diff --git a/.cmake-format.py b/.cmake-format.py index deafc86ff7c3..da2f8898b68e 100644 --- a/.cmake-format.py +++ b/.cmake-format.py @@ -3,238 +3,258 @@ # ---------------------------------- with section("parse"): - # Specify structure for custom cmake functions - additional_commands = { - 'add_gdal_driver': { 'flags': ['BUILTIN', 'PLUGIN'], 'kwargs': {'DEF': 1, 'TARGET': 1, 'SOURCES': '+'}}, - 'gdal_driver': { - 'flags': ['BUILTIN'], - 'kwargs': {'TARGET': 1, 'SOURCES': '+', 'INCLUDES': '*', 'LIBRARIES': '*', 'DEFINITIONS': '*'}}, - 'gdal_dependent_format': {'pargs': {'nargs': 3}}, - 'gdal_driver_standard_includes': {'pargs': {'nargs': 1}}, - 'gdal_format': {'pargs': {'nargs': 2}}, - 'gdal_optional_format': {'pargs': {'nargs': 2}}, - 'gdal_target_interfaces': {'pargs': {'nargs': 1}}, - 'gdal_target_link_libraries': {'kwargs': {'TARGET': 1, 'LIBRARIES': '*'}}, - 'is_plugin': {'pargs': {'nargs': 2}}, - 'ogr_default_driver': {'pargs': {'nargs': 2}}, - 'ogr_default_driver2': {'pargs': {'nargs': 3}}, - 'ogr_dependent_driver': {'pargs': {'nargs': 3}}, - 'ogr_optional_driver': {'pargs': {'nargs': 2}}, - 'gdal_swig_binding_target': {'kwargs': {}, 'pargs': {'flags': [], 'nargs': '*'}}, - 'gdal_swig_bindings': {'kwargs': {}, 'pargs': {'flags': [], 'nargs': '*'}}, - 'gdal_csharp_dll': { - 'flags': [], - 'kwargs': {'TARGET': 1, 'NAMESPACE': 1, 'WRAPPER': 1, 'SWIG_INTERFACE': 1, - 'CS_SOURCES': '*', 'WORKING_DIRECTORY': '*', 'DEPENDS': '*'}}, - 'gdal_java_wrap': { 'flags': ['CXX'], 'kwargs': {'TARGET': '*', 'ARGS': '*'}} - } - - # Specify variable tags. - vartags = [] - - # Specify property tags. - proptags = [] + # Specify structure for custom cmake functions + additional_commands = { + "add_gdal_driver": { + "flags": ["BUILTIN", "PLUGIN"], + "kwargs": {"DEF": 1, "TARGET": 1, "SOURCES": "+"}, + }, + "gdal_driver": { + "flags": ["BUILTIN"], + "kwargs": { + "TARGET": 1, + "SOURCES": "+", + "INCLUDES": "*", + "LIBRARIES": "*", + "DEFINITIONS": "*", + }, + }, + "gdal_dependent_format": {"pargs": {"nargs": 3}}, + "gdal_driver_standard_includes": {"pargs": {"nargs": 1}}, + "gdal_format": {"pargs": {"nargs": 2}}, + "gdal_optional_format": {"pargs": {"nargs": 2}}, + "gdal_target_interfaces": {"pargs": {"nargs": 1}}, + "gdal_target_link_libraries": {"kwargs": {"TARGET": 1, "LIBRARIES": "*"}}, + "is_plugin": {"pargs": {"nargs": 2}}, + "ogr_default_driver": {"pargs": {"nargs": 2}}, + "ogr_default_driver2": {"pargs": {"nargs": 3}}, + "ogr_dependent_driver": {"pargs": {"nargs": 3}}, + "ogr_optional_driver": {"pargs": {"nargs": 2}}, + "gdal_swig_binding_target": { + "kwargs": {}, + "pargs": {"flags": [], "nargs": "*"}, + }, + "gdal_swig_bindings": {"kwargs": {}, "pargs": {"flags": [], "nargs": "*"}}, + "gdal_csharp_dll": { + "flags": [], + "kwargs": { + "TARGET": 1, + "NAMESPACE": 1, + "WRAPPER": 1, + "SWIG_INTERFACE": 1, + "CS_SOURCES": "*", + "WORKING_DIRECTORY": "*", + "DEPENDS": "*", + }, + }, + "gdal_java_wrap": {"flags": ["CXX"], "kwargs": {"TARGET": "*", "ARGS": "*"}}, + } + + # Specify variable tags. + vartags = [] + + # Specify property tags. + proptags = [] # ----------------------------- # Options affecting formatting. # ----------------------------- with section("format"): - # How wide to allow formatted cmake files - line_width = 120 + # How wide to allow formatted cmake files + line_width = 120 - # How many spaces to tab for indent - tab_size = 2 + # How many spaces to tab for indent + tab_size = 2 - # If an argument group contains more than this many sub-groups (parg or kwarg - # groups) then force it to a vertical layout. - max_subgroups_hwrap = 2 + # If an argument group contains more than this many sub-groups (parg or kwarg + # groups) then force it to a vertical layout. + max_subgroups_hwrap = 2 - # If a positional argument group contains more than this many arguments, then - # force it to a vertical layout. - max_pargs_hwrap = 6 + # If a positional argument group contains more than this many arguments, then + # force it to a vertical layout. + max_pargs_hwrap = 6 - # If a cmdline positional group consumes more than this many lines without - # nesting, then invalidate the layout (and nest) - max_rows_cmdline = 2 + # If a cmdline positional group consumes more than this many lines without + # nesting, then invalidate the layout (and nest) + max_rows_cmdline = 2 - # If true, separate flow control names from their parentheses with a space - separate_ctrl_name_with_space = True + # If true, separate flow control names from their parentheses with a space + separate_ctrl_name_with_space = True - # If true, separate function names from parentheses with a space - separate_fn_name_with_space = False + # If true, separate function names from parentheses with a space + separate_fn_name_with_space = False - # If a statement is wrapped to more than one line, than dangle the closing - # parenthesis on its own line. - dangle_parens = False + # If a statement is wrapped to more than one line, than dangle the closing + # parenthesis on its own line. + dangle_parens = False - # If the trailing parenthesis must be 'dangled' on its on line, then align it - # to this reference: `prefix`: the start of the statement, `prefix-indent`: - # the start of the statement, plus one indentation level, `child`: align to - # the column of the arguments - dangle_align = 'prefix-indent' + # If the trailing parenthesis must be 'dangled' on its on line, then align it + # to this reference: `prefix`: the start of the statement, `prefix-indent`: + # the start of the statement, plus one indentation level, `child`: align to + # the column of the arguments + dangle_align = "prefix-indent" - # If the statement spelling length (including space and parenthesis) is - # smaller than this amount, then force reject nested layouts. - min_prefix_chars = 4 + # If the statement spelling length (including space and parenthesis) is + # smaller than this amount, then force reject nested layouts. + min_prefix_chars = 4 - # If the statement spelling length (including space and parenthesis) is larger - # than the tab width by more than this amount, then force reject un-nested - # layouts. - max_prefix_chars = 16 + # If the statement spelling length (including space and parenthesis) is larger + # than the tab width by more than this amount, then force reject un-nested + # layouts. + max_prefix_chars = 16 - # If a candidate layout is wrapped horizontally but it exceeds this many - # lines, then reject the layout. - max_lines_hwrap = 2 + # If a candidate layout is wrapped horizontally but it exceeds this many + # lines, then reject the layout. + max_lines_hwrap = 2 - # What style line endings to use in the output. - line_ending = 'unix' + # What style line endings to use in the output. + line_ending = "unix" - # Format command names consistently as 'lower' or 'upper' case - command_case = 'canonical' + # Format command names consistently as 'lower' or 'upper' case + command_case = "canonical" - # Format keywords consistently as 'lower' or 'upper' case - keyword_case = 'unchanged' + # Format keywords consistently as 'lower' or 'upper' case + keyword_case = "unchanged" - # A list of command names which should always be wrapped - always_wrap = [] + # A list of command names which should always be wrapped + always_wrap = [] - # If true, the argument lists which are known to be sortable will be sorted - # lexicographicall - enable_sort = True + # If true, the argument lists which are known to be sortable will be sorted + # lexicographicall + enable_sort = True - # If true, the parsers may infer whether or not an argument list is sortable - # (without annotation). - autosort = False + # If true, the parsers may infer whether or not an argument list is sortable + # (without annotation). + autosort = False - # By default, if cmake-format cannot successfully fit everything into the - # desired linewidth it will apply the last, most aggressive attempt that it - # made. If this flag is True, however, cmake-format will print error, exit - # with non-zero status code, and write-out nothing - require_valid_layout = False + # By default, if cmake-format cannot successfully fit everything into the + # desired linewidth it will apply the last, most aggressive attempt that it + # made. If this flag is True, however, cmake-format will print error, exit + # with non-zero status code, and write-out nothing + require_valid_layout = False - # A dictionary mapping layout nodes to a list of wrap decisions. See the - # documentation for more information. - layout_passes = {} + # A dictionary mapping layout nodes to a list of wrap decisions. See the + # documentation for more information. + layout_passes = {} # ------------------------------------------------ # Options affecting comment reflow and formatting. # ------------------------------------------------ with section("markup"): - # What character to use for bulleted lists - bullet_char = '*' + # What character to use for bulleted lists + bullet_char = "*" - # What character to use as punctuation after numerals in an enumerated list - enum_char = '.' + # What character to use as punctuation after numerals in an enumerated list + enum_char = "." - # If comment markup is enabled, don't reflow the first comment block in each - # listfile. Use this to preserve formatting of your copyright/license - # statements. - first_comment_is_literal = False + # If comment markup is enabled, don't reflow the first comment block in each + # listfile. Use this to preserve formatting of your copyright/license + # statements. + first_comment_is_literal = False - # If comment markup is enabled, don't reflow any comment block which matches - # this (regex) pattern. Default is `None` (disabled). - literal_comment_pattern = None + # If comment markup is enabled, don't reflow any comment block which matches + # this (regex) pattern. Default is `None` (disabled). + literal_comment_pattern = None - # Regular expression to match preformat fences in comments default= - # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` - fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$' + # Regular expression to match preformat fences in comments default= + # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` + fence_pattern = "^\\s*([`~]{3}[`~]*)(.*)$" - # Regular expression to match rulers in comments default= - # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` - ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' + # Regular expression to match rulers in comments default= + # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` + ruler_pattern = "^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$" - # If a comment line matches starts with this pattern then it is explicitly a - # trailing comment for the preceding argument. Default is '#<' - explicit_trailing_pattern = '#<' + # If a comment line matches starts with this pattern then it is explicitly a + # trailing comment for the preceding argument. Default is '#<' + explicit_trailing_pattern = "#<" - # If a comment line starts with at least this many consecutive hash - # characters, then don't lstrip() them off. This allows for lazy hash rulers - # where the first hash char is not separated by space - hashruler_min_length = 10 + # If a comment line starts with at least this many consecutive hash + # characters, then don't lstrip() them off. This allows for lazy hash rulers + # where the first hash char is not separated by space + hashruler_min_length = 10 - # If true, then insert a space between the first hash char and remaining hash - # chars in a hash ruler, and normalize its length to fill the column - canonicalize_hashrulers = True + # If true, then insert a space between the first hash char and remaining hash + # chars in a hash ruler, and normalize its length to fill the column + canonicalize_hashrulers = True - # enable comment markup parsing and reflow - enable_markup = True + # enable comment markup parsing and reflow + enable_markup = True # ---------------------------- # Options affecting the linter # ---------------------------- with section("lint"): - # a list of lint codes to disable - disabled_codes = [] + # a list of lint codes to disable + disabled_codes = [] - # regular expression pattern describing valid function names - function_pattern = '[0-9a-z_]+' + # regular expression pattern describing valid function names + function_pattern = "[0-9a-z_]+" - # regular expression pattern describing valid macro names - macro_pattern = '[0-9A-Z_]+' + # regular expression pattern describing valid macro names + macro_pattern = "[0-9A-Z_]+" - # regular expression pattern describing valid names for variables with global - # scope - global_var_pattern = '[0-9A-Z][0-9A-Z_]+' + # regular expression pattern describing valid names for variables with global + # scope + global_var_pattern = "[0-9A-Z][0-9A-Z_]+" - # regular expression pattern describing valid names for variables with global - # scope (but internal semantic) - internal_var_pattern = '_[0-9A-Z][0-9A-Z_]+' + # regular expression pattern describing valid names for variables with global + # scope (but internal semantic) + internal_var_pattern = "_[0-9A-Z][0-9A-Z_]+" - # regular expression pattern describing valid names for variables with local - # scope - local_var_pattern = '[0-9a-z_]+' + # regular expression pattern describing valid names for variables with local + # scope + local_var_pattern = "[0-9a-z_]+" - # regular expression pattern describing valid names for privatedirectory - # variables - private_var_pattern = '_[0-9a-z_]+' + # regular expression pattern describing valid names for privatedirectory + # variables + private_var_pattern = "_[0-9a-z_]+" - # regular expression pattern describing valid names for publicdirectory - # variables - public_var_pattern = '[0-9A-Z][0-9A-Z_]+' + # regular expression pattern describing valid names for publicdirectory + # variables + public_var_pattern = "[0-9A-Z][0-9A-Z_]+" - # regular expression pattern describing valid names for keywords used in - # functions or macros - keyword_pattern = '[0-9A-Z_]+' + # regular expression pattern describing valid names for keywords used in + # functions or macros + keyword_pattern = "[0-9A-Z_]+" - # In the heuristic for C0201, how many conditionals to match within a loop in - # before considering the loop a parser. - max_conditionals_custom_parser = 2 + # In the heuristic for C0201, how many conditionals to match within a loop in + # before considering the loop a parser. + max_conditionals_custom_parser = 2 - # Require at least this many newlines between statements - min_statement_spacing = 1 + # Require at least this many newlines between statements + min_statement_spacing = 1 - # Require no more than this many newlines between statements - max_statement_spacing = 1 - max_returns = 6 - max_branches = 12 - max_arguments = 5 - max_localvars = 15 - max_statements = 50 + # Require no more than this many newlines between statements + max_statement_spacing = 1 + max_returns = 6 + max_branches = 12 + max_arguments = 5 + max_localvars = 15 + max_statements = 50 # ------------------------------- # Options affecting file encoding # ------------------------------- with section("encode"): - # If true, emit the unicode byte-order mark (BOM) at the start of the file - emit_byteorder_mark = False + # If true, emit the unicode byte-order mark (BOM) at the start of the file + emit_byteorder_mark = False - # Specify the encoding of the input file. Defaults to utf-8 - input_encoding = 'utf-8' + # Specify the encoding of the input file. Defaults to utf-8 + input_encoding = "utf-8" - # Specify the encoding of the output file. Defaults to utf-8. Note that cmake - # only claims to support utf-8 so be careful when using anything else - output_encoding = 'utf-8' + # Specify the encoding of the output file. Defaults to utf-8. Note that cmake + # only claims to support utf-8 so be careful when using anything else + output_encoding = "utf-8" # ------------------------------------- # Miscellaneous configurations options. # ------------------------------------- with section("misc"): - # A dictionary containing any per-command configuration overrides. Currently - # only `command_case` is supported. - per_command = {} - + # A dictionary containing any per-command configuration overrides. Currently + # only `command_case` is supported. + per_command = {} diff --git a/autotest/alg/applyverticalshiftgrid.py b/autotest/alg/applyverticalshiftgrid.py index b95731af19a8..fee8b775234b 100755 --- a/autotest/alg/applyverticalshiftgrid.py +++ b/autotest/alg/applyverticalshiftgrid.py @@ -30,8 +30,8 @@ ############################################################################### - import gdaltest + from osgeo import gdal, osr ############################################################################### @@ -40,10 +40,9 @@ 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') + 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 @@ -57,23 +56,23 @@ def test_applyverticalshiftgrid_1(): 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) + 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']) + 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']) + 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 @@ -83,14 +82,14 @@ def test_applyverticalshiftgrid_2(): sr = osr.SpatialReference() sr.SetFromUserInput("WGS84") for i in range(6): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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) + grid_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) if i != 3: grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) if i != 4: @@ -102,10 +101,10 @@ def test_applyverticalshiftgrid_2(): assert out_ds is None, i # Non invertable source geotransform - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = gdal.GetDriverByName("MEM").Create("", 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): @@ -113,10 +112,10 @@ def test_applyverticalshiftgrid_2(): assert out_ds is None # Non invertable grid geotransform - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = gdal.GetDriverByName("MEM").Create("", 1, 1) grid_ds.SetGeoTransform([0, 0, 0, 0, 0, 0]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): @@ -125,10 +124,10 @@ def test_applyverticalshiftgrid_2(): # No PROJ.4 translation for source SRS, coordinate transformation # initialization has failed - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = 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(): @@ -136,41 +135,44 @@ def test_applyverticalshiftgrid_2(): 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) + 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 = 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']) + 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 = 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 = 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']) + 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']) + 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() @@ -178,15 +180,16 @@ def test_applyverticalshiftgrid_3(): cs = out_ds.GetRasterBand(1).Checksum() assert cs == 5112 - out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, - options=['RESAMPLING=BILINEAR']) + 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']) + out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=["RESAMPLING=CUBIC"]) cs = out_ds.GetRasterBand(1).Checksum() - assert cs in (4841, 4854, 4842) # 4842 on Mac / Conda + assert cs in (4841, 4854, 4842) # 4842 on Mac / Conda + ############################################################################### # Test nodata @@ -198,12 +201,12 @@ def test_applyverticalshiftgrid_4(): sr.SetFromUserInput("WGS84") # Nodata on source - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = 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) @@ -213,11 +216,11 @@ def test_applyverticalshiftgrid_4(): assert cs == 1 # Nodata on grid - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = 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) @@ -228,79 +231,97 @@ def test_applyverticalshiftgrid_4(): assert cs == 1 # ERROR_ON_MISSING_VERT_SHIFT due to non compatible extents - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + 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 = 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']) + 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 = 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 = 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']) + 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') + 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]]) + 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') + 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]]) + 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( - 'tmp/applyverticalshiftgrid_6.gtx', 1440, 721, 1, gdal.GDT_Float32) + grid_ds = gdal.GetDriverByName("GTX").Create( + "tmp/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', - srcSRS='EPSG:32611', - dstSRS='+proj=utm +zone=11 +datum=WGS84 +geoidgrids=./tmp/applyverticalshiftgrid_6.gtx +vunits=m +no_defs') + ds = gdal.Warp( + "", + "../gcore/data/byte.tif", + format="MEM", + srcSRS="EPSG:32611", + dstSRS="+proj=utm +zone=11 +datum=WGS84 +geoidgrids=./tmp/applyverticalshiftgrid_6.gtx +vunits=m +no_defs", + ) cs = ds.GetRasterBand(1).Checksum() assert cs == 4783 - gdal.Unlink('tmp/applyverticalshiftgrid_6.gtx') + gdal.Unlink("tmp/applyverticalshiftgrid_6.gtx") + ############################################################################### # Simulate USA geoid grids with long origin > 180 @@ -308,19 +329,21 @@ def test_applyverticalshiftgrid_6(): def test_applyverticalshiftgrid_7(): - grid_ds = gdal.GetDriverByName('GTX').Create( - 'tmp/applyverticalshiftgrid_7.gtx', 700, 721, 1, gdal.GDT_Float32) + grid_ds = gdal.GetDriverByName("GTX").Create( + "tmp/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', - srcSRS='EPSG:32611', - dstSRS='+proj=utm +zone=11 +datum=WGS84 +geoidgrids=./tmp/applyverticalshiftgrid_7.gtx +vunits=m +no_defs') + ds = gdal.Warp( + "", + "../gcore/data/byte.tif", + format="MEM", + srcSRS="EPSG:32611", + dstSRS="+proj=utm +zone=11 +datum=WGS84 +geoidgrids=./tmp/applyverticalshiftgrid_7.gtx +vunits=m +no_defs", + ) cs = ds.GetRasterBand(1).Checksum() assert cs == 4783 - gdal.Unlink('tmp/applyverticalshiftgrid_7.gtx') - - - + gdal.Unlink("tmp/applyverticalshiftgrid_7.gtx") diff --git a/autotest/alg/contour.py b/autotest/alg/contour.py index 89f9bbfdec77..95a6d5371221 100755 --- a/autotest/alg/contour.py +++ b/autotest/alg/contour.py @@ -28,16 +28,15 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import struct import os +import struct - -from osgeo import gdal -from osgeo import ogr import gdaltest import ogrtest import pytest +from osgeo import gdal, ogr + ############################################################################### # Test with -a and -i options @@ -45,59 +44,79 @@ def test_contour_1(): try: - os.remove('tmp/contour.shp') + os.remove("tmp/contour.shp") except OSError: pass try: - os.remove('tmp/contour.dbf') + os.remove("tmp/contour.dbf") except OSError: pass try: - os.remove('tmp/contour.shx') + 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\"]]' + 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 = drv.Create("tmp/gdal_contour.tif", size, size, 1) ds.SetProjection(wkt) ds.SetGeoTransform([1, precision, 0, 50, 0, -precision]) - raw_data = struct.pack('h', 10) * int(size / 2) + raw_data = struct.pack("h", 10) * int(size / 2) 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 = struct.pack('h', 20) * 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 = struct.pack("h", 20) * int(size / 2) 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 = struct.pack('h', 25) * 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 = struct.pack("h", 25) * int(size / 4) 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) + 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) + 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_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") @@ -108,18 +127,23 @@ def test_contour_1(): feat = lyr.GetNextFeature() while feat is not None: envelope = feat.GetGeometryRef().GetEnvelope() - assert feat.GetField('elev') == expected_height[i] + assert feat.GetField("elev") == expected_height[i] for j in range(4): - if expected_envelopes[i][j] != pytest.approx(envelope[j], abs=precision / 2 * 1.001): - print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) + if expected_envelopes[i][j] != pytest.approx( + envelope[j], abs=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)) + 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 @@ -127,35 +151,42 @@ def test_contour_1(): def test_contour_2(): try: - os.remove('tmp/contour.shp') + os.remove("tmp/contour.shp") except OSError: pass try: - os.remove('tmp/contour.dbf') + os.remove("tmp/contour.dbf") except OSError: pass try: - os.remove('tmp/contour.shx') + 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_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) + field_defn = ogr.FieldDefn("elev", ogr.OFTReal) ogr_lyr.CreateField(field_defn) - ds = gdal.Open('tmp/gdal_contour.tif') + 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 + precision = 1.0 / 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_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") @@ -167,82 +198,109 @@ def test_contour_2(): while feat is not None: assert feat.GetGeometryRef().GetZ(0) == expected_height[i] envelope = feat.GetGeometryRef().GetEnvelope() - assert feat.GetField('elev') == expected_height[i] + assert feat.GetField("elev") == expected_height[i] for j in range(4): - if expected_envelopes[i][j] != pytest.approx(envelope[j], abs=precision / 2 * 1.001): - print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) + if expected_envelopes[i][j] != pytest.approx( + envelope[j], abs=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)) + 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_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) + field_defn = ogr.FieldDefn("elev", ogr.OFTReal) ogr_lyr.CreateField(field_defn) - ds = gdal.Open('data/contour_in.tif') + 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') + 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 + 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') + os.remove("tmp/contour.shp") except OSError: pass try: - os.remove('tmp/contour.dbf') + os.remove("tmp/contour.dbf") except OSError: pass try: - os.remove('tmp/contour.shx') + 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_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) + field_defn = ogr.FieldDefn("elevMin", ogr.OFTReal) ogr_lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('elevMax', ogr.OFTReal) + 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 = 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 + precision = 1.0 / 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_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") @@ -252,17 +310,27 @@ def test_contour_3(): 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])) + 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 expected_envelopes[i][j] != pytest.approx(envelope[j], abs=precision / 2 * 1.001): - print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) + if expected_envelopes[i][j] != pytest.approx( + envelope[j], abs=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)) + pytest.fail( + "%f, %f" % (expected_envelopes[i][j] - envelope[j], precision / 2) + ) i = i + 1 feat = lyr.GetNextFeature() @@ -273,27 +341,36 @@ def test_contour_3(): # Check behaviour when the nodata value as a double isn't exactly the Float32 pixel value def test_contour_nodata_precision_issue_float32(): - ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/contour.shp') - ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString) - field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) + ogr_ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource( + "/vsimem/contour.shp" + ) + ogr_lyr = ogr_ds.CreateLayer("contour", geom_type=ogr.wkbLineString) + field_defn = ogr.FieldDefn("ID", ogr.OFTInteger) ogr_lyr.CreateField(field_defn) - ds = gdal.Open('data/nodata_precision_issue_float32.tif') - gdal.ContourGenerateEx(ds.GetRasterBand(1), ogr_lyr, options = [ "LEVEL_INTERVAL=0.1", - "ID_FIELD=0", - "NODATA=%.19g" % ds.GetRasterBand(1).GetNoDataValue()] ) + ds = gdal.Open("data/nodata_precision_issue_float32.tif") + gdal.ContourGenerateEx( + ds.GetRasterBand(1), + ogr_lyr, + options=[ + "LEVEL_INTERVAL=0.1", + "ID_FIELD=0", + "NODATA=%.19g" % ds.GetRasterBand(1).GetNoDataValue(), + ], + ) ds = None assert ogr_lyr.GetFeatureCount() == 0 ogr_ds = None - ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/contour.shp') - + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("/vsimem/contour.shp") def test_contour_too_many_levels(): - ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/contour.shp') - ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString) - field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) + ogr_ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource( + "/vsimem/contour.shp" + ) + ogr_lyr = ogr_ds.CreateLayer("contour", geom_type=ogr.wkbLineString) + field_defn = ogr.FieldDefn("ID", ogr.OFTInteger) ogr_lyr.CreateField(field_defn) content1 = """ncols 2 @@ -313,52 +390,65 @@ def test_contour_too_many_levels(): 0 0""" for content in (content1, content2): - with gdaltest.tempfile('/vsimem/test.asc', content): - ds = gdal.Open('/vsimem/test.asc') + with gdaltest.tempfile("/vsimem/test.asc", content): + ds = gdal.Open("/vsimem/test.asc") with gdaltest.error_handler(): - assert gdal.ContourGenerateEx(ds.GetRasterBand(1), ogr_lyr, - options = [ "LEVEL_INTERVAL=1", - "ID_FIELD=0"] ) != 0 - - with gdaltest.tempfile('/vsimem/test.asc', content): - ds = gdal.Open('/vsimem/test.asc') + assert ( + gdal.ContourGenerateEx( + ds.GetRasterBand(1), + ogr_lyr, + options=["LEVEL_INTERVAL=1", "ID_FIELD=0"], + ) + != 0 + ) + + with gdaltest.tempfile("/vsimem/test.asc", content): + ds = gdal.Open("/vsimem/test.asc") with gdaltest.error_handler(): - assert gdal.ContourGenerateEx(ds.GetRasterBand(1), ogr_lyr, - options = [ "LEVEL_INTERVAL=1", - "LEVEL_EXP_BASE=1.0001", - "ID_FIELD=0"] ) != 0 + assert ( + gdal.ContourGenerateEx( + ds.GetRasterBand(1), + ogr_lyr, + options=[ + "LEVEL_INTERVAL=1", + "LEVEL_EXP_BASE=1.0001", + "ID_FIELD=0", + ], + ) + != 0 + ) ogr_ds = None - ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/contour.shp') + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("/vsimem/contour.shp") + ############################################################################### def test_contour_raster_acquisition_error(): - ogr_ds = ogr.GetDriverByName('Memory').CreateDataSource('') - ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString) - field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) + 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) - ds = gdal.Open('../gcore/data/byte_truncated.tif') + ds = gdal.Open("../gcore/data/byte_truncated.tif") with gdaltest.error_handler(): - assert gdal.ContourGenerateEx(ds.GetRasterBand(1), ogr_lyr, - options = [ "LEVEL_INTERVAL=1", - "ID_FIELD=0"] ) != 0 + assert ( + gdal.ContourGenerateEx( + ds.GetRasterBand(1), ogr_lyr, options=["LEVEL_INTERVAL=1", "ID_FIELD=0"] + ) + != 0 + ) + ############################################################################### # Cleanup def test_contour_cleanup(): - ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/contour.shp') + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("tmp/contour.shp") try: - os.remove('tmp/gdal_contour.tif') + os.remove("tmp/gdal_contour.tif") except OSError: pass - - - - - diff --git a/autotest/alg/cutline.py b/autotest/alg/cutline.py index 138b9c76e4fb..e2d6a3aa5246 100755 --- a/autotest/alg/cutline.py +++ b/autotest/alg/cutline.py @@ -31,20 +31,21 @@ ############################################################################### - -from osgeo import gdal -import ogrtest import gdaltest +import ogrtest import pytest +from osgeo import gdal + ############################################################################### def test_cutline_1(): - tst = gdaltest.GDALTest('VRT', 'cutline_noblend.vrt', 1, 11409) + tst = gdaltest.GDALTest("VRT", "cutline_noblend.vrt", 1, 11409) return tst.testOpen() + ############################################################################### @@ -53,9 +54,10 @@ def test_cutline_2(): if not ogrtest.have_geos(): pytest.skip() - tst = gdaltest.GDALTest('VRT', 'cutline_blend.vrt', 1, 21395) + tst = gdaltest.GDALTest("VRT", "cutline_blend.vrt", 1, 21395) return tst.testOpen() + ############################################################################### @@ -64,9 +66,10 @@ def test_cutline_3(): if not ogrtest.have_geos(): pytest.skip() - tst = gdaltest.GDALTest('VRT', 'cutline_multipolygon.vrt', 1, 20827) + tst = gdaltest.GDALTest("VRT", "cutline_multipolygon.vrt", 1, 20827) return tst.testOpen() + ############################################################################### @@ -75,11 +78,12 @@ 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 = gdal.Translate("/vsimem/utmsmall.tif", "../gcore/data/utmsmall.tif") + ds.BuildOverviews("NEAR", [2]) ds = None - ds = gdal.Open(""" + 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 @@ -109,14 +113,13 @@ def test_cutline_4(): 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%%') +""" + ) + 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') - -############################################################################### - + gdal.Unlink("/vsimem/utmsmall.tif") +############################################################################### diff --git a/autotest/alg/dither.py b/autotest/alg/dither.py index 2f42fa25c48f..6be1a702bcd0 100755 --- a/autotest/alg/dither.py +++ b/autotest/alg/dither.py @@ -30,10 +30,9 @@ ############################################################################### - +import pytest from osgeo import gdal -import pytest ############################################################################### # Test @@ -41,15 +40,16 @@ def test_dither_1(): - drv = gdal.GetDriverByName('GTiff') + drv = gdal.GetDriverByName("GTiff") - src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') + 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_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() @@ -67,10 +67,18 @@ def test_dither_1(): dst_band = None dst_ds = None - assert ct.GetCount() == nColors, 'color table size wrong' + 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)] + 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) @@ -82,16 +90,11 @@ def test_dither_1(): for k in range(nColors): print(ct.GetColorEntry(k)) print(ref_ct[k]) - pytest.fail('color table mismatch') + 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 or gdal.GetConfigOption("CPL_DEBUG", "OFF") != "ON": + drv.Delete("tmp/rgbsmall.tif") if cs != cs_expected: - print('Got: ', cs) - pytest.fail('got wrong checksum') - - - - - + print("Got: ", cs) + pytest.fail("got wrong checksum") diff --git a/autotest/alg/fillnodata.py b/autotest/alg/fillnodata.py index 738ccae0f100..0f70ff9e1692 100755 --- a/autotest/alg/fillnodata.py +++ b/autotest/alg/fillnodata.py @@ -28,118 +28,113 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import struct import pytest +from osgeo import gdal + def test_fillnodata_1x1_no_nodata(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - ar = struct.pack('B' * 1, 1) + 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) + gdal.FillNodata( + targetBand=ds.GetRasterBand(1), + maxSearchDist=1, + maskBand=None, + smoothingIterations=0, + ) ar = ds.ReadRaster() - ar = struct.unpack('B' * 1, ar) + ar = struct.unpack("B" * 1, ar) assert ar == (1,) fillnodata_tests = { # (width, height, input_ar, maxSearchDist, expected, smoothingIterations): - '1x1_nodata_but_pixel_valid': (1, 1, (1,), 1, (1,), 0), - '1x1_nodata_pixel_invalid': (1, 1, (0,), 1, (0,), 0), - '2x1_valid_invalid': (2, 1, (1, 0), 1, (1, 1), 0), - '2x1_invalid_valid': (2, 1, (0, 1), 1, (1, 1), 0), - '3x1_valid_invalid_valid': (3, 1, (2, 0, 4), 1, (2, 3, 4), 0), - '4x1_valid_invalid_invalid_valid': (4, 1, (2, 0, 0, 4), 1, (2, 2, 4, 4), 0), - '1x2_valid_invalid': (1, 2, (1, 0), 1, (1, 1), 0), - '1x2_invalid_valid': (1, 2, (0, 1), 1, (1, 1), 0), - '1x3_valid_invalid_valid': (1, 3, (2, 0, 4), 1, (2, 3, 4), 0), - '1x4_valid_invalid_invalid_valid': (1, 4, (2, 0, 0, 4), 1, (2, 2, 4, 4), 0), - '3x3_central_column_invalid': ( - 3, 3, - (2, 0, 4, - 4, 0, 6, - 6, 0, 8), + "1x1_nodata_but_pixel_valid": (1, 1, (1,), 1, (1,), 0), + "1x1_nodata_pixel_invalid": (1, 1, (0,), 1, (0,), 0), + "2x1_valid_invalid": (2, 1, (1, 0), 1, (1, 1), 0), + "2x1_invalid_valid": (2, 1, (0, 1), 1, (1, 1), 0), + "3x1_valid_invalid_valid": (3, 1, (2, 0, 4), 1, (2, 3, 4), 0), + "4x1_valid_invalid_invalid_valid": (4, 1, (2, 0, 0, 4), 1, (2, 2, 4, 4), 0), + "1x2_valid_invalid": (1, 2, (1, 0), 1, (1, 1), 0), + "1x2_invalid_valid": (1, 2, (0, 1), 1, (1, 1), 0), + "1x3_valid_invalid_valid": (1, 3, (2, 0, 4), 1, (2, 3, 4), 0), + "1x4_valid_invalid_invalid_valid": (1, 4, (2, 0, 0, 4), 1, (2, 2, 4, 4), 0), + "3x3_central_column_invalid": ( + 3, + 3, + (2, 0, 4, 4, 0, 6, 6, 0, 8), 1, - (2, 3, 4, - 4, 5, 6, - 6, 7, 8), 0), - '3x3_central_line_invalid': ( - 3, 3, - (2, 3, 4, - 0, 0, 0, - 6, 7, 8), + (2, 3, 4, 4, 5, 6, 6, 7, 8), + 0, + ), + "3x3_central_line_invalid": ( + 3, + 3, + (2, 3, 4, 0, 0, 0, 6, 7, 8), 1, - (2, 3, 4, - 4, 5, 6, - 6, 7, 8), - 0), - '3x3_central_column_and_line_invalid': ( - 3, 3, - (2, 0, 4, - 0, 0, 0, - 6, 0, 8), + (2, 3, 4, 4, 5, 6, 6, 7, 8), + 0, + ), + "3x3_central_column_and_line_invalid": ( + 3, + 3, + (2, 0, 4, 0, 0, 0, 6, 0, 8), 1, - (2, 3, 4, - 4, 0, 6, - 6, 7, 8), - 0), + (2, 3, 4, 4, 0, 6, 6, 7, 8), + 0, + ), # 1.5 > sqrt(2) - '3x3_central_column_and_line_invalid_search_dist_1_5': ( - 3, 3, - (2, 0, 4, - 0, 0, 0, - 6, 0, 8), + "3x3_central_column_and_line_invalid_search_dist_1_5": ( + 3, + 3, + (2, 0, 4, 0, 0, 0, 6, 0, 8), 1.5, - (2, 3, 4, - 4, 5, 6, - 6, 7, 8), - 0), - '4x4': ( - 4, 4, - (20, 30, 40, 50, - 30, 0, 0, 60, - 40, 0, 0, 70, - 50, 60, 70, 80), + (2, 3, 4, 4, 5, 6, 6, 7, 8), + 0, + ), + "4x4": ( + 4, + 4, + (20, 30, 40, 50, 30, 0, 0, 60, 40, 0, 0, 70, 50, 60, 70, 80), + 1, + (20, 30, 40, 50, 30, 30, 50, 60, 40, 50, 70, 70, 50, 60, 70, 80), + 0, + ), + "4x4_smooth_1": ( + 4, + 4, + (20, 30, 40, 50, 30, 0, 0, 60, 40, 0, 0, 70, 50, 60, 70, 80), 1, - (20, 30, 40, 50, - 30, 30, 50, 60, - 40, 50, 70, 70, - 50, 60, 70, 80), - 0), - '4x4_smooth_1': ( - 4, 4, - (20, 30, 40, 50, - 30, 0, 0, 60, - 40, 0, 0, 70, - 50, 60, 70, 80), + (20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70, 50, 60, 70, 80), 1, - (20, 30, 40, 50, - 30, 40, 50, 60, - 40, 50, 60, 70, - 50, 60, 70, 80), - 1), + ), } -@pytest.mark.parametrize('width, height, input_ar, maxSearchDist, expected, smoothingIterations', - fillnodata_tests.values(), - ids=fillnodata_tests.keys()) -def test_fillnodata_nodata(width, height, input_ar, maxSearchDist, expected, smoothingIterations): - ds = gdal.GetDriverByName('MEM').Create('', width, height) +@pytest.mark.parametrize( + "width, height, input_ar, maxSearchDist, expected, smoothingIterations", + fillnodata_tests.values(), + ids=fillnodata_tests.keys(), +) +def test_fillnodata_nodata( + width, height, input_ar, maxSearchDist, expected, smoothingIterations +): + ds = gdal.GetDriverByName("MEM").Create("", width, height) npixels = ds.RasterXSize * ds.RasterYSize ds.GetRasterBand(1).SetNoDataValue(0) - ar = struct.pack('B', input_ar[0]) + ar = struct.pack("B", input_ar[0]) for i in range(1, len(input_ar)): - ar += struct.pack('B', input_ar[i]) + 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 = smoothingIterations) + gdal.FillNodata( + targetBand=ds.GetRasterBand(1), + maxSearchDist=maxSearchDist, + maskBand=None, + smoothingIterations=smoothingIterations, + ) ar = ds.ReadRaster() - assert struct.unpack('B' * npixels, ar) == expected + assert struct.unpack("B" * npixels, ar) == expected diff --git a/autotest/alg/polygonize.py b/autotest/alg/polygonize.py index 7736b0e136ad..53621e7caed3 100755 --- a/autotest/alg/polygonize.py +++ b/autotest/alg/polygonize.py @@ -30,8 +30,8 @@ ############################################################################### -from collections import defaultdict import struct +from collections import defaultdict import ogrtest @@ -43,16 +43,16 @@ def test_polygonize_1(is_int_polygonize=True): - src_ds = gdal.Open('data/polygonize_in.grd') + 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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + fd = ogr.FieldDefn("DN", ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. @@ -60,23 +60,28 @@ def test_polygonize_1(is_int_polygonize=True): 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' + 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] + expect = [107, 123, 115, 115, 140, 148, 123, 140, 156, 100, 101, 102, 103] - tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect) + tr = ogrtest.check_features_against_list(mem_layer, "DN", expect) # check at least one geometry. if tr: - mem_layer.SetAttributeFilter('dn = 156') + 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,440780 3751080,440840 3751080,440840 3751140,440780 3751140))') != 0: + if ( + ogrtest.check_feature_geometry( + feat_read, + "POLYGON ((440720 3751200,440720 3751020,440900 3751020,440900 3751200,440720 3751200),(440780 3751140,440780 3751080,440840 3751080,440840 3751140,440780 3751140))", + ) + != 0 + ): tr = 0 feat_read.Destroy() @@ -86,61 +91,80 @@ def test_polygonize_1(is_int_polygonize=True): 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_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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + 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' + 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] + 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) + 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_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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + 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' + assert result == 0, "Polygonize failed" # Confirm we get the expected count of features. @@ -148,9 +172,15 @@ def test_polygonize_3(): assert mem_layer.GetFeatureCount() == expected_feature_number # check at least one geometry. - mem_layer.SetAttributeFilter('dn = 0') + 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,25 -39,25 -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,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),(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),(11 -22,11 -36,24 -36,24 -35,26 -35,26 -33,27 -33,27 -25,26 -25,26 -23,24 -23,24 -22,11 -22))') != 0: + if ( + ogrtest.check_feature_geometry( + feat_read, + "POLYGON ((6 -3,6 -40,19 -40,19 -39,25 -39,25 -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,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),(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),(11 -22,11 -36,24 -36,24 -35,26 -35,26 -33,27 -33,27 -25,26 -25,26 -23,24 -23,24 -22,11 -22))", + ) + != 0 + ): print(feat_read.GetGeometryRef().ExportToWkt()) tr = 0 else: @@ -159,61 +189,79 @@ def test_polygonize_3(): 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_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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + 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' + 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] + 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) + tr = ogrtest.check_features_against_list(mem_layer, "DN", expect) assert tr + ############################################################################### # Test a simple case with two inner wholes touchs at a vertex. def test_polygonize_5(): - src_ds = gdal.Open('data/polygonize_in_3.grd') + src_ds = gdal.Open("data/polygonize_in_3.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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + 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' + assert result == 0, "Polygonize failed" # Confirm we get the set of expected features in the output layer. @@ -222,9 +270,9 @@ def test_polygonize_5(): expect = [1, 0, 0] expect_wkt = [ - 'POLYGON ((0 4,0 0,4 0,4 4,0 4),(1 3,1 2,2 2,2 3,1 3),(2 2,2 1,3 1,3 2,2 2))', - 'POLYGON ((1 3,1 2,2 2,2 3,1 3))', - 'POLYGON ((2 2,2 1,3 1,3 2,2 2))' + "POLYGON ((0 4,0 0,4 0,4 4,0 4),(1 3,1 2,2 2,2 3,1 3),(2 2,2 1,3 1,3 2,2 2))", + "POLYGON ((1 3,1 2,2 2,2 3,1 3))", + "POLYGON ((2 2,2 1,3 1,3 2,2 2))", ] idx = 0 @@ -238,26 +286,28 @@ def test_polygonize_5(): idx += 1 + ############################################################################### # Test a simple case with two inner wholes touchs at a vertex. + def test_polygonize_6(): - src_ds = gdal.Open('data/polygonize_in_4.grd') + src_ds = gdal.Open("data/polygonize_in_4.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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + 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' + assert result == 0, "Polygonize failed" # Confirm we get the set of expected features in the output layer. @@ -266,9 +316,9 @@ def test_polygonize_6(): expect = [0, 0, 1] expect_wkt = [ - 'POLYGON ((2 3,2 2,3 2,3 3,2 3))', - 'POLYGON ((1 2,1 1,2 1,2 2,1 2))', - 'POLYGON ((0 4,0 0,4 0,4 4,0 4),(2 3,2 2,3 2,3 3,2 3),(1 2,1 1,2 1,2 2,1 2))' + "POLYGON ((2 3,2 2,3 2,3 3,2 3))", + "POLYGON ((1 2,1 1,2 1,2 2,1 2))", + "POLYGON ((0 4,0 0,4 0,4 4,0 4),(2 3,2 2,3 2,3 3,2 3),(1 2,1 1,2 1,2 2,1 2))", ] idx = 0 @@ -282,37 +332,41 @@ def test_polygonize_6(): idx += 1 + ############################################################################### # Test a complex case to make sure the polygonized area match original raster. + def test_polygonize_7(): - src_ds = gdal.Open('data/polygonize_check_area.tif') + src_ds = gdal.Open("data/polygonize_check_area.tif") 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_drv = ogr.GetDriverByName("Memory") + mem_ds = mem_drv.CreateDataSource("out") - mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) + mem_layer = mem_ds.CreateLayer("poly", None, ogr.wkbPolygon) - fd = ogr.FieldDefn('DN', ogr.OFTInteger) + fd = ogr.FieldDefn("DN", ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. result = gdal.Polygonize(src_band, src_band.GetMaskBand(), mem_layer, 0) - assert result == 0, 'Polygonize failed' + assert result == 0, "Polygonize failed" # collect raster image areas by DN value transform = src_ds.GetGeoTransform() pixel_area = abs(transform[1] * transform[5]) - data = struct.unpack('h' * src_ds.RasterXSize * src_ds.RasterYSize, - src_band.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) + data = struct.unpack( + "h" * src_ds.RasterXSize * src_ds.RasterYSize, + src_band.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize), + ) dn_area_raster = defaultdict(int) for v in data: - if v != src_band.GetNoDataValue(): + if v != src_band.GetNoDataValue(): dn_area_raster[v] += pixel_area # collect vector image areas by DN value @@ -323,7 +377,9 @@ def test_polygonize_7(): geom = feature.GetGeometryRef() dn_area_vector[id] += geom.GetArea() - assert len(dn_area_raster) == len(dn_area_vector), 'DN value inconsistent' + assert len(dn_area_raster) == len(dn_area_vector), "DN value inconsistent" for key, value in dn_area_raster.items(): - assert abs(value - dn_area_vector[key]) < pixel_area, 'polygonized vector area not match raster area' + assert ( + abs(value - dn_area_vector[key]) < pixel_area + ), "polygonized vector area not match raster area" diff --git a/autotest/alg/proximity.py b/autotest/alg/proximity.py index d6bb761b7653..cfb6595ec0db 100755 --- a/autotest/alg/proximity.py +++ b/autotest/alg/proximity.py @@ -29,10 +29,9 @@ ############################################################################### - +import pytest from osgeo import gdal -import pytest ############################################################################### # Test a fairly default case. @@ -40,11 +39,11 @@ def test_proximity_1(): - drv = gdal.GetDriverByName('GTiff') - src_ds = gdal.Open('data/pat.tif') + 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_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) @@ -55,32 +54,32 @@ def test_proximity_1(): 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 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') - + 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') + 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_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']) + 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() @@ -88,32 +87,32 @@ def test_proximity_2(): 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 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') - + 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') + 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_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']) + 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() @@ -121,13 +120,9 @@ def test_proximity_3(): 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 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') - - - + print("Got: ", cs) + pytest.fail("got wrong checksum") diff --git a/autotest/alg/rasterize.py b/autotest/alg/rasterize.py index f9151d8d4542..f87799fcfaa3 100755 --- a/autotest/alg/rasterize.py +++ b/autotest/alg/rasterize.py @@ -30,11 +30,10 @@ import struct - import ogrtest +import pytest from osgeo import gdal, ogr, osr -import pytest ############################################################################### # Simple polygon rasterization. @@ -48,20 +47,18 @@ def test_rasterize_1(): # Create a memory raster to rasterize into. - target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, - gdal.GDT_Byte) + 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) + 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))' + 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)) @@ -70,7 +67,7 @@ def test_rasterize_1(): # Add a linestring. - wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' + wkt_geom = "LINESTRING(1000 1000, 1100 1050)" feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) @@ -79,10 +76,11 @@ def test_rasterize_1(): # Run the algorithm. - err = gdal.RasterizeLayer(target_ds, [3, 2, 1], rast_mem_lyr, - burn_values=[256, 220, -1]) + err = gdal.RasterizeLayer( + target_ds, [3, 2, 1], rast_mem_lyr, burn_values=[256, 220, -1] + ) - assert err == 0, 'got non-zero result code from RasterizeLayer' + assert err == 0, "got non-zero result code from RasterizeLayer" # Check results. @@ -90,8 +88,8 @@ def test_rasterize_1(): 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') + gdal.GetDriverByName("GTiff").CreateCopy("tmp/rasterize_1.tif", target_ds) + pytest.fail("Did not get expected image checksum") _, maxval = target_ds.GetRasterBand(3).ComputeRasterMinMax() assert maxval == 255 @@ -100,7 +98,6 @@ def test_rasterize_1(): assert minval == 0 - ############################################################################### # Test rasterization with ALL_TOUCHED. @@ -112,24 +109,27 @@ def test_rasterize_2(): # Create a memory raster to rasterize into. - target_ds = gdal.GetDriverByName('MEM').Create('', 12, 12, 3, - gdal.GDT_Byte) + 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') + 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.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' + assert err == 0, "got non-zero result code from RasterizeLayer" # Check results. @@ -137,8 +137,8 @@ def test_rasterize_2(): 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') + gdal.GetDriverByName("GTiff").CreateCopy("tmp/rasterize_2.tif", target_ds) + pytest.fail("Did not get expected image checksum") ############################################################################### @@ -153,23 +153,23 @@ def test_rasterize_3(): # Create a memory raster to rasterize into. - target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, - gdal.GDT_Byte) + 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) + 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)'] + 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)) @@ -177,10 +177,15 @@ def test_rasterize_3(): # Run the algorithm. - err = gdal.RasterizeLayer(target_ds, [3, 2, 1], rast_mem_lyr, - burn_values=[10, 10, 55], options=["BURN_VALUE_FROM=Z"]) + 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' + assert err == 0, "got non-zero result code from RasterizeLayer" # Check results. @@ -188,8 +193,8 @@ def test_rasterize_3(): 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') + gdal.GetDriverByName("GTiff").CreateCopy("tmp/rasterize_3.tif", target_ds) + pytest.fail("Did not get expected image checksum") ############################################################################### @@ -203,47 +208,48 @@ def test_rasterize_4(): 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 = 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) + 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)]) + 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)'] + 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]) + 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"]) + err = gdal.RasterizeLayer( + target_ds, [1, 2, 3], rast_mem_lyr, options=["ATTRIBUTE=CELSIUS"] + ) - assert err == 0, 'got non-zero result code from RasterizeLayer' + 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') + gdal.GetDriverByName("GTiff").CreateCopy("tmp/rasterize_4.tif", target_ds) + pytest.fail("Did not get expected image checksum") ############################################################################### @@ -258,48 +264,50 @@ def test_rasterize_5(): # Create a memory raster to rasterize into. - target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, - gdal.GDT_Byte) + 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) + 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))' + 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))' + 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)' + 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)' + 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=[256, 110, -1], - options=["MERGE_ALG=ADD"]) + err = gdal.RasterizeLayer( + target_ds, + [1, 2, 3], + rast_mem_lyr, + burn_values=[256, 110, -1], + options=["MERGE_ALG=ADD"], + ) - assert err == 0, 'got non-zero result code from RasterizeLayer' + assert err == 0, "got non-zero result code from RasterizeLayer" # Check results. @@ -307,8 +315,8 @@ def test_rasterize_5(): 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') + gdal.GetDriverByName("GTiff").CreateCopy("tmp/rasterize_5.tif", target_ds) + pytest.fail("Did not get expected image checksum") _, maxval = target_ds.GetRasterBand(1).ComputeRasterMinMax() assert maxval == 255 @@ -320,21 +328,117 @@ def test_rasterize_5(): ############################################################################### # 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) + 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 = 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) @@ -345,58 +449,250 @@ def test_rasterize_6(): # 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) + 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)')) + 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)')) + 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 = 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) + 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) + 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) + ############################################################################### # Test rasterizing polygon with horizontal segments and MERGE_ALG=ADD @@ -404,33 +700,56 @@ def test_rasterize_merge_alg_add_multiple_segment_linestring(): # the winding order -@pytest.mark.parametrize("wkt", - ['POLYGON((0 0,0 1,1 1,1 0,0 0))', - 'POLYGON((0 0,1 0,1 1,0 1,0 0))'], - ids=['clockwise', 'counterclockwise']) +@pytest.mark.parametrize( + "wkt", + ["POLYGON((0 0,0 1,1 1,1 0,0 0))", "POLYGON((0 0,1 0,1 1,0 1,0 0))"], + ids=["clockwise", "counterclockwise"], +) def test_rasterize_merge_alg_add_polygon(wkt): # 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.wkbPolygon) + data_source = ogr.GetDriverByName("MEMORY").CreateDataSource("") + layer = data_source.CreateLayer("", sr, geom_type=ogr.wkbPolygon) feature = ogr.Feature(layer.GetLayerDefn()) feature.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) layer.CreateFeature(feature) - ds = gdal.GetDriverByName('Mem').Create('', 5, 5, 1, gdal.GDT_Byte) + ds = gdal.GetDriverByName("Mem").Create("", 5, 5, 1, gdal.GDT_Byte) ds.SetGeoTransform([-0.125, 0.25, 0, 1.125, 0, -0.25]) ds.SetProjection(sr_wkt) ds.GetRasterBand(1).Fill(0) gdal.RasterizeLayer(ds, [1], layer, burn_values=[10], options=["MERGE_ALG=ADD"]) - got = struct.unpack('B' * 25, ds.ReadRaster()) - expected = (0, 10, 10, 10, 10, - 0, 10, 10, 10, 10, - 0, 10, 10, 10, 10, - 0, 10, 10, 10, 10, - 0, 10, 10, 10, 10,) - assert got == expected, '%s' % str(got) + got = struct.unpack("B" * 25, ds.ReadRaster()) + expected = ( + 0, + 10, + 10, + 10, + 10, + 0, + 10, + 10, + 10, + 10, + 0, + 10, + 10, + 10, + 10, + 0, + 10, + 10, + 10, + 10, + 0, + 10, + 10, + 10, + 10, + ) + assert got == expected, "%s" % str(got) diff --git a/autotest/alg/reproject.py b/autotest/alg/reproject.py index b3392b6fb379..5df6b2e1b868 100755 --- a/autotest/alg/reproject.py +++ b/autotest/alg/reproject.py @@ -30,22 +30,22 @@ ############################################################################### - - -from osgeo import gdal -from osgeo import osr import pytest +from osgeo import gdal, osr + ############################################################################### # Test a trivial case. def test_reproject_1(): - drv = gdal.GetDriverByName('GTiff') - src_ds = gdal.Open('../gcore/data/byte.tif') + 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 = 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()) @@ -56,12 +56,13 @@ def test_reproject_1(): dst_ds = None - drv.Delete('tmp/byte.tif') + drv.Delete("tmp/byte.tif") if cs != cs_expected: - print('Got: ', cs) - pytest.fail('got wrong checksum') - + print("Got: ", cs) + pytest.fail("got wrong checksum") + + ############################################################################### # Test a real reprojection case. @@ -74,11 +75,20 @@ def test_reproject_2(): 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]) + 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()) @@ -87,60 +97,65 @@ def test_reproject_2(): dst_ds = None - drv.Delete('tmp/byte_4326.tif') + drv.Delete("tmp/byte_4326.tif") if cs != cs_expected: - print('Got: ', cs) - pytest.fail('got wrong checksum') - + 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) + 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 = 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]) + dst_ds.SetGeoTransform([10, 2.0 / 3.0, 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' + 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)) - + 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) + 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 = 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' + dst_ds.SetGeoTransform([10, 2.0 / 3.0, 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)) - - - + pytest.fail(struct.unpack("B" * 18, got_data)) diff --git a/autotest/alg/sieve.py b/autotest/alg/sieve.py index efe2a98b0f9f..d8779f40e00a 100755 --- a/autotest/alg/sieve.py +++ b/autotest/alg/sieve.py @@ -30,10 +30,9 @@ ############################################################################### - +import pytest from osgeo import gdal -import pytest ############################################################################### # Test a fairly default case. @@ -41,11 +40,11 @@ def test_sieve_1(): - drv = gdal.GetDriverByName('GTiff') - src_ds = gdal.Open('data/sieve_src.grd') + 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_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) @@ -56,25 +55,25 @@ def test_sieve_1(): 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 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') - + 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') + 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_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) @@ -85,25 +84,25 @@ def test_sieve_2(): 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 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') - + 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') + 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_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) @@ -115,25 +114,25 @@ def test_sieve_3(): 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 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') - + 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') + 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_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) @@ -144,26 +143,26 @@ def test_sieve_4(): 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 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') - + 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') + 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_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) @@ -174,14 +173,14 @@ def test_sieve_5(): 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 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') - + 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) @@ -197,7 +196,7 @@ def test_sieve_6(): # Try 3002. Should run in less than 10 seconds # size = 3002 size = 102 - ds = gdal.GetDriverByName('MEM').Create('', size + 1, size) + 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)): @@ -216,17 +215,19 @@ def test_sieve_6(): cs = band.Checksum() if (size == 102 and cs != 60955) or (size == 3002 and cs != 63178): - print('Got: ', cs) - pytest.fail('got wrong checksum') + print("Got: ", cs) + pytest.fail("got wrong checksum") + - ############################################################################### # Test with nodata def test_sieve_7(): - gdal.FileFromMemBuffer('/vsimem/sieve_7.asc', """ncols 7 + gdal.FileFromMemBuffer( + "/vsimem/sieve_7.asc", + """ncols 7 nrows 7 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 @@ -239,13 +240,14 @@ def test_sieve_7(): 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') + 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_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) @@ -256,11 +258,10 @@ def test_sieve_7(): dst_band = None dst_ds = None - gdal.Unlink('/vsimem/sieve_7.asc') + gdal.Unlink("/vsimem/sieve_7.asc") - if cs == cs_expected \ - or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': - drv.Delete('/vsimem/sieve_7.tif') + 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] @@ -272,17 +273,19 @@ def test_sieve_7(): # [0 1 1 1 1 1 1]] if cs != cs_expected: - print('Got: ', cs) - pytest.fail('got wrong checksum') - + 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 + gdal.FileFromMemBuffer( + "/vsimem/sieve_8.asc", + """ncols 7 nrows 7 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 @@ -294,13 +297,14 @@ def test_sieve_8(): 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') + 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_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) @@ -312,15 +316,11 @@ def test_sieve_8(): dst_band = None dst_ds = None - gdal.Unlink('/vsimem/sieve_8.asc') + 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 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') - - - + print("Got: ", cs) + pytest.fail("got wrong checksum") diff --git a/autotest/alg/transformgeoloc.py b/autotest/alg/transformgeoloc.py index 670fce9b3685..ebdadc15052c 100755 --- a/autotest/alg/transformgeoloc.py +++ b/autotest/alg/transformgeoloc.py @@ -31,11 +31,10 @@ ############################################################################### - -from osgeo import gdal -from osgeo import osr import pytest +from osgeo import gdal, osr + ############################################################################### # Test a fairly default case. @@ -49,13 +48,11 @@ def test_transformgeoloc_1(): # 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) + 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]]) + 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) @@ -63,32 +60,31 @@ def test_transformgeoloc_1(): # Create a wgs84 to utm transformer. - wgs84_wkt = osr.GetUserInputAsWKT('WGS84') - utm_wkt = osr.GetUserInputAsWKT('+proj=utm +zone=11 +datum=WGS84') + 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]) + 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)) + geoloc_ds.GetRasterBand(3), + ) assert status == 0 expected = numpy.asarray( - [[[ 500000. , 578126.73752062], - [ 540087.07398217, 619246.88515195]], - - [[4982950.40022655, 5038982.81207855], - [4871994.34702622, 4928503.38229753]], - - [[ 0. , 0. ], - [ 0. , 0. ]]]) + [ + [[500000.0, 578126.73752062], [540087.07398217, 619246.88515195]], + [ + [4982950.40022655, 5038982.81207855], + [4871994.34702622, 4928503.38229753], + ], + [[0.0, 0.0], [0.0, 0.0]], + ] + ) assert numpy.allclose(geoloc_ds.ReadAsArray(), expected) - - - diff --git a/autotest/alg/warp.py b/autotest/alg/warp.py index bfca8a69f0ce..0bf8477f61e0 100755 --- a/autotest/alg/warp.py +++ b/autotest/alg/warp.py @@ -34,12 +34,12 @@ import os import shutil - -from osgeo import gdal, osr +import struct import gdaltest import pytest -import struct + +from osgeo import gdal, osr ############################################################################### # Verify that we always getting the same image when warping. @@ -50,404 +50,406 @@ def test_warp_1(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_1_short(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_1_ushort(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_1_float(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_2(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_2_short(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_2_ushort(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_2_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_3(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_3_short(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_3_ushort(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_3_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_3_float_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4_short(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4_ushort(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4_short_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_4_float_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_5(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_5_downsize(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Downsampling def test_warp_6(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_near.vrt', 1, 4770) + tst = gdaltest.GDALTest("VRT", "utmsmall_ds_near.vrt", 1, 4770) return tst.testOpen() def test_warp_7(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_blinear.vrt', 1, 4755) + tst = gdaltest.GDALTest("VRT", "utmsmall_ds_blinear.vrt", 1, 4755) return tst.testOpen() def test_warp_8(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_cubic.vrt', 1, 4833) + tst = gdaltest.GDALTest("VRT", "utmsmall_ds_cubic.vrt", 1, 4833) return tst.testOpen() def test_warp_9(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_10(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" def test_warp_11(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'rgbsmall_dstalpha.vrt', 4, 30658) + 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') + 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 = 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) @@ -455,24 +457,25 @@ def test_warp_12(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'empty_rb.vrt', 4, 0) + tst = gdaltest.GDALTest("VRT", "empty_rb.vrt", 4, 0) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/empty.tif') + 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') + 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 = 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) @@ -480,24 +483,25 @@ def test_warp_13(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'empty_rc.vrt', 4, 0) + tst = gdaltest.GDALTest("VRT", "empty_rc.vrt", 4, 0) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/empty.tif') + 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') + 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 = 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) @@ -505,24 +509,25 @@ def test_warp_14(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'empty_rcs.vrt', 4, 0) + tst = gdaltest.GDALTest("VRT", "empty_rcs.vrt", 4, 0) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/empty.tif') + 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') + 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 = 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) @@ -530,24 +535,25 @@ def test_warp_15(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'test_nearest_float.vrt', 4, 0) + tst = gdaltest.GDALTest("VRT", "test_nearest_float.vrt", 4, 0) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/test.tif') + 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') + 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 = 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) @@ -555,24 +561,25 @@ def test_warp_16(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'test_nearest_float.vrt', 4, 4921) + tst = gdaltest.GDALTest("VRT", "test_nearest_float.vrt", 4, 4921) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/test.tif') + 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') + 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 = 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) @@ -580,24 +587,25 @@ def test_warp_17(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'test_nearest_short.vrt', 4, 0) + tst = gdaltest.GDALTest("VRT", "test_nearest_short.vrt", 4, 0) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/test.tif') + 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') + 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 = 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) @@ -605,21 +613,25 @@ def test_warp_18(): ds = None # The alpha channel must be empty - tst = gdaltest.GDALTest('VRT', 'test_nearest_short.vrt', 4, 4921) + tst = gdaltest.GDALTest("VRT", "test_nearest_short.vrt", 4, 4921) ret = tst.testOpen() - gdaltest.tiff_drv.Delete('tmp/test.tif') + gdaltest.tiff_drv.Delete("tmp/test.tif") return ret # Test all data types and resampling methods for very small images # to test edge behaviour -@pytest.mark.parametrize('size', [1, 2, 3, 7]) -@pytest.mark.parametrize('resampling_string', [ - 'near', 'bilinear', 'cubic', 'cubicspline', 'lanczos', 'average']) -@pytest.mark.parametrize('datatype', [ +@pytest.mark.parametrize("size", [1, 2, 3, 7]) +@pytest.mark.parametrize( + "resampling_string", + ["near", "bilinear", "cubic", "cubicspline", "lanczos", "average"], +) +@pytest.mark.parametrize( + "datatype", + [ gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_CInt16, @@ -632,24 +644,26 @@ def test_warp_18(): gdal.GDT_Float64, gdal.GDT_CFloat64, ], - ids=gdal.GetDataTypeName + ids=gdal.GetDataTypeName, ) def test_warp_19(tmpdir, size, datatype, resampling_string): - test_file = str(tmpdir.join('test.tif')) - warp_file = str(tmpdir.join('testwarp.tif')) + test_file = str(tmpdir.join("test.tif")) + warp_file = str(tmpdir.join("testwarp.tif")) - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create(test_file, 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.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(warp_file, test_file, options=f'-r {resampling_string}') + gdal.Warp(warp_file, test_file, options=f"-r {resampling_string}") ref_ds = gdal.Open(test_file) ds = gdal.Open(warp_file) @@ -668,27 +682,28 @@ def test_warp_19(tmpdir, size, datatype, resampling_string): # Test fix for #2724 (initialization of destination area to nodata in warped VRT) def test_warp_20(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'white_nodata.vrt', 1, 1705) + 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') + 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 = gdal.Open("tmp/warp_21.vrt", gdal.GA_Update) + ds.BuildOverviews("NEAR", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/warp_21.vrt') + ds = gdal.Open("tmp/warp_21.vrt") if ds.GetRasterBand(1).GetOverviewCount() != 1: pytest.skip() @@ -696,40 +711,44 @@ def test_warp_21(): ds = None - os.remove('tmp/warp_21.vrt') + os.remove("tmp/warp_21.vrt") + ############################################################################### # Test warping with datasets which are "bigger" than the wm parameter. # Would have detected issue of #3458 -@pytest.mark.parametrize('option1', ['', '-wo OPTIMIZE_SIZE=TRUE'], - ids=['default', 'optimizeSize']) -@pytest.mark.parametrize('option2', [ - '', - '-co TILED=YES', - '-co TILED=YES -co BLOCKXSIZE=16 -co BLOCKYSIZE=16', +@pytest.mark.parametrize( + "option1", ["", "-wo OPTIMIZE_SIZE=TRUE"], ids=["default", "optimizeSize"] +) +@pytest.mark.parametrize( + "option2", + [ + "", + "-co TILED=YES", + "-co TILED=YES -co BLOCKXSIZE=16 -co BLOCKYSIZE=16", ], - ids=['default', 'tiled', 'tiled16'] + ids=["default", "tiled", "tiled16"], ) def test_warp_22(tmpdir, option1, option2): - src = str(tmpdir.join('warp_22_src.tif')) - dst = str(tmpdir.join('warp_22_dst.tif')) + src = str(tmpdir.join("warp_22_src.tif")) + dst = str(tmpdir.join("warp_22_dst.tif")) # Generate source image with non uniform data w = 1001 h = 1001 - ds = gdal.GetDriverByName('GTiff').Create(src, w, h, 1) + ds = gdal.GetDriverByName("GTiff").Create(src, 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 = '' + line = "" for i in range(w): - line = line + '%c' % int((i * i + h * j / (i + 1)) % 256) + 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() @@ -737,7 +756,7 @@ def test_warp_22(tmpdir, option1, option2): # -wm should not be greater than 2 * w * h. Let's put it at its minimum # value. - gdal.Warp(dst, src, options=f'-wm 100000 {option1} {option2}') + gdal.Warp(dst, src, options=f"-wm 100000 {option1} {option2}") ds = gdal.Open(dst) cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs @@ -802,24 +821,27 @@ def test_warp_23(): sr = osr.SpatialReference() sr.ImportFromEPSG(4326) - ds = gdal.GetDriverByName('GTiff').Create('tmp/test3582.tif', 70, 170, 4, options=['SPARSE_OK=YES']) + 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' + ds = gdal.Warp("", "tmp/test3582.tif", format="MEM") + ret = "success" if ds is None: - gdaltest.post_reason('could not open output dataset') - ret = 'fail' + gdaltest.post_reason("could not open output dataset") + ret = "fail" ds = None - os.remove('tmp/test3582.tif') + 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) @@ -827,12 +849,13 @@ def test_warp_23(): def test_warp_24(): - ds_ref = gdal.Open('data/test3658.tif') + ds_ref = gdal.Open("data/test3658.tif") cs_ref = ds_ref.GetRasterBand(1).Checksum() - ds = gdal.Warp('', ds_ref, options='-of MEM -r bilinear') + ds = gdal.Warp("", ds_ref, options="-of MEM -r bilinear") cs = ds.GetRasterBand(1).Checksum() - assert cs == cs_ref, 'did not get expected checksum' + assert cs == cs_ref, "did not get expected checksum" + ############################################################################### # Test -refine_gcps (#4143) @@ -840,11 +863,12 @@ def test_warp_24(): def test_warp_25(): - ds = gdal.Open('data/refine_gcps.vrt') + ds = gdal.Open("data/refine_gcps.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - assert cs == 4672, 'did not get expected checksum' + assert cs == 4672, "did not get expected checksum" + ############################################################################### # Test serializing and deserializing TPS transformer @@ -852,20 +876,23 @@ def test_warp_25(): 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') + 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') + ds = gdal.Open("tmp/warp_25_warp.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - assert cs == 4672, 'did not get expected checksum' + assert cs == 4672, "did not get expected checksum" + + os.unlink("tmp/warp_25_gcp.vrt") + os.unlink("tmp/warp_25_warp.vrt") - 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 @@ -880,7 +907,7 @@ def warp_27_progress_callback(pct, message, user_data): def test_warp_27(): # Open source dataset - src_ds = gdal.Open('../gcore/data/byte.tif') + src_ds = gdal.Open("../gcore/data/byte.tif") # Desfine target SRS dst_srs = osr.SpatialReference() @@ -891,19 +918,22 @@ def test_warp_27(): 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) + 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 = 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) @@ -912,32 +942,37 @@ def test_warp_27(): 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 + 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') + 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') + 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') + 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 @@ -946,70 +981,72 @@ def test_warp_27(): def test_warp_28(): - ds = gdal.Open('data/utm_alpha_noinit.vrt') + 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' + 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') + 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') + 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) + 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') + 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) + 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') + 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') + 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) + 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') + 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) + 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 @@ -1022,7 +1059,7 @@ def warp_30_progress_callback(pct, message, user_data): def test_warp_30(): # Open source dataset - src_ds = gdal.Open('../gcore/data/byte.tif') + src_ds = gdal.Open("../gcore/data/byte.tif") # Desfine target SRS dst_srs = osr.SpatialReference() @@ -1033,19 +1070,22 @@ def test_warp_30(): 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) + 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 = 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) @@ -1054,140 +1094,151 @@ def test_warp_30(): 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.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 + 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) + gdal.SetConfigOption("GDAL_NUM_THREADS", old_val) assert ret != 0 - gdal.Unlink('/vsimem/warp_30.tif') + gdal.Unlink("/vsimem/warp_30.tif") + # Average (Byte) def test_warp_31(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Average (Float) def test_warp_32(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Mode (Byte) def test_warp_33(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Mode (Int16) def test_warp_34(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Mode (Int16 - signed with negative values) def test_warp_35(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + 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') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # Test a few error cases @@ -1196,11 +1247,12 @@ def test_warp_36(): def test_warp_37(): # Open source dataset - src_ds = gdal.Open('../gcore/data/byte.tif') + src_ds = gdal.Open("../gcore/data/byte.tif") # Dummy proj.4 method sr = osr.SpatialReference() - sr.ImportFromWkt("""PROJCS["unnamed", + sr.ImportFromWkt( + """PROJCS["unnamed", GEOGCS["unnamed ellipse", DATUM["unknown", SPHEROID["unnamed",6378137,298.257223563]], @@ -1208,15 +1260,17 @@ def test_warp_37(): UNIT["degree",0.0174532925199433]], PROJECTION["custom_proj4"], UNIT["Meter",1], - EXTENSION["PROJ4","+proj=dummy_method +units=m +wktext"]]""") + EXTENSION["PROJ4","+proj=dummy_method +units=m +wktext"]]""" + ) dst_wkt = sr.ExportToWkt() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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. @@ -1224,8 +1278,8 @@ def test_warp_37(): 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) + 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), @@ -1234,10 +1288,10 @@ def test_warp_38(): 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.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') + gdal.Warp(out_file, "data/test3658.tif", options="-to DST_METHOD=GCP_POLYNOMIAL") ds = gdal.Open(out_file) cs = ds.GetRasterBand(1).Checksum() @@ -1249,6 +1303,7 @@ def test_warp_38(): os.unlink(out_file) + ############################################################################### # Test a warp with GCPs for TPS on the *destination* image. @@ -1256,8 +1311,8 @@ def test_warp_38(): 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) + 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), @@ -1266,10 +1321,10 @@ def test_warp_39(): 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.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') + gdal.Warp(out_file, "data/test3658.tif", options="-to DST_METHOD=GCP_TPS") ds = gdal.Open(out_file) cs = ds.GetRasterBand(1).Checksum() @@ -1281,23 +1336,25 @@ def test_warp_39(): os.unlink(out_file) + ############################################################################### # test average (#5311) def test_warp_40(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # test weighted average @@ -1305,17 +1362,18 @@ def test_warp_40(): def test_warp_weighted_average(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - ds = gdal.Open('data/3by3_average.vrt') - ref_ds = gdal.Open('data/3by3_average.tif') + ds = gdal.Open("data/3by3_average.vrt") + ref_ds = gdal.Open("data/3by3_average.tif") maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None - assert maxdiff <= 1, 'Image too different from reference' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # test weighted average, with src offset (fix for #2665) @@ -1323,27 +1381,29 @@ def test_warp_weighted_average(): def test_warp_weighted_average_with_srcoffset(): - ds = gdal.Open('data/3by3_average_with_srcoffset.vrt') - val = struct.unpack('d', ds.ReadRaster(0, 0, 1, 1))[0] + ds = gdal.Open("data/3by3_average_with_srcoffset.vrt") + val = struct.unpack("d", ds.ReadRaster(0, 0, 1, 1))[0] assert val == pytest.approx(8.5, abs=1e-5) + ############################################################################### # test sum def test_warp_sum(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - ds = gdal.Open('data/3by3_sum.vrt') - ref_ds = gdal.Open('data/3by3_sum.tif') + ds = gdal.Open("data/3by3_sum.vrt") + ref_ds = gdal.Open("data/3by3_sum.tif") maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None - assert maxdiff <= 1, 'Image too different from reference' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # test GDALSuggestedWarpOutput (#5693) @@ -1351,7 +1411,8 @@ def test_warp_sum(): def test_warp_41(): - src_ds = gdal.Open(""" + src_ds = gdal.Open( + """ -2.0037508340000000e+07, 5.9716428339481353e-01, 0.0000000000000000e+00, 2.0037508340000000e+07, 0.0000000000000000e+00, -5.9716428339481353e-01 @@ -1362,9 +1423,12 @@ def test_warp_41(): -""") +""" + ) - vrt_ds = gdal.AutoCreateWarpedVRT(src_ds, None, None, gdal.GRA_NearestNeighbour, 0.3) + 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() @@ -1380,170 +1444,180 @@ def test_warp_41(): def test_warp_42(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Minimum def test_warp_43(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Median def test_warp_44(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Quartile 1 def test_warp_45(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Quartile 3 def test_warp_46(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Maximum (Int16 - signed with negative values) def test_warp_47(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Minimum (Int16 - signed with negative values) def test_warp_48(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + # Median (Int16 - signed with negative values) def test_warp_49(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + 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') + 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' + 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') + 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') + 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' + 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') + 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') + 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' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # Test fix for #6182 @@ -1551,7 +1625,7 @@ def test_warp_51(): def test_warp_52(): - src_ds = gdal.GetDriverByName('MEM').Create('', 4096, 4096, 3, gdal.GDT_UInt16) + src_ds = gdal.GetDriverByName("MEM").Create("", 4096, 4096, 3, gdal.GDT_UInt16) rpc = [ "HEIGHT_OFF=1466.05894327379", "HEIGHT_SCALE=144.837606185489", @@ -1566,58 +1640,71 @@ def test_warp_52(): "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" + "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) + 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 <= 10, 'processing time was way too long' + assert end - start <= 10, "processing time was way too long" cs = out_ds.GetRasterBand(4).Checksum() assert cs == 3188 + ############################################################################### # Test Grey+Alpha -@pytest.mark.parametrize('typestr', ('Byte', 'UInt16', 'Int16')) -@pytest.mark.parametrize('option', ('-wo USE_GENERAL_CASE=TRUE', ''), - ids=['generalCase', 'default']) -@pytest.mark.parametrize('alg_name, expected_cs', ( - pytest.param('near', [1192], id='near'), - pytest.param('cubic', [1061], id='cubic'), - pytest.param('cubicspline', [1252], id='cubicspline'), - pytest.param('bilinear', [1206, 1204], id='bilinear'), -)) +@pytest.mark.parametrize("typestr", ("Byte", "UInt16", "Int16")) +@pytest.mark.parametrize( + "option", ("-wo USE_GENERAL_CASE=TRUE", ""), ids=["generalCase", "default"] +) +@pytest.mark.parametrize( + "alg_name, expected_cs", + ( + pytest.param("near", [1192], id="near"), + pytest.param("cubic", [1061], id="cubic"), + pytest.param("cubicspline", [1252], id="cubicspline"), + pytest.param("bilinear", [1206, 1204], id="bilinear"), + ), +) def test_warp_53(typestr, option, alg_name, expected_cs): - src_ds = gdal.Translate('', '../gcore/data/byte.tif', - options=f'-a_srs EPSG:32611 -of MEM -b 1 -b 1 -ot {typestr}') + src_ds = gdal.Translate( + "", + "../gcore/data/byte.tif", + options=f"-a_srs EPSG:32611 -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='-outsize 10 10 -of MEM -a_srs EPSG:32611') + 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="-outsize 10 10 -of MEM -a_srs EPSG:32611" + ) dst_ds.GetRasterBand(1).Fill(0) dst_ds.GetRasterBand(2).Fill(0) - gdal.Warp(dst_ds, src_ds, options=f'-r {alg_name} {option}') + gdal.Warp(dst_ds, src_ds, options=f"-r {alg_name} {option}") cs1 = dst_ds.GetRasterBand(1).Checksum() cs2 = dst_ds.GetRasterBand(2).Checksum() assert cs1 in expected_cs @@ -1628,43 +1715,53 @@ def test_warp_53(typestr, option, alg_name, expected_cs): # Test Alpha on UInt16/Int16 -@pytest.mark.parametrize('use_optim', ['YES', 'NO']) +@pytest.mark.parametrize("use_optim", ["YES", "NO"]) def test_warp_54(use_optim): # 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') - with gdaltest.config_option('GDAL_WARP_USE_TRANSLATION_OPTIM', use_optim): - dst_ds = gdal.Warp('', src_ds, format='MEM') + 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", + ) + with gdaltest.config_option("GDAL_WARP_USE_TRANSLATION_OPTIM", use_optim): + 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') - with gdaltest.config_option('GDAL_WARP_USE_TRANSLATION_OPTIM', use_optim): - dst_ds = gdal.Warp('', src_ds, format='MEM') + 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", + ) + with gdaltest.config_option("GDAL_WARP_USE_TRANSLATION_OPTIM", use_optim): + 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') + 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') - with gdaltest.config_option('GDAL_WARP_USE_TRANSLATION_OPTIM', use_optim): - dst_ds = gdal.Warp('/vsimem/warp_54.tif', src_ds, options='-co NBITS=15') + src_ds.GetRasterBand(i + 1).SetMetadataItem("NBITS", "15", "IMAGE_STRUCTURE") + with gdaltest.config_option("GDAL_WARP_USE_TRANSLATION_OPTIM", use_optim): + 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') + gdal.Unlink("/vsimem/warp_54.tif") + ############################################################################### # Test warped VRT with source overview, target GT != GenImgProjection target GT @@ -1673,133 +1770,138 @@ def test_warp_54(use_optim): def test_warp_55(): - ds = gdal.Open('data/warpedvrt_with_ovr.vrt') + 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. -@pytest.mark.parametrize('use_optim', ['YES', 'NO']) +@pytest.mark.parametrize("use_optim", ["YES", "NO"]) def test_warp_56(use_optim): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - 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]) + 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]) - with gdaltest.config_option('GDAL_WARP_USE_TRANSLATION_OPTIM', use_optim): - gdal.Warp(pix_ds, src_ds, resampleAlg='bilinear') + pix_ds.SetGeoTransform([off + 1, 1, 0, off + 1, 0, 1]) + with gdaltest.config_option("GDAL_WARP_USE_TRANSLATION_OPTIM", use_optim): + gdal.Warp(pix_ds, src_ds, resampleAlg="bilinear") - exp = 0 if off < 1 else 100 * (off - 1)**2 + exp = 0 if off < 1 else 100 * (off - 1) ** 2 warped = pix_ds.GetRasterBand(1).ReadAsArray()[0, 0] - assert warped == pytest.approx(exp, abs=0.6), \ - 'offset: {}, expected: {:.0f}, got: {}'.format(off, exp, warped) + assert warped == pytest.approx( + exp, abs=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 = 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(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()) + 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() + ) ############################################################################### # Test bugfix for #2365 + def test_warp_med_out_of_bounds_src_pixels(): - ds = gdal.Open('data/test_bug_2365_wraped_med.vrt') + ds = gdal.Open("data/test_bug_2365_wraped_med.vrt") cs = ds.GetRasterBand(1).Checksum() assert cs == 0 ds = None + ############################################################################### # Test fix for #2460 def test_warp_rpc_source_has_geotransform(): - out_ds = gdal.Warp('', 'data/test_rpc_with_gt_bug_2460.tif', - format='MEM', - transformerOptions=['METHOD=RPC', 'RPC_HEIGHT=1118']) + out_ds = gdal.Warp( + "", + "data/test_rpc_with_gt_bug_2460.tif", + format="MEM", + transformerOptions=["METHOD=RPC", "RPC_HEIGHT=1118"], + ) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 60397 + ############################################################################### # Test RMS resampling + def test_warp_ds_rms(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_rms.vrt', 1, 4926) + tst = gdaltest.GDALTest("VRT", "utmsmall_ds_rms.vrt", 1, 4926) return tst.testOpen() + def test_warp_rms_1(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - tst = gdaltest.GDALTest('VRT', 'utmsmall_rms_float.vrt', 1, 29819) + tst = gdaltest.GDALTest("VRT", "utmsmall_rms_float.vrt", 1, 29819) return tst.testOpen() + def test_warp_rms_2(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") if gdaltest.tiff_drv is None: pytest.skip() - ds = gdal.Open('data/utmsmall_rms.vrt') + ds = gdal.Open("data/utmsmall_rms.vrt") # 29818 on non-Intel archs - assert ds.GetRasterBand(1).Checksum() in (29818, - 29819, - 29828, # Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 - ) + assert ds.GetRasterBand(1).Checksum() in ( + 29818, + 29819, + 29828, # Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 + ) def test_warp_mode_ties(): # when performing mode resampling the result in case of a tie will be # the first value identified as the mode in scanline processing - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - src_ds = gdal.GetDriverByName('MEM').Create('', 3, 3, 1, gdal.GDT_Int16) - src_ds.SetGeoTransform([1, 1, 0, - 1, 0, 1]) - src_ds.GetRasterBand(1).WriteArray(numpy.array([[1, 1, 1], - [2, 3, 4], - [5, 5, 5]])) - out_ds = gdal.Warp('', src_ds, format='MEM', resampleAlg='mode', xRes=3, yRes=3) + src_ds = gdal.GetDriverByName("MEM").Create("", 3, 3, 1, gdal.GDT_Int16) + src_ds.SetGeoTransform([1, 1, 0, 1, 0, 1]) + src_ds.GetRasterBand(1).WriteArray(numpy.array([[1, 1, 1], [2, 3, 4], [5, 5, 5]])) + out_ds = gdal.Warp("", src_ds, format="MEM", resampleAlg="mode", xRes=3, yRes=3) assert out_ds.GetRasterBand(1).ReadAsArray()[0, 0] == 1 - src_ds.GetRasterBand(1).WriteArray(numpy.array([[1, 5, 1], - [2, 5, 4], - [5, 1, 0]])) - out_ds = gdal.Warp('', src_ds, format='MEM', resampleAlg='mode', xRes=3, yRes=3) + src_ds.GetRasterBand(1).WriteArray(numpy.array([[1, 5, 1], [2, 5, 4], [5, 1, 0]])) + out_ds = gdal.Warp("", src_ds, format="MEM", resampleAlg="mode", xRes=3, yRes=3) assert out_ds.GetRasterBand(1).ReadAsArray()[0, 0] == 5 diff --git a/autotest/conftest.py b/autotest/conftest.py index 29bb354d334a..9c605bb6510b 100755 --- a/autotest/conftest.py +++ b/autotest/conftest.py @@ -17,17 +17,20 @@ # 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", - "gdrivers/generate_bag.py", - "gdrivers/generate_fits.py"] +collect_ignore = [ + "kml_generate_test_files.py", + "gdrivers/netcdf_cfchecks.py", + "gdrivers/generate_bag.py", + "gdrivers/generate_fits.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: +if "APPLY_LOCALE" in os.environ: import locale - locale.setlocale(locale.LC_ALL, '') + + locale.setlocale(locale.LC_ALL, "") @pytest.fixture(scope="module", autouse=True) @@ -62,16 +65,16 @@ def pytest_collection_modifyitems(config, items): drivers_checked = {} for item in items: - for mark in item.iter_markers('require_driver'): + 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) + 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'): + 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) diff --git a/autotest/gcore/aaigrid_read.py b/autotest/gcore/aaigrid_read.py index ea769b3fff98..cad2e1b83c81 100755 --- a/autotest/gcore/aaigrid_read.py +++ b/autotest/gcore/aaigrid_read.py @@ -25,24 +25,23 @@ # Boston, MA 02111-1307, USA. ############################################################################### -import pytest - import gdaltest +import pytest ############################################################################### # When imported build a list of units based on the files available. init_list = [ - ('byte.tif.grd', 4672), + ("byte.tif.grd", 4672), ] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('AAIGrid') +@pytest.mark.require_driver("AAIGrid") def test_aaigrid_open(filename, checksum): - ut = gdaltest.GDALTest('AAIGrid', filename, 1, checksum) + ut = gdaltest.GDALTest("AAIGrid", filename, 1, checksum) ut.testOpen() diff --git a/autotest/gcore/aaigrid_write.py b/autotest/gcore/aaigrid_write.py index e840e526de6a..e4028b2898a7 100755 --- a/autotest/gcore/aaigrid_write.py +++ b/autotest/gcore/aaigrid_write.py @@ -26,27 +26,27 @@ # Boston, MA 02111-1307, USA. ############################################################################### -import pytest - import gdaltest +import pytest ############################################################################### # 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)] + ("byte.tif", 4672), + ("int16.tif", 4672), + ("uint16.tif", 4672), + ("float32.tif", 4672), + ("utmsmall.tif", 50054), +] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('AAIGrid') +@pytest.mark.require_driver("AAIGrid") def test_aaigrid_create(filename, checksum): - ut = gdaltest.GDALTest('AAIGrid', filename, 1, checksum) + ut = gdaltest.GDALTest("AAIGrid", filename, 1, checksum) ut.testCreateCopy() diff --git a/autotest/gcore/asyncreader.py b/autotest/gcore/asyncreader.py index 5582e68399bb..2ea1f098a9a7 100755 --- a/autotest/gcore/asyncreader.py +++ b/autotest/gcore/asyncreader.py @@ -29,7 +29,6 @@ ############################################################################### - from osgeo import gdal ############################################################################### @@ -38,16 +37,23 @@ def test_asyncreader_1(): - ds = gdal.Open('data/rgbsmall.tif') + 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()' + 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 = 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)] @@ -55,12 +61,9 @@ def test_asyncreader_1(): ds = None out_ds = None - gdal.Unlink('/vsimem/asyncresult.tif') + 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)) - - - - - + assert csum == expected_cs[i], "did not get expected checksum for band %d" % ( + i + 1 + ) diff --git a/autotest/gcore/basic_test.py b/autotest/gcore/basic_test.py index f8adb597892b..60225a49659c 100755 --- a/autotest/gcore/basic_test.py +++ b/autotest/gcore/basic_test.py @@ -33,38 +33,41 @@ import subprocess import sys - import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + # 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 + 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.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()) + pytest.fail("did not get expected error message, got %s" % gdal.GetLastErrorMsg()) -@pytest.mark.skipif(sys.platform != 'linux', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "linux", reason="Incorrect platform") def test_basic_test_strace_non_existing_file(): python_exe = sys.executable - cmd = "strace -f %s -c \"from osgeo import gdal; " % python_exe + ( - "gdal.OpenEx('non_existing_ds', gdal.OF_RASTER)" - " \" ") + 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: @@ -72,50 +75,51 @@ def test_basic_test_strace_non_existing_file(): pytest.skip() interesting_lines = [] - for line in err.split('\n'): - if 'non_existing_ds' in line: - interesting_lines += [ line ] + 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' + 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.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()) + 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.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()) + 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.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()) + 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.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' + 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 @@ -125,6 +129,7 @@ def test_basic_test_6(): gdal.AllRegister() gdal.AllRegister() + ############################################################################### # Test fix for #3077 (check that errors are cleared when using UseExceptions()) @@ -132,22 +137,26 @@ def test_basic_test_6(): def basic_test_7_internal(): with pytest.raises(Exception): - gdal.Open('non_existing_ds', gdal.GA_ReadOnly) + 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()) + 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 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' + 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' + assert gdal.GetLastErrorType() == 0, "got unexpected error type" def test_basic_test_7(): @@ -158,38 +167,36 @@ def test_basic_test_7(): gdal.DontUseExceptions() return ret + ############################################################################### # Test gdal.VersionInfo('RELEASE_DATE') and gdal.VersionInfo('LICENSE') def test_basic_test_8(): - ret = gdal.VersionInfo('RELEASE_DATE') + ret = gdal.VersionInfo("RELEASE_DATE") assert len(ret) == 8 python_exe = sys.executable - if sys.platform == 'win32': - python_exe = python_exe.replace('\\', '/') + if sys.platform == "win32": + python_exe = python_exe.replace("\\", "/") - license_text = gdal.VersionInfo('LICENSE') + license_text = gdal.VersionInfo("LICENSE") assert ( - license_text.startswith('GDAL/OGR is released under the MIT license') - or 'GDAL/OGR Licensing' in license_text + license_text.startswith("GDAL/OGR is released under the MIT 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') + 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') - ) + [sys.executable, "basic_test_subprocess.py"], env=env + ).decode("utf-8") + os.unlink("tmp/LICENSE.TXT") + assert license_text.startswith("fake_license") ############################################################################### @@ -206,16 +213,17 @@ def test_basic_test_9(): gdaltest.eErrClass = 0 gdaltest.err_no = 0 - gdaltest.msg = '' + gdaltest.msg = "" gdal.PushErrorHandler(my_python_error_handler) - gdal.Error(1, 2, 'test') + gdal.Error(1, 2, "test") gdal.PopErrorHandler() assert gdaltest.eErrClass == 1 assert gdaltest.err_no == 2 - assert gdaltest.msg == 'test' + assert gdaltest.msg == "test" + ############################################################################### # Test gdal.PushErrorHandler() with a Python error handler as a method (#5186) @@ -237,19 +245,20 @@ 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.Error(1, 2, "test") gdal.PopErrorHandler() error_handler = my_python_error_handler_class() gdal.PushErrorHandler(error_handler.handler) - gdal.Error(1, 2, 'test') + gdal.Error(1, 2, "test") gdal.PopErrorHandler() assert error_handler.eErrClass == 1 assert error_handler.err_no == 2 - assert error_handler.msg == 'test' + assert error_handler.msg == "test" + ############################################################################### # Test gdal.OpenEx() @@ -257,90 +266,95 @@ def test_basic_test_10(): def test_basic_test_11(): - ds = gdal.OpenEx('data/byte.tif') + ds = gdal.OpenEx("data/byte.tif") assert ds is not None - ds = gdal.OpenEx('data/byte.tif', gdal.OF_RASTER) + ds = gdal.OpenEx("data/byte.tif", gdal.OF_RASTER) assert ds is not None - ds = gdal.OpenEx('data/byte.tif', gdal.OF_VECTOR) + 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) + 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) + ds = gdal.OpenEx("data/byte.tif", gdal.OF_ALL) assert ds is not None - ds = gdal.OpenEx('data/byte.tif', gdal.OF_UPDATE) + 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) + 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=[]) + ds = gdal.OpenEx("data/byte.tif", allowed_drivers=[]) assert ds is not None - ds = gdal.OpenEx('data/byte.tif', allowed_drivers=['GTiff']) + ds = gdal.OpenEx("data/byte.tif", allowed_drivers=["GTiff"]) assert ds is not None - ds = gdal.OpenEx('data/byte.tif', allowed_drivers=['PNG']) + 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']) + 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)] + 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) + ds = gdal.OpenEx("../ogr/data/poly.shp", gdal.OF_RASTER) assert ds is None - ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) + 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']) + 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) + 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() == '' + 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.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.OpenEx("non existing", gdal.OF_VERBOSE_ERROR) gdal.PopErrorHandler() - assert ds is None and gdal.GetLastErrorMsg() != '' + assert ds is None and gdal.GetLastErrorMsg() != "" old_use_exceptions_status = gdal.GetUseExceptions() gdal.UseExceptions() got_exception = False try: - ds = gdal.OpenEx('non existing') + 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' + 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' + assert lyr.GetDescription() == "foo" from osgeo import ogr + assert lyr.TestCapability(ogr.OLCCreateField) == 1 assert ds.GetLayerCount() == 1 lyr = ds.GetLayerByName("foo") @@ -350,23 +364,24 @@ def test_basic_test_12(): lyr = ds.GetLayer(0) assert lyr is not None assert not ds.IsLayerPrivate(0) - sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') + sql_lyr = ds.ExecuteSQL("SELECT * FROM foo") assert sql_lyr is not None ds.ReleaseResultSet(sql_lyr) - new_lyr = ds.CopyLayer(lyr, 'bar') + new_lyr = ds.CopyLayer(lyr, "bar") assert new_lyr is not None assert ds.DeleteLayer(0) == 0 - assert ds.DeleteLayer('bar') == 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) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) for i in range(3): if i == 0: ds.SetMetadataItem("ScaleBounds", "True") @@ -381,18 +396,18 @@ def test_basic_test_13(): 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' + 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) + 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 + assert ds.GetMetadataItem("FILENAME_%d" % i) == "%d" % i ############################################################################### @@ -401,70 +416,70 @@ def test_basic_test_13(): def test_basic_test_14(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) - ds.SetMetadata('foo') - assert ds.GetMetadata_List() == ['foo'] + 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'] + ds.SetMetadata(["foo=bar"]) + assert ds.GetMetadata_List() == ["foo=bar"] with gdaltest.error_handler(): with pytest.raises(Exception): ds.SetMetadata([5]) + ds.SetMetadata({"foo": "baz"}) + assert ds.GetMetadata_List() == ["foo=baz"] - ds.SetMetadata({'foo': 'baz'}) - assert ds.GetMetadata_List() == ['foo=baz'] - - ds.SetMetadata({'foo': b'baz'}) - assert ds.GetMetadata_List() == ['foo=baz'] + ds.SetMetadata({"foo": b"baz"}) + assert ds.GetMetadata_List() == ["foo=baz"] with gdaltest.error_handler(): with pytest.raises(Exception): - ds.SetMetadata({'foo': b'zero_byte_in_string\0'}) + ds.SetMetadata({"foo": b"zero_byte_in_string\0"}) - ds.SetMetadata({'foo': 5}) - assert ds.GetMetadata_List() == ['foo=5'] + ds.SetMetadata({"foo": 5}) + assert ds.GetMetadata_List() == ["foo=5"] - ds.SetMetadata({5: 'baz'}) - assert ds.GetMetadata_List() == ['5=baz'] + ds.SetMetadata({5: "baz"}) + assert ds.GetMetadata_List() == ["5=baz"] ds.SetMetadata({5: 6}) - assert ds.GetMetadata_List() == ['5=6'] + assert ds.GetMetadata_List() == ["5=6"] - val = '\u00e9ven' + val = "\u00e9ven" - ds.SetMetadata({'bar': val}) - assert ds.GetMetadata()['bar'] == val + ds.SetMetadata({"bar": val}) + assert ds.GetMetadata()["bar"] == val - ds.SetMetadata({val: 'baz'}) - assert ds.GetMetadata()[val] == 'baz' + ds.SetMetadata({val: "baz"}) + assert ds.GetMetadata()[val] == "baz" ds.SetMetadata({val: 5}) - assert ds.GetMetadata_List() == ['\u00e9ven=5'] + assert ds.GetMetadata_List() == ["\u00e9ven=5"] ds.SetMetadata({5: val}) - assert ds.GetMetadata_List() == ['5=\u00e9ven'] + assert ds.GetMetadata_List() == ["5=\u00e9ven"] class ClassWithoutStrRepr: def __init__(self): pass + def __str__(self): - raise Exception('no string representation') + raise Exception("no string representation") with pytest.raises(Exception): - ds.SetMetadata({'a': ClassWithoutStrRepr()}) + ds.SetMetadata({"a": ClassWithoutStrRepr()}) with pytest.raises(Exception): - ds.SetMetadata({ClassWithoutStrRepr(): 'a'}) + ds.SetMetadata({ClassWithoutStrRepr(): "a"}) + + ds.SetMetadata([b"foo=\xE8\x03"]) + assert ds.GetMetadata_List() == [b"foo=\xe8\x03"] - ds.SetMetadata([b'foo=\xE8\x03']) - assert ds.GetMetadata_List() == [b'foo=\xe8\x03'] ############################################################################### # Test errors with progress callback @@ -481,29 +496,37 @@ def basic_test_15_cbk_no_ret(a, b, c): def basic_test_15_cbk_bad_ret(a, b, c): # pylint: disable=unused-argument - return 'ok' + return "ok" def test_basic_test_15(): - mem_driver = gdal.GetDriverByName('MEM') + 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') - + 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) + 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) + 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) + 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 @ @@ -511,15 +534,18 @@ def test_basic_test_15(): def test_basic_test_16(): gdal.ErrorReset() - gdal.OpenEx('data/byte.tif', open_options=['@UNRECOGNIZED=FOO']) - assert gdal.GetLastErrorMsg() == '' + 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') + 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 'Invalid value for NUM_THREADS: INVALID' in gdal.GetLastErrorMsg() + gdal.OpenEx( + "/vsimem/temp.tif", gdal.OF_UPDATE, open_options=["@NUM_THREADS=INVALID"] + ) + gdal.Unlink("/vsimem/temp.tif") + assert "Invalid value for NUM_THREADS: INVALID" in gdal.GetLastErrorMsg() + ############################################################################### # Test mix of gdal/ogr.UseExceptions()/DontUseExceptions() @@ -534,11 +560,11 @@ def test_basic_test_17(): gdal.UseExceptions() flag = False try: - gdal.Open('do_not_exist') + gdal.Open("do_not_exist") flag = True except RuntimeError: pass - assert not flag, 'expected failure' + assert not flag, "expected failure" gdal.DontUseExceptions() ogr.DontUseExceptions() assert not gdal.GetUseExceptions() @@ -565,25 +591,25 @@ def test_basic_test_17_part_2(): except: gdal.DontUseExceptions() ogr.DontUseExceptions() - assert not flag, 'expected failure' + assert not flag, "expected failure" assert not gdal.GetUseExceptions() assert not ogr.GetUseExceptions() def test_gdal_getspatialref(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") assert ds.GetSpatialRef() is not None - ds = gdal.Open('data/minfloat.tif') + ds = gdal.Open("data/minfloat.tif") assert ds.GetSpatialRef() is None def test_gdal_setspatialref(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") sr = ds.GetSpatialRef() - ds = gdal.GetDriverByName('MEM').Create('',1,1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) assert ds.SetSpatialRef(sr) == gdal.CE_None sr_got = ds.GetSpatialRef() assert sr_got @@ -592,18 +618,18 @@ def test_gdal_setspatialref(): def test_gdal_getgcpspatialref(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") assert ds.GetGCPSpatialRef() is None - ds = gdal.Open('data/byte_gcp.tif') + ds = gdal.Open("data/byte_gcp.tif") assert ds.GetGCPSpatialRef() is not None def test_gdal_setgcpspatialref(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") sr = ds.GetSpatialRef() - ds = gdal.GetDriverByName('MEM').Create('',1,1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) gcp = gdal.GCP() gcp.GCPPixel = 0 gcp.GCPLine = 0 @@ -617,111 +643,109 @@ def test_gdal_setgcpspatialref(): def test_gdal_getdatatypename(): - assert gdal.GetDataTypeName(gdal.GDT_Byte) == 'Byte' + assert gdal.GetDataTypeName(gdal.GDT_Byte) == "Byte" with pytest.raises(Exception): gdal.GetDataTypeName(-1) with pytest.raises(Exception): gdal.GetDataTypeName(100) with pytest.raises(Exception): - gdal.GetDataTypeName('invalid') + gdal.GetDataTypeName("invalid") def test_gdal_EscapeString(): - assert gdal.EscapeString( '', scheme = gdal.CPLES_XML ) == '' - - assert gdal.EscapeString( b'', scheme = gdal.CPLES_XML ) == b'' - - assert gdal.EscapeString( '&', gdal.CPLES_XML ) == '&' - - assert gdal.EscapeString( '<', gdal.CPLES_XML ) == '<' + assert gdal.EscapeString("", scheme=gdal.CPLES_XML) == "" - assert gdal.EscapeString( '>', gdal.CPLES_XML ) == '>' + assert gdal.EscapeString(b"", scheme=gdal.CPLES_XML) == b"" - assert gdal.EscapeString( '"', gdal.CPLES_XML ) == '"' + assert gdal.EscapeString("&", gdal.CPLES_XML) == "&" - assert gdal.EscapeString( b'\xEF\xBB\xBF', gdal.CPLES_XML ) == b'' + assert gdal.EscapeString("<", gdal.CPLES_XML) == "<" - assert gdal.EscapeString( '\t', gdal.CPLES_XML ) == '\t' + assert gdal.EscapeString(">", gdal.CPLES_XML) == ">" - assert gdal.EscapeString( '\n', gdal.CPLES_XML ) == '\n' + assert gdal.EscapeString('"', gdal.CPLES_XML) == """ - assert gdal.EscapeString( b'\x01a', gdal.CPLES_XML ) == b'a' + assert gdal.EscapeString(b"\xEF\xBB\xBF", gdal.CPLES_XML) == b"" + assert gdal.EscapeString("\t", gdal.CPLES_XML) == "\t" - assert gdal.EscapeString( '', gdal.CPLES_XML_BUT_QUOTES ) == '' + assert gdal.EscapeString("\n", gdal.CPLES_XML) == "\n" - assert gdal.EscapeString( '&', gdal.CPLES_XML_BUT_QUOTES ) == '&' + assert gdal.EscapeString(b"\x01a", gdal.CPLES_XML) == b"a" - assert gdal.EscapeString( '<', gdal.CPLES_XML_BUT_QUOTES ) == '<' + assert gdal.EscapeString("", gdal.CPLES_XML_BUT_QUOTES) == "" - assert gdal.EscapeString( '>', gdal.CPLES_XML_BUT_QUOTES ) == '>' + assert gdal.EscapeString("&", gdal.CPLES_XML_BUT_QUOTES) == "&" - assert gdal.EscapeString( '"', gdal.CPLES_XML_BUT_QUOTES ) == '"' + assert gdal.EscapeString("<", gdal.CPLES_XML_BUT_QUOTES) == "<" - assert gdal.EscapeString( b'\xEF\xBB\xBF', gdal.CPLES_XML_BUT_QUOTES ) == b'' + assert gdal.EscapeString(">", gdal.CPLES_XML_BUT_QUOTES) == ">" - assert gdal.EscapeString( '\t', gdal.CPLES_XML_BUT_QUOTES ) == '\t' + assert gdal.EscapeString('"', gdal.CPLES_XML_BUT_QUOTES) == '"' - assert gdal.EscapeString( '\n', gdal.CPLES_XML_BUT_QUOTES ) == '\n' + assert gdal.EscapeString(b"\xEF\xBB\xBF", gdal.CPLES_XML_BUT_QUOTES) == b"" - assert gdal.EscapeString( b'\x01a', gdal.CPLES_XML_BUT_QUOTES ) == b'a' + assert gdal.EscapeString("\t", gdal.CPLES_XML_BUT_QUOTES) == "\t" + assert gdal.EscapeString("\n", gdal.CPLES_XML_BUT_QUOTES) == "\n" - assert gdal.EscapeString( '', gdal.CPLES_BackslashQuotable ) == '' + assert gdal.EscapeString(b"\x01a", gdal.CPLES_XML_BUT_QUOTES) == b"a" - assert gdal.EscapeString( 'a', gdal.CPLES_BackslashQuotable ) == 'a' + assert gdal.EscapeString("", gdal.CPLES_BackslashQuotable) == "" - assert gdal.EscapeString( b'\x00x', gdal.CPLES_BackslashQuotable ) == b'\\0x' + assert gdal.EscapeString("a", gdal.CPLES_BackslashQuotable) == "a" - assert gdal.EscapeString( b'\x01', gdal.CPLES_BackslashQuotable ) == b'\x01' + assert gdal.EscapeString(b"\x00x", gdal.CPLES_BackslashQuotable) == b"\\0x" - assert gdal.EscapeString( '\\', gdal.CPLES_BackslashQuotable ) == '\\\\' + assert gdal.EscapeString(b"\x01", gdal.CPLES_BackslashQuotable) == b"\x01" - assert gdal.EscapeString( '\n', gdal.CPLES_BackslashQuotable ) == '\\n' + assert gdal.EscapeString("\\", gdal.CPLES_BackslashQuotable) == "\\\\" - assert gdal.EscapeString( '"', gdal.CPLES_BackslashQuotable ) == '\\"' + assert gdal.EscapeString("\n", gdal.CPLES_BackslashQuotable) == "\\n" + assert gdal.EscapeString('"', gdal.CPLES_BackslashQuotable) == '\\"' - assert gdal.EscapeString( '', gdal.CPLES_URL ) == '' + assert gdal.EscapeString("", gdal.CPLES_URL) == "" - assert gdal.EscapeString( 'aZAZ09$-_.+!*\'(), ', gdal.CPLES_URL ) == 'aZAZ09$-_.+!*\'(),%20' - - - assert gdal.EscapeString( "", gdal.CPLES_SQL ) == "" + assert ( + gdal.EscapeString("aZAZ09$-_.+!*'(), ", gdal.CPLES_URL) + == "aZAZ09$-_.+!*'(),%20" + ) - assert gdal.EscapeString( "a", gdal.CPLES_SQL ) == "a" + assert gdal.EscapeString("", gdal.CPLES_SQL) == "" - assert gdal.EscapeString( "a'a", gdal.CPLES_SQL ) == "a''a" + assert gdal.EscapeString("a", gdal.CPLES_SQL) == "a" + assert gdal.EscapeString("a'a", gdal.CPLES_SQL) == "a''a" - assert gdal.EscapeString( "", gdal.CPLES_CSV ) == "" + assert gdal.EscapeString("", gdal.CPLES_CSV) == "" - assert gdal.EscapeString( "a'b", gdal.CPLES_CSV ) == "a'b" + assert gdal.EscapeString("a'b", gdal.CPLES_CSV) == "a'b" - assert gdal.EscapeString( 'a"b', gdal.CPLES_CSV ) == '"a""b"' + assert gdal.EscapeString('a"b', gdal.CPLES_CSV) == '"a""b"' - assert gdal.EscapeString( 'a,b', gdal.CPLES_CSV ) == '"a,b"' + assert gdal.EscapeString("a,b", gdal.CPLES_CSV) == '"a,b"' - assert gdal.EscapeString( 'a,b', gdal.CPLES_CSV ) == '"a,b"' + assert gdal.EscapeString("a,b", gdal.CPLES_CSV) == '"a,b"' - assert gdal.EscapeString( 'a\tb', gdal.CPLES_CSV ) == '"a\tb"' + assert gdal.EscapeString("a\tb", gdal.CPLES_CSV) == '"a\tb"' - assert gdal.EscapeString( 'a\nb', gdal.CPLES_CSV ) == '"a\nb"' + assert gdal.EscapeString("a\nb", gdal.CPLES_CSV) == '"a\nb"' - assert gdal.EscapeString( 'a\rb', gdal.CPLES_CSV ) == '"a\rb"' + assert gdal.EscapeString("a\rb", gdal.CPLES_CSV) == '"a\rb"' def test_gdal_EscapeString_errors(): if sys.maxsize > 2**32: - pytest.skip('Test not available on 64 bit') + pytest.skip("Test not available on 64 bit") # Allocation will be < 4 GB, but will fail being > 2 GB - assert gdal.EscapeString( b'"' * (((1 << 32)-1) // 6), gdal.CPLES_XML ) is None + assert gdal.EscapeString(b'"' * (((1 << 32) - 1) // 6), gdal.CPLES_XML) is None # Allocation will be > 4 GB - assert gdal.EscapeString( b'"' * (((1 << 32)-1) // 6 + 1), gdal.CPLES_XML ) is None + assert gdal.EscapeString(b'"' * (((1 << 32) - 1) // 6 + 1), gdal.CPLES_XML) is None def test_gdal_DataTypeUnion(): diff --git a/autotest/gcore/basic_test_subprocess.py b/autotest/gcore/basic_test_subprocess.py index a6142521ee73..34e2a8cd23a4 100755 --- a/autotest/gcore/basic_test_subprocess.py +++ b/autotest/gcore/basic_test_subprocess.py @@ -31,7 +31,6 @@ from osgeo import gdal - -if __name__ == '__main__': +if __name__ == "__main__": # test_basic_test_8 - print(gdal.VersionInfo('LICENSE')) + print(gdal.VersionInfo("LICENSE")) diff --git a/autotest/gcore/bmp_read.py b/autotest/gcore/bmp_read.py index 4c9dd18b55c5..bfb099f38c2e 100755 --- a/autotest/gcore/bmp_read.py +++ b/autotest/gcore/bmp_read.py @@ -27,49 +27,53 @@ ############################################################################### -import pytest - import gdaltest - +import pytest init_list = [ - ('1bit.bmp', 200), - ('4bit_pal.bmp', 2587), - ('8bit_pal.bmp', 4672), - ('byte_rle8.bmp', 4672)] + ("1bit.bmp", 200), + ("4bit_pal.bmp", 2587), + ("8bit_pal.bmp", 4672), + ("byte_rle8.bmp", 4672), +] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('BMP') +@pytest.mark.require_driver("BMP") def test_bmp_open(filename, checksum): - ut = gdaltest.GDALTest('BMP', filename, 1, 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'): + 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) + 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'): + 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) + 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() - - - diff --git a/autotest/gcore/bmp_write.py b/autotest/gcore/bmp_write.py index e7140485528f..b03a45ec34a3 100755 --- a/autotest/gcore/bmp_write.py +++ b/autotest/gcore/bmp_write.py @@ -28,9 +28,8 @@ ############################################################################### -import pytest - import gdaltest +import pytest ############################################################################### # Test creating an in memory copy. @@ -38,7 +37,7 @@ def test_bmp_vsimem(): - tst = gdaltest.GDALTest('BMP', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("BMP", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) @@ -47,27 +46,26 @@ def test_bmp_vsimem(): # When imported build a list of units based on the files available. - init_list = [ - ('byte.tif', 4672), - ('utmsmall.tif', 50054), - ('8bit_pal.bmp', 4672), ] + ("byte.tif", 4672), + ("utmsmall.tif", 50054), + ("8bit_pal.bmp", 4672), +] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + ], ) -@pytest.mark.require_driver('BMP') +@pytest.mark.require_driver("BMP") def test_bmp_create(filename, checksum, testfunction): - ut = gdaltest.GDALTest('BMP', filename, 1, checksum) + ut = gdaltest.GDALTest("BMP", filename, 1, checksum) getattr(ut, testfunction)() - - diff --git a/autotest/gcore/cog.py b/autotest/gcore/cog.py index 820943cb4099..e702bbf26906 100755 --- a/autotest/gcore/cog.py +++ b/autotest/gcore/cog.py @@ -29,16 +29,15 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import pytest import struct import sys -from osgeo import gdal -from osgeo import osr - import gdaltest +import pytest from test_py_scripts import samples_path +from osgeo import gdal, osr + ############################################################################### @@ -48,24 +47,28 @@ def _check_cog(filename): if path not in sys.path: sys.path.append(path) import validate_cloud_optimized_geotiff + try: - _, errors, _ = validate_cloud_optimized_geotiff.validate(filename, full_check=True) - assert not errors, 'validate_cloud_optimized_geotiff failed' + _, errors, _ = validate_cloud_optimized_geotiff.validate( + filename, full_check=True + ) + assert not errors, "validate_cloud_optimized_geotiff failed" except OSError: - pytest.fail('validate_cloud_optimized_geotiff failed') + pytest.fail("validate_cloud_optimized_geotiff failed") ############################################################################### + def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micro): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['LIBTIFF'] == 'INTERNAL': + 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('.') + 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) @@ -80,45 +83,50 @@ def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micr return got_micro >= expected_micro return False + ############################################################################### # Basic test def test_cog_basic(): - tab = [ 0 ] + tab = [0] + def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - filename = '/vsimem/cog.tif' - src_ds = gdal.Open('data/byte.tif') - assert src_ds.GetMetadataItem('GDAL_STRUCTURAL_METADATA', 'TIFF') is None + filename = "/vsimem/cog.tif" + src_ds = gdal.Open("data/byte.tif") + assert src_ds.GetMetadataItem("GDAL_STRUCTURAL_METADATA", "TIFF") is None - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - callback = my_cbk, - callback_data = tab) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, callback=my_cbk, callback_data=tab + ) src_ds = None assert tab[0] == 1.0 assert ds ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetMetadataItem('LAYOUT', 'IMAGE_STRUCTURE') == 'COG' - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'LZW' + assert ds.GetMetadataItem("LAYOUT", "IMAGE_STRUCTURE") == "COG" + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "LZW" assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetBlockSize() == [512, 512] - assert ds.GetMetadataItem('GDAL_STRUCTURAL_METADATA', 'TIFF') == """GDAL_STRUCTURAL_METADATA_SIZE=000140 bytes + assert ( + ds.GetMetadataItem("GDAL_STRUCTURAL_METADATA", "TIFF") + == """GDAL_STRUCTURAL_METADATA_SIZE=000140 bytes LAYOUT=IFDS_BEFORE_DATA BLOCK_ORDER=ROW_MAJOR BLOCK_LEADER=SIZE_AS_UINT4 BLOCK_TRAILER=LAST_4_BYTES_REPEATED KNOWN_INCOMPATIBLE_EDITION=NO """ + ) ds = None _check_cog(filename) - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -127,101 +135,107 @@ def my_cbk(pct, _, arg): def test_cog_creation_options(): - filename = '/vsimem/cog.tif' - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE', - 'LEVEL=1', - 'NUM_THREADS=2']) + filename = "/vsimem/cog.tif" + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE", "LEVEL=1", "NUM_THREADS=2"] + ) assert ds ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'DEFLATE' - assert ds.GetMetadataItem('PREDICTOR', 'IMAGE_STRUCTURE') is None + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "DEFLATE" + assert ds.GetMetadataItem("PREDICTOR", "IMAGE_STRUCTURE") is None ds = None filesize = gdal.VSIStatL(filename).size _check_cog(filename) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE', - 'BIGTIFF=YES', - 'LEVEL=1']) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE", "BIGTIFF=YES", "LEVEL=1"] + ) assert gdal.VSIStatL(filename).size != filesize - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE', - 'PREDICTOR=YES', - 'LEVEL=1']) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE", "PREDICTOR=YES", "LEVEL=1"] + ) assert gdal.VSIStatL(filename).size != filesize ds = gdal.Open(filename) - assert ds.GetMetadataItem('PREDICTOR', 'IMAGE_STRUCTURE') == '2' + assert ds.GetMetadataItem("PREDICTOR", "IMAGE_STRUCTURE") == "2" ds = None - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE', - 'LEVEL=9']) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE", "LEVEL=9"] + ) assert gdal.VSIStatL(filename).size < filesize - colist = gdal.GetDriverByName('COG').GetMetadataItem('DMD_CREATIONOPTIONLIST') - if 'ZSTD' in colist: + colist = gdal.GetDriverByName("COG").GetMetadataItem("DMD_CREATIONOPTIONLIST") + if "ZSTD" in colist: - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=ZSTD']) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=ZSTD"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'ZSTD' + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "ZSTD" ds = None - if 'LZMA' in colist: + if "LZMA" in colist: - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LZMA']) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LZMA"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'LZMA' + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "LZMA" ds = None - if 'WEBP' in colist: + if "WEBP" in colist: with gdaltest.error_handler(): - assert not gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=WEBP']) + assert not gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=WEBP"] + ) - if 'LERC' in colist: + if "LERC" in colist: - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC']) + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC"] + ) filesize_no_z_error = gdal.VSIStatL(filename).size assert gdal.VSIStatL(filename).size != filesize - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC', 'MAX_Z_ERROR=10']) + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC", "MAX_Z_ERROR=10"] + ) filesize_with_z_error = gdal.VSIStatL(filename).size assert filesize_with_z_error < filesize_no_z_error - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC_DEFLATE']) + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC_DEFLATE"] + ) filesize_lerc_deflate = gdal.VSIStatL(filename).size assert filesize_lerc_deflate < filesize_no_z_error - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC_DEFLATE', 'LEVEL=1']) + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC_DEFLATE", "LEVEL=1"] + ) filesize_lerc_deflate_level_1 = gdal.VSIStatL(filename).size assert filesize_lerc_deflate_level_1 > filesize_lerc_deflate - if 'ZSTD' in colist: - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC_ZSTD']) + if "ZSTD" in colist: + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC_ZSTD"] + ) filesize_lerc_zstd = gdal.VSIStatL(filename).size assert filesize_lerc_zstd < filesize_no_z_error - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LERC_ZSTD', 'LEVEL=1']) + assert gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=LERC_ZSTD", "LEVEL=1"] + ) filesize_lerc_zstd_level_1 = gdal.VSIStatL(filename).size assert filesize_lerc_zstd_level_1 > filesize_lerc_zstd src_ds = None with gdaltest.error_handler(): - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -230,33 +244,34 @@ def test_cog_creation_options(): def test_cog_creation_of_overviews(): - tab = [ 0 ] + tab = [0] + def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - directory = '/vsimem/test_cog_creation_of_overviews' - filename = directory + '/cog.tif' - src_ds = gdal.Translate('', 'data/byte.tif', - options='-of MEM -outsize 2048 300') + directory = "/vsimem/test_cog_creation_of_overviews" + filename = directory + "/cog.tif" + src_ds = gdal.Translate("", "data/byte.tif", options="-of MEM -outsize 2048 300") - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - check_filename = '/vsimem/tmp.tif' - ds = gdal.GetDriverByName('GTiff').CreateCopy(check_filename, src_ds, - options = ['TILED=YES']) - ds.BuildOverviews('CUBIC', [2, 4]) + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + check_filename = "/vsimem/tmp.tif" + ds = gdal.GetDriverByName("GTiff").CreateCopy( + check_filename, src_ds, options=["TILED=YES"] + ) + ds.BuildOverviews("CUBIC", [2, 4]) cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2 = ds.GetRasterBand(1).GetOverview(1).Checksum() ds = None gdal.Unlink(check_filename) - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - callback = my_cbk, - callback_data = tab) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, callback=my_cbk, callback_data=tab + ) assert tab[0] == 1.0 assert ds - assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away + assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away ds = None ds = gdal.Open(filename) @@ -268,38 +283,42 @@ def my_cbk(pct, _, arg): _check_cog(filename) src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) + ############################################################################### # Test creation of overviews with a different compression method + def test_cog_creation_of_overviews_with_compression(): - directory = '/vsimem/test_cog_creation_of_overviews_with_compression' - filename = directory + '/cog.tif' - src_ds = gdal.Translate('', 'data/byte.tif', - options='-of MEM -outsize 2048 300') + directory = "/vsimem/test_cog_creation_of_overviews_with_compression" + filename = directory + "/cog.tif" + src_ds = gdal.Translate("", "data/byte.tif", options="-of MEM -outsize 2048 300") - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=LZW', 'OVERVIEW_COMPRESS=JPEG', 'OVERVIEW_QUALITY=50']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["COMPRESS=LZW", "OVERVIEW_COMPRESS=JPEG", "OVERVIEW_QUALITY=50"], + ) assert ds.GetRasterBand(1).GetOverviewCount() == 2 - assert ds.GetMetadata('IMAGE_STRUCTURE')['COMPRESSION'] == 'LZW' + assert ds.GetMetadata("IMAGE_STRUCTURE")["COMPRESSION"] == "LZW" - ds_overview_a = gdal.Open('GTIFF_DIR:2:' + filename) - assert ds_overview_a.GetMetadata('IMAGE_STRUCTURE')['COMPRESSION'] == 'JPEG' - assert ds_overview_a.GetMetadata('IMAGE_STRUCTURE')['JPEG_QUALITY'] == '50' + ds_overview_a = gdal.Open("GTIFF_DIR:2:" + filename) + assert ds_overview_a.GetMetadata("IMAGE_STRUCTURE")["COMPRESSION"] == "JPEG" + assert ds_overview_a.GetMetadata("IMAGE_STRUCTURE")["JPEG_QUALITY"] == "50" - ds_overview_b = gdal.Open('GTIFF_DIR:3:' + filename) - assert ds_overview_b.GetMetadata('IMAGE_STRUCTURE')['COMPRESSION'] == 'JPEG' - assert ds_overview_a.GetMetadata('IMAGE_STRUCTURE')['JPEG_QUALITY'] == '50' + ds_overview_b = gdal.Open("GTIFF_DIR:3:" + filename) + assert ds_overview_b.GetMetadata("IMAGE_STRUCTURE")["COMPRESSION"] == "JPEG" + assert ds_overview_a.GetMetadata("IMAGE_STRUCTURE")["JPEG_QUALITY"] == "50" ds_overview_a = None ds_overview_b = None ds = None src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) @@ -309,37 +328,39 @@ def test_cog_creation_of_overviews_with_compression(): def test_cog_creation_of_overviews_with_mask(): - tab = [ 0 ] + tab = [0] + def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - directory = '/vsimem/test_cog_creation_of_overviews_with_mask' + directory = "/vsimem/test_cog_creation_of_overviews_with_mask" gdal.Mkdir(directory, 0o755) - filename = directory + '/cog.tif' - src_ds = gdal.Translate('', 'data/byte.tif', - options='-of MEM -outsize 2048 300') + filename = directory + "/cog.tif" + src_ds = gdal.Translate("", "data/byte.tif", options="-of MEM -outsize 2048 300") src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1024, 300, b'\xFF', - buf_xsize = 1, buf_ysize = 1) - - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - check_filename = '/vsimem/tmp.tif' - ds = gdal.GetDriverByName('GTiff').CreateCopy(check_filename, src_ds, - options = ['TILED=YES']) - ds.BuildOverviews('CUBIC', [2, 4]) + src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( + 0, 0, 1024, 300, b"\xFF", buf_xsize=1, buf_ysize=1 + ) + + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + check_filename = "/vsimem/tmp.tif" + ds = gdal.GetDriverByName("GTiff").CreateCopy( + check_filename, src_ds, options=["TILED=YES"] + ) + ds.BuildOverviews("CUBIC", [2, 4]) cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2 = ds.GetRasterBand(1).GetOverview(1).Checksum() ds = None gdal.Unlink(check_filename) - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - callback = my_cbk, - callback_data = tab) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, callback=my_cbk, callback_data=tab + ) assert tab[0] == 1.0 assert ds - assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away + assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away ds = None ds = gdal.Open(filename) @@ -352,34 +373,37 @@ def my_cbk(pct, _, arg): _check_cog(filename) src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) - ############################################################################### # Test full world reprojection to WebMercator def test_cog_small_world_to_web_mercator(): - tab = [ 0 ] + tab = [0] + def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - directory = '/vsimem/test_cog_small_world_to_web_mercator' + directory = "/vsimem/test_cog_small_world_to_web_mercator" gdal.Mkdir(directory, 0o755) - filename = directory + '/cog.tif' - src_ds = gdal.Open('../gdrivers/data/small_world.tif') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'COMPRESS=JPEG'], - callback = my_cbk, - callback_data = tab) + filename = directory + "/cog.tif" + src_ds = gdal.Open("../gdrivers/data/small_world.tif") + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "COMPRESS=JPEG"], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds - assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away + assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away ds = None ds = gdal.Open(filename) @@ -389,51 +413,61 @@ def my_cbk(pct, _, arg): assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] gt = ds.GetGeoTransform() - assert gt[1] == -gt[5] # yes, checking for strict equality - expected_gt = [-20037508.342789248, 156543.033928041, 0.0, - 20037508.342789248, 0.0, -156543.033928041] + assert gt[1] == -gt[5] # yes, checking for strict equality + expected_gt = [ + -20037508.342789248, + 156543.033928041, + 0.0, + 20037508.342789248, + 0.0, + -156543.033928041, + ] for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])): assert False, gt - got_cs = [ds.GetRasterBand(i+1).Checksum() for i in range(3)] - assert got_cs in ([26293, 23439, 14955], - [26228, 22085, 12992], - [25088, 23140, 13265], # libjpeg 9e - ) + got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] + assert got_cs in ( + [26293, 23439, 14955], + [26228, 22085, 12992], + [25088, 23140, 13265], # libjpeg 9e + ) assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 17849 assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None _check_cog(filename) src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) - ############################################################################### # Test reprojection of small extent to WebMercator def test_cog_byte_to_web_mercator(): - tab = [ 0 ] + tab = [0] + def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - directory = '/vsimem/test_cog_byte_to_web_mercator' + directory = "/vsimem/test_cog_byte_to_web_mercator" gdal.Mkdir(directory, 0o755) - filename = directory + '/cog.tif' - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'ALIGNED_LEVELS=3'], - callback = my_cbk, - callback_data = tab) + filename = directory + "/cog.tif" + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "ALIGNED_LEVELS=3"], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds - assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away + assert len(gdal.ReadDir(directory)) == 1 # check that the temp file has gone away ds = None ds = gdal.Open(filename) @@ -441,19 +475,26 @@ def my_cbk(pct, _, arg): assert ds.RasterXSize == 1024 assert ds.RasterYSize == 1024 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET - assert ds.GetRasterBand(1).GetBlockSize() == [256,256] + assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] gt = ds.GetGeoTransform() - assert gt[1] == -gt[5] # yes, checking for strict equality - expected_gt = [-13149614.849955443, 76.43702828517598, 0.0, - 4070118.8821290657, 0.0, -76.43702828517598] + assert gt[1] == -gt[5] # yes, checking for strict equality + expected_gt = [ + -13149614.849955443, + 76.43702828517598, + 0.0, + 4070118.8821290657, + 0.0, + -76.43702828517598, + ] for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])): assert False, gt - assert ds.GetRasterBand(1).Checksum() in (4363, - 4264, # got on Mac at some point - 4362, # libjpeg 9d - 4569, # libjpeg 9e - ) + assert ds.GetRasterBand(1).Checksum() in ( + 4363, + 4264, # got on Mac at some point + 4362, # libjpeg 9d + 4569, # libjpeg 9e + ) assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 4356 assert ds.GetRasterBand(1).GetOverviewCount() == 2 ds = None @@ -461,7 +502,7 @@ def my_cbk(pct, _, arg): # Use our generated COG as the input of the same COG generation: reprojection # should be skipped - filename2 = directory + '/cog2.tif' + filename2 = directory + "/cog2.tif" src_ds = gdal.Open(filename) class my_error_handler(object): @@ -475,50 +516,59 @@ def handler(self, eErrClass, err_no, msg): else: self.other_msg_list.append(msg) - handler = my_error_handler(); + handler = my_error_handler() try: gdal.PushErrorHandler(handler.handler) gdal.SetCurrentErrorHandlerCatchDebug(True) - with gdaltest.config_option('CPL_DEBUG', 'COG'): - ds = gdal.GetDriverByName('COG').CreateCopy(filename2, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'ALIGNED_LEVELS=3']) + with gdaltest.config_option("CPL_DEBUG", "COG"): + ds = gdal.GetDriverByName("COG").CreateCopy( + filename2, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "ALIGNED_LEVELS=3"], + ) finally: gdal.PopErrorHandler() assert ds - assert 'COG: Skipping reprojection step: source dataset matches reprojection specifications' in handler.debug_msg_list + assert ( + "COG: Skipping reprojection step: source dataset matches reprojection specifications" + in handler.debug_msg_list + ) assert handler.other_msg_list == [] src_ds = None ds = None # Cleanup - gdal.GetDriverByName('GTiff').Delete(filename) - gdal.GetDriverByName('GTiff').Delete(filename2) + gdal.GetDriverByName("GTiff").Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename2) gdal.Unlink(directory) - - ############################################################################### # Same as previous test case but with other input options def test_cog_byte_to_web_mercator_manual(): - directory = '/vsimem/test_cog_byte_to_web_mercator_manual' + directory = "/vsimem/test_cog_byte_to_web_mercator_manual" gdal.Mkdir(directory, 0o755) - filename = directory + '/cog.tif' - src_ds = gdal.Open('data/byte.tif') + filename = directory + "/cog.tif" + src_ds = gdal.Open("data/byte.tif") res = 76.43702828517598 minx = -13149614.849955443 maxx = minx + 1024 * res maxy = 4070118.8821290657 miny = maxy - 1024 * res - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['BLOCKSIZE=256', - 'TARGET_SRS=EPSG:3857', - 'RES=%.18g' % res, - 'EXTENT=%.18g,%.18g,%.18g,%.18g' % (minx,miny,maxx,maxy)]) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "BLOCKSIZE=256", + "TARGET_SRS=EPSG:3857", + "RES=%.18g" % res, + "EXTENT=%.18g,%.18g,%.18g,%.18g" % (minx, miny, maxx, maxy), + ], + ) assert ds ds = None @@ -527,51 +577,58 @@ def test_cog_byte_to_web_mercator_manual(): assert ds.RasterXSize == 1024 assert ds.RasterYSize == 1024 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET - assert ds.GetRasterBand(1).GetBlockSize() == [256,256] + assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] gt = ds.GetGeoTransform() - expected_gt = [-13149614.849955443, 76.43702828517598, 0.0, - 4070118.8821290657, 0.0, -76.43702828517598] + expected_gt = [ + -13149614.849955443, + 76.43702828517598, + 0.0, + 4070118.8821290657, + 0.0, + -76.43702828517598, + ] for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])): assert False, gt - assert ds.GetRasterBand(1).Checksum() in (4363, - 4264, # got on Mac at some point - 4362, # libjpeg 9d - 4569, # libjpeg 9e - ) + assert ds.GetRasterBand(1).Checksum() in ( + 4363, + 4264, # got on Mac at some point + 4362, # libjpeg 9d + 4569, # libjpeg 9e + ) assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 4356 assert ds.GetRasterBand(1).GetOverviewCount() == 2 ds = None src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) - ############################################################################### # Test OVERVIEWS creation option def test_cog_overviews_co(): - def my_cbk(pct, _, arg): assert pct >= tab[0] tab[0] = pct return 1 - directory = '/vsimem/test_cog_overviews_co' - filename = directory + '/cog.tif' - src_ds = gdal.Translate('', 'data/byte.tif', - options='-of MEM -outsize 2048 300') + directory = "/vsimem/test_cog_overviews_co" + filename = directory + "/cog.tif" + src_ds = gdal.Translate("", "data/byte.tif", options="-of MEM -outsize 2048 300") - for val in ['NONE', 'FORCE_USE_EXISTING']: + for val in ["NONE", "FORCE_USE_EXISTING"]: - tab = [ 0 ] - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['OVERVIEWS=' + val], - callback = my_cbk, - callback_data = tab) + tab = [0] + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["OVERVIEWS=" + val], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds @@ -582,13 +639,16 @@ def my_cbk(pct, _, arg): ds = None _check_cog(filename) - for val in ['AUTO', 'IGNORE_EXISTING']: + for val in ["AUTO", "IGNORE_EXISTING"]: - tab = [ 0 ] - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['OVERVIEWS=' + val], - callback = my_cbk, - callback_data = tab) + tab = [0] + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["OVERVIEWS=" + val], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds @@ -600,15 +660,13 @@ def my_cbk(pct, _, arg): ds = None _check_cog(filename) - # Add overviews to source - src_ds.BuildOverviews('NONE', [2]) + src_ds.BuildOverviews("NONE", [2]) - tab = [ 0 ] - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['OVERVIEWS=NONE'], - callback = my_cbk, - callback_data = tab) + tab = [0] + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["OVERVIEWS=NONE"], callback=my_cbk, callback_data=tab + ) assert tab[0] == 1.0 assert ds @@ -619,11 +677,14 @@ def my_cbk(pct, _, arg): ds = None _check_cog(filename) - tab = [ 0 ] - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['OVERVIEWS=FORCE_USE_EXISTING'], - callback = my_cbk, - callback_data = tab) + tab = [0] + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["OVERVIEWS=FORCE_USE_EXISTING"], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds @@ -635,11 +696,14 @@ def my_cbk(pct, _, arg): ds = None _check_cog(filename) - tab = [ 0 ] - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['OVERVIEWS=IGNORE_EXISTING'], - callback = my_cbk, - callback_data = tab) + tab = [0] + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["OVERVIEWS=IGNORE_EXISTING"], + callback=my_cbk, + callback_data=tab, + ) assert tab[0] == 1.0 assert ds @@ -651,26 +715,27 @@ def my_cbk(pct, _, arg): ds = None _check_cog(filename) - src_ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) gdal.Unlink(directory) + ############################################################################### # Test editing and invalidating a COG file def test_cog_invalidation_by_data_change(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100) - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE']) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE"] + ) ds = None ds = gdal.Open(filename, gdal.GA_Update) - assert ds.GetMetadataItem('LAYOUT', 'IMAGE_STRUCTURE') == 'COG' - src_ds = gdal.Open('data/byte.tif') + assert ds.GetMetadataItem("LAYOUT", "IMAGE_STRUCTURE") == "COG" + src_ds = gdal.Open("data/byte.tif") data = src_ds.ReadRaster() ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, data) with gdaltest.error_handler(): @@ -679,14 +744,17 @@ def test_cog_invalidation_by_data_change(): with gdaltest.error_handler(): ds = gdal.Open(filename) - assert ds.GetMetadataItem('LAYOUT', 'IMAGE_STRUCTURE') is None + assert ds.GetMetadataItem("LAYOUT", "IMAGE_STRUCTURE") is None ds = None - with pytest.raises(AssertionError, match='KNOWN_INCOMPATIBLE_EDITION=YES is declared in the file'): + with pytest.raises( + AssertionError, match="KNOWN_INCOMPATIBLE_EDITION=YES is declared in the file" + ): _check_cog(filename) with gdaltest.error_handler(): - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test editing and invalidating a COG file @@ -694,10 +762,11 @@ def test_cog_invalidation_by_data_change(): def test_cog_invalidation_by_metadata_change(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['COMPRESS=DEFLATE']) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["COMPRESS=DEFLATE"] + ) ds = None ds = gdal.Open(filename, gdal.GA_Update) @@ -706,11 +775,11 @@ def test_cog_invalidation_by_metadata_change(): with gdaltest.error_handler(): ds = gdal.Open(filename) - assert ds.GetMetadataItem('LAYOUT', 'IMAGE_STRUCTURE') is None + assert ds.GetMetadataItem("LAYOUT", "IMAGE_STRUCTURE") is None ds = None with gdaltest.error_handler(): - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -720,7 +789,7 @@ def test_cog_invalidation_by_metadata_change(): def test_cog_northing_easting_and_non_power_of_two_ratios(): - filename = '/vsimem/cog.tif' + filename = "/vsimem/cog.tif" x0_NZTM2000 = -1000000 y0_NZTM2000 = 10000000 @@ -729,18 +798,28 @@ def test_cog_northing_easting_and_non_power_of_two_ratios(): scale_denom_zoom_level_13 = 2500 scale_denom_zoom_level_12 = 5000 - ds = gdal.Translate(filename, 'data/byte.tif', - options='-of COG -a_srs EPSG:2193 -a_ullr 1000001 5000001 1000006.6 4999995.4 -co TILING_SCHEME=NZTM2000 -co ALIGNED_LEVELS=2') + ds = gdal.Translate( + filename, + "data/byte.tif", + options="-of COG -a_srs EPSG:2193 -a_ullr 1000001 5000001 1000006.6 4999995.4 -co TILING_SCHEME=NZTM2000 -co ALIGNED_LEVELS=2", + ) assert ds.RasterXSize == 1280 assert ds.RasterYSize == 1280 b = ds.GetRasterBand(1) - assert [(b.GetOverview(i).XSize, b.GetOverview(i).YSize) for i in range(b.GetOverviewCount())] == [(512, 512), (256, 256)] + assert [ + (b.GetOverview(i).XSize, b.GetOverview(i).YSize) + for i in range(b.GetOverviewCount()) + ] == [(512, 512), (256, 256)] gt = ds.GetGeoTransform() - assert gt[1] == -gt[5] # yes, checking for strict equality + assert gt[1] == -gt[5] # yes, checking for strict equality - res_zoom_level_14 = scale_denom_zoom_level_14 * 0.28e-3 # According to OGC Tile Matrix Set formula - assert gt == pytest.approx((999872, res_zoom_level_14, 0, 5000320, 0, -res_zoom_level_14), abs=1e-8) + res_zoom_level_14 = ( + scale_denom_zoom_level_14 * 0.28e-3 + ) # According to OGC Tile Matrix Set formula + assert gt == pytest.approx( + (999872, res_zoom_level_14, 0, 5000320, 0, -res_zoom_level_14), abs=1e-8 + ) # Check that gt origin matches the corner of a tile at zoom 14 res = gt[1] @@ -751,7 +830,10 @@ def test_cog_northing_easting_and_non_power_of_two_ratios(): # Check that overview=0 corresponds to the resolution of zoom level=13 / OGC ScaleDenom = 2500 ovr0_xsize = b.GetOverview(0).XSize - assert float(ovr0_xsize) / ds.RasterXSize == float(scale_denom_zoom_level_14) / scale_denom_zoom_level_13 + assert ( + float(ovr0_xsize) / ds.RasterXSize + == float(scale_denom_zoom_level_14) / scale_denom_zoom_level_13 + ) # Check that gt origin matches the corner of a tile at zoom 13 ovr0_res = res * scale_denom_zoom_level_13 / scale_denom_zoom_level_14 tile_x = (gt[0] - x0_NZTM2000) / (blocksize * ovr0_res) @@ -761,7 +843,10 @@ def test_cog_northing_easting_and_non_power_of_two_ratios(): # Check that overview=1 corresponds to the resolution of zoom level=12 / OGC ScaleDenom = 5000 ovr1_xsize = b.GetOverview(1).XSize - assert float(ovr1_xsize) / ds.RasterXSize == float(scale_denom_zoom_level_14) / scale_denom_zoom_level_12 + assert ( + float(ovr1_xsize) / ds.RasterXSize + == float(scale_denom_zoom_level_14) / scale_denom_zoom_level_12 + ) # Check that gt origin matches the corner of a tile at zoom 12 ovr1_res = res * scale_denom_zoom_level_12 / scale_denom_zoom_level_14 tile_x = (gt[0] - x0_NZTM2000) / (blocksize * ovr1_res) @@ -772,11 +857,11 @@ def test_cog_northing_easting_and_non_power_of_two_ratios(): assert ds.GetMetadata("TILING_SCHEME") == { "NAME": "NZTM2000", "ZOOM_LEVEL": "14", - "ALIGNED_LEVELS": "2" + "ALIGNED_LEVELS": "2", } ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -785,30 +870,50 @@ def test_cog_northing_easting_and_non_power_of_two_ratios(): def test_cog_sparse(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512) src_ds.GetRasterBand(1).Fill(255) - src_ds.WriteRaster(0, 0, 256, 256, '\x00' * 256 * 256) - src_ds.WriteRaster(256, 256, 128, 128, '\x00' * 128 * 128) - src_ds.BuildOverviews('NEAREST', [2]) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['BLOCKSIZE=128', 'SPARSE_OK=YES', 'COMPRESS=LZW']) + src_ds.WriteRaster(0, 0, 256, 256, "\x00" * 256 * 256) + src_ds.WriteRaster(256, 256, 128, 128, "\x00" * 128 * 128) + src_ds.BuildOverviews("NEAREST", [2]) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=128", "SPARSE_OK=YES", "COMPRESS=LZW"] + ) _check_cog(filename) - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_2_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is not None - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is None + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") is None + assert ( + ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_2_0", "TIFF") is not None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") + is not None + ) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) if check_libtiff_internal_or_at_least(4, 0, 11): # This file is the same as the one generated above, except that we have, # with an hex editor, zeroify all entries of TileByteCounts except the # last tile of the main IFD, and for a tile when the next tile is sparse - ds = gdal.Open('data/cog_sparse_strile_arrays_zeroified_when_possible.tif') - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) + ds = gdal.Open("data/cog_sparse_strile_arrays_zeroified_when_possible.tif") + assert ds.GetRasterBand(1).ReadRaster( + 0, 0, 512, 512 + ) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) ds = None gdal.Unlink(filename) @@ -820,33 +925,89 @@ def test_cog_sparse(): def test_cog_sparse_mask(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 4) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512, 4) for i in range(4): - src_ds.GetRasterBand(i+1).SetColorInterpretation(gdal.GCI_RedBand + i) - src_ds.GetRasterBand(i+1).Fill(255) - src_ds.GetRasterBand(i+1).WriteRaster(0, 0, 256, 256, '\x00' * 256 * 256) - src_ds.GetRasterBand(i+1).WriteRaster(256, 256, 128, 128, '\x00' * 128 * 128) - src_ds.BuildOverviews('NEAREST', [2]) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['BLOCKSIZE=128', 'SPARSE_OK=YES', 'COMPRESS=JPEG', 'RESAMPLING=NEAREST']) - assert gdal.GetLastErrorMsg() == '' + src_ds.GetRasterBand(i + 1).SetColorInterpretation(gdal.GCI_RedBand + i) + src_ds.GetRasterBand(i + 1).Fill(255) + src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 256, 256, "\x00" * 256 * 256) + src_ds.GetRasterBand(i + 1).WriteRaster(256, 256, 128, 128, "\x00" * 128 * 128) + src_ds.BuildOverviews("NEAREST", [2]) + gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "BLOCKSIZE=128", + "SPARSE_OK=YES", + "COMPRESS=JPEG", + "RESAMPLING=NEAREST", + ], + ) + assert gdal.GetLastErrorMsg() == "" _check_cog(filename) - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_2_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_2_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_1_0', 'TIFF') is not None - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is None + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") is None + assert ( + ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_2_0", "TIFF") is not None + ) + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_2_0", "TIFF") + is not None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") + is not None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_1_0", "TIFF") + is not None + ) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetMaskBand().ReadRaster( + 0, 0, 512, 512 + ) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) ds = None gdal.Unlink(filename) @@ -858,24 +1019,50 @@ def test_cog_sparse_mask(): def test_cog_sparse_imagery_0_mask_255(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 4) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512, 4) for i in range(4): - src_ds.GetRasterBand(i+1).SetColorInterpretation(gdal.GCI_RedBand + i) - src_ds.GetRasterBand(i+1).Fill(0 if i < 3 else 255) - src_ds.BuildOverviews('NEAREST', [2]) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['BLOCKSIZE=128', 'SPARSE_OK=YES', 'COMPRESS=JPEG']) + src_ds.GetRasterBand(i + 1).SetColorInterpretation(gdal.GCI_RedBand + i) + src_ds.GetRasterBand(i + 1).Fill(0 if i < 3 else 255) + src_ds.BuildOverviews("NEAREST", [2]) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=128", "SPARSE_OK=YES", "COMPRESS=JPEG"] + ) _check_cog(filename) - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is not None - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is None + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetMaskBand().ReadRaster( + 0, 0, 512, 512 + ) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) ds = None gdal.Unlink(filename) @@ -887,29 +1074,64 @@ def test_cog_sparse_imagery_0_mask_255(): def test_cog_sparse_imagery_0_or_255_mask_255(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 4) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512, 4) for i in range(4): - src_ds.GetRasterBand(i+1).SetColorInterpretation(gdal.GCI_RedBand + i) + src_ds.GetRasterBand(i + 1).SetColorInterpretation(gdal.GCI_RedBand + i) for i in range(3): - src_ds.GetRasterBand(i+1).Fill(255) - src_ds.GetRasterBand(i+1).WriteRaster(0, 0, 256, 256, '\x00' * 256 * 256) - src_ds.GetRasterBand(i+1).WriteRaster(256, 256, 128, 128, '\x00' * 128 * 128) + src_ds.GetRasterBand(i + 1).Fill(255) + src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 256, 256, "\x00" * 256 * 256) + src_ds.GetRasterBand(i + 1).WriteRaster(256, 256, 128, 128, "\x00" * 128 * 128) src_ds.GetRasterBand(4).Fill(255) - src_ds.BuildOverviews('NEAREST', [2]) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['BLOCKSIZE=128', 'SPARSE_OK=YES', 'COMPRESS=JPEG', 'RESAMPLING=NEAREST']) + src_ds.BuildOverviews("NEAREST", [2]) + gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "BLOCKSIZE=128", + "SPARSE_OK=YES", + "COMPRESS=JPEG", + "RESAMPLING=NEAREST", + ], + ) _check_cog(filename) - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_2_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is not None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is not None - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is None + assert ( + ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_2_0", "TIFF") is not None + ) + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetMaskBand().ReadRaster( + 0, 0, 512, 512 + ) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) ds = None gdal.Unlink(filename) @@ -921,55 +1143,124 @@ def test_cog_sparse_imagery_0_or_255_mask_255(): def test_cog_sparse_imagery_mask_0(): - filename = '/vsimem/cog.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 4) + filename = "/vsimem/cog.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512, 4) for i in range(4): - src_ds.GetRasterBand(i+1).SetColorInterpretation(gdal.GCI_RedBand + i) - src_ds.GetRasterBand(i+1).Fill(0) - src_ds.BuildOverviews('NEAREST', [2]) - gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['BLOCKSIZE=128', 'SPARSE_OK=YES', 'COMPRESS=JPEG']) + src_ds.GetRasterBand(i + 1).SetColorInterpretation(gdal.GCI_RedBand + i) + src_ds.GetRasterBand(i + 1).Fill(0) + src_ds.BuildOverviews("NEAREST", [2]) + gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=128", "SPARSE_OK=YES", "COMPRESS=JPEG"] + ) _check_cog(filename) - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None - assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) - assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) - assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster(0, 0, 256, 256) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is None + assert ( + ds.GetRasterBand(1) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is None + ) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) == src_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetMaskBand().ReadRaster( + 0, 0, 512, 512 + ) == src_ds.GetRasterBand(4).ReadRaster(0, 0, 512, 512) + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().ReadRaster( + 0, 0, 256, 256 + ) == src_ds.GetRasterBand(4).GetOverview(0).ReadRaster(0, 0, 256, 256) ds = None gdal.Unlink(filename) - ############################################################################### # Test ZOOM_LEVEL_STRATEGY option -@pytest.mark.parametrize('zoom_level_strategy,expected_gt', - [('AUTO', (-13110479.09147343, 76.43702828517416, 0.0, 4030983.1236470547, 0.0, -76.43702828517416)), - ('LOWER', (-13110479.09147343, 76.43702828517416, 0.0, 4030983.1236470547, 0.0, -76.43702828517416)), - ('UPPER', (-13100695.151852928, 38.21851414258708, 0.0, 4021199.1840265524, 0.0, -38.21851414258708)) - ]) -def test_cog_zoom_level_strategy(zoom_level_strategy,expected_gt): - - filename = '/vsimem/test_cog_zoom_level_strategy.tif' - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', - 'ZOOM_LEVEL_STRATEGY=' + zoom_level_strategy]) + +@pytest.mark.parametrize( + "zoom_level_strategy,expected_gt", + [ + ( + "AUTO", + ( + -13110479.09147343, + 76.43702828517416, + 0.0, + 4030983.1236470547, + 0.0, + -76.43702828517416, + ), + ), + ( + "LOWER", + ( + -13110479.09147343, + 76.43702828517416, + 0.0, + 4030983.1236470547, + 0.0, + -76.43702828517416, + ), + ), + ( + "UPPER", + ( + -13100695.151852928, + 38.21851414258708, + 0.0, + 4021199.1840265524, + 0.0, + -38.21851414258708, + ), + ), + ], +) +def test_cog_zoom_level_strategy(zoom_level_strategy, expected_gt): + + filename = "/vsimem/test_cog_zoom_level_strategy.tif" + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "TILING_SCHEME=GoogleMapsCompatible", + "ZOOM_LEVEL_STRATEGY=" + zoom_level_strategy, + ], + ) gt = ds.GetGeoTransform() assert gt == pytest.approx(expected_gt, rel=1e-10) # Test that the zoom level strategy applied on input data already on a # zoom level doesn't lead to selecting another zoom level - filename2 = '/vsimem/test_cog_zoom_level_strategy_2.tif' - src_ds = gdal.Open('data/byte.tif') - ds2 = gdal.GetDriverByName('COG').CreateCopy(filename2, ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', - 'ZOOM_LEVEL_STRATEGY=' + zoom_level_strategy]) + filename2 = "/vsimem/test_cog_zoom_level_strategy_2.tif" + src_ds = gdal.Open("data/byte.tif") + ds2 = gdal.GetDriverByName("COG").CreateCopy( + filename2, + ds, + options=[ + "TILING_SCHEME=GoogleMapsCompatible", + "ZOOM_LEVEL_STRATEGY=" + zoom_level_strategy, + ], + ) gt = ds2.GetGeoTransform() assert gt == pytest.approx(expected_gt, rel=1e-10) ds2 = None @@ -979,28 +1270,47 @@ def test_cog_zoom_level_strategy(zoom_level_strategy,expected_gt): gdal.Unlink(filename) - ############################################################################### # Test ZOOM_LEVEL option + def test_cog_zoom_level(): - filename = '/vsimem/test_cog_zoom_level.tif' - src_ds = gdal.Open('data/byte.tif') + filename = "/vsimem/test_cog_zoom_level.tif" + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', - 'ZOOM_LEVEL=-1']) is None - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', - 'ZOOM_LEVEL=25']) is None - - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', - 'ZOOM_LEVEL=12']) + assert ( + gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "ZOOM_LEVEL=-1"], + ) + is None + ) + assert ( + gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "ZOOM_LEVEL=25"], + ) + is None + ) + + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "ZOOM_LEVEL=12"], + ) gt = ds.GetGeoTransform() - expected_gt = (-13100695.151852928, 38.21851414258813, 0.0, 4021199.1840265524, 0.0, -38.21851414258813) + expected_gt = ( + -13100695.151852928, + 38.21851414258813, + 0.0, + 4021199.1840265524, + 0.0, + -38.21851414258813, + ) assert gt == pytest.approx(expected_gt, rel=1e-10) ds = None gdal.Unlink(filename) @@ -1008,37 +1318,56 @@ def test_cog_zoom_level(): ############################################################################### + def test_cog_resampling_options(): - filename = '/vsimem/test_cog_resampling_options.tif' - src_ds = gdal.Open('data/byte.tif') + filename = "/vsimem/test_cog_resampling_options.tif" + src_ds = gdal.Open("data/byte.tif") - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'WARP_RESAMPLING=NEAREST']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "WARP_RESAMPLING=NEAREST"], + ) cs1 = ds.GetRasterBand(1).Checksum() - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'WARP_RESAMPLING=CUBIC']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "WARP_RESAMPLING=CUBIC"], + ) cs2 = ds.GetRasterBand(1).Checksum() - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'RESAMPLING=NEAREST', 'WARP_RESAMPLING=CUBIC']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "TILING_SCHEME=GoogleMapsCompatible", + "RESAMPLING=NEAREST", + "WARP_RESAMPLING=CUBIC", + ], + ) cs3 = ds.GetRasterBand(1).Checksum() assert cs1 != cs2 assert cs2 == cs3 - src_ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -outsize 129 0') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['BLOCKSIZE=128', 'OVERVIEW_RESAMPLING=NEAREST']) + src_ds = gdal.Translate("", "data/byte.tif", options="-of MEM -outsize 129 0") + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=128", "OVERVIEW_RESAMPLING=NEAREST"] + ) cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['BLOCKSIZE=128','OVERVIEW_RESAMPLING=BILINEAR']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=128", "OVERVIEW_RESAMPLING=BILINEAR"] + ) cs2 = ds.GetRasterBand(1).GetOverview(0).Checksum() - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['BLOCKSIZE=128','RESAMPLING=NEAREST', 'OVERVIEW_RESAMPLING=BILINEAR']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["BLOCKSIZE=128", "RESAMPLING=NEAREST", "OVERVIEW_RESAMPLING=BILINEAR"], + ) cs3 = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs1 != cs2 @@ -1050,30 +1379,52 @@ def test_cog_resampling_options(): ############################################################################### + def test_cog_invalid_warp_resampling(): - filename = '/vsimem/test_cog_invalid_warp_resampling.tif' - src_ds = gdal.Open('data/byte.tif') + filename = "/vsimem/test_cog_invalid_warp_resampling.tif" + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - assert gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, - options = ['TILING_SCHEME=GoogleMapsCompatible', 'RESAMPLING=INVALID']) is None + assert ( + gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=["TILING_SCHEME=GoogleMapsCompatible", "RESAMPLING=INVALID"], + ) + is None + ) gdal.Unlink(filename) ############################################################################### + def test_cog_overview_size(): - src_ds = gdal.GetDriverByName('MEM').Create('', 20480 // 4, 40960 // 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 20480 // 4, 40960 // 4) src_ds.SetGeoTransform([1723840, 7 * 4, 0, 5555840, 0, -7 * 4]) srs = osr.SpatialReference() srs.ImportFromEPSG(2193) src_ds.SetProjection(srs.ExportToWkt()) - filename = '/vsimem/test_cog_overview_size.tif' - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options = ['TILING_SCHEME=NZTM2000', 'ALIGNED_LEVELS=4', 'OVERVIEW_RESAMPLING=NONE']) + filename = "/vsimem/test_cog_overview_size.tif" + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, + src_ds, + options=[ + "TILING_SCHEME=NZTM2000", + "ALIGNED_LEVELS=4", + "OVERVIEW_RESAMPLING=NONE", + ], + ) assert (ds.RasterXSize, ds.RasterYSize) == (20480 // 4, 40960 // 4) - ovr_size = [ (ds.GetRasterBand(1).GetOverview(i).XSize, ds.GetRasterBand(1).GetOverview(i).YSize) for i in range(ds.GetRasterBand(1).GetOverviewCount()) ] + ovr_size = [ + ( + ds.GetRasterBand(1).GetOverview(i).XSize, + ds.GetRasterBand(1).GetOverview(i).YSize, + ) + for i in range(ds.GetRasterBand(1).GetOverviewCount()) + ] assert ovr_size == [(2048, 4096), (1024, 2048), (512, 1024), (256, 512), (128, 256)] gdal.Unlink(filename) @@ -1084,40 +1435,45 @@ def test_cog_overview_size(): def test_cog_float32_color_table(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1024, 1024, 1, gdal.GDT_Float32) + src_ds = gdal.GetDriverByName("MEM").Create("", 1024, 1024, 1, gdal.GDT_Float32) src_ds.GetRasterBand(1).Fill(1.0) ct = gdal.ColorTable() src_ds.GetRasterBand(1).SetColorTable(ct) - filename = '/vsimem/test_cog_float32_color_table.tif' + filename = "/vsimem/test_cog_float32_color_table.tif" # Silence warning about color table not being copied with gdaltest.error_handler(): - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds) # segfault + ds = gdal.GetDriverByName("COG").CreateCopy(filename, src_ds) # segfault assert ds assert ds.GetRasterBand(1).GetColorTable() is None - assert struct.unpack('f', ds.ReadRaster(0,0,1,1))[0] == 1.0 - assert struct.unpack('f', ds.GetRasterBand(1).GetOverview(0).ReadRaster(0,0,1,1))[0] == 1.0 + assert struct.unpack("f", ds.ReadRaster(0, 0, 1, 1))[0] == 1.0 + assert ( + struct.unpack("f", ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 1, 1))[0] + == 1.0 + ) gdal.Unlink(filename) + ############################################################################### # Test copy XMP def test_cog_copy_xmp(): - filename = '/vsimem/cog_xmp.tif' - src_ds = gdal.Open('../gdrivers/data/gtiff/byte_with_xmp.tif') - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds) + filename = "/vsimem/cog_xmp.tif" + src_ds = gdal.Open("../gdrivers/data/gtiff/byte_with_xmp.tif") + ds = gdal.GetDriverByName("COG").CreateCopy(filename, src_ds) assert ds ds = None ds = gdal.Open(filename) - xmp = ds.GetMetadata('xml:XMP') + xmp = ds.GetMetadata("xml:XMP") ds = None - assert 'W5M0MpCehiHzreSzNTczkc9d' in xmp[0], 'Wrong input file without XMP' + assert "W5M0MpCehiHzreSzNTczkc9d" in xmp[0], "Wrong input file without XMP" _check_cog(filename) gdal.Unlink(filename) + ############################################################################### # Test creating COG from a source dataset that has overview with 'odd' sizes # and a mask without overview @@ -1125,11 +1481,13 @@ def test_cog_copy_xmp(): def test_cog_odd_overview_size_and_msk(): - filename = '/vsimem/test_cog_odd_overview_size_and_msk.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 511, 511) - src_ds.BuildOverviews('NEAR', [2]) + filename = "/vsimem/test_cog_odd_overview_size_and_msk.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 511, 511) + src_ds.BuildOverviews("NEAR", [2]) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - ds = gdal.GetDriverByName('COG').CreateCopy(filename, src_ds, options=['BLOCKSIZE=256']) + ds = gdal.GetDriverByName("COG").CreateCopy( + filename, src_ds, options=["BLOCKSIZE=256"] + ) assert ds assert ds.GetRasterBand(1).GetOverview(0).XSize == 256 assert ds.GetRasterBand(1).GetMaskBand().GetOverview(0).XSize == 256 diff --git a/autotest/gcore/colortable.py b/autotest/gcore/colortable.py index b16ece1f2e94..a6e1b2b6825f 100755 --- a/autotest/gcore/colortable.py +++ b/autotest/gcore/colortable.py @@ -31,11 +31,11 @@ ############################################################################### - import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### # Create a color table. @@ -48,7 +48,7 @@ def test_colortable_1(): for i in range(len(gdaltest.test_ct_data)): gdaltest.test_ct.SetColorEntry(i, gdaltest.test_ct_data[i]) - + ############################################################################### # verify contents. @@ -65,9 +65,9 @@ def test_colortable_2(): else: o_v = o_data[j] - assert g_data[j] == o_v, 'color table mismatch' + assert g_data[j] == o_v, "color table mismatch" + - ############################################################################### # Test CreateColorRamp() @@ -86,12 +86,10 @@ def test_colortable_3(): assert ct.GetColorEntry(255) == (0, 0, 255, 255) + ############################################################################### # Cleanup. def test_colortable_cleanup(): gdaltest.test_ct = None - - - diff --git a/autotest/gcore/envi_read.py b/autotest/gcore/envi_read.py index ed3d4f621bc8..11302597fcf4 100755 --- a/autotest/gcore/envi_read.py +++ b/autotest/gcore/envi_read.py @@ -28,10 +28,10 @@ ############################################################################### +import gdaltest import pytest from osgeo import gdal -import gdaltest ############################################################################### # Test GDAL_READDIR_LIMIT_ON_OPEN @@ -39,41 +39,39 @@ def test_envi_1(): - gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', '1') + gdal.SetConfigOption("GDAL_READDIR_LIMIT_ON_OPEN", "1") - ds = gdal.Open('data/utmsmall.raw') + ds = gdal.Open("data/utmsmall.raw") filelist = ds.GetFileList() - gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', None) + gdal.SetConfigOption("GDAL_READDIR_LIMIT_ON_OPEN", None) + + assert len(filelist) == 2, "did not get expected file list." - 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), + ("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', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('ENVI') +@pytest.mark.require_driver("ENVI") def test_envi_open(filename, checksum): - ut = gdaltest.GDALTest('ENVI', filename, 1, checksum) + ut = gdaltest.GDALTest("ENVI", filename, 1, checksum) ut.testOpen() - - - diff --git a/autotest/gcore/gcps2geotransform.py b/autotest/gcore/gcps2geotransform.py index 33c5f63c9607..d3b51b086918 100755 --- a/autotest/gcore/gcps2geotransform.py +++ b/autotest/gcore/gcps2geotransform.py @@ -29,11 +29,10 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Helper to make gcps @@ -53,15 +52,22 @@ def _list2gcps(src_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) - ])) + 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) + gt, (400000.0, 100.0, 0.0, 370000.0, 0.0, -10.0), 0.000001 + ) + ############################################################################### # Similar but non-exact. @@ -69,14 +75,20 @@ def test_gcps2gt_1(): 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) - ])) + 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) + gt, (400000.0, 100.0, 0.0, 370000.0025, -5e-05, -9.999975), 0.000001 + ) + ############################################################################### # bApproxOK false, and no good solution. @@ -85,13 +97,19 @@ def test_gcps2gt_2(): 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.' + 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. @@ -99,10 +117,15 @@ def test_gcps2gt_3(): def test_gcps2gt_4(): - gt = gdal.GCPsToGeoTransform(_list2gcps([ - (0.0, 0.0, 400000, 370000), - ])) - assert gt is None, 'Expected failure for single GCP.' + 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. @@ -110,12 +133,18 @@ def test_gcps2gt_4(): def test_gcps2gt_5(): - gt = gdal.GCPsToGeoTransform(_list2gcps([ - (0.0, 0.0, 400000, 370000), - (100.0, 200.0, 410000, 368000), - ])) + 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) + 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. @@ -123,14 +152,18 @@ def test_gcps2gt_5(): 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) + 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. @@ -138,14 +171,18 @@ def test_gcps2gt_6(): 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) + 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. @@ -153,17 +190,24 @@ def test_gcps2gt_7(): 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) + 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) - - - diff --git a/autotest/gcore/gdal_stats.py b/autotest/gcore/gdal_stats.py index 0f5067aa222e..f0b1677f6952 100755 --- a/autotest/gcore/gdal_stats.py +++ b/autotest/gcore/gdal_stats.py @@ -28,35 +28,36 @@ ############################################################################### import os -import struct import shutil - +import struct import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### # Test handling NaN with GDT_Float32 data def test_stats_nan_1(): - gdaltest.gtiff_drv = gdal.GetDriverByName('GTiff') + 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') + shutil.copyfile("data/nan32.tif", "tmp/nan32.tif") - t = gdaltest.GDALTest('GTiff', 'tmp/nan32.tif', 1, 874, filename_absolute=1) + 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') + gdal.GetDriverByName("GTiff").Delete("tmp/nan32.tif") return ret + ############################################################################### # Test handling NaN with GDT_Float64 data @@ -68,15 +69,16 @@ def test_stats_nan_2(): stats = (50.0, 58.0, 54.0, 2.5819888974716) - shutil.copyfile('data/nan64.tif', 'tmp/nan64.tif') + shutil.copyfile("data/nan64.tif", "tmp/nan64.tif") - t = gdaltest.GDALTest('GTiff', 'tmp/nan64.tif', 1, 4414, filename_absolute=1) + 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') + gdal.GetDriverByName("GTiff").Delete("tmp/nan64.tif") return ret + ############################################################################### # Test stats on signed byte (#3151) @@ -88,12 +90,14 @@ def test_stats_signedbyte(): stats = (-128.0, 127.0, -0.2, 80.64) - shutil.copyfile('data/stats_signed_byte.img', 'tmp/stats_signed_byte.img') + 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) + 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') + gdal.GetDriverByName("HFA").Delete("tmp/stats_signed_byte.img") return ret @@ -102,77 +106,86 @@ def test_stats_signedbyte(): # 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') + 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' + 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') + shutil.copyfile("data/minfloat.tif", "tmp/minfloat.tif") try: - os.remove('tmp/minfloat.tif.aux.xml') + os.remove("tmp/minfloat.tif.aux.xml") except OSError: pass - ds = gdal.Open('tmp/minfloat.tif') + 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') + os.remove("tmp/minfloat.tif.aux.xml") - ds = gdal.Open('tmp/minfloat.tif') + ds = gdal.Open("tmp/minfloat.tif") minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None - os.remove('tmp/minfloat.tif') + os.remove("tmp/minfloat.tif") - if nodata != -3.4028234663852886e+38: + if nodata != -3.4028234663852886e38: print("%.18g" % nodata) - pytest.fail('did not get expected nodata') + pytest.fail("did not get expected nodata") - assert stats == [-3.0, 5.0, 1.0, 4.0], 'did not get expected stats' + 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 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' + 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') + src_ds = gdal.Open("data/nan32_nodata.tif") nodata = src_ds.GetRasterBand(1).GetNoDataValue() - assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) + assert gdaltest.isnan(nodata), "expected nan, got %f" % nodata - out_ds = gdaltest.gtiff_drv.CreateCopy('tmp/nan32_nodata.tif', src_ds) + 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') + os.remove("tmp/nan32_nodata.tif.aux.xml") except OSError: pass - ds = gdal.Open('tmp/nan32_nodata.tif') + 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) + 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 @@ -181,14 +194,15 @@ def test_stats_nan_3(): def test_stats_nan_4(): - ds = gdal.Open('data/nan32_nodata.vrt') + 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 cs == 874, "did not get expected checksum" + + assert gdaltest.isnan(nodata), "expected nan, got %f" % nodata - assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test reading a VRT with a complex source that define 0 as band nodata @@ -197,29 +211,31 @@ def test_stats_nan_4(): def test_stats_nan_5(): - ds = gdal.Open('data/nan32_nodata_nan_to_zero.vrt') + 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 cs == 978, "did not get expected checksum" - assert nodata == 0, ('expected nan, got %f' % nodata) + 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') + 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 cs == 874, "did not get expected checksum" + + assert gdaltest.isnan(nodata), "expected nan, got %f" % nodata - 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) @@ -227,29 +243,31 @@ def test_stats_nan_6(): def test_stats_nan_7(): - ds = gdal.Open('data/nan32_nodata_warp_nan_to_zero.vrt') + 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 cs == 978, "did not get expected checksum" - assert nodata == 0, ('expected nan, got %f' % nodata) + 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') + 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 cs == 874, "did not get expected checksum" + + assert gdaltest.isnan(nodata), "expected nan, got %f" % nodata - assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test statistics computation when nodata = +/- inf @@ -262,48 +280,60 @@ def stats_nodata_inf_progress_cbk(value, string, extra): def test_stats_nodata_inf(): - ds = gdal.GetDriverByName('HFA').Create('/vsimem/stats_nodata_inf.img', 3, 1, 1, gdal.GDT_Float32) + 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).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' + 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') + gdal.GetDriverByName("HFA").Delete("/vsimem/stats_nodata_inf.img") - assert stats == [-2.0, 1.0, -0.5, 1.5], 'did not get expected stats' + 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' + 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()) + 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()) + 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()) + 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()) + return stats_nodata_check("data/stats_nodata_posinf_msvc.tif", gdaltest.posinf()) + ############################################################################### # Test standard deviation computation on huge values @@ -311,8 +341,9 @@ def test_stats_nodata_posinf_msvc(): def test_stats_stddev_huge_values(): - gdal.FileFromMemBuffer('/vsimem/stats_stddev_huge_values.asc', - """ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/stats_stddev_huge_values.asc", + """ncols 4 nrows 4 xllcorner 0 yllcorner 0 @@ -320,13 +351,19 @@ def test_stats_stddev_huge_values(): 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') + 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' + 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') + gdal.GetDriverByName("AAIGRID").Delete("/vsimem/stats_stddev_huge_values.asc") + ############################################################################### # Test approximate statistics computation on a square shaped raster whose first column @@ -335,21 +372,28 @@ def test_stats_stddev_huge_values(): 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 = 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) + 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') + 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' + 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') + pytest.fail("did not get expected minmax") ############################################################################### @@ -358,34 +402,38 @@ def test_stats_square_shape(): def test_stats_flt_min(): - shutil.copyfile('data/flt_min.tif', 'tmp/flt_min.tif') + shutil.copyfile("data/flt_min.tif", "tmp/flt_min.tif") try: - os.remove('tmp/flt_min.tif.aux.xml') + os.remove("tmp/flt_min.tif.aux.xml") except OSError: pass - ds = gdal.Open('tmp/flt_min.tif') + 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') + os.remove("tmp/flt_min.tif.aux.xml") - ds = gdal.Open('tmp/flt_min.tif') + ds = gdal.Open("tmp/flt_min.tif") minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None - os.remove('tmp/flt_min.tif') + os.remove("tmp/flt_min.tif") if nodata != 1.17549435082228751e-38: print("%.18g" % nodata) - pytest.fail('did not get expected 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 (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" - assert minmax == (0.0, 1.0), 'did not get expected minmax' ############################################################################### # Test when nodata = DBL_MIN (#6578) @@ -393,34 +441,38 @@ def test_stats_flt_min(): def test_stats_dbl_min(): - shutil.copyfile('data/dbl_min.tif', 'tmp/dbl_min.tif') + shutil.copyfile("data/dbl_min.tif", "tmp/dbl_min.tif") try: - os.remove('tmp/dbl_min.tif.aux.xml') + os.remove("tmp/dbl_min.tif.aux.xml") except OSError: pass - ds = gdal.Open('tmp/dbl_min.tif') + 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') + os.remove("tmp/dbl_min.tif.aux.xml") - ds = gdal.Open('tmp/dbl_min.tif') + ds = gdal.Open("tmp/dbl_min.tif") minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None - os.remove('tmp/dbl_min.tif') + os.remove("tmp/dbl_min.tif") if nodata != 2.22507385850720138e-308: print("%.18g" % nodata) - pytest.fail('did not get expected 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 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" - assert minmax == (0.0, 1.0), 'did not get expected minmax' ############################################################################### # Test stats on a tiled Byte with partial tiles @@ -428,95 +480,117 @@ def test_stats_dbl_min(): 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']) + 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') + 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' + 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 = 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/stats_byte_tiled.tif") expected_stats = [1.0, 255.0, 50.311081057390084, 67.14541389488096] - assert stats == pytest.approx(expected_stats, rel=1e-10), \ - 'did not get expected stats' + assert stats == pytest.approx( + expected_stats, rel=1e-10 + ), "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 = 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/stats_byte_untiled.tif") expected_stats = [1.0, 255.0, 50.378183963744554, 67.184793517649453] - assert stats == pytest.approx(expected_stats, rel=1e-10), 'did not get expected stats' - - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/stats_byte_tiled.tif', 1000, 512, - options=['TILED=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=512']) + assert stats == pytest.approx( + expected_stats, rel=1e-10 + ), "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') + 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' + 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)) + 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)) + 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' + 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 = 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)) + 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' + 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 = 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)) + 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' + assert ( + max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15 + ), "did not get expected stats" + ############################################################################### # Test stats on uint16 @@ -524,98 +598,129 @@ def test_stats_byte_partial_tiles(): 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']) + 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') + 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') + 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' + 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 = 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') + 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 == pytest.approx(expected_stats, rel=1e-10), 'did not get expected stats' + expected_stats = [ + 257.0, + 65535.0, + 50.378183963744554 * 65535 / 255, + 67.184793517649453 * 65535 / 255, + ] + assert stats == pytest.approx( + expected_stats, rel=1e-10 + ), "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 = 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') + 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') + 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 = 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)) + 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' + 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)) + 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)) + 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' + 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)) + 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' + 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 @@ -623,134 +728,161 @@ def test_stats_uint16(): 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()) + 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') + ds = gdal.Open("/vsimem/float32_almost_nodata_max_float32.tif") minmax = ds.GetRasterBand(1).ComputeRasterMinMax() - assert minmax == (0, 0), 'did not get expected minmax' + 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' + 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' + assert hist[0] == 3, "did not get expected hist" ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/float32_almost_nodata_max_float32.tif') + 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'): +def test_stats_approx_stats_flag(dt=gdal.GDT_Byte, struct_frmt="B"): - ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000, 1, dt) + 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' + 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' + 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' + 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' + 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' + 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') + 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 = 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' + 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 = 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' + 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') + 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' + assert (my_min, my_max) == ( + -1.0989999771118164, + 0.703338623046875, + ), "did not get expected stats" def test_stats_clear(): - filename = '/vsimem/out.tif' - gdal.Translate(filename, 'data/byte.tif') + filename = "/vsimem/out.tif" + gdal.Translate(filename, "data/byte.tif") ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetStatistics(False, False) == [0,0,0,-1] - assert ds.GetRasterBand(1).ComputeStatistics(False) != [0,0,0,-1] + assert ds.GetRasterBand(1).GetStatistics(False, False) == [0, 0, 0, -1] + assert ds.GetRasterBand(1).ComputeStatistics(False) != [0, 0, 0, -1] ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetStatistics(False, False) != [0,0,0,-1] + assert ds.GetRasterBand(1).GetStatistics(False, False) != [0, 0, 0, -1] ds.ClearStatistics() ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetStatistics(False, False) == [0,0,0,-1] - - gdal.GetDriverByName('GTiff').Delete(filename) - - -@pytest.mark.parametrize('datatype,minval,maxval', - [(gdal.GDT_Byte, 1, 254), - (gdal.GDT_Byte, -127, 127), - (gdal.GDT_UInt16, 1, 65535), - (gdal.GDT_Int16, -32767, 32766), - (gdal.GDT_UInt32, 1, (1 << 32) - 2), - (gdal.GDT_Int32, -(1 << 31) + 1, (1 << 31) - 2), - (gdal.GDT_UInt64, 1, (1 << 53) - 2), - (gdal.GDT_Int64, -(1 << 53) + 2, (1 << 53) - 2), - (gdal.GDT_Float32, -struct.unpack('f', struct.pack('f', 1e20))[0], - struct.unpack('f', struct.pack('f', 1e20))[0]), - (gdal.GDT_Float64, -1e100, 1e100), - (gdal.GDT_CInt16, -32767, 32766), - (gdal.GDT_CInt32, -(1 << 31) + 1, (1 << 31) - 2), - (gdal.GDT_CFloat32, -struct.unpack('f', struct.pack('f', 1e20))[0], - struct.unpack('f', struct.pack('f', 1e20))[0]), - (gdal.GDT_CFloat64, -1e100, 1e100),]) -@pytest.mark.parametrize('nodata', [None, 0, 1]) + assert ds.GetRasterBand(1).GetStatistics(False, False) == [0, 0, 0, -1] + + gdal.GetDriverByName("GTiff").Delete(filename) + + +@pytest.mark.parametrize( + "datatype,minval,maxval", + [ + (gdal.GDT_Byte, 1, 254), + (gdal.GDT_Byte, -127, 127), + (gdal.GDT_UInt16, 1, 65535), + (gdal.GDT_Int16, -32767, 32766), + (gdal.GDT_UInt32, 1, (1 << 32) - 2), + (gdal.GDT_Int32, -(1 << 31) + 1, (1 << 31) - 2), + (gdal.GDT_UInt64, 1, (1 << 53) - 2), + (gdal.GDT_Int64, -(1 << 53) + 2, (1 << 53) - 2), + ( + gdal.GDT_Float32, + -struct.unpack("f", struct.pack("f", 1e20))[0], + struct.unpack("f", struct.pack("f", 1e20))[0], + ), + (gdal.GDT_Float64, -1e100, 1e100), + (gdal.GDT_CInt16, -32767, 32766), + (gdal.GDT_CInt32, -(1 << 31) + 1, (1 << 31) - 2), + ( + gdal.GDT_CFloat32, + -struct.unpack("f", struct.pack("f", 1e20))[0], + struct.unpack("f", struct.pack("f", 1e20))[0], + ), + (gdal.GDT_CFloat64, -1e100, 1e100), + ], +) +@pytest.mark.parametrize("nodata", [None, 0, 1]) def test_stats_computeminmax(datatype, minval, maxval, nodata): - ds = gdal.GetDriverByName('MEM').Create('', 64, 1, 1, datatype) + ds = gdal.GetDriverByName("MEM").Create("", 64, 1, 1, datatype) minval_mod = minval expected_minval = minval if datatype == gdal.GDT_Byte and minval < 0: - ds.GetRasterBand(1).SetMetadataItem('PIXELTYPE', 'SIGNEDBYTE', 'IMAGE_STRUCTURE') + ds.GetRasterBand(1).SetMetadataItem( + "PIXELTYPE", "SIGNEDBYTE", "IMAGE_STRUCTURE" + ) minval_mod = 256 + minval if nodata: ds.GetRasterBand(1).SetNoDataValue(nodata) if nodata == 1 and minval == 1: expected_minval = maxval - ds.GetRasterBand(1).WriteRaster(0, 0, 64, 1, - struct.pack('d' * 2, minval_mod, maxval), - buf_type = gdal.GDT_Float64, - buf_xsize = 2, - buf_ysize = 1) + ds.GetRasterBand(1).WriteRaster( + 0, + 0, + 64, + 1, + struct.pack("d" * 2, minval_mod, maxval), + buf_type=gdal.GDT_Float64, + buf_xsize=2, + buf_ysize=1, + ) assert ds.GetRasterBand(1).ComputeRasterMinMax(0) == (expected_minval, maxval) - diff --git a/autotest/gcore/geoloc.py b/autotest/gcore/geoloc.py index 9aa9ae8e03fd..08088d87e9ac 100755 --- a/autotest/gcore/geoloc.py +++ b/autotest/gcore/geoloc.py @@ -31,18 +31,19 @@ import array import random -from osgeo import gdal, osr import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Verify warped result. def test_geoloc_1(): - tst = gdaltest.GDALTest('VRT', 'warpsst.vrt', 1, 63034) + tst = gdaltest.GDALTest("VRT", "warpsst.vrt", 1, 63034) return tst.testOpen(check_filelist=False) @@ -50,68 +51,90 @@ def test_geoloc_1(): # Test that we take into account the min/max of the geoloc arrays -@pytest.mark.parametrize("use_temp_datasets", ['YES', 'NO']) +@pytest.mark.parametrize("use_temp_datasets", ["YES", "NO"]) def test_geoloc_bounds(use_temp_datasets): - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lon.tif', 360, 1, 1, gdal.GDT_Float32) - lon_ds.WriteRaster(0, 0, 360, 1, array.array('f', [91 + 0.5 * x for x in range(178)] + [-179.9 + 0.5 * x for x in range(182)])) + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lon.tif", 360, 1, 1, gdal.GDT_Float32 + ) + lon_ds.WriteRaster( + 0, + 0, + 360, + 1, + array.array( + "f", + [91 + 0.5 * x for x in range(178)] + [-179.9 + 0.5 * x for x in range(182)], + ), + ) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lat.tif', 80, 1, 1, gdal.GDT_Float32) - lat_ds.WriteRaster(0, 0, 80, 1, array.array('f', [60.4 + 0.5 * x for x in range(60)] + [89 - 0.5 * x for x in range(20)])) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lat.tif", 80, 1, 1, gdal.GDT_Float32 + ) + lat_ds.WriteRaster( + 0, + 0, + 80, + 1, + array.array( + "f", [60.4 + 0.5 * x for x in range(60)] + [89 - 0.5 * x for x in range(20)] + ), + ) lat_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 360, 80) + ds = gdal.GetDriverByName("MEM").Create("", 360, 80) md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': '1', - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': '1', - 'X_DATASET': '/vsimem/lon.tif', - 'X_BAND' : '1', - 'Y_DATASET': '/vsimem/lat.tif', - 'Y_BAND' : '1' + "LINE_OFFSET": "0", + "LINE_STEP": "1", + "PIXEL_OFFSET": "0", + "PIXEL_STEP": "1", + "X_DATASET": "/vsimem/lon.tif", + "X_BAND": "1", + "Y_DATASET": "/vsimem/lat.tif", + "Y_BAND": "1", } - ds.SetMetadata(md, 'GEOLOCATION') - with gdaltest.config_option('GDAL_GEOLOC_USE_TEMP_DATASETS', use_temp_datasets): - warped_ds = gdal.Warp('', ds, format='MEM') + ds.SetMetadata(md, "GEOLOCATION") + with gdaltest.config_option("GDAL_GEOLOC_USE_TEMP_DATASETS", use_temp_datasets): + warped_ds = gdal.Warp("", ds, format="MEM") assert warped_ds - gdal.Unlink('/vsimem/lon.tif') - gdal.Unlink('/vsimem/lat.tif') + gdal.Unlink("/vsimem/lon.tif") + gdal.Unlink("/vsimem/lat.tif") gt = warped_ds.GetGeoTransform() assert gt[0] == pytest.approx(-179.9) assert gt[3] == pytest.approx(60.4 + 0.5 * 59) + ############################################################################### # Test that the line filling logic works -@pytest.mark.parametrize("use_temp_datasets", ['YES', 'NO']) +@pytest.mark.parametrize("use_temp_datasets", ["YES", "NO"]) def test_geoloc_fill_line(use_temp_datasets): - - ds = gdal.GetDriverByName('MEM').Create('', 200, 372) + ds = gdal.GetDriverByName("MEM").Create("", 200, 372) md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': '1', - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': '1', - 'X_DATASET': '../alg/data/geoloc/longitude_including_pole.tif', - 'X_BAND' : '1', - 'Y_DATASET': '../alg/data/geoloc/latitude_including_pole.tif', - 'Y_BAND' : '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + "LINE_OFFSET": "0", + "LINE_STEP": "1", + "PIXEL_OFFSET": "0", + "PIXEL_STEP": "1", + "X_DATASET": "../alg/data/geoloc/longitude_including_pole.tif", + "X_BAND": "1", + "Y_DATASET": "../alg/data/geoloc/latitude_including_pole.tif", + "Y_BAND": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', } - ds.SetMetadata(md, 'GEOLOCATION') + ds.SetMetadata(md, "GEOLOCATION") ds.GetRasterBand(1).Fill(1) - with gdaltest.config_option('GDAL_GEOLOC_USE_TEMP_DATASETS', use_temp_datasets): - warped_ds = gdal.Warp('', ds, format='MEM') + with gdaltest.config_option("GDAL_GEOLOC_USE_TEMP_DATASETS", use_temp_datasets): + warped_ds = gdal.Warp("", ds, format="MEM") assert warped_ds - assert warped_ds.GetRasterBand(1).Checksum() in (22339, - 22336) # 22336 with Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 - + assert warped_ds.GetRasterBand(1).Checksum() in ( + 22339, + 22336, + ) # 22336 with Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 ############################################################################### @@ -120,30 +143,36 @@ def test_geoloc_fill_line(use_temp_datasets): def test_geoloc_warp_to_geoloc(): - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lon.tif', 10, 1, 1, gdal.GDT_Float32) - lon_ds.WriteRaster(0, 0, 10, 1, array.array('f', [-79.5 + 1 * x for x in range(10)])) + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lon.tif", 10, 1, 1, gdal.GDT_Float32 + ) + lon_ds.WriteRaster( + 0, 0, 10, 1, array.array("f", [-79.5 + 1 * x for x in range(10)]) + ) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lat.tif', 10, 1, 1, gdal.GDT_Float32) - lat_ds.WriteRaster(0, 0, 10, 1, array.array('f', [49.5 - 1 * x for x in range(10)])) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lat.tif", 10, 1, 1, gdal.GDT_Float32 + ) + lat_ds.WriteRaster(0, 0, 10, 1, array.array("f", [49.5 - 1 * x for x in range(10)])) lat_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 10, 10) + ds = gdal.GetDriverByName("MEM").Create("", 10, 10) md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': '1', - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': '1', - 'X_DATASET': '/vsimem/lon.tif', - 'X_BAND' : '1', - 'Y_DATASET': '/vsimem/lat.tif', - 'Y_BAND' : '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'GEOREFERENCING_CONVENTION': 'PIXEL_CENTER' + "LINE_OFFSET": "0", + "LINE_STEP": "1", + "PIXEL_OFFSET": "0", + "PIXEL_STEP": "1", + "X_DATASET": "/vsimem/lon.tif", + "X_BAND": "1", + "Y_DATASET": "/vsimem/lat.tif", + "Y_BAND": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "GEOREFERENCING_CONVENTION": "PIXEL_CENTER", } - ds.SetMetadata(md, 'GEOLOCATION') + ds.SetMetadata(md, "GEOLOCATION") - input_ds = gdal.GetDriverByName('MEM').Create('', 10, 10) + input_ds = gdal.GetDriverByName("MEM").Create("", 10, 10) input_ds.SetGeoTransform([-80, 1, 0, 50, 0, -1]) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) @@ -163,8 +192,17 @@ def test_geoloc_warp_to_geoloc(): assert ds.GetRasterBand(1).ComputeRasterMinMax() == (255, 255), ds.ReadAsArray() # Try with projected coordinates - input_ds = gdal.GetDriverByName('MEM').Create('', 10, 10) - input_ds.SetGeoTransform([-8905559.26346189, (-7792364.35552915 - -8905559.26346189)/10, 0, 6446275.84101716, 0, -(6446275.84101716-4865942.27950318)/10]) + input_ds = gdal.GetDriverByName("MEM").Create("", 10, 10) + input_ds.SetGeoTransform( + [ + -8905559.26346189, + (-7792364.35552915 - -8905559.26346189) / 10, + 0, + 6446275.84101716, + 0, + -(6446275.84101716 - 4865942.27950318) / 10, + ] + ) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) @@ -182,10 +220,8 @@ def test_geoloc_warp_to_geoloc(): assert ds.GetRasterBand(1).ComputeRasterMinMax() == (255, 255), ds.ReadAsArray() - - gdal.Unlink('/vsimem/lon.tif') - gdal.Unlink('/vsimem/lat.tif') - + gdal.Unlink("/vsimem/lon.tif") + gdal.Unlink("/vsimem/lat.tif") ############################################################################### @@ -194,16 +230,22 @@ def test_geoloc_warp_to_geoloc(): def test_geoloc_error_cases(): - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lon.tif', 10, 1, 1, gdal.GDT_Float32) - lon_ds.WriteRaster(0, 0, 10, 1, array.array('f', [-179.5 + 1 * x for x in range(10)])) + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lon.tif", 10, 1, 1, gdal.GDT_Float32 + ) + lon_ds.WriteRaster( + 0, 0, 10, 1, array.array("f", [-179.5 + 1 * x for x in range(10)]) + ) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lat.tif', 10, 1, 1, gdal.GDT_Float32) - lat_ds.WriteRaster(0, 0, 10, 1, array.array('f', [89.5 - 1 * x for x in range(10)])) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lat.tif", 10, 1, 1, gdal.GDT_Float32 + ) + lat_ds.WriteRaster(0, 0, 10, 1, array.array("f", [89.5 - 1 * x for x in range(10)])) lat_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 10, 10) - ds.SetMetadata({'invalid': 'content'}, 'GEOLOCATION') + ds = gdal.GetDriverByName("MEM").Create("", 10, 10) + ds.SetMetadata({"invalid": "content"}, "GEOLOCATION") with gdaltest.error_handler(): transformer = gdal.Transformer(ds, None, []) @@ -219,38 +261,42 @@ def test_geoloc_error_cases(): @pytest.mark.parametrize("step", [1, 2]) -@pytest.mark.parametrize("convention", ['TOP_LEFT_CORNER', 'PIXEL_CENTER']) -@pytest.mark.parametrize("inverse_method", ['BACKMAP', 'QUADTREE']) +@pytest.mark.parametrize("convention", ["TOP_LEFT_CORNER", "PIXEL_CENTER"]) +@pytest.mark.parametrize("inverse_method", ["BACKMAP", "QUADTREE"]) def test_geoloc_affine_transformation(step, convention, inverse_method): - shift = 0.5 if convention == 'PIXEL_CENTER' else 0 - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lon.tif', 20 // step, 1, 1, gdal.GDT_Float32) - vals = array.array('f', [-80 + step * (x + shift) for x in range(20 // step)]) + shift = 0.5 if convention == "PIXEL_CENTER" else 0 + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lon.tif", 20 // step, 1, 1, gdal.GDT_Float32 + ) + vals = array.array("f", [-80 + step * (x + shift) for x in range(20 // step)]) lon_ds.WriteRaster(0, 0, 20 // step, 1, vals) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lat.tif', 20 // step, 1, 1, gdal.GDT_Float32) - vals = array.array('f', [50 - step * (x + shift) for x in range(20 // step)]) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lat.tif", 20 // step, 1, 1, gdal.GDT_Float32 + ) + vals = array.array("f", [50 - step * (x + shift) for x in range(20 // step)]) lat_ds.WriteRaster(0, 0, 20 // step, 1, vals) lat_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + ds = gdal.GetDriverByName("MEM").Create("", 20, 20) md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': str(step), - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': str(step), - 'X_DATASET': '/vsimem/lon.tif', - 'X_BAND' : '1', - 'Y_DATASET': '/vsimem/lat.tif', - 'Y_BAND' : '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'GEOREFERENCING_CONVENTION' : convention + "LINE_OFFSET": "0", + "LINE_STEP": str(step), + "PIXEL_OFFSET": "0", + "PIXEL_STEP": str(step), + "X_DATASET": "/vsimem/lon.tif", + "X_BAND": "1", + "Y_DATASET": "/vsimem/lat.tif", + "Y_BAND": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "GEOREFERENCING_CONVENTION": convention, } - ds.SetMetadata(md, 'GEOLOCATION') + ds.SetMetadata(md, "GEOLOCATION") - with gdaltest.config_option('GDAL_GEOLOC_INVERSE_METHOD', inverse_method): + with gdaltest.config_option("GDAL_GEOLOC_INVERSE_METHOD", inverse_method): tr = gdal.Transformer(ds, None, []) - def check_point(x,y,X,Y): + def check_point(x, y, X, Y): success, pnt = tr.TransformPoint(False, x, y) assert success assert pnt == (X, Y, 0) @@ -261,15 +307,15 @@ def check_point(x,y,X,Y): check_point(10, 10, -70.0, 40.0) check_point(1.23, 2.34, -78.77, 47.66) - check_point(0, 0, -80.0, 50.0) - check_point(20, 0, -60.0, 50.0) - check_point(0, 20, -80.0, 30.0) + check_point(0, 0, -80.0, 50.0) + check_point(20, 0, -60.0, 50.0) + check_point(0, 20, -80.0, 30.0) check_point(20, 20, -60.0, 30.0) ds = None - gdal.Unlink('/vsimem/lon.tif') - gdal.Unlink('/vsimem/lat.tif') + gdal.Unlink("/vsimem/lon.tif") + gdal.Unlink("/vsimem/lat.tif") ############################################################################### @@ -277,39 +323,55 @@ def check_point(x,y,X,Y): @pytest.mark.parametrize("step", [1, 2]) -@pytest.mark.parametrize("convention", ['TOP_LEFT_CORNER', 'PIXEL_CENTER']) +@pytest.mark.parametrize("convention", ["TOP_LEFT_CORNER", "PIXEL_CENTER"]) def test_geoloc_affine_transformation_with_noise(step, convention): r = random.Random(0) - shift = 0.5 if convention == 'PIXEL_CENTER' else 0 - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lon.tif', 20 // step, 20 // step, 1, gdal.GDT_Float32) + shift = 0.5 if convention == "PIXEL_CENTER" else 0 + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lon.tif", 20 // step, 20 // step, 1, gdal.GDT_Float32 + ) for y in range(lon_ds.RasterYSize): - vals = array.array('f', [-80 + step * (x + shift) + r.uniform(-0.25,0.25) for x in range(lon_ds.RasterXSize)]) + vals = array.array( + "f", + [ + -80 + step * (x + shift) + r.uniform(-0.25, 0.25) + for x in range(lon_ds.RasterXSize) + ], + ) lon_ds.WriteRaster(0, y, lon_ds.RasterXSize, 1, vals) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lat.tif', 20 // step, 20 // step, 1, gdal.GDT_Float32) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lat.tif", 20 // step, 20 // step, 1, gdal.GDT_Float32 + ) for x in range(lat_ds.RasterXSize): - vals = array.array('f', [50 - step * (y + shift) + r.uniform(-0.25,0.25) for y in range(lat_ds.RasterYSize)]) + vals = array.array( + "f", + [ + 50 - step * (y + shift) + r.uniform(-0.25, 0.25) + for y in range(lat_ds.RasterYSize) + ], + ) lat_ds.WriteRaster(x, 0, 1, lat_ds.RasterYSize, vals) lat_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + ds = gdal.GetDriverByName("MEM").Create("", 20, 20) md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': str(step), - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': str(step), - 'X_DATASET': '/vsimem/lon.tif', - 'X_BAND' : '1', - 'Y_DATASET': '/vsimem/lat.tif', - 'Y_BAND' : '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'GEOREFERENCING_CONVENTION' : convention + "LINE_OFFSET": "0", + "LINE_STEP": str(step), + "PIXEL_OFFSET": "0", + "PIXEL_STEP": str(step), + "X_DATASET": "/vsimem/lon.tif", + "X_BAND": "1", + "Y_DATASET": "/vsimem/lat.tif", + "Y_BAND": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "GEOREFERENCING_CONVENTION": convention, } - ds.SetMetadata(md, 'GEOLOCATION') + ds.SetMetadata(md, "GEOLOCATION") tr = gdal.Transformer(ds, None, []) - def check_point(x,y): + def check_point(x, y): success, pnt = tr.TransformPoint(False, x, y) assert success success, pnt = tr.TransformPoint(True, pnt[0], pnt[1]) @@ -325,8 +387,8 @@ def check_point(x,y): ds = None - gdal.Unlink('/vsimem/lon.tif') - gdal.Unlink('/vsimem/lat.tif') + gdal.Unlink("/vsimem/lon.tif") + gdal.Unlink("/vsimem/lat.tif") ############################################################################### @@ -336,34 +398,40 @@ def check_point(x,y): def test_geoloc_GEOLOC_ARRAY_transformer_option(): step = 1 - convention = 'TOP_LEFT_CORNER' + convention = "TOP_LEFT_CORNER" x0 = -80 y0 = 50 - shift = 0.5 if convention == 'PIXEL_CENTER' else 0 - geoloc_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lonlat.tif', 20 // step, 20 // step, 2, gdal.GDT_Float32) + shift = 0.5 if convention == "PIXEL_CENTER" else 0 + geoloc_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lonlat.tif", 20 // step, 20 // step, 2, gdal.GDT_Float32 + ) lon_band = geoloc_ds.GetRasterBand(1) lat_band = geoloc_ds.GetRasterBand(2) for y in range(geoloc_ds.RasterYSize): - vals = array.array('f', [x0 + step * (x + shift) for x in range(geoloc_ds.RasterXSize)]) + vals = array.array( + "f", [x0 + step * (x + shift) for x in range(geoloc_ds.RasterXSize)] + ) lon_band.WriteRaster(0, y, geoloc_ds.RasterXSize, 1, vals) for x in range(geoloc_ds.RasterXSize): - vals = array.array('f', [y0 - step * (y + shift) for y in range(geoloc_ds.RasterYSize)]) + vals = array.array( + "f", [y0 - step * (y + shift) for y in range(geoloc_ds.RasterYSize)] + ) lat_band.WriteRaster(x, 0, 1, geoloc_ds.RasterYSize, vals) geoloc_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + ds = gdal.GetDriverByName("MEM").Create("", 20, 20) # Non-existing GEOLOC_ARRAY with gdaltest.error_handler(): - assert gdal.Transformer(ds, None, ['GEOLOC_ARRAY=/vsimem/invalid.tif' ]) is None + assert gdal.Transformer(ds, None, ["GEOLOC_ARRAY=/vsimem/invalid.tif"]) is None # Existing GEOLOC_ARRAY but single band with gdaltest.error_handler(): - assert gdal.Transformer(ds, None, ['GEOLOC_ARRAY=data/byte.tif' ]) is None + assert gdal.Transformer(ds, None, ["GEOLOC_ARRAY=data/byte.tif"]) is None # Test SRC_GEOLOC_ARRAY transformer option - tr = gdal.Transformer(ds, None, ['SRC_GEOLOC_ARRAY=/vsimem/lonlat.tif' ]) + tr = gdal.Transformer(ds, None, ["SRC_GEOLOC_ARRAY=/vsimem/lonlat.tif"]) assert tr x = 1 y = 20 @@ -372,44 +440,54 @@ def test_geoloc_GEOLOC_ARRAY_transformer_option(): assert pnt == pytest.approx((x0 + x * step, y0 - y * step, 0)) # Test GEOLOC_ARRAY transformer option - tr = gdal.Transformer(ds, None, ['GEOLOC_ARRAY=/vsimem/lonlat.tif' ]) + tr = gdal.Transformer(ds, None, ["GEOLOC_ARRAY=/vsimem/lonlat.tif"]) assert tr success, pnt = tr.TransformPoint(False, x, y) assert success assert pnt == pytest.approx((x0 + x * step, y0 - y * step, 0)) # Test with a GEOLOCATION metadata domain - geoloc_ds = gdal.Open('/vsimem/lonlat.tif', gdal.GA_Update) + geoloc_ds = gdal.Open("/vsimem/lonlat.tif", gdal.GA_Update) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) geoloc_ds.SetSpatialRef(srs) md = { - 'X_BAND': '2', - 'Y_BAND': '1', - 'PIXEL_OFFSET': 15, - 'PIXEL_STEP': '1', - 'LINE_OFFSET': 5, - 'LINE_STEP': '1', - 'X_DATASET': 'ignored', - 'Y_DATASET': 'ignored', + "X_BAND": "2", + "Y_BAND": "1", + "PIXEL_OFFSET": 15, + "PIXEL_STEP": "1", + "LINE_OFFSET": 5, + "LINE_STEP": "1", + "X_DATASET": "ignored", + "Y_DATASET": "ignored", } - geoloc_ds.SetMetadata(md, 'GEOLOCATION') + geoloc_ds.SetMetadata(md, "GEOLOCATION") geoloc_ds = None - tr = gdal.Transformer(ds, None, ['DST_SRS=EPSG:32731', 'GEOLOC_ARRAY=/vsimem/lonlat.tif' ]) + tr = gdal.Transformer( + ds, None, ["DST_SRS=EPSG:32731", "GEOLOC_ARRAY=/vsimem/lonlat.tif"] + ) assert tr success, pnt = tr.TransformPoint(False, x, y) assert success # The 10e6 offset is the northing offset between EPSG:32631 and EPSG:32731 - assert pnt == pytest.approx((y0 - y * step + md['LINE_OFFSET'], 10e6 + x0 + x * step - md['PIXEL_OFFSET'], 0)) - - warped_ds = gdal.Warp('', ds, format='MEM', transformerOptions=['GEOLOC_ARRAY=/vsimem/lonlat.tif']) - assert warped_ds.GetSpatialRef().GetAuthorityCode(None) == '32631' + assert pnt == pytest.approx( + ( + y0 - y * step + md["LINE_OFFSET"], + 10e6 + x0 + x * step - md["PIXEL_OFFSET"], + 0, + ) + ) + + warped_ds = gdal.Warp( + "", ds, format="MEM", transformerOptions=["GEOLOC_ARRAY=/vsimem/lonlat.tif"] + ) + assert warped_ds.GetSpatialRef().GetAuthorityCode(None) == "32631" ds = None - gdal.Unlink('/vsimem/lonlat.tif') + gdal.Unlink("/vsimem/lonlat.tif") ############################################################################### @@ -418,21 +496,27 @@ def test_geoloc_GEOLOC_ARRAY_transformer_option(): def test_geoloc_DST_GEOLOC_ARRAY_transformer_option(): - geoloc_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/lonlat_DST_GEOLOC_ARRAY.tif', 10, 10, 2, gdal.GDT_Float32) - geoloc_ds.SetMetadataItem('GEOREFERENCING_CONVENTION', 'PIXEL_CENTER') + geoloc_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/lonlat_DST_GEOLOC_ARRAY.tif", 10, 10, 2, gdal.GDT_Float32 + ) + geoloc_ds.SetMetadataItem("GEOREFERENCING_CONVENTION", "PIXEL_CENTER") lon_band = geoloc_ds.GetRasterBand(1) lat_band = geoloc_ds.GetRasterBand(2) x0 = -80 y0 = 50 for y in range(geoloc_ds.RasterYSize): - lon_band.WriteRaster(0, 0, 10, 1, array.array('f', [x0 + 0.5 + 1 * x for x in range(10)])) + lon_band.WriteRaster( + 0, 0, 10, 1, array.array("f", [x0 + 0.5 + 1 * x for x in range(10)]) + ) for x in range(geoloc_ds.RasterXSize): - lat_band.WriteRaster(0, 0, 10, 1, array.array('f', [y0 - 0.5 - 1 * x for x in range(10)])) + lat_band.WriteRaster( + 0, 0, 10, 1, array.array("f", [y0 - 0.5 - 1 * x for x in range(10)]) + ) geoloc_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 10, 10) + ds = gdal.GetDriverByName("MEM").Create("", 10, 10) - input_ds = gdal.GetDriverByName('MEM').Create('', 10, 10) + input_ds = gdal.GetDriverByName("MEM").Create("", 10, 10) input_ds.SetGeoTransform([x0, 1, 0, y0, 0, -1]) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) @@ -441,9 +525,14 @@ def test_geoloc_DST_GEOLOC_ARRAY_transformer_option(): # Non-existing DST_GEOLOC_ARRAY with gdaltest.error_handler(): - assert gdal.Transformer(input_ds, ds, ['DST_GEOLOC_ARRAY=/vsimem/invalid.tif' ]) is None + assert ( + gdal.Transformer(input_ds, ds, ["DST_GEOLOC_ARRAY=/vsimem/invalid.tif"]) + is None + ) - tr = gdal.Transformer(input_ds, ds, ['DST_GEOLOC_ARRAY=/vsimem/lonlat_DST_GEOLOC_ARRAY.tif' ]) + tr = gdal.Transformer( + input_ds, ds, ["DST_GEOLOC_ARRAY=/vsimem/lonlat_DST_GEOLOC_ARRAY.tif"] + ) success, pnt = tr.TransformPoint(0, 0.5, 0.5) assert success @@ -451,4 +540,4 @@ def test_geoloc_DST_GEOLOC_ARRAY_transformer_option(): ds = None - gdal.Unlink('/vsimem/lonlat_DST_GEOLOC_ARRAY.tif') + gdal.Unlink("/vsimem/lonlat_DST_GEOLOC_ARRAY.tif") diff --git a/autotest/gcore/gtiff_write.py b/autotest/gcore/gtiff_write.py index 92e4a1b07acc..7908c404d8ec 100755 --- a/autotest/gcore/gtiff_write.py +++ b/autotest/gcore/gtiff_write.py @@ -25,52 +25,54 @@ # Boston, MA 02111-1307, USA. ############################################################################### -import pytest - import gdaltest +import pytest 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)] + ("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', - ] + "testfunction", + [ + "testSetGeoTransform", + "testSetProjection", + "testSetMetadata", + ], ) -@pytest.mark.require_driver('GTiff') +@pytest.mark.require_driver("GTiff") def test_gtiff_set(testfunction): - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) + ut = gdaltest.GDALTest("GTiff", "byte.tif", 1, 4672) getattr(ut, testfunction)() # Others we do for each pixel type. @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - 'testSetNoDataValue', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + "testSetNoDataValue", + ], ) -@pytest.mark.require_driver('GTiff') +@pytest.mark.require_driver("GTiff") def test_gtiff_create(filename, checksum, testfunction): - ut = gdaltest.GDALTest('GTiff', filename, 1, checksum) + ut = gdaltest.GDALTest("GTiff", filename, 1, checksum) getattr(ut, testfunction)() diff --git a/autotest/gcore/hdf4_read.py b/autotest/gcore/hdf4_read.py index 0e05c590ac07..c439b899b96c 100755 --- a/autotest/gcore/hdf4_read.py +++ b/autotest/gcore/hdf4_read.py @@ -27,40 +27,41 @@ ############################################################################### +import gdaltest import pytest -import gdaltest from osgeo import gdal -pytestmark = pytest.mark.require_driver('HDF4') +pytestmark = pytest.mark.require_driver("HDF4") 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)] + ("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', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('HDF4Image') +@pytest.mark.require_driver("HDF4Image") def test_hdf4_open(filename, checksum): - ut = gdaltest.GDALTest('HDF4Image', filename, 1, checksum) + ut = gdaltest.GDALTest("HDF4Image", filename, 1, checksum) ut.testOpen() @@ -71,13 +72,14 @@ def test_hdf4_open(filename, checksum): def test_hdf4_read_gr(): # Generated by https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/hdf/examples/GR_create_and_write_image.c - ds = gdal.Open('data/General_RImages.hdf') + ds = gdal.Open("data/General_RImages.hdf") assert ds assert ds.RasterCount == 2 assert ds.GetRasterBand(1).Checksum() == 361 assert not ds.GetRasterBand(1).GetColorTable() assert ds.GetRasterBand(2).Checksum() == 400 + ############################################################################### # Test reading a GR dataset with a palette @@ -85,29 +87,40 @@ def test_hdf4_read_gr(): def test_hdf4_read_gr_palette(): # Generated by https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/hdf/examples/GR_write_palette.c - ds = gdal.Open('data/Image_with_Palette.hdf') + ds = gdal.Open("data/Image_with_Palette.hdf") assert ds assert ds.RasterCount == 1 assert ds.GetRasterBand(1).GetColorTable() + ############################################################################### # Test HDF4_SDS with single subdataset def test_hdf4_read_online_1(): - gdaltest.hdf4_drv = gdal.GetDriverByName('HDF4') + 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'): + 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) + 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 @@ -117,47 +130,71 @@ 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'): + 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 = 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') + 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' + 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'): + 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 = 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') + 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 gt[i] == pytest.approx(expected_gt[i], abs=1e-8), 'did not get expected gt' + assert gt[i] == pytest.approx( + expected_gt[i], abs=1e-8 + ), "did not get expected gt" srs = ds.GetProjectionRef() - assert srs.find('Clarke') != -1, 'did not get expected projection' + assert srs.find("Clarke") != -1, "did not get expected projection" ds = None + ############################################################################### # Test HDF4_SDS:SEAWIFS_L1A @@ -167,18 +204,28 @@ 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'): + 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 = 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 = 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 @@ -189,13 +236,23 @@ def test_hdf4_read_online_5(): 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'): + 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 = 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 @@ -206,25 +263,37 @@ def test_hdf4_read_online_6(): 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'): + 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 = 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') + 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): + 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' + assert cs == 12197, "did not get expected checksum" ds = None + ############################################################################### # Test fix for #3386 where block size is smaller than dataset size @@ -235,21 +304,32 @@ def test_hdf4_read_online_7(): 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'): + 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 = 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') + 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): + 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' + assert cs == 54894, "did not get expected checksum" ds = None @@ -258,32 +338,45 @@ def test_hdf4_read_online_7(): # 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('https://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.006/2006.06.10/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf', 'MOD13Q1.A2006161.h34v09.006.2015161173716.hdf'): + if not gdaltest.download_file( + "https://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.006/2006.06.10/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf", + "MOD13Q1.A2006161.h34v09.006.2015161173716.hdf", + ): pytest.skip() - tst = gdaltest.GDALTest('HDF4Image', 'HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI', 1, 44174, filename_absolute=1) + tst = gdaltest.GDALTest( + "HDF4Image", + "HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI", + 1, + 44174, + filename_absolute=1, + ) tst.testOpen() - ds = gdal.Open('HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI') + ds = gdal.Open( + "HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h34v09.006.2015161173716.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI" + ) cs = ds.GetRasterBand(1).Checksum() - assert cs == 44174, 'did not get expected checksum' + assert cs == 44174, "did not get expected checksum" - if 'GetBlockSize' in dir(gdal.Band): + 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)) + print("blockx=%d, blocky=%d" % (blockx, blocky)) pytest.fail("Did not get expected block size") ds = None + ############################################################################### # Test reading L1G MTL metadata metadata @@ -293,20 +386,27 @@ def test_hdf4_read_online_9(): if gdaltest.hdf4_drv is None: pytest.skip() - if not gdaltest.download_file('ftp://ftp.maps.canada.ca/pub/nrcan_rncan/archive/image/landsat_7/geobase_hdf/L71002025_02520010722/L71002025_02520010722_MTL.L1G', 'L71002025_02520010722_MTL.L1G'): + if not gdaltest.download_file( + "ftp://ftp.maps.canada.ca/pub/nrcan_rncan/archive/image/landsat_7/geobase_hdf/L71002025_02520010722/L71002025_02520010722_MTL.L1G", + "L71002025_02520010722_MTL.L1G", + ): pytest.skip() - if not gdaltest.download_file('ftp://ftp.maps.canada.ca/pub/nrcan_rncan/archive/image/landsat_7/geobase_hdf/L71002025_02520010722/L71002025_02520010722_HDF.L1G', 'L71002025_02520010722_HDF.L1G'): + if not gdaltest.download_file( + "ftp://ftp.maps.canada.ca/pub/nrcan_rncan/archive/image/landsat_7/geobase_hdf/L71002025_02520010722/L71002025_02520010722_HDF.L1G", + "L71002025_02520010722_HDF.L1G", + ): pytest.skip() - f = open('tmp/cache/L71002025_02520010722_B10.L1G', 'wb') + 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' + assert gcp_count == 4, "did not get expected gcp count" + ############################################################################### # Test that non-tiled access works (#4672) @@ -317,22 +417,26 @@ 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'): + 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') + 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): + 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' + assert cs == 20976, "did not get expected checksum" ds = None - ############################################################################### # Test reading HDFEOS SWATH projducts @@ -342,16 +446,24 @@ def test_hdf4_read_online_11(): if gdaltest.hdf4_drv is None: pytest.skip() - if not gdaltest.download_file('https://gamma.hdfgroup.org/ftp/pub/outgoing/NASAHDFfiles2/eosweb/hdf4/hdfeos2-swath-wo-dimmaps/AMSR_E_L2_Ocean_B01_200206182340_A.hdf', 'AMSR_E_L2_Ocean_B01_200206182340_A.hdf'): + if not gdaltest.download_file( + "https://gamma.hdfgroup.org/ftp/pub/outgoing/NASAHDFfiles2/eosweb/hdf4/hdfeos2-swath-wo-dimmaps/AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + "AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + ): pytest.skip() - ds = gdal.Open('HDF4_EOS:EOS_SWATH:"tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf":Swath1:Ocean_products_quality_flag') + ds = gdal.Open( + 'HDF4_EOS:EOS_SWATH:"tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf":Swath1:Ocean_products_quality_flag' + ) cs = ds.GetRasterBand(1).Checksum() - assert cs == 7809, 'did not get expected checksum' + assert cs == 7809, "did not get expected checksum" - ds = gdal.Open('tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf') + ds = gdal.Open("tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf") assert len(ds.GetSubDatasets()) == 7 - ds = gdal.OpenEx('tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf', open_options = ['LIST_SDS=YES']) + ds = gdal.OpenEx( + "tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + open_options=["LIST_SDS=YES"], + ) assert len(ds.GetSubDatasets()) == 16 diff --git a/autotest/gcore/hdf4_write.py b/autotest/gcore/hdf4_write.py index 476d31fe20d3..64249e359622 100755 --- a/autotest/gcore/hdf4_write.py +++ b/autotest/gcore/hdf4_write.py @@ -25,39 +25,40 @@ # Boston, MA 02111-1307, USA. ############################################################################### -import pytest import gdaltest +import pytest 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) + ("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( - '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] + "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', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + "testSetGeoTransform", + "testSetProjection", + "testSetMetadata", + "testSetNoDataValue", + "testSetDescription", + ], ) -@pytest.mark.require_driver('HDF4Image') +@pytest.mark.require_driver("HDF4Image") def test_hdf4_write(filename, checksum, testfunction, rank): - ut = gdaltest.GDALTest('HDF4Image', filename, 1, checksum, options=['RANK=%d' % rank]) + ut = gdaltest.GDALTest( + "HDF4Image", filename, 1, checksum, options=["RANK=%d" % rank] + ) getattr(ut, testfunction)() diff --git a/autotest/gcore/hdf4multidim.py b/autotest/gcore/hdf4multidim.py index 376d39ca6424..408aef3ec9c8 100644 --- a/autotest/gcore/hdf4multidim.py +++ b/autotest/gcore/hdf4multidim.py @@ -28,13 +28,14 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import struct + import gdaltest import pytest -import struct from osgeo import gdal -pytestmark = pytest.mark.require_driver('HDF4') +pytestmark = pytest.mark.require_driver("HDF4") ############################################################################### @@ -43,86 +44,89 @@ def test_hdf4multidim_hdfeos_swath(): - if not gdaltest.download_file('https://gamma.hdfgroup.org/ftp/pub/outgoing/NASAHDFfiles2/eosweb/hdf4/hdfeos2-swath-wo-dimmaps/AMSR_E_L2_Ocean_B01_200206182340_A.hdf', 'AMSR_E_L2_Ocean_B01_200206182340_A.hdf'): + if not gdaltest.download_file( + "https://gamma.hdfgroup.org/ftp/pub/outgoing/NASAHDFfiles2/eosweb/hdf4/hdfeos2-swath-wo-dimmaps/AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + "AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + ): pytest.skip() - ds = gdal.OpenEx('tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf", gdal.OF_MULTIDIM_RASTER + ) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetGroupNames() == ['swaths'] + assert rg.GetGroupNames() == ["swaths"] attrs = rg.GetAttributes() assert attrs - attr = rg.GetAttribute('HDFEOSVersion') - assert attr.Read() == 'HDFEOS_V2.7.2' - swaths = rg.OpenGroup('swaths') + attr = rg.GetAttribute("HDFEOSVersion") + assert attr.Read() == "HDFEOS_V2.7.2" + swaths = rg.OpenGroup("swaths") assert swaths - assert not rg.OpenGroup('foo') - assert swaths.GetGroupNames() == ['Swath1'] - swath1 = swaths.OpenGroup('Swath1') + assert not rg.OpenGroup("foo") + assert swaths.GetGroupNames() == ["Swath1"] + swath1 = swaths.OpenGroup("Swath1") assert swath1 - assert not swaths.OpenGroup('foo') + assert not swaths.OpenGroup("foo") attrs = swath1.GetAttributes() assert len(attrs) == 3 - attr = swath1.GetAttribute('SoftwareRevisionDate') + attr = swath1.GetAttribute("SoftwareRevisionDate") assert attr.Read()[0:-1] == "November 7, 2003" - attr = swath1.GetAttribute('SoftwareBuildNumber') + attr = swath1.GetAttribute("SoftwareBuildNumber") assert attr.Read() == 1 dims = swath1.GetDimensions() assert len(dims) == 4 - dim = next((x for x in dims if x.GetName() == 'DataXtrack_lo'), None) + dim = next((x for x in dims if x.GetName() == "DataXtrack_lo"), None) assert dim - assert dim.GetFullName() == '/swaths/Swath1/DataXtrack_lo' - assert dim.GetSize() == 196 - assert swath1.GetGroupNames() == ['Data Fields', 'Geolocation Fields'] - assert not swath1.OpenGroup('foo') - datafields = swath1.OpenGroup('Data Fields') + assert dim.GetFullName() == "/swaths/Swath1/DataXtrack_lo" + assert dim.GetSize() == 196 + assert swath1.GetGroupNames() == ["Data Fields", "Geolocation Fields"] + assert not swath1.OpenGroup("foo") + datafields = swath1.OpenGroup("Data Fields") assert datafields assert len(datafields.GetMDArrayNames()) == 10 - assert not datafields.OpenMDArray('foo') - array = datafields.OpenMDArray('High_res_cloud') + assert not datafields.OpenMDArray("foo") + array = datafields.OpenMDArray("High_res_cloud") assert array dims = array.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/swaths/Swath1/DataTrack_lo' + assert dims[0].GetFullName() == "/swaths/Swath1/DataTrack_lo" assert array.GetDataType().GetNumericDataType() == gdal.GDT_Int16 - attr = array.GetAttribute('Scale') + attr = array.GetAttribute("Scale") assert attr.Read() == 9.999999747378752e-05 - got_data = array.Read(array_start_idx = [13, 0], count = [3, 2]) + got_data = array.Read(array_start_idx=[13, 0], count=[3, 2]) assert len(got_data) == 3 * 2 * 2 - assert struct.unpack('h' * 6, got_data) == (0, 0, - 17318, 17317, - 17318, 17317) + assert struct.unpack("h" * 6, got_data) == (0, 0, 17318, 17317, 17318, 17317) - - got_data = array.Read(array_start_idx = [13, 0], count = [3, 2], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + got_data = array.Read( + array_start_idx=[13, 0], + count=[3, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int32), + ) assert len(got_data) == 3 * 2 * 4 - assert struct.unpack('i' * 6, got_data) == (0, 0, - 17318, 17317, - 17318, 17317) + assert struct.unpack("i" * 6, got_data) == (0, 0, 17318, 17317, 17318, 17317) - got_data = array.Read(array_start_idx = [13, 0], count = [3, 2], array_step = [2, 1]) + got_data = array.Read(array_start_idx=[13, 0], count=[3, 2], array_step=[2, 1]) assert len(got_data) == 3 * 2 * 2 - assert struct.unpack('h' * 6, got_data) == (0, 0, - 17318, 17317, - 17317, 17317) + assert struct.unpack("h" * 6, got_data) == (0, 0, 17318, 17317, 17317, 17317) - got_data = array.Read(array_start_idx = [15, 1], count = [3, 2], array_step = [-1, -1]) + got_data = array.Read(array_start_idx=[15, 1], count=[3, 2], array_step=[-1, -1]) assert len(got_data) == 3 * 2 * 2 - assert struct.unpack('h' * 6, got_data) == (17317, 17318, - 17317, 17318, - 0, 0) + assert struct.unpack("h" * 6, got_data) == (17317, 17318, 17317, 17318, 0, 0) - got_data = array.Read(array_start_idx = [13, 0], count = [3, 2], buffer_stride = [1, 3]) + got_data = array.Read(array_start_idx=[13, 0], count=[3, 2], buffer_stride=[1, 3]) assert len(got_data) == 3 * 2 * 2 - assert struct.unpack('h' * 6, got_data) == (0, 17318, 17318, - 0, 17317, 17317) + assert struct.unpack("h" * 6, got_data) == (0, 17318, 17318, 0, 17317, 17317) - ds = gdal.OpenEx('tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf', gdal.OF_MULTIDIM_RASTER, open_options = ['LIST_SDS=YES']) + ds = gdal.OpenEx( + "tmp/cache/AMSR_E_L2_Ocean_B01_200206182340_A.hdf", + gdal.OF_MULTIDIM_RASTER, + open_options=["LIST_SDS=YES"], + ) rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['swaths', 'scientific_datasets'] + assert rg.GetGroupNames() == ["swaths", "scientific_datasets"] + ############################################################################### # Test reading HDFEOS GRID products @@ -130,71 +134,82 @@ def test_hdf4multidim_hdfeos_swath(): def test_hdf4multidim_hdfeos_grid(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/MOD09A1.A2010041.h06v03.005.2010051001103.hdf', 'MOD09A1.A2010041.h06v03.005.2010051001103.hdf'): + 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() - ds = gdal.OpenEx('tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['eos_grids'] + assert rg.GetGroupNames() == ["eos_grids"] attrs = rg.GetAttributes() assert attrs - attr = rg.GetAttribute('HDFEOSVersion') - assert attr.Read() == 'HDFEOS_V2.9' - eos_grids = rg.OpenGroup('eos_grids') + attr = rg.GetAttribute("HDFEOSVersion") + assert attr.Read() == "HDFEOS_V2.9" + eos_grids = rg.OpenGroup("eos_grids") assert eos_grids - assert not rg.OpenGroup('foo') - assert eos_grids.GetGroupNames() == ['MOD_Grid_500m_Surface_Reflectance'] - MOD_Grid_500m_Surface_Reflectance = eos_grids.OpenGroup('MOD_Grid_500m_Surface_Reflectance') + assert not rg.OpenGroup("foo") + assert eos_grids.GetGroupNames() == ["MOD_Grid_500m_Surface_Reflectance"] + MOD_Grid_500m_Surface_Reflectance = eos_grids.OpenGroup( + "MOD_Grid_500m_Surface_Reflectance" + ) assert MOD_Grid_500m_Surface_Reflectance - assert not eos_grids.OpenGroup('foo') + assert not eos_grids.OpenGroup("foo") attrs = MOD_Grid_500m_Surface_Reflectance.GetAttributes() assert len(attrs) == 0 - assert MOD_Grid_500m_Surface_Reflectance.GetGroupNames() == ['Data Fields'] - assert not MOD_Grid_500m_Surface_Reflectance.OpenGroup('foo') - datafields = MOD_Grid_500m_Surface_Reflectance.OpenGroup('Data Fields') + assert MOD_Grid_500m_Surface_Reflectance.GetGroupNames() == ["Data Fields"] + assert not MOD_Grid_500m_Surface_Reflectance.OpenGroup("foo") + datafields = MOD_Grid_500m_Surface_Reflectance.OpenGroup("Data Fields") assert datafields assert len(datafields.GetMDArrayNames()) == 13 - assert not datafields.OpenMDArray('foo') - array = datafields.OpenMDArray('sur_refl_b01') + assert not datafields.OpenMDArray("foo") + array = datafields.OpenMDArray("sur_refl_b01") assert array dims = array.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/eos_grids/MOD_Grid_500m_Surface_Reflectance/YDim' + assert dims[0].GetFullName() == "/eos_grids/MOD_Grid_500m_Surface_Reflectance/YDim" assert dims[0].GetSize() == 2400 - assert dims[1].GetFullName() == '/eos_grids/MOD_Grid_500m_Surface_Reflectance/XDim' + assert dims[1].GetFullName() == "/eos_grids/MOD_Grid_500m_Surface_Reflectance/XDim" assert dims[1].GetSize() == 2400 assert array.GetDataType().GetNumericDataType() == gdal.GDT_Int16 assert array.GetNoDataValueAsDouble() == -28672.0 assert array.GetOffset() == 0 assert array.GetScale() == 0.0001 - assert array.GetUnit() == 'reflectance' - attr = array.GetAttribute('valid_range') + assert array.GetUnit() == "reflectance" + attr = array.GetAttribute("valid_range") assert attr.Read() == (-100, 16000) assert array.GetSpatialRef() - got_data = array.Read(array_start_idx = [2398, 2398], count = [2, 2]) + got_data = array.Read(array_start_idx=[2398, 2398], count=[2, 2]) assert len(got_data) == 2 * 2 * 2 - assert struct.unpack('h' * 4, got_data) == (-24, 0, - -15, -22) + assert struct.unpack("h" * 4, got_data) == (-24, 0, -15, -22) dims = MOD_Grid_500m_Surface_Reflectance.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'YDim' + assert dims[0].GetName() == "YDim" assert dims[0].GetIndexingVariable() - assert dims[1].GetName() == 'XDim' + assert dims[1].GetName() == "XDim" assert dims[1].GetIndexingVariable() - assert MOD_Grid_500m_Surface_Reflectance.GetMDArrayNames() == ['YDim', 'XDim'] - XDim = MOD_Grid_500m_Surface_Reflectance.OpenMDArray('XDim') + assert MOD_Grid_500m_Surface_Reflectance.GetMDArrayNames() == ["YDim", "XDim"] + XDim = MOD_Grid_500m_Surface_Reflectance.OpenMDArray("XDim") assert XDim - YDim = MOD_Grid_500m_Surface_Reflectance.OpenMDArray('YDim') + YDim = MOD_Grid_500m_Surface_Reflectance.OpenMDArray("YDim") assert YDim - assert not MOD_Grid_500m_Surface_Reflectance.OpenMDArray('foo') + assert not MOD_Grid_500m_Surface_Reflectance.OpenMDArray("foo") - ds = gdal.OpenEx('tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf', gdal.OF_MULTIDIM_RASTER, open_options = ['LIST_SDS=YES']) + ds = gdal.OpenEx( + "tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf", + gdal.OF_MULTIDIM_RASTER, + open_options=["LIST_SDS=YES"], + ) rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['eos_grids', 'scientific_datasets'] + assert rg.GetGroupNames() == ["eos_grids", "scientific_datasets"] ############################################################################### @@ -203,39 +218,44 @@ def test_hdf4multidim_hdfeos_grid(): def test_hdf4multidim_gdal_sds_2d(): - ds = gdal.OpenEx('data/byte_2.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/byte_2.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg.GetGroupNames() is None - assert rg.OpenGroup('scientific_datasets') is None - assert rg.GetMDArrayNames() == ['Band0', 'X', 'Y'] + assert rg.OpenGroup("scientific_datasets") is None + assert rg.GetMDArrayNames() == ["Band0", "X", "Y"] dims = rg.GetDimensions() assert len(dims) == 2 - array = rg.OpenMDArray('Band0') + array = rg.OpenMDArray("Band0") assert array dims = array.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/Y' - assert dims[1].GetFullName() == '/X' + assert dims[0].GetFullName() == "/Y" + assert dims[1].GetFullName() == "/X" assert array.GetDataType().GetNumericDataType() == gdal.GDT_Byte - got_data = array.Read(array_start_idx = [0, 0], count = [2, 2]) + got_data = array.Read(array_start_idx=[0, 0], count=[2, 2]) assert len(got_data) == 2 * 2 - assert struct.unpack('B' * 4, got_data) == (107, 123, - 115, 132) + assert struct.unpack("B" * 4, got_data) == (107, 123, 115, 132) assert array.GetSpatialRef() - assert array.GetUnit() == '' + assert array.GetUnit() == "" assert not array.GetOffset() assert not array.GetScale() assert not array.GetNoDataValueAsDouble() X = dims[0].GetIndexingVariable() assert X - assert struct.unpack('d' * 2, X.Read(array_start_idx = [0], count = [2])) == (3751290.0, 3751230.0) + assert struct.unpack("d" * 2, X.Read(array_start_idx=[0], count=[2])) == ( + 3751290.0, + 3751230.0, + ) Y = dims[1].GetIndexingVariable() assert Y - assert struct.unpack('d' * 2, Y.Read(array_start_idx = [0], count = [2])) == (440750.0, 440810.0) + assert struct.unpack("d" * 2, Y.Read(array_start_idx=[0], count=[2])) == ( + 440750.0, + 440810.0, + ) ############################################################################### @@ -244,44 +264,50 @@ def test_hdf4multidim_gdal_sds_2d(): def test_hdf4multidim_gdal_sds_3d(): - ds = gdal.OpenEx('data/byte_3.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/byte_3.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg.GetGroupNames() is None - assert rg.OpenGroup('scientific_datasets') is None - assert rg.GetMDArrayNames() == ['3-dimensional Scientific Dataset', 'X', 'Y'] + assert rg.OpenGroup("scientific_datasets") is None + assert rg.GetMDArrayNames() == ["3-dimensional Scientific Dataset", "X", "Y"] dims = rg.GetDimensions() assert len(dims) == 3 - array = rg.OpenMDArray('3-dimensional Scientific Dataset') + array = rg.OpenMDArray("3-dimensional Scientific Dataset") assert array dims = array.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/Y' - assert dims[1].GetFullName() == '/X' - assert dims[2].GetFullName() == '/Band' + assert dims[0].GetFullName() == "/Y" + assert dims[1].GetFullName() == "/X" + assert dims[2].GetFullName() == "/Band" assert array.GetDataType().GetNumericDataType() == gdal.GDT_Byte - got_data = array.Read(array_start_idx = [0, 0, 0], count = [2, 2, 1]) + got_data = array.Read(array_start_idx=[0, 0, 0], count=[2, 2, 1]) assert len(got_data) == 2 * 2 - assert struct.unpack('B' * 4, got_data) == (107, 123, - 115, 132) + assert struct.unpack("B" * 4, got_data) == (107, 123, 115, 132) - got_data = array.Transpose([2,1,0]).Read(array_start_idx = [0, 0, 0], count = [1, 2, 2]) + got_data = array.Transpose([2, 1, 0]).Read( + array_start_idx=[0, 0, 0], count=[1, 2, 2] + ) assert len(got_data) == 2 * 2 - assert struct.unpack('B' * 4, got_data) == (107, 115, - 123, 132) + assert struct.unpack("B" * 4, got_data) == (107, 115, 123, 132) assert array.GetSpatialRef() X = dims[0].GetIndexingVariable() assert X - assert struct.unpack('d' * 2, X.Read(array_start_idx = [0], count = [2])) == (3751290.0, 3751230.0) - assert rg.OpenMDArray('X') + assert struct.unpack("d" * 2, X.Read(array_start_idx=[0], count=[2])) == ( + 3751290.0, + 3751230.0, + ) + assert rg.OpenMDArray("X") Y = dims[1].GetIndexingVariable() assert Y - assert struct.unpack('d' * 2, Y.Read(array_start_idx = [0], count = [2])) == (440750.0, 440810.0) - assert rg.OpenMDArray('Y') + assert struct.unpack("d" * 2, Y.Read(array_start_idx=[0], count=[2])) == ( + 440750.0, + 440810.0, + ) + assert rg.OpenMDArray("Y") ############################################################################### @@ -294,39 +320,39 @@ def test_hdf4multidim_sds(): # https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/mfhdf/examples/SD_create_sds.c # + https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/mfhdf/examples/SD_set_get_dim_info.c # + https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/mfhdf/examples/SD_set_attr.c - ds = gdal.OpenEx('data/SDS.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/SDS.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['scientific_datasets'] - subg = rg.OpenGroup('scientific_datasets') + assert rg.GetGroupNames() == ["scientific_datasets"] + subg = rg.OpenGroup("scientific_datasets") assert subg attrs = rg.GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'File_contents' - assert attrs[0].Read() == 'Storm_track_data' - assert not rg.OpenGroup('foo') + assert attrs[0].GetName() == "File_contents" + assert attrs[0].Read() == "Storm_track_data" + assert not rg.OpenGroup("foo") assert not rg.GetMDArrayNames() - assert not rg.OpenMDArray('foo') + assert not rg.OpenMDArray("foo") assert not subg.GetGroupNames() - assert not subg.OpenGroup('foo') - assert subg.GetMDArrayNames() == ['SDStemplate', 'Y_Axis', 'X_Axis'] + assert not subg.OpenGroup("foo") + assert subg.GetMDArrayNames() == ["SDStemplate", "Y_Axis", "X_Axis"] dims = subg.GetDimensions() assert len(dims) == 2 - array = subg.OpenMDArray('SDStemplate') + array = subg.OpenMDArray("SDStemplate") assert array dims = array.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/scientific_datasets/Y_Axis' + assert dims[0].GetFullName() == "/scientific_datasets/Y_Axis" assert dims[0].GetIndexingVariable() - assert dims[1].GetFullName() == '/scientific_datasets/X_Axis' + assert dims[1].GetFullName() == "/scientific_datasets/X_Axis" assert dims[1].GetIndexingVariable() attrs = array.GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'Valid_range' - attr = array.GetAttribute('Valid_range') + assert attrs[0].GetName() == "Valid_range" + attr = array.GetAttribute("Valid_range") assert attr assert attr.Read() == (2, 10) - assert array.GetUnit() == '' + assert array.GetUnit() == "" assert not array.GetSpatialRef() @@ -338,20 +364,20 @@ def test_hdf4multidim_sds_unlimited_dim(): # Generated with # hhttps://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/mfhdf/examples/SD_unlimited_sds.c - ds = gdal.OpenEx('data/SDSUNLIMITED.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/SDSUNLIMITED.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['scientific_datasets'] - subg = rg.OpenGroup('scientific_datasets') + assert rg.GetGroupNames() == ["scientific_datasets"] + subg = rg.OpenGroup("scientific_datasets") assert subg dims = subg.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'fakeDim0' + assert dims[0].GetName() == "fakeDim0" assert dims[0].GetSize() == 11 - array = subg.OpenMDArray('AppendableData') + array = subg.OpenMDArray("AppendableData") dims = array.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'fakeDim0' + assert dims[0].GetName() == "fakeDim0" assert dims[0].GetSize() == 11 assert len(array.Read()) == 11 * 10 * 4 @@ -362,67 +388,75 @@ def test_hdf4multidim_sds_unlimited_dim(): def test_hdf4multidim_sds_read_world(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/A2004259075000.L2_LAC_SST.hdf', 'A2004259075000.L2_LAC_SST.hdf'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/hdf4/A2004259075000.L2_LAC_SST.hdf", + "A2004259075000.L2_LAC_SST.hdf", + ): pytest.skip() - ds = gdal.OpenEx('tmp/cache/A2004259075000.L2_LAC_SST.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("tmp/cache/A2004259075000.L2_LAC_SST.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['scientific_datasets'] - subg = rg.OpenGroup('scientific_datasets') + assert rg.GetGroupNames() == ["scientific_datasets"] + subg = rg.OpenGroup("scientific_datasets") assert subg - assert not rg.OpenGroup('foo') + assert not rg.OpenGroup("foo") assert not rg.GetMDArrayNames() - assert not rg.OpenMDArray('foo') + assert not rg.OpenMDArray("foo") assert not subg.GetGroupNames() - assert not subg.OpenGroup('foo') - assert subg.GetMDArrayNames() == ['sst'] + assert not subg.OpenGroup("foo") + assert subg.GetMDArrayNames() == ["sst"] dims = subg.GetDimensions() assert len(dims) == 2 - sst = subg.OpenMDArray('sst') + sst = subg.OpenMDArray("sst") assert sst dims = sst.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/scientific_datasets/fakeDim0' - assert dims[1].GetFullName() == '/scientific_datasets/fakeDim1' + assert dims[0].GetFullName() == "/scientific_datasets/fakeDim0" + assert dims[1].GetFullName() == "/scientific_datasets/fakeDim1" attrs = sst.GetAttributes() assert len(attrs) == 5 - attr = sst.GetAttribute('long_name') + attr = sst.GetAttribute("long_name") assert attr - assert attr.Read() == 'Sea Surface Temperature' - assert sst.GetUnit() == 'degrees-C' + assert attr.Read() == "Sea Surface Temperature" + assert sst.GetUnit() == "degrees-C" assert not sst.GetSpatialRef() + ############################################################################### # Test reading a SDS product with indexed dimensions def test_hdf4multidim_sds_read_world_with_indexing_variable(): - if not gdaltest.download_file('https://download.osgeo.org/gdal/data/hdf4/REANALYSIS_1999217.hdf', 'REANALYSIS_1999217.hdf'): + if not gdaltest.download_file( + "https://download.osgeo.org/gdal/data/hdf4/REANALYSIS_1999217.hdf", + "REANALYSIS_1999217.hdf", + ): pytest.skip() - ds = gdal.OpenEx('tmp/cache/REANALYSIS_1999217.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("tmp/cache/REANALYSIS_1999217.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['scientific_datasets'] - subg = rg.OpenGroup('scientific_datasets') + assert rg.GetGroupNames() == ["scientific_datasets"] + subg = rg.OpenGroup("scientific_datasets") assert subg dims = subg.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/scientific_datasets/lat' + assert dims[0].GetFullName() == "/scientific_datasets/lat" assert dims[0].GetIndexingVariable() - assert dims[1].GetFullName() == '/scientific_datasets/lon' + assert dims[1].GetFullName() == "/scientific_datasets/lon" assert dims[1].GetIndexingVariable() - assert dims[2].GetFullName() == '/scientific_datasets/time' + assert dims[2].GetFullName() == "/scientific_datasets/time" assert not dims[2].GetIndexingVariable() - assert subg.GetMDArrayNames() == ['lat', 'lon', 'slp', 'pr_wtr', 'air'] - slp = subg.OpenMDArray('slp') + assert subg.GetMDArrayNames() == ["lat", "lon", "slp", "pr_wtr", "air"] + slp = subg.OpenMDArray("slp") assert slp - assert slp.GetUnit() == 'Pascals' + assert slp.GetUnit() == "Pascals" assert slp.GetOffset() == 119765.0 assert slp.GetScale() == 1.0 + ############################################################################### # Test reading a GR dataset @@ -431,73 +465,56 @@ def test_hdf4multidim_gr(): # Generated by https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/hdf/examples/GR_create_and_write_image.c - ds = gdal.OpenEx('data/General_RImages.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/General_RImages.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['general_rasters'] - subg = rg.OpenGroup('general_rasters') + assert rg.GetGroupNames() == ["general_rasters"] + subg = rg.OpenGroup("general_rasters") assert subg attrs = subg.GetAttributes() assert len(attrs) == 2 - attr = subg.GetAttribute('File Attribute 1') - assert attr.Read() == 'Contents of First FILE Attribute' + attr = subg.GetAttribute("File Attribute 1") + assert attr.Read() == "Contents of First FILE Attribute" assert not subg.GetGroupNames() - assert not subg.OpenGroup('foo') - assert subg.GetMDArrayNames() == ['Image Array 1'] - array = subg.OpenMDArray('Image Array 1') - assert not subg.OpenMDArray('foo') + assert not subg.OpenGroup("foo") + assert subg.GetMDArrayNames() == ["Image Array 1"] + array = subg.OpenMDArray("Image Array 1") + assert not subg.OpenMDArray("foo") dims = array.GetDimensions() assert len(dims) == 3 - assert dims[0].GetName() == 'y' + assert dims[0].GetName() == "y" assert dims[0].GetSize() == 10 - assert dims[1].GetName() == 'x' + assert dims[1].GetName() == "x" assert dims[1].GetSize() == 5 - assert dims[2].GetName() == 'bands' + assert dims[2].GetName() == "bands" assert dims[2].GetSize() == 2 - got_data = array.Read(array_start_idx = [1, 2, 0], count = [3, 2, 2]) + got_data = array.Read(array_start_idx=[1, 2, 0], count=[3, 2, 2]) assert len(got_data) == 3 * 2 * 2 * 2 - assert struct.unpack('h' * 12, got_data) == (4, 5, - 5, 6, - 6, 7, - 5, 6, - 6, 7, - 7, 8) - - got_data = array.Read(array_start_idx = [1, 2, 0], count = [3, 2, 1]) + assert struct.unpack("h" * 12, got_data) == (4, 5, 5, 6, 6, 7, 5, 6, 6, 7, 7, 8) + + got_data = array.Read(array_start_idx=[1, 2, 0], count=[3, 2, 1]) assert len(got_data) == 3 * 2 * 1 * 2 - assert struct.unpack('h' * 6, got_data) == (4, - 5, - 6, - 5, - 6, - 7) - - got_data = array.Read(array_start_idx = [1, 2, 1], count = [3, 2, 1]) + assert struct.unpack("h" * 6, got_data) == (4, 5, 6, 5, 6, 7) + + got_data = array.Read(array_start_idx=[1, 2, 1], count=[3, 2, 1]) assert len(got_data) == 3 * 2 * 1 * 2 - assert struct.unpack('h' * 6, got_data) == (5, - 6, - 7, - 6, - 7, - 8) - - got_data = array.Read(array_start_idx = [1, 2, 1], count = [3, 2, 2], array_step = [1, 1, -1]) + assert struct.unpack("h" * 6, got_data) == (5, 6, 7, 6, 7, 8) + + got_data = array.Read( + array_start_idx=[1, 2, 1], count=[3, 2, 2], array_step=[1, 1, -1] + ) assert len(got_data) == 3 * 2 * 2 * 2 - assert struct.unpack('h' * 12, got_data) == (5, 4, - 6, 5, - 7, 6, - 6, 5, - 7, 6, - 8, 7) + assert struct.unpack("h" * 12, got_data) == (5, 4, 6, 5, 7, 6, 6, 5, 7, 6, 8, 7) attrs = array.GetAttributes() assert len(attrs) == 2 - attr = array.GetAttribute('Image Attribute 1') + attr = array.GetAttribute("Image Attribute 1") assert attr.Read() == "Contents of IMAGE's First Attribute" - attr = array.GetAttribute('Image Attribute 2') + attr = array.GetAttribute("Image Attribute 2") assert attr.Read() == (1, 2, 3, 4, 5, 6) + ############################################################################### # Test reading a GR dataset with a palette @@ -507,14 +524,14 @@ def test_hdf4multidim_gr_palette(): # Generated by https://support.hdfgroup.org/ftp/HDF/HDF_Current/src/unpacked/hdf/examples/GR_write_palette.c def get_lut(): - ds = gdal.OpenEx('data/Image_with_Palette.hdf', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/Image_with_Palette.hdf", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['general_rasters'] - subg = rg.OpenGroup('general_rasters') - array = subg.OpenMDArray('Image with Palette') + assert rg.GetGroupNames() == ["general_rasters"] + subg = rg.OpenGroup("general_rasters") + array = subg.OpenMDArray("Image with Palette") assert array - lut = array.GetAttribute('lut') + lut = array.GetAttribute("lut") return lut lut = get_lut() @@ -527,4 +544,3 @@ def get_lut(): assert got[255 * 3 + 0] == 255 assert got[255 * 3 + 1] == 0 assert got[255 * 3 + 2] == 1 - diff --git a/autotest/gcore/hfa_read.py b/autotest/gcore/hfa_read.py index 43f2dd6e9070..dab0154e8f30 100755 --- a/autotest/gcore/hfa_read.py +++ b/autotest/gcore/hfa_read.py @@ -29,41 +29,40 @@ ############################################################################### +import gdaltest 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)] + ("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', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('HFA') +@pytest.mark.require_driver("HFA") def test_hfa_open(filename, checksum): - ut = gdaltest.GDALTest('HFA', filename, 1, 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') - - - + gdal.Open("data/hfa_completedefn_recursion.img") diff --git a/autotest/gcore/hfa_rfc40.py b/autotest/gcore/hfa_rfc40.py index 1b2a14aee1ba..7b8afc5000ab 100755 --- a/autotest/gcore/hfa_rfc40.py +++ b/autotest/gcore/hfa_rfc40.py @@ -30,23 +30,39 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import pytest +from osgeo import gdal + # All tests will be skipped if numpy is unavailable. -np = pytest.importorskip('numpy') +np = pytest.importorskip("numpy") INT_DATA = np.array([197, 83, 46, 29, 1, 78, 23, 90, 12, 45]) DOUBLE_DATA = np.array([0.1, 43.2, 78.1, 9.9, 23.0, 0.92, 82.5, 0.0, 1.0, 99.0]) -STRING_DATA = np.array([ - "sddf", "wess", "grbgr", "dewd", "ddww", "qwsqw", "gbfgbf", "wwqw3", "e", ""]) -STRING_DATA_INTS = np.array(["197", "83", "46", "29", "1", "78", "23", "90", "12", "45"]) -STRING_DATA_DOUBLES = np.array([ - "0.1", "43.2", "78.1", "9.9", "23.0", "0.92", "82.5", "0.0", "1.0", "99.0"]) -LONG_STRING_DATA = np.array(["sdfsdfsdfs", "sdweddw", "sdewdweee", "3423dedd", "jkejjjdjd", - "edcdcdcdc", "fcdkmk4m534m", "edwededdd", "dedwedew", "wdedefrfrfrf"]) +STRING_DATA = np.array( + ["sddf", "wess", "grbgr", "dewd", "ddww", "qwsqw", "gbfgbf", "wwqw3", "e", ""] +) +STRING_DATA_INTS = np.array( + ["197", "83", "46", "29", "1", "78", "23", "90", "12", "45"] +) +STRING_DATA_DOUBLES = np.array( + ["0.1", "43.2", "78.1", "9.9", "23.0", "0.92", "82.5", "0.0", "1.0", "99.0"] +) +LONG_STRING_DATA = np.array( + [ + "sdfsdfsdfs", + "sdweddw", + "sdewdweee", + "3423dedd", + "jkejjjdjd", + "edcdcdcdc", + "fcdkmk4m534m", + "edwededdd", + "dedwedew", + "wdedefrfrfrf", + ] +) class HFATestError(Exception): @@ -85,35 +101,50 @@ def CreateAndWriteRAT(fname): raise HFATestError("Create column failed") # for writing as different type - if rat.CreateColumn("IntAsDouble", gdal.GFT_Integer, gdal.GFU_Generic) != gdal.CE_None: + 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: + 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: + 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: + 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: + 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') + raise HFATestError("Wrong RowCount") if rat.GetColumnCount() != 9: - raise HFATestError('Wrong Column Count') + raise HFATestError("Wrong Column Count") if rat.GetNameOfCol(1) != "Doubles": - raise HFATestError('Wrong Column Count') + raise HFATestError("Wrong Column Count") if rat.GetUsageOfCol(1) != gdal.GFU_Generic: raise HFATestError("Wrong column usage") @@ -225,7 +256,7 @@ def CheckSetGetValues(fname): rat.SetValueAsInt(i, 0, int(INT_DATA[i] + 1)) rat.SetValueAsDouble(i, 1, DOUBLE_DATA[i] + 1) s = STRING_DATA[i] - s = s + 'z' + s = s + "z" rat.SetValueAsString(i, 2, s) # read data and check @@ -235,7 +266,7 @@ def CheckSetGetValues(fname): if rat.GetValueAsDouble(i, 1) != (DOUBLE_DATA[i] + 1): raise HFATestError("GetValueAsDouble not reading correctly") s = STRING_DATA[i] - s = s + 'z' + s = s + "z" if rat.GetValueAsString(i, 2) != s: raise HFATestError("GetValueAsString not reading correctly") @@ -378,6 +409,7 @@ def CheckClone(fname): # print("cloned ok") ds = None + # basic tests @@ -388,36 +420,42 @@ def test_hfa_rfc40_1(): 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 @@ -425,41 +463,44 @@ def test_hfa_rfc40_7(): 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") - - - + gdal.GetDriverByName("HFA").Delete("tmp/test.img") diff --git a/autotest/gcore/hfa_srs.py b/autotest/gcore/hfa_srs.py index 1cebdc06aa1f..18123ab85c77 100755 --- a/autotest/gcore/hfa_srs.py +++ b/autotest/gcore/hfa_srs.py @@ -31,9 +31,7 @@ import pytest -from osgeo import gdal -from osgeo import osr - +from osgeo import gdal, osr ############################################################################### # Write a HFA/Imagine and read it back to check its SRS @@ -45,7 +43,7 @@ [32661, True], # stere [6931, False], # laea [2062, False], # lcc - #[2065, True], # krovak South-West + # [2065, True], # krovak South-West [5221, True], # krovak east-north [2066, False], # cass [2964, False], # aea @@ -62,7 +60,7 @@ @pytest.mark.parametrize( - 'epsg_code,epsg_broken', + "epsg_code,epsg_broken", epsg_list, ids=[str(r[0]) for r in epsg_list], ) @@ -70,73 +68,90 @@ 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 = gdal.GetDriverByName("HFA").Create("/vsimem/TestHFASRS.img", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/TestHFASRS.img') + ds = gdal.Open("/vsimem/TestHFASRS.img") wkt = ds.GetProjectionRef() sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None - gdal.Unlink('/vsimem/TestHFASRS.img') + 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"') + 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_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!') + pytest.xfail( + "did not get expected SRS. known to be broken currently. FIXME!" + ) print(sr) print(sr2) - assert False, 'did not get expected SRS' + 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') + 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' + assert sr.GetAuthorityCode(None) == "103300" def test_hfa_srs_NAD83_UTM(): sr = osr.SpatialReference() sr.ImportFromEPSG(26915) - ds = gdal.GetDriverByName('HFA').Create('/vsimem/TestHFASRS.img', 1, 1) + ds = gdal.GetDriverByName("HFA").Create("/vsimem/TestHFASRS.img", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/TestHFASRS.img') + ds = gdal.Open("/vsimem/TestHFASRS.img") wkt = ds.GetProjectionRef() - assert ds.GetSpatialRef().GetAuthorityCode(None) == '26915' + assert ds.GetSpatialRef().GetAuthorityCode(None) == "26915" ds = None - gdal.Unlink('/vsimem/TestHFASRS.img') + gdal.Unlink("/vsimem/TestHFASRS.img") - assert 'TOWGS84' not in wkt + assert "TOWGS84" not in wkt def test_hfa_srs_NAD83_CORS96_UTM(): sr = osr.SpatialReference() - sr.SetFromUserInput('PROJCS["NAD_1983_CORS96_UTM_Zone_11N",GEOGCS["NAD83(CORS96)",DATUM["NAD83_Continuously_Operating_Reference_Station_1996",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","1133"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","6783"]],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["ESRI","102411"]]') + sr.SetFromUserInput( + 'PROJCS["NAD_1983_CORS96_UTM_Zone_11N",GEOGCS["NAD83(CORS96)",DATUM["NAD83_Continuously_Operating_Reference_Station_1996",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","1133"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","6783"]],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["ESRI","102411"]]' + ) - ds = gdal.GetDriverByName('HFA').Create('/vsimem/TestHFASRS.img', 1, 1) + ds = gdal.GetDriverByName("HFA").Create("/vsimem/TestHFASRS.img", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/TestHFASRS.img') + ds = gdal.Open("/vsimem/TestHFASRS.img") srs_got = ds.GetSpatialRef() assert srs_got.GetAuthorityName(None) is None assert srs_got.IsSame(sr), srs_got.ExportToWkt() ds = None - gdal.Unlink('/vsimem/TestHFASRS.img') + gdal.Unlink("/vsimem/TestHFASRS.img") diff --git a/autotest/gcore/hfa_write.py b/autotest/gcore/hfa_write.py index 89a0df6bee36..e69086a455ae 100755 --- a/autotest/gcore/hfa_write.py +++ b/autotest/gcore/hfa_write.py @@ -33,79 +33,79 @@ import os import shutil +import gdaltest import pytest from osgeo import gdal, osr -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') + src_ds = gdal.Open("data/byte.tif") - new_ds = gdal.GetDriverByName('HFA').CreateCopy('tmp/test_desc.img', - src_ds) + new_ds = gdal.GetDriverByName("HFA").CreateCopy("tmp/test_desc.img", src_ds) bnd = new_ds.GetRasterBand(1) - bnd.SetDescription('CustomBandName') + bnd.SetDescription("CustomBandName") bnd = None src_ds = None new_ds = None - new_ds = gdal.Open('tmp/test_desc.img') + new_ds = gdal.Open("tmp/test_desc.img") bnd = new_ds.GetRasterBand(1) - assert bnd.GetDescription() == 'CustomBandName', 'Didnt get custom band name.' + assert bnd.GetDescription() == "CustomBandName", "Didnt get custom band name." bnd = None new_ds = None - gdal.GetDriverByName('HFA').Delete('tmp/test_desc.img') + 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']) + 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') + ds = gdal.Open("tmp/4bit.img") cs = ds.GetRasterBand(1).Checksum() - assert cs == 252, 'Got wrong checksum on 4bit image.' + assert cs == 252, "Got wrong checksum on 4bit image." ds = None - drv.Delete('tmp/4bit.img') + 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']) + 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') + ds = gdal.Open("tmp/4bitc.img") cs = ds.GetRasterBand(1).Checksum() - assert cs == 252, 'Got wrong checksum on 4bit image.' + assert cs == 252, "Got wrong checksum on 4bit image." ds = None - drv.Delete('tmp/4bitc.img') + drv.Delete("tmp/4bitc.img") + ############################################################################### # Test creating a file with a nodata value, and fetching otherwise unread @@ -114,19 +114,20 @@ def test_hfa_write_4bit_compressed(): def test_hfa_write_nd_invalid(): - drv = gdal.GetDriverByName('HFA') - ds = drv.Create('tmp/ndinvalid.img', 512, 512, 1, gdal.GDT_Byte, []) + 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') + ds = gdal.Open("tmp/ndinvalid.img") cs = ds.GetRasterBand(1).Checksum() - assert cs == 29754, 'Got wrong checksum on invalid image.' + assert cs == 29754, "Got wrong checksum on invalid image." ds = None - drv.Delete('tmp/ndinvalid.img') + drv.Delete("tmp/ndinvalid.img") + ############################################################################### # Test updating .rrd overviews in place (#2524). @@ -134,51 +135,123 @@ def test_hfa_write_nd_invalid(): def test_hfa_update_overviews(): - shutil.copyfile('data/small_ov.img', 'tmp/small.img') - shutil.copyfile('data/small_ov.rrd', 'tmp/small.rrd') + 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) + ds = gdal.Open("tmp/small.img", gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[2]) - assert result == 0, 'BuildOverviews() failed.' + 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) + ds = gdal.Open("tmp/small.img", gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[]) - assert result == 0, 'BuildOverviews() failed.' + assert result == 0, "BuildOverviews() failed." - assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'Overviews still exist.' + 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 = gdal.Open("tmp/small.img") + assert ds.GetRasterBand(1).GetOverviewCount() == 0, "Overviews still exist." ds = None - assert not os.path.exists('tmp/small.rrd') + assert not os.path.exists("tmp/small.rrd") + + gdal.GetDriverByName("HFA").Delete("tmp/small.img") - 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']) + 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) + + 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') + drv.Delete("tmp/test_hfa.img") + ############################################################################### # Test building external overviews with HFA_USE_RRD=YES @@ -186,102 +259,107 @@ def test_hfa_bug_2525(): def test_hfa_use_rrd(): - shutil.copyfile('data/small_ov.img', 'tmp/small.img') + 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) + 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) + gdal.SetConfigOption("HFA_USE_RRD", old_value) - assert result == 0, 'BuildOverviews() failed.' + assert result == 0, "BuildOverviews() failed." ds = None try: - os.stat('tmp/small.rrd') + os.stat("tmp/small.rrd") except OSError: - pytest.fail('small.rrd not present.') + pytest.fail("small.rrd not present.") - ds = gdal.Open('tmp/small.img') - assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 26148, \ - 'Unexpected checksum.' + 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') + gdal.GetDriverByName("HFA").Delete("tmp/small.img") ############################################################################### # Test fix for #4831 + def test_hfa_update_existing_aux_overviews(): - gdal.SetConfigOption('USE_RRD', 'YES') + gdal.SetConfigOption("USE_RRD", "YES") - ds = gdal.GetDriverByName('BMP').Create('tmp/hfa_update_existing_aux_overviews.bmp', 100, 100, 1) + 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 = 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') + 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.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None - ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') + 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) + gdal.SetConfigOption("USE_RRD", None) pytest.fail() if cs_ovr1 != new_cs_ovr1: - gdal.SetConfigOption('USE_RRD', None) + 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.BuildOverviews("NEAR", overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None - ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') + 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) + gdal.SetConfigOption("USE_RRD", None) pytest.fail() if cs_ovr1 != new_cs_ovr1: - gdal.SetConfigOption('USE_RRD', None) + gdal.SetConfigOption("USE_RRD", None) pytest.fail() # and regenerate them with an extra overview level - ds.BuildOverviews('NEAR', overviewlist=[8]) + ds.BuildOverviews("NEAR", overviewlist=[8]) ds = None - ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') + 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) + gdal.SetConfigOption("USE_RRD", None) pytest.fail() if cs_ovr1 != new_cs_ovr1: - gdal.SetConfigOption('USE_RRD', None) + gdal.SetConfigOption("USE_RRD", None) pytest.fail() ds = None - gdal.GetDriverByName('BMP').Delete('tmp/hfa_update_existing_aux_overviews.bmp') + gdal.GetDriverByName("BMP").Delete("tmp/hfa_update_existing_aux_overviews.bmp") + + gdal.SetConfigOption("USE_RRD", None) - gdal.SetConfigOption('USE_RRD', None) ############################################################################### # Test writing invalid WKT (#5258) @@ -290,8 +368,9 @@ def test_hfa_update_existing_aux_overviews(): 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", + 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], @@ -300,12 +379,14 @@ def test_hfa_write_invalid_wkt(): PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","26711"]]""") + 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", + 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"], @@ -316,12 +397,14 @@ def test_hfa_write_invalid_wkt(): PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","26711"]]""") + 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", + 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"]], @@ -336,104 +419,113 @@ def test_hfa_write_invalid_wkt(): PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","26711"]]""") + AUTHORITY["EPSG","26711"]]""" + ) ds = None - gdal.GetDriverByName('HFA').Delete('/vsimem/hfa_write_invalid_wkt.img') + 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)] + ("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', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - 'testSetGeoTransform', - 'testSetMetadata', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + "testSetGeoTransform", + "testSetMetadata", + ], ) -@pytest.mark.require_driver('HFA') +@pytest.mark.require_driver("HFA") def test_hfa_create_normal(filename, checksum, testfunction): - ut = gdaltest.GDALTest('HFA', filename, 1, checksum) + 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)] +short_list = [("byte.tif", 4672), ("uint16.tif", 4672), ("float64.tif", 4672)] + @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", short_list, - ids=[tup[0].split('.')[0] for tup in short_list], + ids=[tup[0].split(".")[0] for tup in short_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + ], ) -@pytest.mark.require_driver('HFA') +@pytest.mark.require_driver("HFA") def test_hfa_create_spill(filename, checksum, testfunction): - ut = gdaltest.GDALTest('HFA', filename, 1, checksum, options=['USE_SPILL=YES']) + ut = gdaltest.GDALTest("HFA", filename, 1, checksum, options=["USE_SPILL=YES"]) getattr(ut, testfunction)() @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", short_list, - ids=[tup[0].split('.')[0] for tup in short_list], + ids=[tup[0].split(".")[0] for tup in short_list], ) @pytest.mark.parametrize( - 'testfunction', [ + "testfunction", + [ # 'testCreateCopy', - 'testCreate', - ] + "testCreate", + ], ) -@pytest.mark.require_driver('HFA') +@pytest.mark.require_driver("HFA") def test_hfa_create_compress(filename, checksum, testfunction): - ut = gdaltest.GDALTest('HFA', filename, 1, checksum, options=['COMPRESS=YES']) + 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 = 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') + 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') + gdal.Unlink("/vsimem/big_block.img") assert got_data == src_ds.GetRasterBand(1).ReadRaster() # GCPs go to PAM currently def test_hfa_create_gcp(): - filename = '/vsimem/test.img' - ds = gdal.GetDriverByName('HFA').Create(filename, 1, 1) + filename = "/vsimem/test.img" + ds = gdal.GetDriverByName("HFA").Create(filename, 1, 1) gcp1 = gdal.GCP() gcp1.GCPPixel = 0 gcp1.GCPLine = 0 @@ -441,11 +533,11 @@ def test_hfa_create_gcp(): gcp1.GCPY = 3751320.000 sr = osr.SpatialReference() sr.ImportFromEPSG(4326) - assert ds.SetGCPs((gcp1, ), sr.ExportToWkt()) == gdal.CE_None + assert ds.SetGCPs((gcp1,), sr.ExportToWkt()) == gdal.CE_None ds = None ds = gdal.Open(filename) assert ds.GetGCPCount() == 1 assert ds.GetGCPSpatialRef() is not None assert len(ds.GetGCPs()) == 1 ds = None - gdal.GetDriverByName('HFA').Delete(filename) + gdal.GetDriverByName("HFA").Delete(filename) diff --git a/autotest/gcore/histogram.py b/autotest/gcore/histogram.py index af1b05384d9c..c53927ca10e6 100755 --- a/autotest/gcore/histogram.py +++ b/autotest/gcore/histogram.py @@ -35,24 +35,281 @@ import struct import sys - -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Fetch simple histogram. def test_histogram_1(): - ds = gdal.Open('data/utmsmall.tif') + 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] + 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." - assert hist == exp_hist, 'did not get expected histogram.' ############################################################################### # Fetch histogram with specified sampling, using keywords. @@ -60,12 +317,30 @@ def test_histogram_1(): def test_histogram_2(): - ds = gdal.Open('data/utmsmall.tif') + 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] + 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." - assert hist == exp_hist, 'did not get expected histogram.' ############################################################################### # try on a different data type with out of range values included. @@ -73,14 +348,15 @@ def test_histogram_2(): 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) + 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.' + assert hist == exp_hist, "did not get expected histogram." + ############################################################################### # try on a different data type without out of range values included. @@ -88,18 +364,19 @@ def test_histogram_3(): 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) + 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.' + assert hist == exp_hist, "did not get expected histogram." ds = None - gdal.Unlink('data/int32_withneg.grd.aux.xml') + gdal.Unlink("data/int32_withneg.grd.aux.xml") + ############################################################################### # Test GetDefaultHistogram() on the file. @@ -107,16 +384,279 @@ def test_histogram_4(): def test_histogram_5(): - ds = gdal.Open('data/utmsmall.tif') + 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.' + 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') + gdal.Unlink("data/utmsmall.tif.aux.xml") + ############################################################################### # Test GetDefaultHistogram( force = 0 ) on a JPG file (#3304) @@ -124,12 +664,12 @@ def test_histogram_5(): def test_histogram_6(): - shutil.copy('../gdrivers/data/jpeg/albania.jpg', 'tmp/albania.jpg') - ds = gdal.Open('tmp/albania.jpg') + shutil.copy("../gdrivers/data/jpeg/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.' + assert hist is None, "did not get expected histogram." ds = None - os.unlink('tmp/albania.jpg') + os.unlink("tmp/albania.jpg") ############################################################################### @@ -138,18 +678,18 @@ def test_histogram_6(): def test_histogram_inf_values(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_Float64) - ds.WriteRaster(0, 0, 1, 1, struct.pack('d', math.inf)) - hist = ds.GetRasterBand(1).GetHistogram(buckets=2, min=-0.5, max=1.5, - include_out_of_range=1, - approx_ok=0) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_Float64) + ds.WriteRaster(0, 0, 1, 1, struct.pack("d", math.inf)) + hist = ds.GetRasterBand(1).GetHistogram( + buckets=2, min=-0.5, max=1.5, include_out_of_range=1, approx_ok=0 + ) assert hist == [0, 1] - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_Float64) - ds.WriteRaster(0, 0, 1, 1, struct.pack('d', -math.inf)) - hist = ds.GetRasterBand(1).GetHistogram(buckets=2, min=-0.5, max=1.5, - include_out_of_range=1, - approx_ok=0) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_Float64) + ds.WriteRaster(0, 0, 1, 1, struct.pack("d", -math.inf)) + hist = ds.GetRasterBand(1).GetHistogram( + buckets=2, min=-0.5, max=1.5, include_out_of_range=1, approx_ok=0 + ) assert hist == [1, 0] @@ -159,39 +699,44 @@ def test_histogram_inf_values(): def test_histogram_errors(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) # Invalid bucket count with pytest.raises(Exception): - ds.GetRasterBand(1).GetHistogram(buckets=0, min=-0.5, max=1.5, - include_out_of_range=1, - approx_ok=0) + ds.GetRasterBand(1).GetHistogram( + buckets=0, min=-0.5, max=1.5, include_out_of_range=1, approx_ok=0 + ) ############################################################################### # Test GetHistogram() invalid min max bounds -@pytest.mark.parametrize('min,max', [[math.nan, 1.5], - [-math.inf, 1.5], - [math.inf, 1.5], - [-0.5,math.nan], - [-0.5,-math.inf], - [-0.5,math.inf], - [-math.inf,math.inf], - [-sys.float_info.max,sys.float_info.max], # leads to dfScale == 0 - [0,0]]) +@pytest.mark.parametrize( + "min,max", + [ + [math.nan, 1.5], + [-math.inf, 1.5], + [math.inf, 1.5], + [-0.5, math.nan], + [-0.5, -math.inf], + [-0.5, math.inf], + [-math.inf, math.inf], + [-sys.float_info.max, sys.float_info.max], # leads to dfScale == 0 + [0, 0], + ], +) def test_histogram_invalid_min_max(min, max): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) with gdaltest.error_handler(): gdal.ErrorReset() - ret = ds.GetRasterBand(1).GetHistogram(buckets=2, min=min, max=max, - include_out_of_range=1, - approx_ok=0) + ret = ds.GetRasterBand(1).GetHistogram( + buckets=2, min=min, max=max, include_out_of_range=1, approx_ok=0 + ) if (min, max) == (-sys.float_info.max, sys.float_info.max) and ret == [1, 0]: # Happens on i386 since 2. / (sys.float_info.max - -sys.float_info.max) == 5.56268464626800346e-309 # when using i387 coprocessor (long double) pass else: ret == [0, 0] - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" diff --git a/autotest/gcore/identify.py b/autotest/gcore/identify.py index d0e1290fc0f1..04546b80d9e6 100755 --- a/autotest/gcore/identify.py +++ b/autotest/gcore/identify.py @@ -29,7 +29,6 @@ ############################################################################### - from osgeo import gdal ############################################################################### @@ -38,11 +37,13 @@ def test_identify_1(): - file_list = gdal.ReadDir('data') + 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" - 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. @@ -50,10 +51,11 @@ def test_identify_1(): def test_identify_2(): - file_list = gdal.ReadDir('data') + 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!" - 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. @@ -61,8 +63,9 @@ def test_identify_2(): def test_identify_3(): - dr = gdal.IdentifyDriver('data') - assert dr is None, 'Got a driver for data directory!' + dr = gdal.IdentifyDriver("data") + assert dr is None, "Got a driver for data directory!" + ############################################################################### # Try IdentifyDriverEx @@ -70,25 +73,28 @@ def test_identify_3(): 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("data/byte.tif") + assert ( + dr is not None and dr.GetDescription() == "GTiff" + ), "Got wrong driver for byte.tif" - dr = gdal.IdentifyDriverEx('../gdrivers/data/envi/aea.dat', sibling_files=['aea.dat']) - assert dr is None, 'Got a driver, which was not expected!' + 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('../gdrivers/data/envi/aea.dat', sibling_files=['aea.dat', 'aea.hdr']) - assert dr is not None, 'Did not get a driver!' + 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/envi/aea.dat", sibling_files=["aea.dat"] + ) + assert dr is None, "Got a driver, which was not expected!" + dr = gdal.IdentifyDriverEx( + "../gdrivers/data/envi/aea.dat", sibling_files=["aea.dat", "aea.hdr"] + ) + assert dr is not None, "Did not get a driver!" diff --git a/autotest/gcore/mask.py b/autotest/gcore/mask.py index f7ca7b90da42..d0751569da25 100755 --- a/autotest/gcore/mask.py +++ b/autotest/gcore/mask.py @@ -31,32 +31,33 @@ import os - import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### # Verify the checksum and flags for "all valid" case. def test_mask_1(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." band = ds.GetRasterBand(1) assert not band.IsMaskBand() - assert band.GetMaskFlags() == gdal.GMF_ALL_VALID, 'Did not get expected mask.' + assert band.GetMaskFlags() == gdal.GMF_ALL_VALID, "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 4873, 'Got wrong mask 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' + assert (my_min, my_max, mean, stddev) == (255, 255, 255, 0), "Got wrong mask stats" + ############################################################################### # Verify the checksum and flags for "nodata" case. @@ -64,18 +65,19 @@ def test_mask_1(): def test_mask_2(): - ds = gdal.Open('data/byte.vrt') + ds = gdal.Open("data/byte.vrt") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." band = ds.GetRasterBand(1) assert not band.IsMaskBand() - assert band.GetMaskFlags() == gdal.GMF_NODATA, 'Did not get expected mask.' + assert band.GetMaskFlags() == gdal.GMF_NODATA, "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 4209, 'Got wrong mask checksum' + assert cs == 4209, "Got wrong mask checksum" + ############################################################################### # Verify the checksum and flags for "alpha" case. @@ -83,20 +85,21 @@ def test_mask_2(): def test_mask_3(): - ds = gdal.Open('data/stefan_full_rgba.png') + ds = gdal.Open("data/stefan_full_rgba.png") - assert ds is not None, 'Failed to open test dataset.' + 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.' + assert ( + band.GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET + ), "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 10807, 'Got wrong mask checksum' + assert cs == 10807, "Got wrong mask checksum" # Verify second and third same as first. @@ -106,16 +109,20 @@ def test_mask_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' + 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.' + 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' + assert cs == 36074, "Got wrong alpha mask checksum" + ############################################################################### # Copy a *real* masked dataset, and confirm masks copied properly. @@ -123,19 +130,20 @@ def test_mask_3(): def test_mask_4(): - src_ds = gdal.Open('../gdrivers/data/jpeg/masked.jpg') + src_ds = gdal.Open("../gdrivers/data/jpeg/masked.jpg") - assert src_ds is not None, 'Failed to open test dataset.' + 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.ppm', src_ds) + drv = gdal.GetDriverByName("PNM") + ds = drv.CreateCopy("tmp/mask_4.ppm", 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' + assert ( + ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET + ), "did not get expected mask flags" msk = ds.GetRasterBand(1).GetMaskBand() assert msk.IsMaskBand() @@ -143,11 +151,12 @@ def test_mask_4(): cs = msk.Checksum() expected_cs = 770 - assert cs == expected_cs, 'Did not get expected checksum' + 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. @@ -156,13 +165,13 @@ def test_mask_4(): 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: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("BigTIFF") == -1: pytest.skip() - ds = gdal.Open('tmp/mask_4.ppm', gdal.GA_Update) + ds = gdal.Open("tmp/mask_4.ppm", gdal.GA_Update) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." # So that we instantiate the mask band before. ds.GetRasterBand(1).GetMaskFlags() @@ -172,38 +181,39 @@ def test_mask_5(): # confirm mask flags on overview. ovr = ds.GetRasterBand(1).GetOverview(1) - assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, 'did not get expected mask flags' + assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, "did not get expected mask flags" msk = ovr.GetMaskBand() assert msk.IsMaskBand() cs = msk.Checksum() expected_cs = 20505 - assert cs == expected_cs, 'Did not get expected checksum' + 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.ppm') + ds = gdal.Open("tmp/mask_4.ppm") # confirm mask flags on overview. ovr = ds.GetRasterBand(1).GetOverview(1) - assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, 'did not get expected mask flags' + assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, "did not get expected mask flags" msk = ovr.GetMaskBand() assert msk.IsMaskBand() cs = msk.Checksum() expected_cs = 20505 - assert cs == expected_cs, 'Did not get expected checksum' + assert cs == expected_cs, "Did not get expected checksum" ovr = None msk = None ds = None - gdal.GetDriverByName('PNM').Delete('tmp/mask_4.ppm') + gdal.GetDriverByName("PNM").Delete("tmp/mask_4.ppm") + ############################################################################### # Test a TIFF file with 1 band and an embedded mask of 1 bit @@ -211,18 +221,19 @@ def test_mask_5(): def test_mask_6(): - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('data/test_with_mask_1bit.tif') + with gdaltest.config_option("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.' + assert ds is not None, "Failed to open test dataset." - band = ds.GetRasterBand(1) + band = ds.GetRasterBand(1) - assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' - assert band.GetMaskBand().IsMaskBand() + assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, "Did not get expected mask." + assert band.GetMaskBand().IsMaskBand() + + cs = band.GetMaskBand().Checksum() + assert cs == 100, "Got wrong mask checksum" - cs = band.GetMaskBand().Checksum() - assert cs == 100, 'Got wrong mask checksum' ############################################################################### # Test a TIFF file with 3 bands and an embedded mask of 1 band of 1 bit @@ -230,19 +241,22 @@ def test_mask_6(): def test_mask_7(): - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('data/test3_with_1mask_1bit.tif') + with gdaltest.config_option("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.' + assert ds is not None, "Failed to open test dataset." - for i in (1, 2, 3): - band = ds.GetRasterBand(i) + for i in (1, 2, 3): + band = ds.GetRasterBand(i) - assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' - assert band.GetMaskBand().IsMaskBand() + assert ( + band.GetMaskFlags() == gdal.GMF_PER_DATASET + ), "Did not get expected mask." + assert band.GetMaskBand().IsMaskBand() + + cs = band.GetMaskBand().Checksum() + assert cs == 100, "Got wrong mask checksum" - cs = band.GetMaskBand().Checksum() - assert cs == 100, 'Got wrong mask checksum' ############################################################################### # Test a TIFF file with 1 band and an embedded mask of 8 bit. @@ -251,17 +265,18 @@ def test_mask_7(): def test_mask_8(): - ds = gdal.Open('data/test_with_mask_8bit.tif') + ds = gdal.Open("data/test_with_mask_8bit.tif") - assert ds is not None, 'Failed to open test dataset.' + 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.' + assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 1222, 'Got wrong mask 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. @@ -270,18 +285,18 @@ def test_mask_8(): def test_mask_9(): - ds = gdal.Open('data/test3_with_mask_1bit.tif') + ds = gdal.Open("data/test3_with_mask_1bit.tif") - assert ds is not None, 'Failed to open test dataset.' + 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.' + assert band.GetMaskFlags() == 0, "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 100, 'Got wrong mask checksum' + assert cs == 100, "Got wrong mask checksum" ############################################################################### @@ -291,18 +306,18 @@ def test_mask_9(): def test_mask_10(): - ds = gdal.Open('data/test3_with_mask_8bit.tif') + ds = gdal.Open("data/test3_with_mask_8bit.tif") - assert ds is not None, 'Failed to open test dataset.' + 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.' + assert band.GetMaskFlags() == 0, "Did not get expected mask." assert band.GetMaskBand().IsMaskBand() cs = band.GetMaskBand().Checksum() - assert cs == 1222, 'Got wrong mask checksum' + assert cs == 1222, "Got wrong mask checksum" ############################################################################### @@ -312,73 +327,79 @@ def test_mask_10(): def test_mask_11(): - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('data/test_with_mask_1bit_and_ovr.tif') + with gdaltest.config_option("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.' + assert ds is not None, "Failed to open test dataset." - band = ds.GetRasterBand(1) - assert not band.IsMaskBand() + band = ds.GetRasterBand(1) + assert not band.IsMaskBand() - # Let's fetch the mask - assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' - assert band.GetMaskBand().IsMaskBand() + # Let's fetch the mask + assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, "Did not get expected mask." + assert band.GetMaskBand().IsMaskBand() - cs = band.GetMaskBand().Checksum() - assert cs == 100, 'Got wrong mask checksum' + 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 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.' + # 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' + 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' + # 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" ############################################################################### # 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(): - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('data/test3_with_mask_1bit_and_ovr.tif') + with gdaltest.config_option("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.' + assert ds is not None, "Failed to open test dataset." - for i in (1, 2, 3): - band = ds.GetRasterBand(i) + 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.' + # 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' + 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 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.' + # 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' + 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" - # 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' ############################################################################### # Test creation of external TIFF mask band @@ -386,45 +407,47 @@ def test_mask_12(): def test_mask_13(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - assert src_ds is not None, 'Failed to open test dataset.' + 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) + drv = gdal.GetDriverByName("GTiff") + ds = drv.CreateCopy("tmp/byte_with_mask.tif", src_ds) src_ds = None ds.CreateMaskBand(gdal.GMF_PER_DATASET) assert ds.GetRasterBand(1).GetMaskBand().IsMaskBand() cs = ds.GetRasterBand(1).GetMaskBand().Checksum() - assert cs == 0, 'Got wrong checksum for the mask' + 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' + assert cs == 400, "Got wrong checksum for the mask" ds = None try: - os.stat('tmp/byte_with_mask.tif.msk') + os.stat("tmp/byte_with_mask.tif.msk") except OSError: - pytest.fail('tmp/byte_with_mask.tif.msk is absent') + pytest.fail("tmp/byte_with_mask.tif.msk is absent") - ds = gdal.Open('tmp/byte_with_mask.tif') + ds = gdal.Open("tmp/byte_with_mask.tif") - assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ - 'wrong mask flags' + 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' + assert cs == 400, "Got wrong checksum for the mask" ds = None - drv.Delete('tmp/byte_with_mask.tif') + drv.Delete("tmp/byte_with_mask.tif") + + assert not os.path.exists("tmp/byte_with_mask.tif.msk") - assert not os.path.exists('tmp/byte_with_mask.tif.msk') ############################################################################### # Test creation of internal TIFF mask band @@ -432,74 +455,78 @@ def test_mask_13(): def test_mask_14(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - drv = gdal.GetDriverByName('GTiff') - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = drv.CreateCopy('tmp/byte_with_mask.tif', src_ds) + drv = gdal.GetDriverByName("GTiff") + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK_TO_8BIT", "FALSE"): + ds = drv.CreateCopy("tmp/byte_with_mask.tif", src_ds) 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'): + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): ret = ds.CreateMaskBand(0) - assert ret != 0, 'Error expected' + assert ret != 0, "Error expected" - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): ret = ds.CreateMaskBand(gdal.GMF_PER_DATASET) - assert ret == 0, 'Creation failed' + assert ret == 0, "Creation failed" assert ds.GetRasterBand(1).GetMaskBand().IsMaskBand() cs = ds.GetRasterBand(1).GetMaskBand().Checksum() - assert cs == 0, 'Got wrong checksum for the mask (1)' + 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)' + 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'): + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): ret = ds.CreateMaskBand(gdal.GMF_PER_DATASET) - assert ret != 0, 'Error expected' + 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'): + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): ret = ds.GetRasterBand(1).CreateMaskBand(gdal.GMF_PER_DATASET) - assert ret != 0, 'Error expected' + assert ret != 0, "Error expected" ds = None - assert not os.path.exists('tmp/byte_with_mask.tif.msk') + assert not os.path.exists("tmp/byte_with_mask.tif.msk") - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('tmp/byte_with_mask.tif') + with gdaltest.config_option("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' + 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 (3)' + assert cs == 400, "Got wrong checksum for the mask (3)" # Test fix for #5884 old_val = gdal.GetCacheMax() gdal.SetCacheMax(0) - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - out_ds = drv.CreateCopy('/vsimem/byte_with_mask.tif', ds, options=['COMPRESS=JPEG']) + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + out_ds = drv.CreateCopy( + "/vsimem/byte_with_mask.tif", ds, options=["COMPRESS=JPEG"] + ) 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)' + assert cs == 400, "Got wrong checksum for the mask (4)" out_ds = None - drv.Delete('/vsimem/byte_with_mask.tif') + drv.Delete("/vsimem/byte_with_mask.tif") ds = None - drv.Delete('tmp/byte_with_mask.tif') + drv.Delete("tmp/byte_with_mask.tif") + ############################################################################### # Test creation of internal TIFF overview, mask band and mask band of overview @@ -507,101 +534,103 @@ def test_mask_14(): def mask_and_ovr(order, method): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - assert src_ds is not None, 'Failed to open test dataset.' + 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) + drv = gdal.GetDriverByName("GTiff") + ds = drv.CreateCopy("tmp/byte_with_ovr_and_mask.tif", src_ds) src_ds = None if order == 1: - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds.BuildOverviews(method, overviewlist=[2, 4]) - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): + with gdaltest.config_option("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) elif order == 2: - with gdaltest.config_option('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) + with gdaltest.config_option("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) elif order == 3: - with gdaltest.config_option('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) + with gdaltest.config_option("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) elif order == 4: - with gdaltest.config_option('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]) + with gdaltest.config_option("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]) if order < 4: ds = None - ds = gdal.Open('tmp/byte_with_ovr_and_mask.tif', gdal.GA_Update) + 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') + assert not os.path.exists("tmp/byte_with_ovr_and_mask.tif.msk") - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE'): - ds = gdal.Open('tmp/byte_with_ovr_and_mask.tif') + with gdaltest.config_option("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' + 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' + 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' + 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' + assert cs == 25, "Got wrong checksum for the mask of the second overview" ds = None - drv.Delete('tmp/byte_with_ovr_and_mask.tif') + drv.Delete("tmp/byte_with_ovr_and_mask.tif") def test_mask_15(): - return mask_and_ovr(1, 'NEAREST') + return mask_and_ovr(1, "NEAREST") def test_mask_16(): - return mask_and_ovr(2, 'NEAREST') + return mask_and_ovr(2, "NEAREST") def test_mask_17(): - return mask_and_ovr(3, 'NEAREST') + return mask_and_ovr(3, "NEAREST") def test_mask_18(): - return mask_and_ovr(4, 'NEAREST') + return mask_and_ovr(4, "NEAREST") def test_mask_15_avg(): - return mask_and_ovr(1, 'AVERAGE') + return mask_and_ovr(1, "AVERAGE") def test_mask_16_avg(): - return mask_and_ovr(2, 'AVERAGE') + return mask_and_ovr(2, "AVERAGE") def test_mask_17_avg(): - return mask_and_ovr(3, 'AVERAGE') + return mask_and_ovr(3, "AVERAGE") def test_mask_18_avg(): - return mask_and_ovr(4, 'AVERAGE') + return mask_and_ovr(4, "AVERAGE") + ############################################################################### # Test NODATA_VALUES mask @@ -609,50 +638,63 @@ def test_mask_18_avg(): def test_mask_19(): - ds = gdal.Open('data/test_nodatavalues.tif') + ds = gdal.Open("data/test_nodatavalues.tif") - assert ds is not None, 'Failed to open test dataset.' + 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' + 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' + 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] + 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') + drv = gdal.GetDriverByName("GTiff") for i, typ in enumerate(types): - ds = drv.Create('tmp/mask20.tif', 1, 1, 1, typ) + 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)) + 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())) + 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') + drv.Delete("tmp/mask20.tif") ############################################################################### @@ -661,32 +703,47 @@ def test_mask_20(): 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] + 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') + drv = gdal.GetDriverByName("GTiff") for i, typ in enumerate(types): - ds = drv.Create('tmp/mask21.tif', 1, 1, 3, typ) + ds = drv.Create("tmp/mask21.tif", 1, 1, 3, typ) md = {} - md['NODATA_VALUES'] = '%f %f %f' % (nodatavalue[i], nodatavalue[i], nodatavalue[i]) + 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)) + 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())) + 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') + drv.Delete("tmp/mask21.tif") ############################################################################### @@ -695,38 +752,39 @@ def test_mask_21(): def test_mask_22(): - drv = gdal.GetDriverByName('GTiff') - ds = drv.Create('tmp/mask_22.tif', 20, 20) + 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' + 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' + assert cs == 400, "Got wrong checksum for the mask" ds = None try: - os.stat('tmp/mask_22.tif.msk') + os.stat("tmp/mask_22.tif.msk") except OSError: - pytest.fail('tmp/mask_22.tif.msk is absent') + pytest.fail("tmp/mask_22.tif.msk is absent") - ds = gdal.Open('tmp/mask_22.tif') + ds = gdal.Open("tmp/mask_22.tif") - assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ - 'wrong mask flags' + 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' + assert cs == 400, "Got wrong checksum for the mask" ds = None - drv.Delete('tmp/mask_22.tif') + drv.Delete("tmp/mask_22.tif") - assert not os.path.exists('tmp/mask_22.tif.msk') + assert not os.path.exists("tmp/mask_22.tif.msk") ############################################################################### @@ -736,30 +794,35 @@ def test_mask_22(): def test_mask_23(): - drv = gdal.GetDriverByName('GTiff') + drv = gdal.GetDriverByName("GTiff") md = drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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 = drv.Create( + "tmp/mask_23_src.tif", 3000, 2000, 3, options=["TILED=YES", "SPARSE_OK=YES"] + ) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) old_val = gdal.GetCacheMax() gdal.SetCacheMax(15000000) gdal.ErrorReset() - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - ds = drv.CreateCopy('tmp/mask_23_dst.tif', src_ds, options=['TILED=YES', 'COMPRESS=JPEG']) + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + ds = drv.CreateCopy( + "tmp/mask_23_dst.tif", src_ds, options=["TILED=YES", "COMPRESS=JPEG"] + ) 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') + 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 == '' + assert error_msg == "" + ############################################################################### # Test on a GDT_UInt16 RGBA (#5692) @@ -767,33 +830,42 @@ def test_mask_23(): 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 = 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.' + 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 + + 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 + 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 + assert struct.unpack("B", mask.ReadRaster(0, 0, 1, 1))[0] == 1 ds = None - gdal.Unlink('/vsimem/mask_24.tif') + gdal.Unlink("/vsimem/mask_24.tif") + ############################################################################### # Test various error conditions @@ -801,56 +873,56 @@ def test_mask_24(): def test_mask_25(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif', 1, 1) + 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') + 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') + 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 = gdal.GetDriverByName("GTiff").Create("/vsimem/mask_25.tif", 1, 1) ds.GetRasterBand(1).CreateMaskBand(0) ds = None - ds = gdal.Open('/vsimem/mask_25.tif') + 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') + 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') + 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') + 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') + 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 = 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') + 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 = gdal.GetDriverByName("MEM").Create("", 1, 1) ds.CreateMaskBand(0) @@ -860,22 +932,26 @@ def test_mask_25(): def test_mask_26(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_26.tif', 100, 100, 2, - gdal.GDT_UInt16, options=['ALPHA=YES']) + 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.' + 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 + + assert struct.unpack("B", mask.ReadRaster(0, 0, 1, 1))[0] == 255 ds = None - gdal.Unlink('/vsimem/mask_26.tif') + gdal.Unlink("/vsimem/mask_26.tif") + ############################################################################### # Cleanup. @@ -891,25 +967,26 @@ def test_mask_27(): nodatavalue = [0.5, 0.5] - drv = gdal.GetDriverByName('GTiff') + drv = gdal.GetDriverByName("GTiff") for i, typ in enumerate(types): - ds = drv.Create('tmp/mask27.tif', 1, 1, 1, typ) + 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)) + 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())) + 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') + drv.Delete("tmp/mask27.tif") ############################################################################### # Extensive test of real NODATA_VALUES mask for all complex types - - diff --git a/autotest/gcore/minixml.py b/autotest/gcore/minixml.py index 7e84c43841dd..a3fdc534ba8b 100755 --- a/autotest/gcore/minixml.py +++ b/autotest/gcore/minixml.py @@ -30,8 +30,8 @@ ############################################################################### - import gdaltest + from osgeo import gdal ############################################################################### @@ -42,42 +42,43 @@ def test_minixml_1(): tree = gdal.ParseXMLString('abc') - assert tree[0] == gdal.CXT_Element, 'wrong node type.' + assert tree[0] == gdal.CXT_Element, "wrong node type." - assert tree[1] == 'TestDoc', 'Wrong element name' + assert tree[1] == "TestDoc", "Wrong element name" - assert len(tree) == 5, 'Wrong number of children.' + 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[0] == gdal.CXT_Attribute, "wrong node type." - assert node[1] == 'style', 'Wrong element name' + assert node[1] == "style", "Wrong element name" - assert len(node) == 3, 'Wrong number of children.' + assert len(node) == 3, "Wrong number of children." - assert node[2][1] == '123', 'Wrong element content.' + assert node[2][1] == "123", "Wrong element content." # Check element node = tree[3] - assert node[0] == gdal.CXT_Element, 'wrong node type.' + assert node[0] == gdal.CXT_Element, "wrong node type." - assert node[1] == 'sub1', 'Wrong element name' + assert node[1] == "sub1", "Wrong element name" - assert len(node) == 2, 'Wrong number of children.' + assert len(node) == 2, "Wrong number of children." # Check element node = tree[4] - assert node[0] == gdal.CXT_Element, 'wrong node type.' + assert node[0] == gdal.CXT_Element, "wrong node type." + + assert node[1] == "sub2", "Wrong element name" - assert node[1] == 'sub2', 'Wrong element name' + assert len(node) == 3, "Wrong number of children." - assert len(node) == 3, 'Wrong number of children.' + assert node[2][1] == "abc", "Wrong element content." - assert node[2][1] == 'abc', 'Wrong element content.' ############################################################################### # Serialize an XML Tree @@ -85,10 +86,17 @@ def test_minixml_1(): def test_minixml_2(): - tree = [0, 'TestDoc', [2, 'style', [1, '123']], [0, 'sub1'], [0, 'sub2', [1, 'abc']]] + 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.' + assert doc_got == doc_target, "serialize xml tree failed." + ############################################################################### # Read XML document with complex DOCTYPE element. @@ -96,40 +104,41 @@ def test_minixml_2(): def test_minixml_3(): - fp = open('data/doctype.xml', 'r') + fp = open("data/doctype.xml", "r") text = fp.read() tree = gdal.ParseXMLString(text) - assert tree[0] == gdal.CXT_Element, 'wrong node type.' + 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[0] == gdal.CXT_Element, "wrong node type." - assert node[1] == 'chapter', 'Wrong element name' + assert node[1] == "chapter", "Wrong element name" - assert len(node) == 7, 'Wrong number of children.' + assert len(node) == 7, "Wrong number of children." # Check subelement subnode = node[2] - assert subnode[0] == gdal.CXT_Element, 'wrong node type.' + assert subnode[0] == gdal.CXT_Element, "wrong node type." - assert subnode[1] == 'title', 'Wrong element name' + assert subnode[1] == "title", "Wrong element name" - assert len(subnode) == 3, 'Wrong number of children.' + assert len(subnode) == 3, "Wrong number of children." - assert subnode[2][1] == 'Chapter 1', 'Wrong element content.' + 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[0] == gdal.CXT_Element, "wrong node type." + + assert subnode[1] == "para", "Wrong element name" - assert subnode[1] == 'para', 'Wrong element name' + assert len(subnode) == 3, "Wrong number of children." - assert len(subnode) == 3, 'Wrong number of children.' ############################################################################### # Parse and serialize an XML Tree with a <?xml> prolog @@ -139,7 +148,8 @@ 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.' + assert xml == got_xml, "serialize xml tree failed." + ############################################################################### # Parse malformed XML. Complains, but still makes a tree. @@ -148,8 +158,8 @@ def test_minixml_4(): def test_minixml_5(): test_pairs = ( - ('<a></A>', 'case'), - ('<a b=c></a>', 'quoted'), + ("<a></A>", "case"), + ("<a b=c></a>", "quoted"), ) for xml_str, expect in test_pairs: @@ -157,11 +167,13 @@ def test_minixml_5(): 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 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) + assert tree is not None, 'Tree is None: "%s"' % tree ############################################################################### @@ -171,18 +183,18 @@ def test_minixml_5(): 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'), + ("<", "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: @@ -190,11 +202,13 @@ def test_minixml_6(): 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 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) + assert tree is None, 'Tree is not None: "%s"' % tree ############################################################################### @@ -204,10 +218,10 @@ def test_minixml_6(): def test_minixml_7(): test_strings = ( - '<1></1>', - '<-></->', - '<.></.>', - '<![CDATA[', + "<1></1>", + "<-></->", + "<.></.>", + "<![CDATA[", ) for xml_str in test_strings: @@ -215,9 +229,9 @@ def test_minixml_7(): tree = gdal.ParseXMLString(xml_str) found = gdal.GetLastErrorMsg() - assert found == '', ('Unexpected msg "%s"' % found) + assert found == "", 'Unexpected msg "%s"' % found - assert tree is not None, ('Tree is None: "%s"' % tree) + assert tree is not None, 'Tree is None: "%s"' % tree ############################################################################### @@ -226,14 +240,14 @@ def test_minixml_7(): def test_minixml_8(): - xml_str = '<a>' * 10001 - xml_str += '</a>' * 10001 + 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' + assert tree is None, "expected None tree" + assert gdal.GetLastErrorMsg() != "", "expected error message" ############################################################################### @@ -244,12 +258,12 @@ def test_minixml_processing_instruction(): xml = """<?a b c d?>\n<foo />\n""" got_xml = gdal.SerializeXMLTree(gdal.ParseXMLString(xml)) - assert xml == got_xml, 'serialize xml tree failed.' + assert xml == got_xml, "serialize xml tree failed." + ############################################################################### # Cleanup + def test_minixml_cleanup(): pass - - diff --git a/autotest/gcore/misc.py b/autotest/gcore/misc.py index 9a0798f4c767..03f810cc6c69 100755 --- a/autotest/gcore/misc.py +++ b/autotest/gcore/misc.py @@ -31,26 +31,27 @@ import os import shutil -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal ############################################################################### # 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') + drv = gdal.GetDriverByName("MEM") for i, _ in enumerate(tab_ds): - name = 'mem_%d' % i + 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 @@ -61,7 +62,7 @@ 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') + tab_ds[i] = gdal.OpenShared("data/byte.tif") assert tab_ds[i] is not None @@ -72,12 +73,12 @@ def test_misc_2(): def test_misc_3(): with gdaltest.error_handler(): - ds = gdal.OpenShared('../gdrivers/data/paux/small16.aux') + ds = gdal.OpenShared("../gdrivers/data/paux/small16.aux") ds.GetRasterBand(1).Checksum() cache_size = gdal.GetCacheUsed() with gdaltest.error_handler(): - ds2 = gdal.OpenShared('../gdrivers/data/paux/small16.aux') + ds2 = gdal.OpenShared("../gdrivers/data/paux/small16.aux") ds2.GetRasterBand(1).Checksum() cache_size2 = gdal.GetCacheUsed() @@ -87,20 +88,21 @@ def test_misc_3(): ds = None ds2 = None + ############################################################################### # Test Create() with invalid arguments def test_misc_4(): - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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') + 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() @@ -108,33 +110,38 @@ def test_misc_4(): ############################################################################### 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' + 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)) + 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) @@ -144,22 +151,27 @@ def _misc_5_internal(drv, datatype, nBands): # Hum the directory already exists... Not expected, but let's try to go on except OSError: pytest.fail( - 'Cannot create %s for drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + "Cannot create %s for drv = %s, nBands = %d, datatype = %s" + % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) ) 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): + 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]]') + 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']: + if drv.ShortName not in ["PNM", "MFF", "NULL"]: got_gt = ds.GetGeoTransform() for i in range(6): - assert got_gt[i] == pytest.approx(set_gt[i], abs=1e-10), \ - 'Did not get expected GT for drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + assert got_gt[i] == pytest.approx(set_gt[i], abs=1e-10), ( + "Did not get expected GT for drv = %s, nBands = %d, datatype = %s" + % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + ) # if ds.RasterCount > 0: # ds.GetRasterBand(1).Fill(255) @@ -179,59 +191,62 @@ def _misc_5_internal(drv, datatype, nBands): shutil.rmtree(dirname) except OSError: pytest.fail( - 'Cannot remove %s for drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + "Cannot remove %s for drv = %s, nBands = %d, datatype = %s" + % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) ) def test_misc_5(): - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") try: - shutil.rmtree('tmp/tmp') + shutil.rmtree("tmp/tmp") except OSError: pass try: - os.mkdir('tmp/tmp') + os.mkdir("tmp/tmp") except OSError: try: - os.stat('tmp/tmp') + 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') + 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') + gdal.SetConfigOption("OGR_SQLITE_SYNCHRONOUS", "OFF") # 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': + if drv.ShortName == "PDF": # PDF Create() is vector-only continue - if drv.ShortName == 'MBTiles': + if drv.ShortName == "MBTiles": # MBTiles only support some precise resolutions continue - if 'DCAP_CREATE' in md and 'DCAP_RASTER' in md: + if "DCAP_CREATE" in md and "DCAP_RASTER" in md: datatype = gdal.GDT_Byte for nBands in range(6): _misc_5_internal(drv, datatype, nBands) 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): + 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, + ): _misc_5_internal(drv, datatype, nBands) gdal.PopErrorHandler() @@ -246,34 +261,44 @@ 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) + 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']) + 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: + 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): + 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)) + dirname = "tmp/tmp/tmp_%s_%d_%s" % ( + drv.ShortName, + nBands, + gdal.GetDataTypeName(datatype), + ) try: os.mkdir(dirname) except OSError: @@ -281,7 +306,15 @@ def misc_6_internal(datatype, nBands, setDriversDone): 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)) + 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) @@ -291,7 +324,7 @@ def misc_6_internal(datatype, nBands, setDriversDone): if dst_ds: # check that domain == None doesn't crash dst_ds.GetMetadata(None) - dst_ds.GetMetadataItem('', None) + dst_ds.GetMetadataItem("", None) dst_ds = None size = 0 @@ -302,7 +335,15 @@ def misc_6_internal(datatype, nBands, setDriversDone): try: shutil.rmtree(dirname) except OSError: - reason = 'Cannot remove %s after drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + 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: @@ -310,13 +351,20 @@ def misc_6_internal(datatype, nBands, setDriversDone): # 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']: + 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:] + 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 @@ -325,23 +373,45 @@ def misc_6_internal(datatype, nBands, setDriversDone): else: gdal.ErrorReset() dst_ds = None - if gdal.GetLastErrorMsg() != '': + 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) + 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') + 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') + 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 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 @@ -350,7 +420,14 @@ def misc_6_internal(datatype, nBands, setDriversDone): except OSError: pass - pytest.fail('interruption did not work with drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype))) + pytest.fail( + "interruption did not work with drv = %s, nBands = %d, datatype = %s" + % ( + drv.ShortName, + nBands, + gdal.GetDataTypeName(datatype), + ) + ) dst_ds = None @@ -361,60 +438,71 @@ def misc_6_internal(datatype, nBands, setDriversDone): try: os.mkdir(dirname) except OSError: - reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") try: - shutil.rmtree('tmp/tmp') + shutil.rmtree("tmp/tmp") except OSError: pass try: - os.mkdir('tmp/tmp') + os.mkdir("tmp/tmp") except OSError: try: - os.stat('tmp/tmp') + 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') + 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') + 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': + 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): + 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': + if ret != "success": gdal.PopErrorHandler() return ret gdal.PopErrorHandler() + ############################################################################### # Test gdal.InvGeoTransform() @@ -442,14 +530,21 @@ def test_misc_7(): # 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) + expected_inv_gt = ( + -316831683.16831684, + 99009900.990099, + 9900990.099009901, + 5168316831.683168, + 9900990.099009901, + -99009900.990099, + ) for i in range(6): assert res[i] == pytest.approx(expected_inv_gt[i], abs=1e-6), res res2 = gdal.InvGeoTransform(res) for i in range(6): assert res2[i] == pytest.approx(gt[i], abs=1e-6), res2 + ############################################################################### # Test gdal.ApplyGeoTransform() @@ -465,6 +560,7 @@ def test_misc_8(): res = gdal.ApplyGeoTransform(gt, 10, 1) assert res == [11.0, 19.0] + ############################################################################### # Test setting and retrieving > 2 GB values for GDAL max cache (#3689) @@ -476,20 +572,21 @@ def test_misc_9(): ret_val = gdal.GetCacheMax() gdal.SetCacheMax(old_val) - assert ret_val == 3000000000, 'did not get expected value' + 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') + os.remove("data/byte.tif.gz.properties") except OSError: pass - f = gdal.VSIFOpenL('/vsigzip/./data/byte.tif.gz', 'rb') + f = gdal.VSIFOpenL("/vsigzip/./data/byte.tif.gz", "rb") gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 0, 2) gdal.VSIFSeekL(f, 0, 0) @@ -497,38 +594,40 @@ def test_misc_10(): gdal.VSIFCloseL(f) import struct - ar = struct.unpack('B' * 4, data) + + ar = struct.unpack("B" * 4, data) assert ar == (73, 73, 42, 0) try: - os.remove('data/byte.tif.gz.properties') + 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') + gdal.Unlink("tmp/symlink.tif") + os.symlink("GTIFF_DIR:1:data/byte.tif", "tmp/symlink.tif") - ds = gdal.Open('tmp/symlink.tif') + ds = gdal.Open("tmp/symlink.tif") if ds is None: - os.remove('tmp/symlink.tif') + os.remove("tmp/symlink.tif") pytest.fail() desc = ds.GetDescription() ds = None - os.remove('tmp/symlink.tif') + os.remove("tmp/symlink.tif") + + assert desc == "GTIFF_DIR:1:data/byte.tif", "did not get expected description" - assert desc == 'GTIFF_DIR:1:data/byte.tif', 'did not get expected description' ############################################################################### # Test CreateCopy() with a target filename in a non-existing dir @@ -536,64 +635,88 @@ def test_misc_11(): def test_misc_12(): - if int(gdal.VersionInfo('VERSION_NUM')) < 1900: - pytest.skip('would crash') + 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: + 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': + if drv.ShortName == "WEBP" or drv.ShortName == "ADRG": nbands = 3 datatype = gdal.GDT_Byte - if drv.ShortName == 'BT' or drv.ShortName == 'BLX': + if drv.ShortName == "BT" or drv.ShortName == "BLX": datatype = gdal.GDT_Int16 - elif drv.ShortName == 'GTX' or drv.ShortName == 'NTv2' or drv.ShortName == 'Leveller': + elif ( + drv.ShortName == "GTX" + or drv.ShortName == "NTv2" + or drv.ShortName == "Leveller" + ): datatype = gdal.GDT_Float32 size = 1201 - if drv.ShortName == 'BLX': + if drv.ShortName == "BLX": size = 128 - src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/misc_12_src.tif', size, size, nbands, datatype) + 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]]') + 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.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) + 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) + 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') + 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: + 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) + print("memleak detected for driver %s" % drv.ShortName) src_ds = None - gdal.Unlink('/vsimem/misc_12_src.tif') + gdal.Unlink("/vsimem/misc_12_src.tif") ############################################################################### @@ -603,22 +726,24 @@ def test_misc_12(): def test_misc_13(): # Raster-only -> vector-only - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('ESRI Shapefile').CreateCopy('/vsimem/out.shp', ds) + 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) + ds = gdal.OpenEx("../ogr/data/poly.shp", gdal.OF_VECTOR) gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', ds) + 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 @@ -631,8 +756,7 @@ def __init__(self, *args, **kwargs): def emit(self, record): self.messages[record.levelname].append(record.getMessage()) - - logger = logging.getLogger('gdal_logging_test') + logger = logging.getLogger("gdal_logging_test") logger.setLevel(logging.DEBUG) logger.propagate = False handler = MockLoggingHandler(level=logging.DEBUG) @@ -640,7 +764,7 @@ def emit(self, record): prev_debug = gdal.GetConfigOption("CPL_DEBUG") try: - gdal.ConfigurePythonLogging(logger_name='gdal_logging_test', enable_debug=True) + gdal.ConfigurePythonLogging(logger_name="gdal_logging_test", enable_debug=True) assert gdal.GetConfigOption("CPL_DEBUG") == "ON", "should have enabled debug" @@ -651,62 +775,65 @@ def emit(self, record): gdal.Error(gdal.CE_Failure, 99999, "error1") expected = { - 'DEBUG': ["test1: debug1", "FileIO: debug2"], - 'INFO': ["AppDefined: info1"], - 'WARNING': ["AssertionFailed: warning1"], - 'ERROR': ["99999: error1"], + "DEBUG": ["test1: debug1", "FileIO: debug2"], + "INFO": ["AppDefined: info1"], + "WARNING": ["AssertionFailed: warning1"], + "ERROR": ["99999: error1"], } assert handler.messages == expected, "missing log messages" - gdal.SetErrorHandler('CPLDefaultErrorHandler') + gdal.SetErrorHandler("CPLDefaultErrorHandler") handler.messages.clear() - gdal.SetConfigOption('CPL_DEBUG', "OFF") + gdal.SetConfigOption("CPL_DEBUG", "OFF") - gdal.ConfigurePythonLogging(logger_name='gdal_logging_test') + gdal.ConfigurePythonLogging(logger_name="gdal_logging_test") - assert gdal.GetConfigOption("CPL_DEBUG") == "OFF", \ - "shouldn't have enabled debug" + 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" + assert handler.messages["DEBUG"] == ["debug4"], "unexpected log messages" finally: - gdal.SetErrorHandler('CPLDefaultErrorHandler') - gdal.SetConfigOption('CPL_DEBUG', prev_debug) + 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.SetConfigOption("CPL_DEBUG", "ON") - gdal.Debug('foo', 'bar') + 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, 0, "foo: bar"), (gdal.CE_Debug, gdal.CPLE_FileIO, "debug2"), (gdal.CE_None, gdal.CPLE_AppDefined, "info1"), (gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1"), @@ -738,8 +865,8 @@ def handle1(ecls, ecode, emsg): assert len(messages1) == 0, "PopErrorHandler: unexpected log messages" finally: - gdal.SetErrorHandler('CPLDefaultErrorHandler') - gdal.SetConfigOption('CPL_DEBUG', prev_debug) + gdal.SetErrorHandler("CPLDefaultErrorHandler") + gdal.SetConfigOption("CPL_DEBUG", prev_debug) ############################################################################### @@ -748,6 +875,6 @@ def handle1(ecls, ecode, emsg): def test_misc_cleanup(): try: - shutil.rmtree('tmp/tmp') + shutil.rmtree("tmp/tmp") except OSError: pass diff --git a/autotest/gcore/multidim.py b/autotest/gcore/multidim.py index 81044bb7761d..31eb4e8b97ba 100644 --- a/autotest/gcore/multidim.py +++ b/autotest/gcore/multidim.py @@ -29,15 +29,16 @@ ############################################################################### import array -from osgeo import gdal -from osgeo import osr import gdaltest import pytest +from osgeo import gdal, osr + + def test_multidim_asarray_epsg_4326(): - ds = gdal.Open('../gdrivers/data/small_world.tif') + ds = gdal.Open("../gdrivers/data/small_world.tif") srs_ds = ds.GetSpatialRef() assert srs_ds.GetDataAxisToSRSAxisMapping() == [2, 1] band = ds.GetRasterBand(1) @@ -67,7 +68,7 @@ def test_multidim_asarray_epsg_4326(): def test_multidim_asarray_epsg_26711(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") srs_ds = ds.GetSpatialRef() assert srs_ds.GetDataAxisToSRSAxisMapping() == [1, 2] band = ds.GetRasterBand(1) @@ -95,18 +96,23 @@ def test_multidim_asarray_epsg_26711(): assert ds2.ReadRaster() == ds.GetRasterBand(1).ReadRaster() -@pytest.mark.parametrize("resampling",[gdal.GRIORA_NearestNeighbour, - gdal.GRIORA_Bilinear, - gdal.GRIORA_Cubic, - gdal.GRIORA_CubicSpline, - gdal.GRIORA_Lanczos, - gdal.GRIORA_Average, - gdal.GRIORA_Mode, - gdal.GRIORA_Gauss, #unsupported - gdal.GRIORA_RMS]) +@pytest.mark.parametrize( + "resampling", + [ + gdal.GRIORA_NearestNeighbour, + gdal.GRIORA_Bilinear, + gdal.GRIORA_Cubic, + gdal.GRIORA_CubicSpline, + gdal.GRIORA_Lanczos, + gdal.GRIORA_Average, + gdal.GRIORA_Mode, + gdal.GRIORA_Gauss, # unsupported + gdal.GRIORA_RMS, + ], +) def test_multidim_getresampled(resampling): - ds = gdal.Open('../gdrivers/data/small_world.tif') + ds = gdal.Open("../gdrivers/data/small_world.tif") srs_ds = ds.GetSpatialRef() band = ds.GetRasterBand(1) ar = band.AsMDArray() @@ -114,7 +120,9 @@ def test_multidim_getresampled(resampling): if resampling == gdal.GRIORA_Gauss: with gdaltest.error_handler(): - resampled_ar = ar.GetResampled([None] * ar.GetDimensionCount(), resampling, None) + resampled_ar = ar.GetResampled( + [None] * ar.GetDimensionCount(), resampling, None + ) assert resampled_ar is None return @@ -126,12 +134,15 @@ def test_multidim_getresampled(resampling): assert srs.GetAuthorityCode(None) == srs_ds.GetAuthorityCode(None) dims = resampled_ar.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'dimY' + assert dims[0].GetName() == "dimY" assert dims[0].GetSize() == ds.RasterYSize - assert dims[1].GetName() == 'dimX' + assert dims[1].GetName() == "dimX" assert dims[1].GetSize() == ds.RasterXSize - assert resampled_ar.Read(buffer_datatype = gdal.ExtendedDataType.CreateString()) != gdal.CE_None + assert ( + resampled_ar.Read(buffer_datatype=gdal.ExtendedDataType.CreateString()) + != gdal.CE_None + ) ixdim = 1 iydim = 0 @@ -146,42 +157,56 @@ def test_multidim_getresampled(resampling): assert ds2.ReadRaster() != ds.GetRasterBand(1).ReadRaster() else: assert ds2.ReadRaster() == ds.GetRasterBand(1).ReadRaster() - assert ds2.ReadRaster(buf_type = gdal.GDT_UInt16) == ds.GetRasterBand(1).ReadRaster(buf_type = gdal.GDT_UInt16) - - -@pytest.mark.parametrize("with_dim_x,with_var_x,with_dim_y,with_var_y", - [[True, False, True, False], - [True, False, False, False], - [False, False, True, False], - [True, True, True, True]]) -def test_multidim_getresampled_new_dims_with_variables(with_dim_x,with_var_x,with_dim_y,with_var_y): - - ds = gdal.Open('../gdrivers/data/small_world.tif') + assert ds2.ReadRaster(buf_type=gdal.GDT_UInt16) == ds.GetRasterBand( + 1 + ).ReadRaster(buf_type=gdal.GDT_UInt16) + + +@pytest.mark.parametrize( + "with_dim_x,with_var_x,with_dim_y,with_var_y", + [ + [True, False, True, False], + [True, False, False, False], + [False, False, True, False], + [True, True, True, True], + ], +) +def test_multidim_getresampled_new_dims_with_variables( + with_dim_x, with_var_x, with_dim_y, with_var_y +): + + ds = gdal.Open("../gdrivers/data/small_world.tif") srs_ds = ds.GetSpatialRef() band = ds.GetRasterBand(1) ar = band.AsMDArray() assert ar - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() dimY = None if with_dim_y: - dimY = rg.CreateDimension('dimY', None, None, ds.RasterYSize // 2) + dimY = rg.CreateDimension("dimY", None, None, ds.RasterYSize // 2) if with_var_y: - varY = rg.CreateMDArray(dimY.GetName(), [dimY], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - varY.Write(array.array('d', [ 90 - 0.9 - 1.8 * i for i in range(dimY.GetSize()) ])) + varY = rg.CreateMDArray( + dimY.GetName(), [dimY], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + varY.Write( + array.array("d", [90 - 0.9 - 1.8 * i for i in range(dimY.GetSize())]) + ) dimY.SetIndexingVariable(varY) dimX = None if with_dim_x: - dimX = rg.CreateDimension('dimX', None, None, ds.RasterXSize // 2) + dimX = rg.CreateDimension("dimX", None, None, ds.RasterXSize // 2) if with_var_x: - varX = rg.CreateMDArray(dimX.GetName(), [dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - varX.Write(array.array('d', [ -180 + 0.9 + 1.8 * i for i in range(dimX.GetSize()) ])) + varX = rg.CreateMDArray( + dimX.GetName(), [dimX], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + varX.Write( + array.array("d", [-180 + 0.9 + 1.8 * i for i in range(dimX.GetSize())]) + ) dimX.SetIndexingVariable(varX) resampled_ar = ar.GetResampled([dimY, dimX], gdal.GRIORA_Cubic, None) @@ -194,27 +219,29 @@ def test_multidim_getresampled_new_dims_with_variables(with_dim_x,with_var_x,wit assert dims[0].GetSize() == ds.RasterYSize // 2 assert dims[1].GetSize() == ds.RasterXSize // 2 - expected_ds = gdal.Warp('', ds, options = '-of MEM -ts 200 100 -r cubic') + expected_ds = gdal.Warp("", ds, options="-of MEM -ts 200 100 -r cubic") assert expected_ds.GetRasterBand(1).ReadRaster() == resampled_ar.Read() def test_multidim_getresampled_with_srs(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") band = ds.GetRasterBand(1) ar = band.AsMDArray() assert ar srs = osr.SpatialReference() srs.ImportFromEPSG(4267) - resampled_ar = ar.GetResampled([None] * ar.GetDimensionCount(), gdal.GRIORA_NearestNeighbour, srs) + resampled_ar = ar.GetResampled( + [None] * ar.GetDimensionCount(), gdal.GRIORA_NearestNeighbour, srs + ) assert resampled_ar got_srs = resampled_ar.GetSpatialRef() assert got_srs is not None assert got_srs.GetAuthorityCode(None) == srs.GetAuthorityCode(None) dims = resampled_ar.GetDimensions() - expected_ds = gdal.Warp('', ds, options = '-of MEM -t_srs EPSG:4267 -r nearest') + expected_ds = gdal.Warp("", ds, options="-of MEM -t_srs EPSG:4267 -r nearest") assert expected_ds.RasterXSize == dims[1].GetSize() assert expected_ds.RasterYSize == dims[0].GetSize() assert expected_ds.GetRasterBand(1).ReadRaster() == resampled_ar.Read() @@ -227,36 +254,40 @@ def test_multidim_getresampled_with_srs(): def test_multidim_getresampled_3d(): - ds = gdal.Open('../gdrivers/data/small_world.tif') + ds = gdal.Open("../gdrivers/data/small_world.tif") ar_b1 = ds.GetRasterBand(1).AsMDArray() - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimBand = rg.CreateDimension('dimBand', None, None, ds.RasterCount) + dimBand = rg.CreateDimension("dimBand", None, None, ds.RasterCount) dimY = ar_b1.GetDimensions()[0] dimX = ar_b1.GetDimensions()[1] - ar = rg.CreateMDArray("ar", [dimBand, dimY, dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + ar = rg.CreateMDArray( + "ar", [dimBand, dimY, dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) ar.SetOffset(1.5) ar.SetScale(2.5) - ar.SetUnit('foo') + ar.SetUnit("foo") ar.SetNoDataValueDouble(-0.5) - attr = ar.CreateAttribute('attr', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = ar.CreateAttribute( + "attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert attr.Write(1) == gdal.CE_None srs = ds.GetSpatialRef().Clone() srs.SetDataAxisToSRSAxisMapping([1, 2]) ar.SetSpatialRef(srs) for i in range(ds.RasterCount): - ar[i].Write(ds.GetRasterBand(i+1).ReadRaster()) + ar[i].Write(ds.GetRasterBand(i + 1).ReadRaster()) - resampled_ar = ar.GetResampled([None] * ar.GetDimensionCount(), gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [None] * ar.GetDimensionCount(), gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar dims = resampled_ar.GetDimensions() - assert len(dims) == 3 + assert len(dims) == 3 assert dims[0].GetName() == dimBand.GetName() assert dims[0].GetSize() == dimBand.GetSize() assert dims[1].GetSize() == dimY.GetSize() @@ -271,21 +302,19 @@ def test_multidim_getresampled_3d(): assert block_size[0] == 0 assert block_size[1] != 0 assert block_size[2] != 0 - assert resampled_ar.GetAttribute('attr') is not None + assert resampled_ar.GetAttribute("attr") is not None assert len(resampled_ar.GetAttributes()) == 1 assert resampled_ar.Read() == ds.ReadRaster() - def test_multidim_getresampled_error_single_dim(): - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimX = rg.CreateDimension('X', None, None, 3) - ar = rg.CreateMDArray("ar", [dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + dimX = rg.CreateDimension("X", None, None, 3) + ar = rg.CreateMDArray("ar", [dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) with gdaltest.error_handler(): resampled_ar = ar.GetResampled([None], gdal.GRIORA_NearestNeighbour, None) assert resampled_ar is None @@ -293,43 +322,50 @@ def test_multidim_getresampled_error_single_dim(): def test_multidim_getresampled_error_too_large_y(): - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimY = rg.CreateDimension('Y', None, None, 4) - dimX = rg.CreateDimension('X', None, None, 3) - ar = rg.CreateMDArray("ar", [dimY, dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) - new_dimY = rg.CreateDimension('Y', None, None, 4 * 1000 * 1000 * 1000) + dimY = rg.CreateDimension("Y", None, None, 4) + dimX = rg.CreateDimension("X", None, None, 3) + ar = rg.CreateMDArray( + "ar", [dimY, dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) + new_dimY = rg.CreateDimension("Y", None, None, 4 * 1000 * 1000 * 1000) with gdaltest.error_handler(): - resampled_ar = ar.GetResampled([new_dimY, None], gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [new_dimY, None], gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar is None def test_multidim_getresampled_error_too_large_x(): - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimY = rg.CreateDimension('Y', None, None, 4) - dimX = rg.CreateDimension('X', None, None, 3) - ar = rg.CreateMDArray("ar", [dimY, dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) - new_dimX = rg.CreateDimension('Y', None, None, 4 * 1000 * 1000 * 1000) + dimY = rg.CreateDimension("Y", None, None, 4) + dimX = rg.CreateDimension("X", None, None, 3) + ar = rg.CreateMDArray( + "ar", [dimY, dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) + new_dimX = rg.CreateDimension("Y", None, None, 4 * 1000 * 1000 * 1000) with gdaltest.error_handler(): - resampled_ar = ar.GetResampled([None, new_dimX], gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [None, new_dimX], gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar is None def test_multidim_getresampled_error_no_geotransform(): - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimY = rg.CreateDimension('Y', None, None, 2) - dimX = rg.CreateDimension('X', None, None, 3) - ar = rg.CreateMDArray("ar", [dimY, dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + dimY = rg.CreateDimension("Y", None, None, 2) + dimX = rg.CreateDimension("X", None, None, 3) + ar = rg.CreateMDArray( + "ar", [dimY, dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) with gdaltest.error_handler(): resampled_ar = ar.GetResampled([None, None], gdal.GRIORA_NearestNeighbour, None) assert resampled_ar is None @@ -337,27 +373,30 @@ def test_multidim_getresampled_error_no_geotransform(): def test_multidim_getresampled_error_extra_dim_not_same(): - ds = gdal.Open('../gdrivers/data/small_world.tif') + ds = gdal.Open("../gdrivers/data/small_world.tif") ar_b1 = ds.GetRasterBand(1).AsMDArray() - drv = gdal.GetDriverByName('MEM') - mem_ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + mem_ds = drv.CreateMultiDimensional("myds") rg = mem_ds.GetRootGroup() - dimOther = rg.CreateDimension('other', None, None, 2) + dimOther = rg.CreateDimension("other", None, None, 2) dimY = ar_b1.GetDimensions()[0] dimX = ar_b1.GetDimensions()[1] - ar = rg.CreateMDArray("ar", [dimOther, dimY, dimX], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + ar = rg.CreateMDArray( + "ar", [dimOther, dimY, dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) - dimOtherNew = rg.CreateDimension('otherNew', None, None, 1) + dimOtherNew = rg.CreateDimension("otherNew", None, None, 1) with gdaltest.error_handler(): - resampled_ar = ar.GetResampled([dimOtherNew, None, None], gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [dimOtherNew, None, None], gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar is None def test_multidim_getresampled_bad_input_dim_count(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") band = ds.GetRasterBand(1) ar = band.AsMDArray() assert ar @@ -367,6 +406,7 @@ def test_multidim_getresampled_bad_input_dim_count(): assert resampled_ar is None with gdaltest.error_handler(): - resampled_ar = ar.GetResampled([None, None, None], gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [None, None, None], gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar is None - diff --git a/autotest/gcore/nodatamaskband.py b/autotest/gcore/nodatamaskband.py index 7c8967e6dbdf..2a9e253ef00f 100755 --- a/autotest/gcore/nodatamaskband.py +++ b/autotest/gcore/nodatamaskband.py @@ -36,53 +36,104 @@ 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'))]: + 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 = 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)) + 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) + 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) + 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) + 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) + 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) + 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 diff --git a/autotest/gcore/numpy_rw.py b/autotest/gcore/numpy_rw.py index c314377fdb12..9d3e03440af6 100755 --- a/autotest/gcore/numpy_rw.py +++ b/autotest/gcore/numpy_rw.py @@ -30,13 +30,13 @@ ############################################################################### import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal # All tests will be skipped if numpy or gdal_array are unavailable. -numpy = pytest.importorskip('numpy') -gdal_array = pytest.importorskip('osgeo.gdal_array') +numpy = pytest.importorskip("numpy") +gdal_array = pytest.importorskip("osgeo.gdal_array") ############################################################################### # verify that we can load the deprecated gdalnumeric module @@ -45,34 +45,38 @@ def test_numpy_rw_1(): from osgeo import gdalnumeric + gdalnumeric.zeros + ############################################################################### # Load a test file into a memory Numpy array, and verify the checksum. def test_numpy_rw_2(): - array = gdal_array.LoadFile('data/utmsmall.tif') - assert array is not None, 'Failed to load utmsmall.tif into array' + array = gdal_array.LoadFile("data/utmsmall.tif") + assert array is not None, "Failed to load utmsmall.tif into array" ds = gdal_array.OpenArray(array) - assert ds is not None, 'Failed to open memory array as dataset.' + 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' + assert bnd.Checksum() == 50054, "Didnt get expected checksum on reopened file" ds = None + ############################################################################### # Test loading complex data. def test_numpy_rw_3(): - ds = gdal.Open('data/cint_sar.tif') + ds = gdal.Open("data/cint_sar.tif") array = ds.ReadAsArray() - assert array[2][3] == 116 - 16j, 'complex value read improperly.' + assert array[2][3] == 116 - 16j, "complex value read improperly." + ############################################################################### # Test a band read with downsampling. @@ -80,11 +84,13 @@ def test_numpy_rw_3(): def test_numpy_rw_4(): - ds = gdal.Open('data/byte.tif') + 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?' + assert ( + array[2][3] == 123 + ), "Read wrong value - perhaps downsampling algorithm has changed subtly?" + ############################################################################### # Test reading a multi-band file. @@ -92,25 +98,31 @@ def test_numpy_rw_4(): def test_numpy_rw_5(): - array = gdal_array.LoadFile('data/rgbsmall.tif', 35, 21, 1, 1) + array = gdal_array.LoadFile("data/rgbsmall.tif", 35, 21, 1, 1) - assert array[0][0][0] == 78, 'value read improperly.' + assert array[0][0][0] == 78, "value read improperly." - assert array[1][0][0] == 117, 'value read improperly.' + assert array[1][0][0] == 117, "value read improperly." - assert array[2][0][0] == 24, 'value read improperly.' + assert array[2][0][0] == 24, "value read improperly." - array = gdal_array.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.' + array = gdal_array.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." array = numpy.zeros([3, 1, 1], dtype=numpy.uint8) - ds = gdal.Open('data/rgbsmall.tif') + 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.' + 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) @@ -118,7 +130,7 @@ def test_numpy_rw_5(): def test_numpy_rw_6(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") array = numpy.zeros([ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.GetRasterBand(1).ReadAsArray(buf_obj=array) @@ -127,13 +139,14 @@ def test_numpy_rw_6(): ds2 = gdal_array.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(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") array = numpy.zeros([1, ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.ReadAsArray(buf_obj=array) @@ -152,7 +165,7 @@ def test_numpy_rw_7(): assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() # With a multi band file - ds = gdal.Open('data/rgbsmall.tif') + ds = gdal.Open("data/rgbsmall.tif") array = numpy.zeros([ds.RasterCount, ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.ReadAsArray(buf_obj=array) @@ -161,13 +174,14 @@ def test_numpy_rw_7(): ds2 = gdal_array.OpenArray(array) assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() + ############################################################################### # Check that Dataset.ReadAsArray() with multi-band data def test_numpy_rw_8(): - ds = gdal.Open('data/rgbsmall.tif') + ds = gdal.Open("data/rgbsmall.tif") array = numpy.zeros([ds.RasterCount, ds.RasterYSize, ds.RasterXSize], numpy.uint8) ds.ReadAsArray(buf_obj=array) @@ -182,16 +196,17 @@ def test_numpy_rw_8(): def test_numpy_rw_9(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") array = ds.ReadAsArray() - out_ds = gdal.GetDriverByName('MEM').Create('', ds.RasterYSize, ds.RasterXSize) + 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' + assert cs == 4672, "did not get expected checksum" + ############################################################################### # Test signed byte handling @@ -199,68 +214,82 @@ def test_numpy_rw_9(): def test_numpy_rw_10(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/signed8.tif', 2, 1, options=['PIXELTYPE=SIGNEDBYTE']) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/signed8.tif", 2, 1, options=["PIXELTYPE=SIGNEDBYTE"] + ) ar = numpy.array([[-128, 127]], dtype=numpy.int8) ds.GetRasterBand(1).WriteArray(ar) ds = None - ds = gdal.Open('/vsimem/signed8.tif') + 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') + gdal.Unlink("/vsimem/signed8.tif") + + assert ar2[0][0] == -128 and ar2[0][1] == 127, "did not get expected result (1)" - 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)" - assert ar3[0][0] == -128 and ar3[0][1] == 127, 'did not get expected result (2)' ############################################################################### # Test signed byte handling with all values set to nodata -@pytest.mark.parametrize("options", [[], ['SPARSE_OK=YES']]) +@pytest.mark.parametrize("options", [[], ["SPARSE_OK=YES"]]) def test_numpy_rw_10_bis(options): """Reproduce https://github.com/mapbox/rasterio/issues/2180""" - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/signed8.tif', 2, 1, - options=['PIXELTYPE=SIGNEDBYTE']+options) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/signed8.tif", 2, 1, options=["PIXELTYPE=SIGNEDBYTE"] + options + ) ar = numpy.array([[-1, -1]], dtype=numpy.int8) ds.GetRasterBand(1).WriteArray(ar) ds.GetRasterBand(1).SetNoDataValue(-1) ds = None - ds = gdal.Open('/vsimem/signed8.tif') + ds = gdal.Open("/vsimem/signed8.tif") ar2 = ds.ReadAsArray() ds = None - gdal.Unlink('/vsimem/signed8.tif') + gdal.Unlink("/vsimem/signed8.tif") assert ar2[0][0] == -1 and ar2[0][1] == -1 + ############################################################################### # Test all datatypes def test_numpy_rw_11(): - 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), - ('uint64', gdal.GDT_UInt64, numpy.uint64, 4294967295 * 1000), - ('int64', gdal.GDT_Int64, numpy.int64, -2147483648 * 1000), - ('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)] + 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), + ("uint64", gdal.GDT_UInt64, numpy.uint64, 4294967295 * 1000), + ("int64", gdal.GDT_Int64, numpy.int64, -2147483648 * 1000), + ("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]) + 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' + assert tmp.dtype == type_tuple[2], "did not get expected numpy type" ar = numpy.empty([1, 1], dtype=type_tuple[2]) @@ -272,28 +301,34 @@ def test_numpy_rw_11(): expected_dt = gdal.GDT_CFloat32 if got_dt != expected_dt: print(type_tuple[1]) - pytest.fail('did not get expected result (0)') + 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]) + ds = gdal.Open("/vsimem/" + type_tuple[0]) assert ds.GetRasterBand(1).DataType == type_tuple[1] ar2 = ds.ReadAsArray() ar3 = numpy.empty_like(ar2) ds.GetRasterBand(1).ReadAsArray(buf_obj=ar3) ds = None - gdal.Unlink('/vsimem/' + type_tuple[0]) + gdal.Unlink("/vsimem/" + type_tuple[0]) - assert (not (type_tuple[0] == 'float32' and ar2[0][0] != pytest.approx(type_tuple[3], abs=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 ar2[0][0] != pytest.approx(type_tuple[3], abs=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 ar3[0][0] != pytest.approx(type_tuple[3], abs=1e-6)) or \ - (type_tuple[0] != 'float32' and ar3[0][0] != type_tuple[3])), \ - 'did not get expected result (2)' + assert not ( + type_tuple[0] == "float32" + and ar3[0][0] != pytest.approx(type_tuple[3], abs=1e-6) + ) or ( + type_tuple[0] != "float32" and ar3[0][0] != type_tuple[3] + ), "did not get expected result (2)" ############################################################################### @@ -308,8 +343,8 @@ def test_numpy_rw_12(): ar[1][0] = 2 ar[1][1] = 3 - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('', 1, 2, 1, gdal.GDT_Byte) + drv = gdal.GetDriverByName("MEM") + ds = drv.Create("", 1, 2, 1, gdal.GDT_Byte) ds.GetRasterBand(1).WriteArray(ar[:, 1:]) @@ -320,14 +355,15 @@ def test_numpy_rw_12(): assert slice_read[0][0] == 1 and slice_read[1][0] == 3 + ############################################################################### # Test expected errors def test_numpy_rw_13(): - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('', 2, 1, 1, gdal.GDT_Byte) + 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 @@ -335,67 +371,63 @@ def test_numpy_rw_13(): # Try reading into unsupported array type ar = numpy.empty([1, 2], dtype=numpy.bool_) - with pytest.raises(Exception, match='array does not have ' - 'corresponding GDAL data type'): + 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) - + 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) - + 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) - + 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) - + 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' + 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' + 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' + 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' + 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) + 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 @@ -407,71 +439,95 @@ def test_numpy_rw_13(): ds.GetRasterBand(i + 1).WriteArray(ar[i]) ar = numpy.empty([3, 1, 2], dtype=numpy.bool_) - with pytest.raises(Exception, match='array does not have ' - 'corresponding GDAL data type'): + 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'): + 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'): + 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'): + with pytest.raises( + Exception, match="Specified buf_xsize not consistent " "with array shape" + ): ds.ReadAsArray(buf_obj=ar, buf_xsize=1, buf_ysize=1) ar = numpy.empty([1, 2, 3], 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, interleave='pixel') + with pytest.raises( + Exception, match="Specified buf_xsize not consistent " "with array shape" + ): + ds.ReadAsArray(buf_obj=ar, buf_xsize=1, buf_ysize=1, interleave="pixel") # 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'): + 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='Dimension 0 of array should have size 3 to store bands'): + with pytest.raises( + Exception, match="Dimension 0 of array should have size 3 to store bands" + ): ds.ReadAsArray(buf_obj=ar) # Not enough space in third dimension ar = numpy.empty([1, 2, 2], dtype=numpy.uint8) - with pytest.raises(Exception, match='Dimension 2 of array should have size 3 to store bands'): - ds.ReadAsArray(buf_obj=ar, interleave='pixel') + with pytest.raises( + Exception, match="Dimension 2 of array should have size 3 to store bands" + ): + ds.ReadAsArray(buf_obj=ar, interleave="pixel") # 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' + 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' + 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' + 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() @@ -479,7 +535,7 @@ def test_numpy_rw_13(): def numpy_rw_14_progress_callback(pct, message, user_data): # pylint: disable=unused-argument if pct != pytest.approx(user_data[0], abs=1e-5): - print('Expected %f, got %f' % (user_data[0], pct)) + 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 @@ -496,7 +552,7 @@ def numpy_rw_14_progress_interrupt_callback(pct, message, user_data): 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])) + 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 @@ -505,58 +561,68 @@ def numpy_rw_14_progress_callback_2(pct, message, user_data): def test_numpy_rw_14(): # Progress not implemented yet - if gdal.GetConfigOption('GTIFF_DIRECT_IO') == 'YES' or \ - gdal.GetConfigOption('GTIFF_VIRTUAL_MEM_IO') == 'YES': + if ( + gdal.GetConfigOption("GTIFF_DIRECT_IO") == "YES" + or gdal.GetConfigOption("GTIFF_VIRTUAL_MEM_IO") == "YES" + ): pytest.skip() - ds = gdal.Open('data/byte.tif') + 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) + 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 tab[0] == pytest.approx(1.05, abs=1e-5) and tab[1] # Test interruption tab = [0] - data = ds.GetRasterBand(1).ReadAsArray(callback=numpy_rw_14_progress_interrupt_callback, - callback_data=tab) + 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) + data = ds.ReadAsArray( + resample_alg=gdal.GRIORA_NearestNeighbour, + callback=numpy_rw_14_progress_callback, + callback_data=tab, + ) assert data is not None assert tab[0] == pytest.approx(1.05, abs=1e-5) and tab[1] # Same with interruption tab = [0] - data = ds.ReadAsArray(callback=numpy_rw_14_progress_interrupt_callback, - callback_data=tab) + 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') + ds = gdal.Open("data/rgbsmall.tif") last_pct = [0] - data = ds.ReadAsArray(callback=numpy_rw_14_progress_callback_2, - callback_data=last_pct) + data = ds.ReadAsArray( + callback=numpy_rw_14_progress_callback_2, callback_data=last_pct + ) assert not (data is None or last_pct[0] != pytest.approx(1.0, abs=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) + data = ds.ReadAsArray( + buf_obj=array, callback=numpy_rw_14_progress_callback_2, callback_data=last_pct + ) assert not (data is None or last_pct[0] != pytest.approx(1.0, abs=1e-5)) + ############################################################################### # Test NumPy GetGeoTransform/SetGeoTransform @@ -571,6 +637,7 @@ def test_numpy_rw_15(): gt = ds.GetGeoTransform() assert gt == (1, 2, 3, 4, 5, -6) + ############################################################################### # Test errors of OpenArray() @@ -595,6 +662,7 @@ def test_numpy_rw_16(): ds = gdal_array.OpenArray(array) assert ds is None + ############################################################################### # Test old deprecated way with gdal_array.GetArrayFilename() @@ -607,25 +675,26 @@ def test_numpy_rw_17(): ds = gdal.Open(gdal_array.GetArrayFilename(array)) assert ds is None - gdal.SetConfigOption('GDAL_ARRAY_OPEN_BY_FILENAME', 'TRUE') + gdal.SetConfigOption("GDAL_ARRAY_OPEN_BY_FILENAME", "TRUE") ds = gdal.Open(gdal_array.GetArrayFilename(array)) - gdal.SetConfigOption('GDAL_ARRAY_OPEN_BY_FILENAME', None) + gdal.SetConfigOption("GDAL_ARRAY_OPEN_BY_FILENAME", None) assert ds is not None # Invalid value with gdaltest.error_handler(): - ds = gdal.Open('NUMPY:::invalid') + ds = gdal.Open("NUMPY:::invalid") assert ds is None + ############################################################################### # Test the pixel interleave options def test_numpy_rw_18(): - 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.' + 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() @@ -634,19 +703,21 @@ def test_numpy_rw_18(): res = numpy.dstack((bnd1, bnd2, bnd3)) assert numpy.all(img == res) - res = ds.ReadAsArray(interleave='pixel') + res = ds.ReadAsArray(interleave="pixel") assert numpy.all(img == res) res = numpy.zeros([256, 200, 3]) - ds.ReadAsArray(buf_obj=res, interleave='pixel') + ds.ReadAsArray(buf_obj=res, 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(): - ds = gdal.Open('data/idontexist2.vrt') + ds = gdal.Open("data/idontexist2.vrt") assert ds is not None exception_raised = False @@ -684,74 +755,86 @@ def test_numpy_rw_gdal_array_openarray_permissions(): ds = gdal_array.OpenArray(ar) with gdaltest.error_handler(): assert ds.GetRasterBand(1).Fill(1) != 0 - assert ds.GetRasterBand(1).Checksum() == 0 + assert ds.GetRasterBand(1).Checksum() == 0 # Cannot read in non-writeable array with gdaltest.error_handler(): - assert ds.ReadAsArray(buf_obj = ar) is None - assert ds.GetRasterBand(1).ReadAsArray(buf_obj = ar) is None + assert ds.ReadAsArray(buf_obj=ar) is None + assert ds.GetRasterBand(1).ReadAsArray(buf_obj=ar) is None ############################################################################### # Test ReadAsArray RMS subsampling. -def test_numpy_rw_rms_resemple_alg(): - wrk_ds = gdal.Open('../gdrivers/data/int16.tif') - assert wrk_ds is not None, 'Failed to open test dataset.' +def test_numpy_rw_rms_resemple_alg(): - res = wrk_ds.ReadAsArray(0, 0, - wrk_ds.RasterXSize, - wrk_ds.RasterYSize, - buf_xsize=wrk_ds.RasterXSize//2, - buf_ysize=wrk_ds.RasterYSize//2, - resample_alg=gdal.GRIORA_RMS) + wrk_ds = gdal.Open("../gdrivers/data/int16.tif") + assert wrk_ds is not None, "Failed to open test dataset." + + res = wrk_ds.ReadAsArray( + 0, + 0, + wrk_ds.RasterXSize, + wrk_ds.RasterYSize, + buf_xsize=wrk_ds.RasterXSize // 2, + buf_ysize=wrk_ds.RasterYSize // 2, + resample_alg=gdal.GRIORA_RMS, + ) cs = res.sum() exp_cs = 12773 - assert cs == exp_cs, 'got wrong rms sum' - + assert cs == exp_cs, "got wrong rms sum" ############################################################################### # Test Dataset.ReadAsArray() with band_list -def test_numpy_rw_dataset_read_as_array(): - wrk_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') - - assert numpy.array_equal(wrk_ds.ReadAsArray(band_list=[2]), - wrk_ds.GetRasterBand(2).ReadAsArray()) +def test_numpy_rw_dataset_read_as_array(): - assert numpy.array_equal(wrk_ds.ReadAsArray(band_list=[2,1]), - numpy.stack( - [wrk_ds.GetRasterBand(2).ReadAsArray(), - wrk_ds.GetRasterBand(1).ReadAsArray()])) + wrk_ds = gdal.Open("../gdrivers/data/rgbsmall.tif") + assert numpy.array_equal( + wrk_ds.ReadAsArray(band_list=[2]), wrk_ds.GetRasterBand(2).ReadAsArray() + ) + assert numpy.array_equal( + wrk_ds.ReadAsArray(band_list=[2, 1]), + numpy.stack( + [ + wrk_ds.GetRasterBand(2).ReadAsArray(), + wrk_ds.GetRasterBand(1).ReadAsArray(), + ] + ), + ) ############################################################################### # Test Dataset.WriteArray() + def test_numpy_rw_dataset_writearray(): # Write 2D array in single-band dataset - ds = gdal.GetDriverByName('MEM').Create('', 3, 2) - ar = numpy.array([[0,1,2],[3,4,5]], dtype=numpy.uint8) + ds = gdal.GetDriverByName("MEM").Create("", 3, 2) + ar = numpy.array([[0, 1, 2], [3, 4, 5]], dtype=numpy.uint8) assert ds.WriteArray(ar) == 0 assert numpy.array_equal(ds.ReadAsArray(), ar) # Use WriteRaster interface - ds = gdal.GetDriverByName('MEM').Create('', 3, 2) - assert ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar.astype(numpy.uint32)) == 0 + ds = gdal.GetDriverByName("MEM").Create("", 3, 2) + assert ( + ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar.astype(numpy.uint32)) + == 0 + ) assert numpy.array_equal(ds.ReadAsArray(), ar) with pytest.raises(Exception): ds.WriteArray(None) with pytest.raises(Exception): - ds.WriteArray('not an array') + ds.WriteArray("not an array") # 1D array with pytest.raises(Exception): @@ -759,59 +842,83 @@ def test_numpy_rw_dataset_writearray(): # Too big 2D array in X with pytest.raises(Exception): - ds.WriteArray(numpy.array([[0,1,2,10],[3,4,5,20]], dtype=numpy.uint8)) + ds.WriteArray(numpy.array([[0, 1, 2, 10], [3, 4, 5, 20]], dtype=numpy.uint8)) # Write 3D array in single-band dataset - ds = gdal.GetDriverByName('MEM').Create('', 3, 2) - ar = numpy.array([[[0,1,2],[3,4,5]]], dtype=numpy.uint8) + ds = gdal.GetDriverByName("MEM").Create("", 3, 2) + ar = numpy.array([[[0, 1, 2], [3, 4, 5]]], dtype=numpy.uint8) assert ds.WriteArray(ar) == 0 assert numpy.array_equal(ds.ReadAsArray(), ar[0]) # ar.shape[0] != 1 with pytest.raises(Exception): - ds.WriteArray(numpy.array([[[0,1,2],[3,4,5]],[[0,1,2],[3,4,5]]])) + ds.WriteArray(numpy.array([[[0, 1, 2], [3, 4, 5]], [[0, 1, 2], [3, 4, 5]]])) # Write 3D array in two-band dataset - ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 2) - ar = numpy.array([[[0,1,2],[3,4,5]],[[10,11,12],[13,14,15]]], dtype=numpy.uint8) - assert ds.WriteRaster(0,0,3,2,memoryview(ar)) == 0 + ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 2) + ar = numpy.array( + [[[0, 1, 2], [3, 4, 5]], [[10, 11, 12], [13, 14, 15]]], dtype=numpy.uint8 + ) + assert ds.WriteRaster(0, 0, 3, 2, memoryview(ar)) == 0 assert numpy.array_equal(ds.ReadAsArray(), ar) # Non-native data type - ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 2) + ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 2) assert ds.WriteArray(ar.astype(numpy.int32)) == 0 assert numpy.array_equal(ds.ReadAsArray(), ar) # interleave='pixel' - ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 2) - assert ds.WriteArray(numpy.transpose(ar, (1,2,0)), interleave='pixel') == 0 + ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 2) + assert ds.WriteArray(numpy.transpose(ar, (1, 2, 0)), interleave="pixel") == 0 assert numpy.array_equal(ds.ReadAsArray(), ar) # band_list - ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 2) - assert ds.WriteArray(ar[::-1,...], band_list=[2,1]) == 0 + ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 2) + assert ds.WriteArray(ar[::-1, ...], band_list=[2, 1]) == 0 assert numpy.array_equal(ds.ReadAsArray(), ar) # Use WriteRaster interface - ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 2) - assert ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar.astype(numpy.uint32)) == 0 + ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 2) + assert ( + ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar.astype(numpy.uint32)) + == 0 + ) assert numpy.array_equal(ds.ReadAsArray(), ar) # 2D array with pytest.raises(Exception): - ds.WriteArray(numpy.array([[0,1,2,0],[3,4,5,0]])) + ds.WriteArray(numpy.array([[0, 1, 2, 0], [3, 4, 5, 0]])) # Too big 3D array in X with pytest.raises(Exception): - ds.WriteArray(numpy.array([[[0,1,2,0],[3,4,5,0]],[[10,11,12,0],[13,14,15,0]]])) + ds.WriteArray( + numpy.array( + [[[0, 1, 2, 0], [3, 4, 5, 0]], [[10, 11, 12, 0], [13, 14, 15, 0]]] + ) + ) # Too big 3D array in Y with pytest.raises(Exception): - ds.WriteArray(numpy.array([[[0,1,2],[3,4,5],[3,4,5]],[[10,11,12],[13,14,15],[13,14,15]]])) + ds.WriteArray( + numpy.array( + [ + [[0, 1, 2], [3, 4, 5], [3, 4, 5]], + [[10, 11, 12], [13, 14, 15], [13, 14, 15]], + ] + ) + ) # Too big 3D array in band dimension with pytest.raises(Exception): - ds.WriteArray(numpy.array([[[0,1,2],[3,4,5]],[[10,11,12],[13,14,15]],[[10,11,12],[13,14,15]]])) + ds.WriteArray( + numpy.array( + [ + [[0, 1, 2], [3, 4, 5]], + [[10, 11, 12], [13, 14, 15]], + [[10, 11, 12], [13, 14, 15]], + ] + ) + ) ############################################################################### @@ -820,26 +927,30 @@ def test_numpy_rw_dataset_writearray(): def test_numpy_rw_band_read_as_array_error_cases(): - ds = gdal.GetDriverByName('MEM').Create('', 3, 2) + ds = gdal.GetDriverByName("MEM").Create("", 3, 2) band = ds.GetRasterBand(1) - assert band.ReadAsArray(buf_obj = numpy.empty((3,2), dtype=numpy.uint8)) is not None - assert band.ReadAsArray(buf_obj = numpy.empty((1, 3,2), dtype=numpy.uint8)) is not None + assert band.ReadAsArray(buf_obj=numpy.empty((3, 2), dtype=numpy.uint8)) is not None + assert ( + band.ReadAsArray(buf_obj=numpy.empty((1, 3, 2), dtype=numpy.uint8)) is not None + ) # 1D - with pytest.raises(Exception, match='expected array of dimension 2 or 3'): - band.ReadAsArray(buf_obj = numpy.empty((3,), dtype=numpy.uint8)) + with pytest.raises(Exception, match="expected array of dimension 2 or 3"): + band.ReadAsArray(buf_obj=numpy.empty((3,), dtype=numpy.uint8)) # 3D of wrong size in first dimension - with pytest.raises(Exception, match='expected size of first dimension should be 0'): - band.ReadAsArray(buf_obj = numpy.empty((2, 3,2), dtype=numpy.uint8)) + with pytest.raises(Exception, match="expected size of first dimension should be 0"): + band.ReadAsArray(buf_obj=numpy.empty((2, 3, 2), dtype=numpy.uint8)) ############################################################################### # Test that we can get an error (#5374) + def test_numpy_rw_band_read_as_array_getlasterrormsg(): - ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Scaling</Description> <PixelFunctionType>invalid</PixelFunctionType> @@ -849,8 +960,9 @@ def test_numpy_rw_band_read_as_array_getlasterrormsg(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) gdal.ErrorReset() with gdaltest.error_handler(): assert ds.GetRasterBand(1).ReadAsArray() is None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" diff --git a/autotest/gcore/numpy_rw_multidim.py b/autotest/gcore/numpy_rw_multidim.py index 4dae7fb17064..4ac9208cf7fa 100755 --- a/autotest/gcore/numpy_rw_multidim.py +++ b/autotest/gcore/numpy_rw_multidim.py @@ -29,11 +29,12 @@ ############################################################################### +import struct import gdaltest -from osgeo import gdal import pytest -import struct + +from osgeo import gdal ############################################################################### # verify that we can load Numeric python, and find the Numpy driver. @@ -43,12 +44,13 @@ def test_numpy_rw_multidim_init(): gdaltest.numpy_drv = None # importing gdal_array will allow numpy driver registration - pytest.importorskip('osgeo.gdal_array') + pytest.importorskip("osgeo.gdal_array") gdal.AllRegister() - gdaltest.numpy_drv = gdal.GetDriverByName('NUMPY') - assert gdaltest.numpy_drv is not None, 'NUMPY driver not found!' + gdaltest.numpy_drv = gdal.GetDriverByName("NUMPY") + assert gdaltest.numpy_drv is not None, "NUMPY driver not found!" + ############################################################################### @@ -59,23 +61,39 @@ def test_numpy_rw_multidim_readasarray_writearray(): pytest.skip() import numpy as np - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1 ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - ar = np.array([[1,2,3], [4,5,6]], dtype=np.uint8) + ar = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.uint8) assert myarray.WriteArray(ar) == gdal.CE_None got_ar = myarray.ReadAsArray() assert got_ar.shape == (2, 3) assert np.array_equal(got_ar, ar) # Check algo with non-numpy method so as to detect issues with buffer striding - assert struct.unpack('B' * 6, myarray.Read()) == (1, 2, 3, 4, 5, 6) - assert struct.unpack('B' * 6, myarray.Read(buffer_stride = [3, 1])) == (1, 2, 3, 4, 5, 6) - assert struct.unpack('B' * 6, myarray.Read(buffer_stride = [1, 2])) == (1, 4, 2, 5, 3, 6) + assert struct.unpack("B" * 6, myarray.Read()) == (1, 2, 3, 4, 5, 6) + assert struct.unpack("B" * 6, myarray.Read(buffer_stride=[3, 1])) == ( + 1, + 2, + 3, + 4, + 5, + 6, + ) + assert struct.unpack("B" * 6, myarray.Read(buffer_stride=[1, 2])) == ( + 1, + 4, + 2, + 5, + 3, + 6, + ) + ############################################################################### @@ -84,19 +102,32 @@ def test_numpy_rw_multidim_numpy_array_as_dataset(): if gdaltest.numpy_drv is None: pytest.skip() - from osgeo import gdal_array import numpy as np - for typ in (np.int8, np.uint8, np.uint16, np.int16, np.uint32, np.int32, np.float32, np.float64, np.cfloat, np.cdouble): - ar = np.array([[1,2,3], [4,5,6]], dtype=typ) + from osgeo import gdal_array + + for typ in ( + np.int8, + np.uint8, + np.uint16, + np.int16, + np.uint32, + np.int32, + np.float32, + np.float64, + np.cfloat, + np.cdouble, + ): + ar = np.array([[1, 2, 3], [4, 5, 6]], dtype=typ) ds = gdal_array.OpenMultiDimensionalNumPyArray(ar) assert ds rg = ds.GetRootGroup() assert rg - myarray = rg.OpenMDArray('array') + myarray = rg.OpenMDArray("array") assert myarray assert np.array_equal(myarray.ReadAsArray(), ar) + ############################################################################### @@ -106,24 +137,40 @@ def test_numpy_rw_multidim_readasarray_writearray_negative_strides(): pytest.skip() import numpy as np - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1 ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - ar = np.array([[1,2,3], [4,5,6]], dtype=np.uint8) - ar = ar[::-1,::-1] # Test negative strides + ar = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.uint8) + ar = ar[::-1, ::-1] # Test negative strides assert myarray.WriteArray(ar) == gdal.CE_None got_ar = myarray.ReadAsArray() assert got_ar.shape == (2, 3) assert np.array_equal(got_ar, ar) # Check algo with non-numpy method so as to detect issues with buffer striding - assert struct.unpack('B' * 6, myarray.Read()) == (6, 5, 4, 3, 2, 1) - assert struct.unpack('B' * 6, myarray.Read(buffer_stride = [3, 1])) == (6, 5, 4, 3, 2, 1) - assert struct.unpack('B' * 6, myarray.Read(buffer_stride = [1, 2])) == (6, 3, 5, 2, 4, 1) + assert struct.unpack("B" * 6, myarray.Read()) == (6, 5, 4, 3, 2, 1) + assert struct.unpack("B" * 6, myarray.Read(buffer_stride=[3, 1])) == ( + 6, + 5, + 4, + 3, + 2, + 1, + ) + assert struct.unpack("B" * 6, myarray.Read(buffer_stride=[1, 2])) == ( + 6, + 3, + 5, + 2, + 4, + 1, + ) + ############################################################################### @@ -132,20 +179,33 @@ def test_numpy_rw_multidim_numpy_array_as_dataset_negative_strides(): if gdaltest.numpy_drv is None: pytest.skip() - from osgeo import gdal_array import numpy as np - for typ in (np.int8, np.uint8, np.uint16, np.int16, np.uint32, np.int32, np.float32, np.float64, np.cfloat, np.cdouble): - ar = np.array([[1,2,3], [4,5,6]], dtype=typ) - ar = ar[::-1,::-1] # Test negative strides + from osgeo import gdal_array + + for typ in ( + np.int8, + np.uint8, + np.uint16, + np.int16, + np.uint32, + np.int32, + np.float32, + np.float64, + np.cfloat, + np.cdouble, + ): + ar = np.array([[1, 2, 3], [4, 5, 6]], dtype=typ) + ar = ar[::-1, ::-1] # Test negative strides ds = gdal_array.OpenMultiDimensionalNumPyArray(ar) assert ds rg = ds.GetRootGroup() assert rg - myarray = rg.OpenMDArray('array') + myarray = rg.OpenMDArray("array") assert myarray assert np.array_equal(myarray.ReadAsArray(), ar) + ############################################################################### @@ -153,63 +213,82 @@ def test_numpy_rw_multidim_compound_datatype(): if gdaltest.numpy_drv is None: pytest.skip() - from osgeo import gdal_array import numpy as np - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + from osgeo import gdal_array + + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", None, None, 2) - comp0 = gdal.EDTComponent.Create('x', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - comp1 = gdal.EDTComponent.Create('y', 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + comp0 = gdal.EDTComponent.Create( + "x", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16) + ) + comp1 = gdal.EDTComponent.Create( + "y", 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) dt = gdal.ExtendedDataType.CreateCompound("mytype", 8, [comp0, comp1]) - myarray = rg.CreateMDArray("myarray", [ dim ], dt) + myarray = rg.CreateMDArray("myarray", [dim], dt) assert myarray numpydt = gdal_array.ExtendedDataTypeToNumPyDataType(dt) assert numpydt.itemsize == 8 - assert numpydt.names == ('x', 'y') - assert numpydt.fields['x'] == (np.int16, 0) - assert numpydt.fields['y'] == (np.int32, 4) - - assert myarray.Write(struct.pack('hi' * 2, 32767, 1000000, -32768, -1000000)) == gdal.CE_None + assert numpydt.names == ("x", "y") + assert numpydt.fields["x"] == (np.int16, 0) + assert numpydt.fields["y"] == (np.int32, 4) + + assert ( + myarray.Write(struct.pack("hi" * 2, 32767, 1000000, -32768, -1000000)) + == gdal.CE_None + ) res = myarray.ReadAsArray() assert res.dtype == numpydt - assert np.array_equal(res, np.array([( 32767, 1000000), (-32768, -1000000)], dtype = res.dtype)) + assert np.array_equal( + res, np.array([(32767, 1000000), (-32768, -1000000)], dtype=res.dtype) + ) - ar = np.array([( -32768, -1000000), (-32767, 1000000)], dtype = numpydt) + ar = np.array([(-32768, -1000000), (-32767, 1000000)], dtype=numpydt) assert myarray.WriteArray(ar) == gdal.CE_None res = myarray.ReadAsArray() assert np.array_equal(res, ar) + ############################################################################### -@pytest.mark.parametrize("datatype", [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, ], ids=gdal.GetDataTypeName) +@pytest.mark.parametrize( + "datatype", + [ + 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, + ], + ids=gdal.GetDataTypeName, +) def test_numpy_rw_multidim_datatype(datatype): if gdaltest.numpy_drv is None: pytest.skip() import numpy as np - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", None, None, 2) - myarray = rg.CreateMDArray("myarray", [ dim ], gdal.ExtendedDataType.Create(datatype)) + myarray = rg.CreateMDArray("myarray", [dim], gdal.ExtendedDataType.Create(datatype)) assert myarray numpy_ar = np.reshape(np.arange(0, 2, dtype=np.uint16), (2,)) assert myarray.WriteArray(numpy_ar) == gdal.CE_None got = myarray.ReadAsArray() assert np.array_equal(got, numpy_ar) - assert np.array_equal(myarray.ReadAsArray(buf_obj = np.zeros(got.shape, got.dtype)), numpy_ar) + assert np.array_equal( + myarray.ReadAsArray(buf_obj=np.zeros(got.shape, got.dtype)), numpy_ar + ) diff --git a/autotest/gcore/overviewds.py b/autotest/gcore/overviewds.py index 29ba1d23a27e..9e29417668a7 100755 --- a/autotest/gcore/overviewds.py +++ b/autotest/gcore/overviewds.py @@ -29,57 +29,66 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import gdaltest import os import shutil import struct -from osgeo import gdal +import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Error cases def test_overviewds_1(): - ds = gdal.OpenEx('data/byte.tif', open_options=['OVERVIEW_LEVEL=0']) + ds = gdal.OpenEx("data/byte.tif", open_options=["OVERVIEW_LEVEL=0"]) assert ds is None + ############################################################################### # Nominal cases + @pytest.mark.parametrize("externalOverviews", [True, False]) def test_overviewds_2(tmp_path, externalOverviews): - shutil.copy('data/byte.tif', tmp_path) - tmpfilename = str(tmp_path.joinpath('byte.tif')) + shutil.copy("data/byte.tif", tmp_path) + tmpfilename = str(tmp_path.joinpath("byte.tif")) if externalOverviews: ds = gdal.Open(tmpfilename) - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None ds = gdal.Open(tmpfilename, gdal.GA_Update) else: ds = gdal.Open(tmpfilename, gdal.GA_Update) - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) - ds.GetRasterBand(1).WriteRaster(2, 2, 5, 5, b'\0' * 25) - ds.GetRasterBand(1).WriteRaster(2, 2, 1, 1, b'\0') - ds.GetRasterBand(1).GetOverview(1).WriteRaster(2, 2, 1, 1, b'\0') + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) + ds.GetRasterBand(1).WriteRaster(2, 2, 5, 5, b"\0" * 25) + ds.GetRasterBand(1).WriteRaster(2, 2, 1, 1, b"\0") + ds.GetRasterBand(1).GetOverview(1).WriteRaster(2, 2, 1, 1, b"\0") ds = None src_ds = gdal.Open(tmpfilename) - ds = gdal.OpenEx(tmpfilename, open_options=['OVERVIEW_LEVEL=NONE']) + ds = gdal.OpenEx(tmpfilename, open_options=["OVERVIEW_LEVEL=NONE"]) assert ds.RasterXSize == 20 and ds.RasterYSize == 20 and ds.RasterCount == 1 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetProjectionRef() == src_ds.GetProjectionRef() assert ds.GetGeoTransform() == src_ds.GetGeoTransform() assert ds.ReadRaster() == src_ds.ReadRaster() # Check that subsampled request doesn't use source overviews - assert ds.ReadRaster(0, 0, 20, 20, 10, 10) != src_ds.GetRasterBand(1).GetOverview(0).ReadRaster() - assert ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) != src_ds.GetRasterBand(1).GetOverview(0).ReadRaster() + assert ( + ds.ReadRaster(0, 0, 20, 20, 10, 10) + != src_ds.GetRasterBand(1).GetOverview(0).ReadRaster() + ) + assert ( + ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) + != src_ds.GetRasterBand(1).GetOverview(0).ReadRaster() + ) ds = None - ds = gdal.OpenEx(tmpfilename, open_options=['OVERVIEW_LEVEL=0only']) + ds = gdal.OpenEx(tmpfilename, open_options=["OVERVIEW_LEVEL=0only"]) assert ds.RasterXSize == 10 and ds.RasterYSize == 10 and ds.RasterCount == 1 assert ds.GetRasterBand(1).GetOverviewCount() == 0 expected_data = src_ds.GetRasterBand(1).GetOverview(1).ReadRaster() @@ -91,16 +100,27 @@ def test_overviewds_2(tmp_path, externalOverviews): assert got_data != expected_data ds = None - ds = gdal.OpenEx(tmpfilename, open_options=['OVERVIEW_LEVEL=0']) + ds = gdal.OpenEx(tmpfilename, 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) + 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 expected_gt[i] == pytest.approx(gt[i], abs=1e-5) - assert ds.GetGCPCount() == 0 and ds.GetGCPProjection() == src_ds.GetGCPProjection() and not ds.GetGCPs() + assert ( + ds.GetGCPCount() == 0 + and ds.GetGCPProjection() == src_ds.GetGCPProjection() + and not ds.GetGCPs() + ) expected_data = src_ds.GetRasterBand(1).GetOverview(0).ReadRaster() got_data = ds.ReadRaster() assert expected_data == got_data @@ -117,20 +137,23 @@ def test_overviewds_2(tmp_path, externalOverviews): assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALL_VALID assert ds.GetRasterBand(1).GetMaskBand() 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 + 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) + 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 @@ -150,32 +173,37 @@ def test_overviewds_3(): src_gcps = (gcp1, gcp2, gcp3) ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) - tr = gdal.Transformer(ds, None, ['METHOD=GCP_POLYNOMIAL']) + tr = gdal.Transformer(ds, None, ["METHOD=GCP_POLYNOMIAL"]) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None - ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) + 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) + 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']) + tr = gdal.Transformer(ds, None, ["METHOD=GCP_POLYNOMIAL"]) (_, pnt) = tr.TransformPoint(0, 20 / 2.0, 10 / 2.0) for i in range(3): assert ref_pnt[i] == pytest.approx(pnt[i], abs=1e-5) ds = None + ############################################################################### # Test RPC def myfloat(s): - p = s.rfind(' ') + p = s.rfind(" ") if p >= 0: s = s[0:p] return float(s) @@ -183,23 +211,28 @@ def myfloat(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') + 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']) + tr = gdal.Transformer(ds, None, ["METHOD=RPC"]) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None - ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) - got_md = ds.GetMetadata('RPC') + 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 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]) @@ -207,7 +240,7 @@ def test_overviewds_4(): pytest.fail(key) # Really check that the transformer works - tr = gdal.Transformer(ds, None, ['METHOD=RPC']) + tr = gdal.Transformer(ds, None, ["METHOD=RPC"]) (_, pnt) = tr.TransformPoint(0, 20 / 2.0, 10 / 2.0) for i in range(3): @@ -216,7 +249,7 @@ def test_overviewds_4(): ds = None try: - os.remove('tmp/byte_rpc.txt') + os.remove("tmp/byte_rpc.txt") except OSError: pass @@ -227,34 +260,38 @@ def test_overviewds_4(): def test_overviewds_5(): - shutil.copy('data/sstgeo.tif', 'tmp/sstgeo.tif') - shutil.copy('data/sstgeo.vrt', 'tmp/sstgeo.vrt') + 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') + ds = gdal.Open("tmp/sstgeo.vrt") + geoloc_md = ds.GetMetadata("GEOLOCATION") - tr = gdal.Transformer(ds, None, ['METHOD=GEOLOC_ARRAY']) + tr = gdal.Transformer(ds, None, ["METHOD=GEOLOC_ARRAY"]) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) ds = None - ds = gdal.OpenEx('tmp/sstgeo.vrt', open_options=['OVERVIEW_LEVEL=0']) - got_md = ds.GetMetadata('GEOLOCATION') + 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 float(got_md[key]) == pytest.approx(myfloat(geoloc_md[key]) * 2, abs=1e-1) - elif key == 'PIXEL_STEP' or key == 'LINE_STEP': - assert float(got_md[key]) == pytest.approx(myfloat(geoloc_md[key]) / 2, abs=1e-1) + assert ds.GetMetadataItem(key, "GEOLOCATION") == got_md[key] + if key == "PIXEL_OFFSET" or key == "LINE_OFFSET": + assert float(got_md[key]) == pytest.approx( + myfloat(geoloc_md[key]) * 2, abs=1e-1 + ) + elif key == "PIXEL_STEP" or key == "LINE_STEP": + assert float(got_md[key]) == pytest.approx( + myfloat(geoloc_md[key]) / 2, abs=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']) + 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]) @@ -262,59 +299,67 @@ def test_overviewds_5(): assert pnt[i] == pytest.approx(expected_xyz[i], abs=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]) + 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']) + 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 = gdal.GetDriverByName("VRT").CreateCopy("tmp/byte.vrt", src_ds) ds = None src_ds = None - ds = gdal.Open('tmp/byte.vrt') + 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 + ############################################################################### # Dataset with a mask + def test_overviewds_mask(): - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test.tif', 4, 4) + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + src_ds = gdal.GetDriverByName("GTiff").Create("/vsimem/test.tif", 4, 4) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 2, 4, b'\xFF' * 8) - src_ds.BuildOverviews('NEAR', [2, 4]) + src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 2, 4, b"\xFF" * 8) + src_ds.BuildOverviews("NEAR", [2, 4]) src_ds = None - ovr_ds = gdal.OpenEx('/vsimem/test.tif', open_options=['OVERVIEW_LEVEL=0']) + ovr_ds = gdal.OpenEx("/vsimem/test.tif", open_options=["OVERVIEW_LEVEL=0"]) assert ovr_ds assert ovr_ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET ovrmaskband = ovr_ds.GetRasterBand(1).GetMaskBand() - assert struct.unpack('B' * 4, ovrmaskband.ReadRaster()) == (255, 0, 255, 0) + assert struct.unpack("B" * 4, ovrmaskband.ReadRaster()) == (255, 0, 255, 0) # Mask of mask assert ovrmaskband.GetMaskFlags() == gdal.GMF_ALL_VALID - assert struct.unpack('B' * 4, ovrmaskband.GetMaskBand().ReadRaster()) == (255, 255, 255, 255) + assert struct.unpack("B" * 4, ovrmaskband.GetMaskBand().ReadRaster()) == ( + 255, + 255, + 255, + 255, + ) # Overview of overview of mask assert ovrmaskband.GetOverviewCount() == 1 ovrofovrmaskband = ovrmaskband.GetOverview(0) - assert struct.unpack('B' * 1, ovrofovrmaskband.ReadRaster()) == (255,) + assert struct.unpack("B" * 1, ovrofovrmaskband.ReadRaster()) == (255,) ovr_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/test.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/test.tif") ############################################################################### @@ -323,22 +368,18 @@ def test_overviewds_mask(): def test_overviewds_cleanup(): - gdal.GetDriverByName('GTiff').Delete('tmp/byte.tif') + gdal.GetDriverByName("GTiff").Delete("tmp/byte.tif") try: - os.remove('tmp/byte_rpc.txt') + 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') + 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') + os.remove("tmp/byte.vrt") except OSError: pass - - - - diff --git a/autotest/gcore/pam.py b/autotest/gcore/pam.py index 309887533107..c46cd476aa42 100755 --- a/autotest/gcore/pam.py +++ b/autotest/gcore/pam.py @@ -34,28 +34,29 @@ import shutil import stat - import gdaltest -from osgeo import gdal -from osgeo import osr import pytest +from osgeo import gdal, osr + + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - with gdaltest.config_option('GDAL_PAM_ENABLED', 'YES'): + with gdaltest.config_option("GDAL_PAM_ENABLED", "YES"): yield try: - os.chmod('tmpdirreadonly', stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - shutil.rmtree('tmpdirreadonly') + os.chmod("tmpdirreadonly", stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) + shutil.rmtree("tmpdirreadonly") except OSError: pass try: - shutil.rmtree('tmppamproxydir') + shutil.rmtree("tmppamproxydir") except OSError: pass + ############################################################################### # Check that we can read PAM metadata for existing PNM file. @@ -65,20 +66,22 @@ def test_pam_1(): 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' + 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') + xml_md = ds.GetMetadata("xml:test") - assert len(xml_md) == 1, 'xml:test metadata missing' + assert len(xml_md) == 1, "xml:test metadata missing" - assert isinstance(xml_md, list), 'xml:test metadata not returned as list.' + assert isinstance(xml_md, list), "xml:test metadata not returned as list." expected_xml = """<?xml version="2.0"?> <TestXML>Value</TestXML> """ - assert xml_md[0] == expected_xml, 'xml does not match' + assert xml_md[0] == expected_xml, "xml does not match" + ############################################################################### # Verify that we can write XML to a new file. @@ -86,22 +89,23 @@ def test_pam_1(): def test_pam_2(): - driver = gdal.GetDriverByName('PNM') - ds = driver.Create('tmp/pam.pgm', 10, 10) + driver = gdal.GetDriverByName("PNM") + ds = driver.Create("tmp/pam.pgm", 10, 10) band = ds.GetRasterBand(1) - band.SetMetadata({'other': 'red', 'key': 'value'}) + band.SetMetadata({"other": "red", "key": "value"}) expected_xml = """<?xml version="2.0"?> <TestXML>Value</TestXML> """ - band.SetMetadata([expected_xml], 'xml:test') + band.SetMetadata([expected_xml], "xml:test") band.SetNoDataValue(100) ds = None + ############################################################################### # Check that we can read PAM metadata for existing PNM file. @@ -112,31 +116,34 @@ def test_pam_3(): 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' + 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') + xml_md = band.GetMetadata("xml:test") - assert len(xml_md) == 1, 'xml:test metadata missing' + assert len(xml_md) == 1, "xml:test metadata missing" - assert isinstance(xml_md, list), 'xml:test metadata not returned as list.' + assert isinstance(xml_md, list), "xml:test metadata not returned as list." expected_xml = """<?xml version="2.0"?> <TestXML>Value</TestXML> """ - assert xml_md[0] == expected_xml, 'xml does not match' + assert xml_md[0] == expected_xml, "xml does not match" - assert band.GetNoDataValue() == 100, 'nodata not saved via pam' + assert band.GetNoDataValue() == 100, "nodata not saved via pam" ds = None - ds = gdal.Open('tmp/pam.pgm', gdal.GA_Update) + ds = gdal.Open("tmp/pam.pgm", gdal.GA_Update) assert ds.GetRasterBand(1).DeleteNoDataValue() == 0 ds = None - ds = gdal.Open('tmp/pam.pgm') - assert ds.GetRasterBand(1).GetNoDataValue() is None, \ - 'got nodata value whereas none was expected' + ds = gdal.Open("tmp/pam.pgm") + assert ( + ds.GetRasterBand(1).GetNoDataValue() is None + ), "got nodata value whereas none was expected" + ############################################################################### # Check that PAM binary encoded nodata values work properly. @@ -147,15 +154,17 @@ 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') + 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') + 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?' + 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 @@ -165,11 +174,12 @@ def test_pam_4(): def test_pam_5(): - ds = gdal.Open('data/sasha.tif') + ds = gdal.Open("data/sasha.tif") filelist = ds.GetFileList() ds = None - assert len(filelist) == 1, 'did not get expected file list.' + assert len(filelist) == 1, "did not get expected file list." + ############################################################################### # Verify we can read nodata values from .aux files (#2505) @@ -178,13 +188,16 @@ def test_pam_5(): def test_pam_6(): - ds = gdal.Open('data/f2r23.tif') - assert ds.GetRasterBand(1).GetNoDataValue() == 0, \ - 'did not get expected .aux sourced nodata.' + 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.' + 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) @@ -193,22 +206,23 @@ def test_pam_6(): def test_pam_7(): - with gdaltest.config_option('GDAL_PAM_ENABLED', 'NO'): + with gdaltest.config_option("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]) + 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') + 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') + 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) # @@ -216,19 +230,20 @@ def test_pam_7(): def test_pam_8(): - with gdaltest.config_option('GDAL_PAM_ENABLED', 'YES'): + with gdaltest.config_option("GDAL_PAM_ENABLED", "YES"): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pam_8.tif', 1, 1, 1) - ds.GetRasterBand(1).SetDescription('foo') + 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') + ds = gdal.Open("/vsimem/pam_8.tif") desc = ds.GetRasterBand(1).GetDescription() ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/pam_8.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/pam_8.tif") + + assert desc == "foo" - assert desc == 'foo' ############################################################################### # Test that we can retrieve projection from xml:ESRI domain @@ -237,10 +252,10 @@ def test_pam_8(): def test_pam_9(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pam_9.tif', 1, 1, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/pam_9.tif", 1, 1, 1) ds = None - f = gdal.VSIFOpenL('/vsimem/pam_9.tif.aux.xml', 'wb') + f = gdal.VSIFOpenL("/vsimem/pam_9.tif.aux.xml", "wb") content = """<PAMDataset> <Metadata domain="xml:ESRI" format="xml"> <GeodataXform xsi:type="typens:IdentityXform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:typens="http://www.esri.com/schemas/ArcGIS/9.2"> @@ -254,44 +269,55 @@ def test_pam_9(): gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/pam_9.tif') + ds = gdal.Open("/vsimem/pam_9.tif") wkt = ds.GetProjectionRef() ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/pam_9.tif') + 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 = 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') + 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) + 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.GetDescription() == "MyDescription" - assert band.GetUnitType() == 'MyUnit' + assert band.GetUnitType() == "MyUnit" assert band.GetOffset() == 1 @@ -299,7 +325,7 @@ def test_pam_10(): assert band.GetRasterColorInterpretation() == gdal.GCI_PaletteIndex - assert band.GetCategoryNames() == ['Cat1', 'Cat2'] + assert band.GetCategoryNames() == ["Cat1", "Cat2"] ct = band.GetColorTable() assert ct.GetColorEntry(0) == (0, 0, 0, 255) @@ -309,12 +335,18 @@ def test_pam_10(): assert band.GetMinimum() == 2 - assert band.GetMetadata() == {'STATISTICS_MEAN': '1', 'STATISTICS_MINIMUM': '2', 'STATISTICS_MAXIMUM': '0', 'STATISTICS_STDDEV': '3'} + 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') + gdal.Unlink("/vsimem/pam_10.asc") + gdal.Unlink("/vsimem/pam_10.asc.aux.xml") + ############################################################################### # Test PamProxyDb mechanism @@ -324,20 +356,20 @@ 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') + 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') + 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) + os.chmod("tmpdirreadonly", stat.S_IRUSR | stat.S_IXUSR) # Test that the directory is really read-only try: - f = open('tmpdirreadonly/test', 'w') + f = open("tmpdirreadonly/test", "w") if f is not None: f.close() pytest.skip() @@ -345,31 +377,34 @@ def test_pam_11(): pass # Compute statistics --> the saving as .aux.xml should fail - ds = gdal.Open('tmpdirreadonly/byte.tif') + ds = gdal.Open("tmpdirreadonly/byte.tif") stats = ds.GetRasterBand(1).ComputeStatistics(False) - assert stats[0] == 74, 'did not get expected minimum' + assert stats[0] == 74, "did not get expected minimum" gdal.ErrorReset() with gdaltest.error_handler(): ds = None error_msg = gdal.GetLastErrorMsg() - assert error_msg.startswith('Unable to save auxiliary information'), \ - 'warning was expected at that point' + 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') + 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' + 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) + + 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) + 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 @@ -377,8 +412,9 @@ def test_pam_11(): def test_pam_12(): - shutil.copy('data/byte.tif', 'tmp') - open('tmp/byte.tif.aux.xml', 'wt').write("""<PAMDataset> + shutil.copy("data/byte.tif", "tmp") + open("tmp/byte.tif.aux.xml", "wt").write( + """<PAMDataset> <PAMRasterBand band="1"> <Histograms> <HistItem> @@ -391,21 +427,23 @@ def test_pam_12(): </HistItem> </Histograms> </PAMRasterBand> -</PAMDataset>""") +</PAMDataset>""" + ) - ds = gdal.Open('tmp/byte.tif') + 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.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') + 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 '<HistCounts>6000000000|' in aux_xml + assert "<HistCounts>6000000000|" in aux_xml + ############################################################################### # Test various stuff with PAM disabled @@ -414,14 +452,14 @@ def test_pam_12(): def test_pam_13(): - with gdaltest.config_option('GDAL_PAM_ENABLED', 'NO'): + with gdaltest.config_option("GDAL_PAM_ENABLED", "NO"): - tmpfilename = '/vsimem/tmp.pgm' - ds = gdal.GetDriverByName('PNM').Create(tmpfilename, 1, 1) + tmpfilename = "/vsimem/tmp.pgm" + ds = gdal.GetDriverByName("PNM").Create(tmpfilename, 1, 1) ds.GetRasterBand(1).SetNoDataValue(0) ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None gdal.Unlink(tmpfilename) @@ -433,30 +471,35 @@ def test_pam_13(): def test_pam_metadata_preserved(): - tmpfilename = '/vsimem/tmp.pgm' - ds = gdal.GetDriverByName('PNM').Create(tmpfilename, 1, 1) - ds.SetMetadataItem('foo', 'bar') + tmpfilename = "/vsimem/tmp.pgm" + 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.GetRasterBand(1).SetMetadataItem("bar", "baz") ds = None ds = gdal.Open(tmpfilename) - assert ds.GetMetadataItem('foo') == 'bar' - assert ds.GetRasterBand(1).GetMetadataItem('bar') == 'baz' + assert ds.GetMetadataItem("foo") == "bar" + assert ds.GetRasterBand(1).GetMetadataItem("bar") == "baz" ds = None - gdal.GetDriverByName('PNM').Delete(tmpfilename) + gdal.GetDriverByName("PNM").Delete(tmpfilename) + ############################################################################### # Test that we can retrieve GCPs from xml:ESRI domain # + def test_pam_esri_GeodataXform_gcp(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_pam_esri_GeodataXform_gcp.tif', 20, 20, 1) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_pam_esri_GeodataXform_gcp.tif", 20, 20, 1 + ) ds = None - gdal.FileFromMemBuffer('/vsimem/test_pam_esri_GeodataXform_gcp.tif.aux.xml', -"""<PAMDataset> + gdal.FileFromMemBuffer( + "/vsimem/test_pam_esri_GeodataXform_gcp.tif.aux.xml", + """<PAMDataset> <Metadata domain="xml:ESRI" format="xml"> <GeodataXform xsi:type="typens:PolynomialXform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.3"> <PolynomialOrder>1</PolynomialOrder> @@ -492,14 +535,15 @@ def test_pam_esri_GeodataXform_gcp(): </TargetGCPs> </GeodataXform> </Metadata> -</PAMDataset>""") +</PAMDataset>""", + ) - ds = gdal.Open('/vsimem/test_pam_esri_GeodataXform_gcp.tif') + ds = gdal.Open("/vsimem/test_pam_esri_GeodataXform_gcp.tif") gcps = ds.GetGCPs() sr_gt = ds.GetSpatialRef() sr_gcp = ds.GetGCPSpatialRef() - gdal.GetDriverByName('GTiff').Delete('/vsimem/test_pam_esri_GeodataXform_gcp.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/test_pam_esri_GeodataXform_gcp.tif") assert len(gcps) == 3 assert gcps[0].GCPPixel == 1 @@ -517,13 +561,14 @@ def test_pam_esri_GeodataXform_gcp(): ds = None + ############################################################################### def test_pam_metadata_coordinate_epoch(): - tmpfilename = '/vsimem/tmp.pgm' - ds = gdal.GetDriverByName('PNM').Create(tmpfilename, 1, 1) + tmpfilename = "/vsimem/tmp.pgm" + ds = gdal.GetDriverByName("PNM").Create(tmpfilename, 1, 1) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) srs.SetCoordinateEpoch(2021.3) @@ -535,19 +580,19 @@ def test_pam_metadata_coordinate_epoch(): assert srs.GetCoordinateEpoch() == 2021.3 ds = None - gdal.GetDriverByName('PNM').Delete(tmpfilename) + gdal.GetDriverByName("PNM").Delete(tmpfilename) + ############################################################################### # Check that PAM handles correctly equality of NaN nodata values (#4847) + def test_pam_nodata_nan(): - outfilename = '/vsimem/test_pam_nodata_nan.tif' - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_Float32) - src_ds.GetRasterBand(1).SetNoDataValue(float('nan')) - gdal.GetDriverByName('GTiff').CreateCopy(outfilename, src_ds) + outfilename = "/vsimem/test_pam_nodata_nan.tif" + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_Float32) + src_ds.GetRasterBand(1).SetNoDataValue(float("nan")) + gdal.GetDriverByName("GTiff").CreateCopy(outfilename, src_ds) # Check that no PAM file is generated - assert gdal.VSIStatL(outfilename + '.aux.xml') is None - gdal.GetDriverByName('GTiff').Delete(outfilename) - - + assert gdal.VSIStatL(outfilename + ".aux.xml") is None + gdal.GetDriverByName("GTiff").Delete(outfilename) diff --git a/autotest/gcore/pamproxydb.py b/autotest/gcore/pamproxydb.py index 0195b659352b..0612484cda86 100755 --- a/autotest/gcore/pamproxydb.py +++ b/autotest/gcore/pamproxydb.py @@ -28,47 +28,50 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import sys import os +import sys + try: - os.putenv('CPL_SHOW_MEM_STATS', '') + 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': +if len(sys.argv) == 2 and sys.argv[1] == "-test1": - from osgeo import gdal import shutil + from osgeo import gdal + try: - shutil.rmtree('tmppamproxydir') + shutil.rmtree("tmppamproxydir") except OSError: pass - os.mkdir('tmppamproxydir') + os.mkdir("tmppamproxydir") - gdal.SetConfigOption('GDAL_PAM_PROXY_DIR', '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') + 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') + 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') + 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> + f = open("tmppamproxydir/000000_tmpdirreadonly_byte.tif.aux.xml", "w") + f.write( + """<PAMDataset> <PAMRasterBand band="1"> <Metadata> <MDI key="STATISTICS_MAXIMUM">255</MDI> @@ -77,78 +80,85 @@ <MDI key="STATISTICS_STDDEV">22.928470838676</MDI> </Metadata> </PAMRasterBand> -</PAMDataset>""") +</PAMDataset>""" + ) f.close() - ds = gdal.Open('tmpdirreadonly/byte.tif') + 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( + "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') + print("did not get expected minimum") sys.exit(1) ds = None # Check that proxy overviews work - ds = gdal.Open('tmpdirreadonly/byte.tif') + ds = gdal.Open("tmpdirreadonly/byte.tif") gdal.PushErrorHandler() - assert ds.BuildOverviews('NEAR', overviewlist=[2]) == gdal.CE_None + assert ds.BuildOverviews("NEAR", overviewlist=[2]) == gdal.CE_None gdal.PopErrorHandler() 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') + 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') + 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( + "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') + print("did not get expected overview count") sys.exit(1) - print('success') + 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': +if len(sys.argv) == 2 and sys.argv[1] == "-test2": from osgeo import gdal - gdal.SetConfigOption('GDAL_PAM_PROXY_DIR', 'tmppamproxydir') + gdal.SetConfigOption("GDAL_PAM_PROXY_DIR", "tmppamproxydir") - ds = gdal.Open('tmpdirreadonly/byte.tif') + 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( + "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') + 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') + print("did not get expected overview count") sys.exit(1) - print('success') + print("success") sys.exit(0) diff --git a/autotest/gcore/pixfun.py b/autotest/gcore/pixfun.py index 2cf2283437ae..f4bf7febf385 100755 --- a/autotest/gcore/pixfun.py +++ b/autotest/gcore/pixfun.py @@ -36,22 +36,23 @@ from osgeo import gdal # All tests will be skipped if numpy is unavailable. -numpy = pytest.importorskip('numpy') +numpy = pytest.importorskip("numpy") ############################################################################### # Verify real part extraction from a complex dataset. + def test_pixfun_real_c(): - filename = 'data/vrt/pixfun_real_c.vrt' + filename = "data/vrt/pixfun_real_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata.real) @@ -60,16 +61,17 @@ def test_pixfun_real_c(): ############################################################################### # Verify real part extraction from a complex dataset. + def test_pixfun_real_r(): - filename = 'data/vrt/pixfun_real_r.vrt' + filename = "data/vrt/pixfun_real_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata.real) @@ -78,22 +80,23 @@ def test_pixfun_real_r(): ############################################################################### # Verify imaginary part extraction from a complex dataset. + def test_pixfun_imag_c(): - filename = 'data/vrt/pixfun_imag_c.vrt' + filename = "data/vrt/pixfun_imag_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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') + copied_ds = gdal.Translate("", filename, format="MEM") data_ds = copied_ds.GetRasterBand(1).ReadAsArray() copied_ds = None @@ -103,11 +106,12 @@ def test_pixfun_imag_c(): ############################################################################### # Verify imaginary part extraction from a real dataset. + def test_pixfun_imag_r(): - filename = 'data/vrt/pixfun_imag_r.vrt' + filename = "data/vrt/pixfun_imag_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == 0) @@ -116,16 +120,17 @@ def test_pixfun_imag_r(): ############################################################################### # Verify complex dataset generation form real and imaginary parts. + def test_pixfun_complex(): - filename = 'data/vrt/pixfun_complex.vrt' + filename = "data/vrt/pixfun_complex.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, refdata + 1j * refdata) @@ -134,16 +139,17 @@ def test_pixfun_complex(): ############################################################################### # Verify complex dataset generation form amplitude and phase parts. + def test_pixfun_polar(): - filename = 'data/vrt/pixfun_polar.vrt' + filename = "data/vrt/pixfun_polar.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, refdata * numpy.exp(1j * refdata)) @@ -152,16 +158,17 @@ def test_pixfun_polar(): ############################################################################### # Verify complex dataset generation form amplitude and phase parts. + def test_pixfun_polar_amplitude(): - filename = 'data/vrt/pixfun_polar_amplitude.vrt' + filename = "data/vrt/pixfun_polar_amplitude.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, refdata * numpy.exp(1j * refdata)) @@ -170,16 +177,17 @@ def test_pixfun_polar_amplitude(): ############################################################################### # Verify complex dataset generation form intensity and phase parts. + def test_pixfun_polar_intensity(): - filename = 'data/vrt/pixfun_polar_intensity.vrt' + filename = "data/vrt/pixfun_polar_intensity.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, numpy.sqrt(refdata) * numpy.exp(1j * refdata)) @@ -188,38 +196,40 @@ def test_pixfun_polar_intensity(): ############################################################################### # Verify complex dataset generation form amplitude (dB) and phase parts. + def test_pixfun_polar_dB(): - filename = 'data/vrt/pixfun_polar_dB.vrt' + filename = "data/vrt/pixfun_polar_dB.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - assert numpy.allclose(data, 10**(refdata/20) * numpy.exp(1j * refdata)) + assert numpy.allclose(data, 10 ** (refdata / 20) * numpy.exp(1j * refdata)) ############################################################################### # Verify modulus extraction from a complex (float) dataset. + def test_pixfun_mod_c(): - filename = 'data/vrt/pixfun_mod_c.vrt' + filename = "data/vrt/pixfun_mod_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() res = numpy.allclose(data, numpy.abs(refdata)) - if gdaltest.is_travis_branch('sanitize') and not res: + if gdaltest.is_travis_branch("sanitize") and not res: print(data) print(numpy.abs(refdata)) pytest.xfail() @@ -230,20 +240,21 @@ def test_pixfun_mod_c(): ############################################################################### # Verify modulus extraction from a real (integer type) dataset. + def test_pixfun_mod_r(): - filename = 'data/vrt/pixfun_mod_r.vrt' + filename = "data/vrt/pixfun_mod_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() res = numpy.alltrue(data == numpy.abs(refdata)) - if gdaltest.is_travis_branch('sanitize') and not res: + if gdaltest.is_travis_branch("sanitize") and not res: print(data) print(numpy.abs(refdata)) pytest.xfail() @@ -254,18 +265,19 @@ def test_pixfun_mod_r(): ############################################################################### # Verify phase extraction from a complex dataset. + def test_pixfun_phase_c(): - filename = 'data/vrt/pixfun_phase_c.vrt' + filename = "data/vrt/pixfun_phase_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('complex128') + refdata = refdata.astype("complex128") assert numpy.allclose(data, numpy.arctan2(refdata.imag, refdata.real)) @@ -273,16 +285,17 @@ def test_pixfun_phase_c(): ############################################################################### # Verify phase extraction from a real dataset. + def test_pixfun_phase_r(): - filename = 'data/vrt/pixfun_phase_r.vrt' + filename = "data/vrt/pixfun_phase_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/vrt/pixfun_imag_c.vrt' + reffilename = "data/vrt/pixfun_imag_c.vrt" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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)) @@ -291,11 +304,12 @@ def test_pixfun_phase_r(): ############################################################################### # Verify phase extraction from a unsigned dataset (completely boring !) + def test_pixfun_phase_unsigned(): - filename = 'data/vrt/pixfun_phase_unsigned.vrt' + filename = "data/vrt/pixfun_phase_unsigned.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.zeros(data.shape)) @@ -304,16 +318,17 @@ def test_pixfun_phase_unsigned(): ############################################################################### # Verify cmplex conjugare computation on a complex dataset. + def test_pixfun_conj_c(): - filename = 'data/vrt/pixfun_conj_c.vrt' + filename = "data/vrt/pixfun_conj_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.conj(refdata)) @@ -322,16 +337,17 @@ def test_pixfun_conj_c(): ############################################################################### # Verify cmplex conjugare computation on a real dataset. + def test_pixfun_conj_r(): - filename = 'data/vrt/pixfun_conj_r.vrt' + filename = "data/vrt/pixfun_conj_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.conj(refdata)) @@ -340,18 +356,18 @@ def test_pixfun_conj_r(): ############################################################################### # Verify the sum of 3 (real) datasets. + def test_pixfun_sum_r(): - filename = 'data/vrt/pixfun_sum_r.vrt' + filename = "data/vrt/pixfun_sum_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - refdata = numpy.zeros(data.shape, 'float') - for reffilename in ('data/uint16.tif', 'data/int32.tif', - 'data/float32.tif'): + 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) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata += refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) @@ -360,18 +376,18 @@ def test_pixfun_sum_r(): ############################################################################### # Verify the sum of 3 (two complex and one real) datasets. + def test_pixfun_sum_c(): - filename = 'data/vrt/pixfun_sum_c.vrt' + filename = "data/vrt/pixfun_sum_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - refdata = numpy.zeros(data.shape, 'complex') - for reffilename in ('data/uint16.tif', 'data/cint_sar.tif', - 'data/cfloat64.tif'): + 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) + 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) @@ -380,41 +396,43 @@ def test_pixfun_sum_c(): ############################################################################### # Verify the sum of 3 (real) datasets and a scalar constant k. + def test_pixfun_sum_k(): - filename = 'data/vrt/pixfun_sum_k.vrt' + filename = "data/vrt/pixfun_sum_k.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - k = 2. - refdata = numpy.full(data.shape, k, dtype='float') - for reffilename in ('data/uint16.tif', 'data/int32.tif', - 'data/float32.tif'): + k = 2.0 + refdata = numpy.full(data.shape, k, dtype="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) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata += refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) + ############################################################################### # Verify the difference of 2 (real) datasets. + def test_pixfun_diff_r(): - filename = 'data/vrt/pixfun_diff_r.vrt' + filename = "data/vrt/pixfun_diff_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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) @@ -423,21 +441,22 @@ def test_pixfun_diff_r(): ############################################################################### # Verify the difference of 2 (complex) datasets. + def test_pixfun_diff_c(): - filename = 'data/vrt/pixfun_diff_c.vrt' + filename = "data/vrt/pixfun_diff_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata1 = refds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cfloat64.tif' + reffilename = "data/cfloat64.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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) @@ -446,18 +465,18 @@ def test_pixfun_diff_c(): ############################################################################### # Verify the product of 3 (real) datasets. + def test_pixfun_mul_r(): - filename = 'data/vrt/pixfun_mul_r.vrt' + filename = "data/vrt/pixfun_mul_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - refdata = numpy.ones(data.shape, 'float') - for reffilename in ('data/uint16.tif', 'data/int32.tif', - 'data/float32.tif'): + 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) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata *= refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) @@ -466,16 +485,17 @@ def test_pixfun_mul_r(): ############################################################################### # Verify the product of 2 (complex) datasets. + def test_pixfun_mul_c(): - filename = 'data/vrt/pixfun_mul_c.vrt' + filename = "data/vrt/pixfun_mul_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata * refdata) @@ -484,19 +504,19 @@ def test_pixfun_mul_c(): ############################################################################### # Verify the product of 3 (real) datasets and a scalar constant k. + def test_pixfun_mul_k(): - filename = 'data/vrt/pixfun_mul_k.vrt' + filename = "data/vrt/pixfun_mul_k.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - k = 2. - refdata = numpy.full(data.shape, k, dtype='float') - for reffilename in ('data/uint16.tif', 'data/int32.tif', - 'data/float32.tif'): + k = 2.0 + refdata = numpy.full(data.shape, k, dtype="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) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata *= refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) @@ -505,22 +525,23 @@ def test_pixfun_mul_k(): ############################################################################### # Verify the division of 2 (real) datasets. + def test_pixfun_div_r(): - filename = 'data/vrt/pixfun_div_r.vrt' + filename = "data/vrt/pixfun_div_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata1 = refds.GetRasterBand(1).ReadAsArray(0, 0, 5, 6) - refdata1 = refdata1.astype('float32') + refdata1 = refdata1.astype("float32") - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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)) @@ -529,39 +550,41 @@ def test_pixfun_div_r(): ############################################################################### # Verify the division of 2 (complex) datasets. + def test_pixfun_div_c(): - filename = 'data/vrt/pixfun_div_c.vrt' + filename = "data/vrt/pixfun_div_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cfloat64.tif' + reffilename = "data/cfloat64.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata1 = refds.GetRasterBand(1).ReadAsArray(0, 0, 5, 6) - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata2 = refds.GetRasterBand(1).ReadAsArray() - assert numpy.alltrue(data == (refdata1 / refdata2).astype('complex64')) + assert numpy.alltrue(data == (refdata1 / refdata2).astype("complex64")) ############################################################################### # Verify the product with complex conjugate of a complex datasets. + def test_pixfun_cmul_c(): - filename = 'data/vrt/pixfun_cmul_c.vrt' + filename = "data/vrt/pixfun_cmul_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata * refdata.conj()) @@ -570,24 +593,25 @@ def test_pixfun_cmul_c(): ############################################################################### # Verify the product with complex conjugate of two real datasets. + def test_pixfun_cmul_r(): - filename = 'data/vrt/pixfun_cmul_r.vrt' + filename = "data/vrt/pixfun_cmul_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/uint16.tif' + reffilename = "data/uint16.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata1 = refds.GetRasterBand(1).ReadAsArray() - refdata1 = refdata1.astype('float64') + refdata1 = refdata1.astype("float64") - reffilename = 'data/int32.tif' + reffilename = "data/int32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata2 = refds.GetRasterBand(1).ReadAsArray() - refdata2 = refdata2.astype('float64') + refdata2 = refdata2.astype("float64") assert numpy.alltrue(data == refdata1 * refdata2.conj()) @@ -595,25 +619,27 @@ def test_pixfun_cmul_r(): ############################################################################### # Verify computation of the inverse of a real datasets. + def test_pixfun_inv_r(): - filename = 'data/vrt/pixfun_inv_r.vrt' + filename = "data/vrt/pixfun_inv_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/uint16.tif' + reffilename = "data/uint16.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") - assert numpy.alltrue(data == 1. / refdata) + assert numpy.alltrue(data == 1.0 / refdata) def test_pixfun_inv_r_zero(): - ds = gdal.Open("""<VRTDataset rasterXSize="1" rasterYSize="1"> + ds = gdal.Open( + """<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Inverse</Description> <PixelFunctionType>inv</PixelFunctionType> @@ -625,7 +651,8 @@ def test_pixfun_inv_r_zero(): <ScaleRatio>0</ScaleRatio> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) data = ds.GetRasterBand(1).ReadAsArray() assert math.isinf(data[0][0]) @@ -633,19 +660,20 @@ def test_pixfun_inv_r_zero(): ############################################################################### # Verify computation of the inverse of a complex datasets. + def test_pixfun_inv_c(): - filename = 'data/vrt/pixfun_inv_c.vrt' + filename = "data/vrt/pixfun_inv_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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 + refdata = refdata.astype("complex") + delta = data - 1.0 / refdata assert numpy.alltrue(abs(delta.real) < 1e-13) assert numpy.alltrue(abs(delta.imag) < 1e-13) @@ -653,7 +681,8 @@ def test_pixfun_inv_c(): def test_pixfun_inv_c_zero(): - ds = gdal.Open("""<VRTDataset rasterXSize="1" rasterYSize="1"> + ds = gdal.Open( + """<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="CFloat64" band="1" subClass="VRTDerivedRasterBand"> <Description>Inverse</Description> <PixelFunctionType>inv</PixelFunctionType> @@ -665,7 +694,8 @@ def test_pixfun_inv_c_zero(): <ScaleRatio>0</ScaleRatio> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) data = ds.GetRasterBand(1).ReadAsArray() assert math.isinf(data[0][0].real) assert math.isinf(data[0][0].imag) @@ -674,36 +704,38 @@ def test_pixfun_inv_c_zero(): ############################################################################### # Verify computation of the inverse of a real datasets multiplied by a scalar k. + def test_pixfun_inv_k(): - filename = 'data/vrt/pixfun_inv_k.vrt' + filename = "data/vrt/pixfun_inv_k.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/uint16.tif' + reffilename = "data/uint16.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") - k = 2. + k = 2.0 assert numpy.alltrue(data == k / refdata) ############################################################################### # Verify intensity computation of a complex dataset. + def test_pixfun_intensity_c(): - filename = 'data/vrt/pixfun_intensity_c.vrt' + filename = "data/vrt/pixfun_intensity_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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) @@ -712,16 +744,17 @@ def test_pixfun_intensity_c(): ############################################################################### # Verify intensity computation of real dataset. + def test_pixfun_intensity_r(): - filename = 'data/vrt/pixfun_intensity_r.vrt' + filename = "data/vrt/pixfun_intensity_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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) @@ -730,16 +763,17 @@ def test_pixfun_intensity_r(): ############################################################################### # Verify square root computation. + def test_pixfun_sqrt(): - filename = 'data/vrt/pixfun_sqrt.vrt' + filename = "data/vrt/pixfun_sqrt.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.sqrt(refdata)) @@ -748,16 +782,17 @@ def test_pixfun_sqrt(): ############################################################################### # Verify logarithm computation of real dataset. + def test_pixfun_log10_r(): - filename = 'data/vrt/pixfun_log10_r.vrt' + filename = "data/vrt/pixfun_log10_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, numpy.log10(refdata)) @@ -766,16 +801,17 @@ def test_pixfun_log10_r(): ############################################################################### # Verify logarithm computation of imag dataset. + def test_pixfun_log10_c(): - filename = 'data/vrt/pixfun_log10_c.vrt' + filename = "data/vrt/pixfun_log10_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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))) @@ -783,122 +819,130 @@ def test_pixfun_log10_c(): ############################################################################### # Verify amplitude to dB computation of real dataset. + def test_pixfun_dB_r(): - filename = 'data/vrt/pixfun_dB_r.vrt' + filename = "data/vrt/pixfun_dB_r.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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)) + assert numpy.allclose(data, 20.0 * numpy.log10(refdata)) ############################################################################### # Verify amplitude to dB computation of imag dataset. + def test_pixfun_dB_c(): - filename = 'data/vrt/pixfun_dB_c.vrt' + filename = "data/vrt/pixfun_dB_c.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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))) + assert numpy.allclose(data, 20.0 * numpy.log10(numpy.abs(refdata))) ############################################################################### # Verify amplitude to dB computation of real dataset. + def test_pixfun_dB_r_amplitude(): - filename = 'data/vrt/pixfun_dB_r_amplitude.vrt' + filename = "data/vrt/pixfun_dB_r_amplitude.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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)) + assert numpy.allclose(data, 20.0 * numpy.log10(refdata)) ############################################################################### # Verify amplitude to dB computation of imag dataset. + def test_pixfun_dB_c_amplitude(): - filename = 'data/vrt/pixfun_dB_c_amplitude.vrt' + filename = "data/vrt/pixfun_dB_c_amplitude.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % 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))) + assert numpy.allclose(data, 20.0 * numpy.log10(numpy.abs(refdata))) ############################################################################### # Verify intensity to dB computation of real dataset. + def test_pixfun_dB_r_intensity(): - filename = 'data/vrt/pixfun_dB_r_intensity.vrt' + filename = "data/vrt/pixfun_dB_r_intensity.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - assert numpy.allclose(data, 10. * numpy.log10(refdata)) + assert numpy.allclose(data, 10.0 * numpy.log10(refdata)) ############################################################################### # Verify intensity to dB computation of imag dataset. + def test_pixfun_dB_c_intensity(): - filename = 'data/vrt/pixfun_dB_c_intensity.vrt' + filename = "data/vrt/pixfun_dB_c_intensity.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/cint_sar.tif' + reffilename = "data/cint_sar.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - assert numpy.allclose(data, 10. * numpy.log10(numpy.abs(refdata))) + assert numpy.allclose(data, 10.0 * numpy.log10(numpy.abs(refdata))) + ############################################################################### # Verify the exp pixel function. + def test_pixfun_exp(): - filename = 'data/vrt/pixfun_exp.vrt' + filename = "data/vrt/pixfun_exp.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") assert numpy.allclose(data, numpy.exp(refdata)) @@ -906,92 +950,97 @@ def test_pixfun_exp(): ############################################################################### # Verify conversion from dB to amplitude using the exp pixel function. + def test_pixfun_exp_dB2amp(): - filename = 'data/vrt/pixfun_exp_dB2amp.vrt' + filename = "data/vrt/pixfun_exp_dB2amp.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - assert numpy.allclose(data, 10.**(refdata / 20.)) + assert numpy.allclose(data, 10.0 ** (refdata / 20.0)) ############################################################################### # Verify conversion from dB to power using the exp pixel function. + def test_pixfun_exp_dB2pow(): - filename = 'data/vrt/pixfun_exp_dB2pow.vrt' + filename = "data/vrt/pixfun_exp_dB2pow.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") - assert numpy.allclose(data, 10.**(refdata / 10.)) + assert numpy.allclose(data, 10.0 ** (refdata / 10.0)) ############################################################################### # Verify conversion from dB to amplitude. + def test_pixfun_dB2amp(): - filename = 'data/vrt/pixfun_dB2amp.vrt' + filename = "data/vrt/pixfun_dB2amp.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - assert numpy.allclose(data, 10.**(refdata / 20.)) + assert numpy.allclose(data, 10.0 ** (refdata / 20.0)) ############################################################################### # Verify conversion from dB to power. + def test_pixfun_dB2pow(): - filename = 'data/vrt/pixfun_dB2pow.vrt' + filename = "data/vrt/pixfun_dB2pow.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") - assert numpy.allclose(data, 10.**(refdata / 10.)) + assert numpy.allclose(data, 10.0 ** (refdata / 10.0)) ############################################################################### # Verify raising values to a power + def test_pixfun_pow(): - filename = 'data/vrt/pixfun_pow.vrt' + filename = "data/vrt/pixfun_pow.vrt" ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) - assert ds is not None, ('Unable to open "%s" dataset.' % filename) + assert ds is not None, 'Unable to open "%s" dataset.' % filename data = ds.GetRasterBand(1).ReadAsArray() - reffilename = 'data/float32.tif' + reffilename = "data/float32.tif" refds = gdal.Open(reffilename) - assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) + assert refds is not None, 'Unable to open "%s" dataset.' % reffilename refdata = refds.GetRasterBand(1).ReadAsArray() - refdata = refdata.astype('float64') + refdata = refdata.astype("float64") assert numpy.allclose(data, refdata**3.14) @@ -999,16 +1048,19 @@ def test_pixfun_pow(): ############################################################################### # Verify linear pixel interpolation + def interpolate_vrt(*, fname, bands, method, nx, ny, t0, dt, t): - vrtXml = """ + vrtXml = """ <VRTDataset rasterXSize="{nx}" rasterYSize="{ny}"> <VRTRasterBand dataType="Float32" band="1" subClass="VRTDerivedRasterBand"> <Description>Interpolated</Description> <PixelFunctionType>interpolate_{method}</PixelFunctionType> <PixelFunctionArguments t0="{t0}" dt="{dt}" t="{t}" /> - <SourceTransferType>Float32</SourceTransferType>""".format(nx=nx, ny=ny, t0=t0, dt=dt, t=t, method=method) + <SourceTransferType>Float32</SourceTransferType>""".format( + nx=nx, ny=ny, t0=t0, dt=dt, t=t, method=method + ) - for b in range(1, bands+1): + for b in range(1, bands + 1): vrtXml += """ <SimpleSource> <SourceFilename relativeToVRT="0">{fname}</SourceFilename> @@ -1016,7 +1068,9 @@ def interpolate_vrt(*, fname, bands, method, nx, ny, t0, dt, t): <SrcRect xOff="0" yOff="0" xSize="{nx}" ySize="{ny}"/> <DstRect xOff="0" yOff="0" xSize="{nx}" ySize="{ny}"/> </SimpleSource> - """.format(fname=fname, band=b, nx=nx, ny=ny) + """.format( + fname=fname, band=b, nx=nx, ny=ny + ) vrtXml += """ </VRTRasterBand> @@ -1028,7 +1082,7 @@ def interpolate_vrt(*, fname, bands, method, nx, ny, t0, dt, t): def test_pixfun_interpolate_linear(): - np = pytest.importorskip('numpy') + np = pytest.importorskip("numpy") x = np.array([[1, 2], [3, 4]]) @@ -1038,7 +1092,7 @@ def test_pixfun_interpolate_linear(): ny = x.shape[1] bands = len(layers) - drv = gdal.GetDriverByName('GTiff') + drv = gdal.GetDriverByName("GTiff") fname = "/vsimem/test.tif" ds = drv.Create(fname, xsize=nx, ysize=ny, bands=bands, eType=gdal.GDT_Float32) @@ -1048,41 +1102,92 @@ def test_pixfun_interpolate_linear(): ds = None # interpolate between bands 2 and 3 - ds = gdal.Open(interpolate_vrt(method='linear', fname=fname, nx=nx, ny=ny, bands=bands, t0=10, dt=5, t=17)) + ds = gdal.Open( + interpolate_vrt( + method="linear", fname=fname, nx=nx, ny=ny, bands=bands, t0=10, dt=5, t=17 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[1] + (17-15)*(layers[2]-layers[1])/5) - - ds = gdal.Open(interpolate_vrt(method='exp', fname=fname, nx=nx, ny=ny, bands=bands, t0=10, dt=5, t=17)) + assert np.allclose( + interpolated, layers[1] + (17 - 15) * (layers[2] - layers[1]) / 5 + ) + + ds = gdal.Open( + interpolate_vrt( + method="exp", fname=fname, nx=nx, ny=ny, bands=bands, t0=10, dt=5, t=17 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[1]*np.exp(np.log(layers[2]/layers[1])/5 * (17-15))) + assert np.allclose( + interpolated, layers[1] * np.exp(np.log(layers[2] / layers[1]) / 5 * (17 - 15)) + ) # extrapolate beyond band 3 - ds = gdal.Open(interpolate_vrt(method='linear', fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=38)) + ds = gdal.Open( + interpolate_vrt( + method="linear", fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=38 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[2] + (38-20)*(layers[2]-layers[1])/10) - - ds = gdal.Open(interpolate_vrt(method='linear', fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=28)) + assert np.allclose( + interpolated, layers[2] + (38 - 20) * (layers[2] - layers[1]) / 10 + ) + + ds = gdal.Open( + interpolate_vrt( + method="linear", fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=28 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[2] + (28-20)*(layers[2]-layers[1])/10) - - ds = gdal.Open(interpolate_vrt(method='exp', fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=38)) + assert np.allclose( + interpolated, layers[2] + (28 - 20) * (layers[2] - layers[1]) / 10 + ) + + ds = gdal.Open( + interpolate_vrt( + method="exp", fname=fname, nx=nx, ny=ny, bands=bands, t0=0, dt=10, t=38 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[2]*np.exp(np.log(layers[2]/layers[1])/10 * (38-20))) + assert np.allclose( + interpolated, layers[2] * np.exp(np.log(layers[2] / layers[1]) / 10 * (38 - 20)) + ) # extrapolate before band 1 - ds = gdal.Open(interpolate_vrt(method='linear', fname=fname, nx=nx, ny=ny, bands=bands, t0=-10, dt=1, t=-22.7)) + ds = gdal.Open( + interpolate_vrt( + method="linear", + fname=fname, + nx=nx, + ny=ny, + bands=bands, + t0=-10, + dt=1, + t=-22.7, + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[0] + (-22.7 - -10)*(layers[1]-layers[0])/1) - - ds = gdal.Open(interpolate_vrt(method='exp', fname=fname, nx=nx, ny=ny, bands=bands, t0=-10, dt=1, t=-22.7)) + assert np.allclose( + interpolated, layers[0] + (-22.7 - -10) * (layers[1] - layers[0]) / 1 + ) + + ds = gdal.Open( + interpolate_vrt( + method="exp", fname=fname, nx=nx, ny=ny, bands=bands, t0=-10, dt=1, t=-22.7 + ) + ) interpolated = ds.GetRasterBand(1).ReadAsArray() - assert np.allclose(interpolated, layers[0]*np.exp(np.log(layers[1]/layers[0])/1 * (-22.7 - -10))) + assert np.allclose( + interpolated, + layers[0] * np.exp(np.log(layers[1] / layers[0]) / 1 * (-22.7 - -10)), + ) def test_pixfun_nan(): - src_ds = gdal.Open('data/test_nodatavalues.tif') - vrt_ds = gdal.Open("""<VRTDataset rasterXSize="50" rasterYSize="50"> + src_ds = gdal.Open("data/test_nodatavalues.tif") + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="50" rasterYSize="50"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Nan</Description> <NoDataValue>0.0</NoDataValue> @@ -1093,14 +1198,15 @@ def test_pixfun_nan(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) data_src = src_ds.GetRasterBand(1).ReadAsArray(buf_type=gdal.GDT_Float32) data_vrt = vrt_ds.GetRasterBand(1).ReadAsArray(buf_type=gdal.GDT_Float32) NoData = src_ds.GetRasterBand(1).GetNoDataValue() for i in range(data_src.shape[0]): for j in range(data_src.shape[1]): - if (data_src[i][j] == NoData): + if data_src[i][j] == NoData: assert math.isnan(data_vrt[i][j]) else: assert data_vrt[i][j] == data_src[i][j] @@ -1108,8 +1214,9 @@ def test_pixfun_nan(): def test_pixfun_replacenodata(): - src_ds = gdal.Open('data/test_nodatavalues.tif') - vrt_ds = gdal.Open("""<VRTDataset rasterXSize="50" rasterYSize="50"> + src_ds = gdal.Open("data/test_nodatavalues.tif") + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="50" rasterYSize="50"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Nan</Description> <NoDataValue>0.0</NoDataValue> @@ -1121,22 +1228,24 @@ def test_pixfun_replacenodata(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) data_src = src_ds.GetRasterBand(1).ReadAsArray(buf_type=gdal.GDT_Float32) data_vrt = vrt_ds.GetRasterBand(1).ReadAsArray(buf_type=gdal.GDT_Float32) NoData = src_ds.GetRasterBand(1).GetNoDataValue() for i in range(data_src.shape[0]): for j in range(data_src.shape[1]): - if (data_src[i][j] == NoData): + if data_src[i][j] == NoData: assert data_vrt[i][j] == 42 else: assert data_vrt[i][j] == data_src[i][j] def test_pixfun_scale(): - src_ds = gdal.Open('data/float32.tif') - vrt_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + src_ds = gdal.Open("data/float32.tif") + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Scaling</Description> <PixelFunctionType>scale</PixelFunctionType> @@ -1148,7 +1257,8 @@ def test_pixfun_scale(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) band_src = src_ds.GetRasterBand(1) band_vrt = vrt_ds.GetRasterBand(1) @@ -1160,8 +1270,10 @@ def test_pixfun_scale(): assert numpy.allclose(data_src * 2 + 1, data_vrt) + def test_pixfun_missing_builtin(): - vrt_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>Scaling</Description> <PixelFunctionType>replace_nodata</PixelFunctionType> @@ -1171,14 +1283,15 @@ def test_pixfun_missing_builtin(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) band_vrt = vrt_ds.GetRasterBand(1) assert band_vrt.GetOffset() == 0 assert band_vrt.GetScale() == 1 assert band_vrt.GetNoDataValue() == None - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") data = band_vrt.ReadAsArray(buf_type=gdal.GDT_Float32) gdal.PopErrorHandler() assert data is None diff --git a/autotest/gcore/pnm_read.py b/autotest/gcore/pnm_read.py index fa2d5da240b6..fdbddaaff4f4 100755 --- a/autotest/gcore/pnm_read.py +++ b/autotest/gcore/pnm_read.py @@ -28,24 +28,21 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import pytest - import gdaltest +import pytest ############################################################################### # When imported build a list of units based on the files available. -init_list = [ - ('byte.pnm', 4672), - ('uint16.pnm', 4672)] +init_list = [("byte.pnm", 4672), ("uint16.pnm", 4672)] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('PNM') +@pytest.mark.require_driver("PNM") def test_pnm_open(filename, checksum): - ut = gdaltest.GDALTest('PNM', filename, 1, checksum) + ut = gdaltest.GDALTest("PNM", filename, 1, checksum) ut.testOpen() diff --git a/autotest/gcore/pnm_write.py b/autotest/gcore/pnm_write.py index 7431824a6476..0bc4a319ff65 100755 --- a/autotest/gcore/pnm_write.py +++ b/autotest/gcore/pnm_write.py @@ -25,27 +25,25 @@ # Boston, MA 02111-1307, USA. ############################################################################### -import pytest - import gdaltest +import pytest -init_list = [ - ('byte.tif', 4672), - ('uint16.tif', 4672)] +init_list = [("byte.tif", 4672), ("uint16.tif", 4672)] @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - ] + "testfunction", + [ + "testCreateCopy", + "testCreate", + ], ) -@pytest.mark.require_driver('PNM') +@pytest.mark.require_driver("PNM") def test_pnm_create(filename, checksum, testfunction): - ut = gdaltest.GDALTest('PNM', filename, 1, checksum) + ut = gdaltest.GDALTest("PNM", filename, 1, checksum) getattr(ut, testfunction)() diff --git a/autotest/gcore/rasterio.py b/autotest/gcore/rasterio.py index 48d1c22de801..670b9919864d 100755 --- a/autotest/gcore/rasterio.py +++ b/autotest/gcore/rasterio.py @@ -33,57 +33,78 @@ import struct import sys -from osgeo import gdal import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test writing a 1x1 buffer to a 10x6 raster and read it back def test_rasterio_1(): - data = 'A'.encode('ascii') + data = "A".encode("ascii") - drv = gdal.GetDriverByName('GTiff') - ds = drv.Create('tmp/rasterio1.tif', 10, 6, 1) + 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 ' + 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 ' + assert data2 == data, "Didnt get expected buffer " ds = None - drv.Delete('tmp/rasterio1.tif') + 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') + data = "AAAAAAAAAAAAAAAAAAAA".encode("ascii") - drv = gdal.GetDriverByName('GTiff') - ds = drv.Create('tmp/rasterio2.tif', 10, 6, 1) + 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 ' + 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 ' + assert data2 == data, "Didnt get expected buffer " ds = None - drv.Delete('tmp/rasterio2.tif') + drv.Delete("tmp/rasterio2.tif") + ############################################################################### # Test extensive read & writes into a non tiled raster @@ -91,15 +112,15 @@ def test_rasterio_2(): def test_rasterio_3(): - data = [['' for i in range(4)] for i in range(5)] + 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') + 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) + drv = gdal.GetDriverByName("GTiff") + ds = drv.Create("tmp/rasterio3.tif", 10, 6, 1) i = 0 while i < ds.RasterXSize: @@ -112,19 +133,30 @@ def test_rasterio_3(): 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 ' + 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') + drv.Delete("tmp/rasterio3.tif") + ############################################################################### # Test extensive read & writes into a tiled raster @@ -132,14 +164,20 @@ def test_rasterio_3(): def test_rasterio_4(): - data = ['' for i in range(5 * 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']) + 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: @@ -152,13 +190,22 @@ def test_rasterio_4(): 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) + 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 ') + pytest.fail("Didnt get expected buffer ") m = m + 1 k = k + 1 if j >= 15: @@ -171,7 +218,8 @@ def test_rasterio_4(): i = i + 3 ds = None - drv.Delete('tmp/rasterio4.tif') + drv.Delete("tmp/rasterio4.tif") + ############################################################################### # Test error cases of ReadRaster() @@ -179,7 +227,7 @@ def test_rasterio_4(): def test_rasterio_5(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") for obj in [ds, ds.GetRasterBand(1)]: obj.ReadRaster(0, 0, -2000000000, 1, 1, 1) @@ -187,26 +235,28 @@ def test_rasterio_5(): for band_number in [-1, 0, 2]: gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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' + 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' + assert res is not None, "expected non None" for obj in [ds, ds.GetRasterBand(1)]: gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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)' + 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: @@ -218,78 +268,86 @@ def test_rasterio_5(): # 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': + if maxsize == 2147483647 and sys.platform != "win32": gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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)' + 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') + 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)' + 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) + 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.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)' + 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.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)' + 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.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)' + 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') + ds = gdal.Open("data/byte.tif") data = ds.GetRasterBand(1).ReadRaster() - assert len(data) == 400, 'did not read expected band data via 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()' + assert len(data) == 400, "did not read expected dataset data via ReadRaster()" + ############################################################################### # Test callback of ReadRaster() @@ -298,7 +356,7 @@ def test_rasterio_7(): def rasterio_8_progress_callback(pct, message, user_data): # pylint: disable=unused-argument if pct != pytest.approx((user_data[0] + 0.05), abs=1e-5): - print('Expected %f, got %f' % (user_data[0] + 0.05, pct)) + 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 @@ -315,7 +373,7 @@ def rasterio_8_progress_interrupt_callback(pct, message, user_data): 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])) + 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 @@ -323,99 +381,118 @@ def rasterio_8_progress_callback_2(pct, message, user_data): def test_rasterio_8(): - ds = gdal.Open('data/byte.tif') + 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': + 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()' + 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 tab[0] == pytest.approx(1, abs=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) + 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()' + 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 tab[0] == pytest.approx(1, abs=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) + 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()' + 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 tab[0] == pytest.approx(1, abs=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) + 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()' + 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 tab[0] == pytest.approx(1, abs=1e-5) and tab[1] ds = None # Test Dataset.ReadRaster on a multi band file, with INTERLEAVE=BAND - ds = gdal.Open('data/rgbsmall.tif') + 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) + data = ds.ReadRaster( + resample_alg=gdal.GRIORA_NearestNeighbour, + callback=rasterio_8_progress_callback_2, + callback_data=last_pct, + ) assert not (data is None or last_pct[0] != pytest.approx(1.0, abs=1e-5)) # Same with interruption tab = [0] - data = ds.ReadRaster(callback=rasterio_8_progress_interrupt_callback, - callback_data=tab) + 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') + 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) + data = ds.ReadRaster( + resample_alg=gdal.GRIORA_NearestNeighbour, + callback=rasterio_8_progress_callback_2, + callback_data=last_pct, + ) assert not (data is None or last_pct[0] != pytest.approx(1.0, abs=1e-5)) # Same with interruption tab = [0] - data = ds.ReadRaster(callback=rasterio_8_progress_interrupt_callback, - callback_data=tab) + 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() @@ -423,7 +500,7 @@ def test_rasterio_8(): 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])) + 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]: @@ -432,25 +509,29 @@ def rasterio_9_progress_callback(pct, message, user_data): 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) + 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') + 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) + 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) + data_ar = struct.unpack("h" * 10 * 10, data) cs = rasterio_9_checksum(data, 10, 10, data_type=gdal.GDT_Int16) assert cs == 1211 @@ -458,21 +539,25 @@ def test_rasterio_9(): # 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) + 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) + 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 @@ -480,14 +565,16 @@ def test_rasterio_9(): assert tab[0] == pytest.approx(1.0, abs=1e-5) # Test RasterBand.ReadRaster, with Bilinear and UInt16 data type - src_ds_uint16 = gdal.Open('data/uint16.tif') + 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) + 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 @@ -496,13 +583,17 @@ def test_rasterio_9(): # 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) + 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 @@ -511,23 +602,27 @@ def test_rasterio_9(): # 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.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) + 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 @@ -536,11 +631,13 @@ def test_rasterio_9(): # 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) + 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 @@ -548,28 +645,30 @@ def test_rasterio_9(): assert tab[0] == pytest.approx(1.0, abs=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) + 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) + 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) + 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 @@ -578,11 +677,13 @@ def test_rasterio_9(): # 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) + 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 @@ -590,41 +691,46 @@ def test_rasterio_9(): assert tab[0] == pytest.approx(1.0, abs=1e-5) # Test Dataset.ReadRaster on a multi band file, with INTERLEAVE=PIXEL - ds = gdal.Open('data/rgbsmall_cmyk.tif') + 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) + 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) + 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) + cs = rasterio_9_checksum(data[25 * 25 : 2 * 25 * 25], 25, 25) assert cs == 6248 assert tab[0] == pytest.approx(1.0, abs=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') + 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) + 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 == 18981 assert tab[0] == pytest.approx(1.0, abs=1e-5) + ############################################################################### # Test error when getting a block def test_rasterio_10(): - ds = gdal.Open('data/byte_truncated.tif') + ds = gdal.Open("data/byte_truncated.tif") gdal.PushErrorHandler() data = ds.GetRasterBand(1).ReadRaster() @@ -639,64 +745,88 @@ def test_rasterio_10(): # Resampling case gdal.PushErrorHandler() - data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, - buf_ysize=10) + 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(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - 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]])) + 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) + 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) + 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])) + 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(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - mem_ds = gdal.GetDriverByName('MEM').Create('', 4, 3, 4) + 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]])) + 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) + 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) + 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)] + 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): @@ -708,22 +838,33 @@ def test_rasterio_12(): # 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(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") for dt in [gdal.GDT_Byte, gdal.GDT_UInt16, gdal.GDT_UInt32]: - mem_ds = gdal.GetDriverByName('MEM').Create('', 4, 3, 1, dt) + 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, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + ] + ) assert numpy.array_equal(ar_ds, expected_ar), (ar_ds, dt) @@ -733,8 +874,9 @@ def test_rasterio_13(): def test_rasterio_14(): - gdal.FileFromMemBuffer('/vsimem/rasterio_14.asc', - """ncols 6 + gdal.FileFromMemBuffer( + "/vsimem/rasterio_14.asc", + """ncols 6 nrows 6 xllcorner 0 yllcorner 0 @@ -744,33 +886,62 @@ def test_rasterio_14(): 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%') + 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) + 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) + 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) + 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) + 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 @@ -780,8 +951,9 @@ def test_rasterio_14(): def test_rasterio_average_4by4_to_3by3(): - gdal.FileFromMemBuffer('/vsimem/test_rasterio_average_4by4_to_3by3.asc', - """ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/test_rasterio_average_4by4_to_3by3.asc", + """ncols 4 nrows 4 xllcorner 0 yllcorner 0 @@ -789,15 +961,29 @@ def test_rasterio_average_4by4_to_3by3(): 1.0 5 9 13 2 6 10 14 3 7 11 15 - 4 8 12 16""") - - ds = gdal.Translate('', '/vsimem/test_rasterio_average_4by4_to_3by3.asc', options='-ot Float32 -f MEM -r average -outsize 3 3') + 4 8 12 16""", + ) + + ds = gdal.Translate( + "", + "/vsimem/test_rasterio_average_4by4_to_3by3.asc", + options="-ot Float32 -f MEM -r average -outsize 3 3", + ) data = ds.GetRasterBand(1).ReadRaster() - assert struct.unpack('f' * 9, data) == (2.25, 7.25, 12.25, - 3.5, 8.5, 13.5, - 4.75, 9.75, 14.75) + assert struct.unpack("f" * 9, data) == ( + 2.25, + 7.25, + 12.25, + 3.5, + 8.5, + 13.5, + 4.75, + 9.75, + 14.75, + ) + + gdal.Unlink("/vsimem/test_rasterio_average_4by4_to_3by3.asc") - gdal.Unlink('/vsimem/test_rasterio_average_4by4_to_3by3.asc') ############################################################################### # Test average oversampling by an integer factor (should behave like nearest) @@ -805,25 +991,36 @@ def test_rasterio_average_4by4_to_3by3(): def test_rasterio_15(): - gdal.FileFromMemBuffer('/vsimem/rasterio_15.asc', - """ncols 2 + 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%') +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%') + 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') + gdal.Unlink("/vsimem/rasterio_15.asc") + gdal.Unlink("/vsimem/rasterio_15_out.asc") + ############################################################################### # Test mode downsampling by a factor of 2 on exact boundaries @@ -831,8 +1028,9 @@ def test_rasterio_15(): def test_rasterio_16(): - gdal.FileFromMemBuffer('/vsimem/rasterio_16.asc', - """ncols 6 + gdal.FileFromMemBuffer( + "/vsimem/rasterio_16.asc", + """ncols 6 nrows 6 xllcorner 0 yllcorner 0 @@ -842,65 +1040,168 @@ def test_rasterio_16(): 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%') + 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') + gdal.Unlink("/vsimem/rasterio_16.asc") + gdal.Unlink("/vsimem/rasterio_16_out.asc") + ############################################################################### def test_rasterio_nodata(): - pytest.importorskip('numpy') + pytest.importorskip("numpy") ndv = 123 - btype = [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_Int32, gdal.GDT_Float32, gdal.GDT_Float64] + 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 = 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 ): + 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 ) + 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) + 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 + gdal.FileFromMemBuffer( + "/vsimem/in.asc", + """ncols 4 nrows 4 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 @@ -909,29 +1210,30 @@ def test_rasterio_resampled_value_is_nodata(): -1.1 -1.1 1.1 1.1 -1.1 -1.1 1.1 1.1 -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') + 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, ) + 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, ) + 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.Unlink("/vsimem/in.asc") - gdal.FileFromMemBuffer('/vsimem/in.asc', -"""ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/in.asc", + """ncols 4 nrows 4 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 @@ -940,32 +1242,32 @@ def test_rasterio_resampled_value_is_nodata(): -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') + 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, ) + 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, ) + 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') - + gdal.Unlink("/vsimem/in.asc") def test_rasterio_dataset_readarray_cint16(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2, gdal.GDT_CInt16) + 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() @@ -977,7 +1279,7 @@ def test_rasterio_dataset_readarray_cint16(): def test_rasterio_rasterband_write_on_readonly(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") band = ds.GetRasterBand(1) with gdaltest.error_handler(): err = band.WriteRaster(0, 0, 20, 20, band.ReadRaster()) @@ -986,54 +1288,88 @@ def test_rasterio_rasterband_write_on_readonly(): def test_rasterio_dataset_write_on_readonly(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): err = ds.WriteRaster(0, 0, 20, 20, ds.ReadRaster()) assert err != 0 -@pytest.mark.parametrize('resample_alg', [-1, 8, "foo"]) +@pytest.mark.parametrize("resample_alg", [-1, 8, "foo"]) def test_rasterio_dataset_invalid_resample_alg(resample_alg): - mem_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) + mem_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) with gdaltest.error_handler(): with pytest.raises(Exception): - assert mem_ds.ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) is None + assert ( + mem_ds.ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) + is None + ) with pytest.raises(Exception): - assert mem_ds.GetRasterBand(1).ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) is None + assert ( + mem_ds.GetRasterBand(1).ReadRaster( + buf_xsize=1, buf_ysize=1, resample_alg=resample_alg + ) + is None + ) with pytest.raises(Exception): - assert mem_ds.ReadAsArray(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) is None + assert ( + mem_ds.ReadAsArray(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) + is None + ) with pytest.raises(Exception): - assert mem_ds.GetRasterBand(1).ReadAsArray(buf_xsize=1, buf_ysize=1, resample_alg=resample_alg) is None + assert ( + mem_ds.GetRasterBand(1).ReadAsArray( + buf_xsize=1, buf_ysize=1, resample_alg=resample_alg + ) + is None + ) def test_rasterio_floating_point_window_no_resampling(): - """ Test fix for #3101 """ + """Test fix for #3101""" - ds = gdal.Translate('/vsimem/test.tif', gdal.Open('data/rgbsmall.tif'), options = '-co INTERLEAVE=PIXEL') - assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL' + ds = gdal.Translate( + "/vsimem/test.tif", + gdal.Open("data/rgbsmall.tif"), + options="-co INTERLEAVE=PIXEL", + ) + assert ds.GetMetadataItem("INTERLEAVE", "IMAGE_STRUCTURE") == "PIXEL" # Check that GDALDataset::IRasterIO() in block-based strategy behaves the # same as GDALRasterBand::IRasterIO() generic case (ie the one dealing # with floating-point window coordinates) - data_per_band = b''.join( ds.GetRasterBand(i+1).ReadRaster(0.1,0.2,10.4,11.4,10,11) for i in range(3) ) - data_per_dataset = ds.ReadRaster(0.1,0.2,10.4,11.4,10,11) + data_per_band = b"".join( + ds.GetRasterBand(i + 1).ReadRaster(0.1, 0.2, 10.4, 11.4, 10, 11) + for i in range(3) + ) + data_per_dataset = ds.ReadRaster(0.1, 0.2, 10.4, 11.4, 10, 11) ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") assert data_per_band == data_per_dataset def test_rasterio_floating_point_window_no_resampling_numpy(): # Same as above but using ReadAsArray() instead of ReadRaster() - numpy = pytest.importorskip('numpy') - - ds = gdal.Translate('/vsimem/test.tif', gdal.Open('data/rgbsmall.tif'), options = '-co INTERLEAVE=PIXEL') - assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL' - - data_per_band = numpy.stack([ds.GetRasterBand(i+1).ReadAsArray(0.1,0.2,10.4,11.4,buf_xsize=10,buf_ysize=11) for i in range(3)]) - data_per_dataset = ds.ReadAsArray(0.1,0.2,10.4,11.4,buf_xsize=10,buf_ysize=11) + numpy = pytest.importorskip("numpy") + + ds = gdal.Translate( + "/vsimem/test.tif", + gdal.Open("data/rgbsmall.tif"), + options="-co INTERLEAVE=PIXEL", + ) + assert ds.GetMetadataItem("INTERLEAVE", "IMAGE_STRUCTURE") == "PIXEL" + + data_per_band = numpy.stack( + [ + ds.GetRasterBand(i + 1).ReadAsArray( + 0.1, 0.2, 10.4, 11.4, buf_xsize=10, buf_ysize=11 + ) + for i in range(3) + ] + ) + data_per_dataset = ds.ReadAsArray(0.1, 0.2, 10.4, 11.4, buf_xsize=10, buf_ysize=11) ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") assert numpy.array_equal(data_per_band, data_per_dataset) @@ -1066,19 +1402,114 @@ def test_rasterio_average_halfsize_downsampling_byte(): v15 = 1 v16 = 1 m4 = (v13 + v14 + v15 + v16 + 2) >> 2 - ds = gdal.GetDriverByName('MEM').Create('', 18, 4, 1, gdal.GDT_Byte) - ds.WriteRaster(0, 0, 18, 4, - struct.pack('B' * 18 * 4, - v1, v2, v5, v6, v9, v10, v13, v14, v5, v6, v9, v10, v13, v14, v1, v2, v5, v6, - v3, v4, v7, v8, v11, v12, v15, v16, v7, v8, v11, v12, v15, v16, v3, v4, v7, v8, - v1, v2, v5, v6, v9, v10, v13, v14, v5, v6, v9, v10, v13, v14, v1, v2, v5, v6, - v3, v4, v7, v8, v11, v12, v15, v16, v7, v8, v11, v12, v15, v16, v3, v4, v7, v8)) + ds = gdal.GetDriverByName("MEM").Create("", 18, 4, 1, gdal.GDT_Byte) + ds.WriteRaster( + 0, + 0, + 18, + 4, + struct.pack( + "B" * 18 * 4, + v1, + v2, + v5, + v6, + v9, + v10, + v13, + v14, + v5, + v6, + v9, + v10, + v13, + v14, + v1, + v2, + v5, + v6, + v3, + v4, + v7, + v8, + v11, + v12, + v15, + v16, + v7, + v8, + v11, + v12, + v15, + v16, + v3, + v4, + v7, + v8, + v1, + v2, + v5, + v6, + v9, + v10, + v13, + v14, + v5, + v6, + v9, + v10, + v13, + v14, + v1, + v2, + v5, + v6, + v3, + v4, + v7, + v8, + v11, + v12, + v15, + v16, + v7, + v8, + v11, + v12, + v15, + v16, + v3, + v4, + v7, + v8, + ), + ) # Ask for at least 8 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 18, 4, 9, 2, resample_alg = gdal.GRIORA_Average) - assert struct.unpack('B' * 9 * 2, data) == (m1, m2, m3, m4, m2, m3, m4, m1, m2, - m1, m2, m3, m4, m2, m3, m4, m1, m2) - - ds.BuildOverviews('AVERAGE', [2]) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 18, 4, 9, 2, resample_alg=gdal.GRIORA_Average + ) + assert struct.unpack("B" * 9 * 2, data) == ( + m1, + m2, + m3, + m4, + m2, + m3, + m4, + m1, + m2, + m1, + m2, + m3, + m4, + m2, + m3, + m4, + m1, + m2, + ) + + ds.BuildOverviews("AVERAGE", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data @@ -1112,148 +1543,976 @@ def test_rasterio_average_halfsize_downsampling_uint16(): v15 = 1 v16 = 1 m4 = (v13 + v14 + v15 + v16 + 2) >> 2 - ds = gdal.GetDriverByName('MEM').Create('', 18, 4, 1, gdal.GDT_UInt16) - ds.WriteRaster(0, 0, 18, 4, - struct.pack('H' * 18 * 4, - v1, v2, v5, v6, v9, v10, v13, v14, v5, v6, v9, v10, v13, v14, v1, v2, v5, v6, - v3, v4, v7, v8, v11, v12, v15, v16, v7, v8, v11, v12, v15, v16, v3, v4, v7, v8, - v1, v2, v5, v6, v9, v10, v13, v14, v5, v6, v9, v10, v13, v14, v1, v2, v5, v6, - v3, v4, v7, v8, v11, v12, v15, v16, v7, v8, v11, v12, v15, v16, v3, v4, v7, v8)) # Ask for at least 8 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 18, 4, 9, 2, resample_alg = gdal.GRIORA_Average) - assert struct.unpack('H' * 9 * 2, data) == (m1, m2, m3, m4, m2, m3, m4, m1, m2, - m1, m2, m3, m4, m2, m3, m4, m1, m2) - - ds.BuildOverviews('AVERAGE', [2]) + ds = gdal.GetDriverByName("MEM").Create("", 18, 4, 1, gdal.GDT_UInt16) + ds.WriteRaster( + 0, + 0, + 18, + 4, + struct.pack( + "H" * 18 * 4, + v1, + v2, + v5, + v6, + v9, + v10, + v13, + v14, + v5, + v6, + v9, + v10, + v13, + v14, + v1, + v2, + v5, + v6, + v3, + v4, + v7, + v8, + v11, + v12, + v15, + v16, + v7, + v8, + v11, + v12, + v15, + v16, + v3, + v4, + v7, + v8, + v1, + v2, + v5, + v6, + v9, + v10, + v13, + v14, + v5, + v6, + v9, + v10, + v13, + v14, + v1, + v2, + v5, + v6, + v3, + v4, + v7, + v8, + v11, + v12, + v15, + v16, + v7, + v8, + v11, + v12, + v15, + v16, + v3, + v4, + v7, + v8, + ), + ) # Ask for at least 8 output pixels in width to trigger SSE2 optim + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 18, 4, 9, 2, resample_alg=gdal.GRIORA_Average + ) + assert struct.unpack("H" * 9 * 2, data) == ( + m1, + m2, + m3, + m4, + m2, + m3, + m4, + m1, + m2, + m1, + m2, + m3, + m4, + m2, + m3, + m4, + m1, + m2, + ) + + ds.BuildOverviews("AVERAGE", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + ############################################################################### # Test average downsampling by a factor of 2 on exact boundaries, with float32 data type def test_rasterio_average_halfsize_downsampling_float32(): - ds = gdal.GetDriverByName('MEM').Create('', 18, 4, 1, gdal.GDT_Float32) - ds.WriteRaster(0, 0, 18, 4, - struct.pack('f' * 18 * 4, - 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, - 2, 65535, 0, 0, 65535, 65535, 2, 65535, 0, 0, 65535, 65535, 2, 65535, 0, 0, 65535, 65535, - 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, - 0, 65535, 0, 0, 0, 0, 0, 65535, 0, 0, 0, 0, 0, 65535, 0, 0, 0, 0)) + ds = gdal.GetDriverByName("MEM").Create("", 18, 4, 1, gdal.GDT_Float32) + ds.WriteRaster( + 0, + 0, + 18, + 4, + struct.pack( + "f" * 18 * 4, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + ), + ) # Ask for at least 8 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 18, 4, 9, 2, resample_alg = gdal.GRIORA_Average) - assert struct.unpack('f' * 18, data) == pytest.approx( - (16384.25, 0.0, 65535.0, 16384.25, 0.0, 65535.0, 16384.25, 0.0, 65535.0, - 49151.25, 0.0, 0.0, 49151.25, 0.0, 0.0, 49151.25, 0.0, 0.0), rel=1e-10) - - ds.BuildOverviews('AVERAGE', [2]) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 18, 4, 9, 2, resample_alg=gdal.GRIORA_Average + ) + assert struct.unpack("f" * 18, data) == pytest.approx( + ( + 16384.25, + 0.0, + 65535.0, + 16384.25, + 0.0, + 65535.0, + 16384.25, + 0.0, + 65535.0, + 49151.25, + 0.0, + 0.0, + 49151.25, + 0.0, + 0.0, + 49151.25, + 0.0, + 0.0, + ), + rel=1e-10, + ) + + ds.BuildOverviews("AVERAGE", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with float data type def test_rasterio_rms_halfsize_downsampling_float32(): - inf = float('inf') - nan = float('nan') - - ds = gdal.GetDriverByName('MEM').Create('', 18, 4, 1, gdal.GDT_Float32) - ds.WriteRaster(0, 0, 18, 4, - struct.pack('f' * 18 * 4, - 0, 0, nan, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 1e-38, 1e-38, 65535, 65535, - 2, 65535, 0, 0, 65535, 65535, 2, 65535, 0, 0, 65535, 65535, 2, 65535, 1e-38, 1e-38, 65535, 65535, - 1e38, -1e38, 0, inf, 1e-20, 1e-20, -65535, -65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 1e38, -1e38, - 1e38, 1e38, 0, 0, 1e-20, 1e-20, 0, -65535, 0, 0, 0, 0, 0, 65535, 0, 0, 1e38, 1e38)) + inf = float("inf") + nan = float("nan") + + ds = gdal.GetDriverByName("MEM").Create("", 18, 4, 1, gdal.GDT_Float32) + ds.WriteRaster( + 0, + 0, + 18, + 4, + struct.pack( + "f" * 18 * 4, + 0, + 0, + nan, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 1e-38, + 1e-38, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 1e-38, + 1e-38, + 65535, + 65535, + 1e38, + -1e38, + 0, + inf, + 1e-20, + 1e-20, + -65535, + -65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 1e38, + -1e38, + 1e38, + 1e38, + 0, + 0, + 1e-20, + 1e-20, + 0, + -65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 1e38, + 1e38, + ), + ) # Ask for at least 8 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 18, 4, 9, 2, resample_alg = gdal.GRIORA_RMS) - got = struct.unpack('f' * 18, data) - #print(got) - expected = (32767.5, nan, 65535, 32767.5, 0, 65535, 32767.5, 1e-38, 65535, - 1e38, inf, 1e-20, 56754.974837013186, 0, 0, 56754.974837013186, 0, 1e38) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 18, 4, 9, 2, resample_alg=gdal.GRIORA_RMS + ) + got = struct.unpack("f" * 18, data) + # print(got) + expected = ( + 32767.5, + nan, + 65535, + 32767.5, + 0, + 65535, + 32767.5, + 1e-38, + 65535, + 1e38, + inf, + 1e-20, + 56754.974837013186, + 0, + 0, + 56754.974837013186, + 0, + 1e38, + ) for i in range(len(got)): if math.isnan(expected[i]): assert math.isnan(got[i]) else: assert got[i] == pytest.approx(expected[i], rel=1e-7), i - ds.BuildOverviews('RMS', [2]) + ds.BuildOverviews("RMS", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with byte data type + def internal_test_rasterio_rms_halfsize_downsampling_byte_content(gdal_dt, struct_type): - ds = gdal.GetDriverByName('MEM').Create('', 38, 6, 1, gdal_dt) - ds.WriteRaster(0, 0, 38, 6, - struct.pack(struct_type * 38 * 6, - 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, - 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 2, 100, - 100, 100, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 100, 100, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 100, 100, - 0, 100, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 100, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 100, - 188, 229, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 188, 229, - 233, 233, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 233, 233 )) + ds = gdal.GetDriverByName("MEM").Create("", 38, 6, 1, gdal_dt) + ds.WriteRaster( + 0, + 0, + 38, + 6, + struct.pack( + struct_type * 38 * 6, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 2, + 100, + 100, + 100, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 100, + 100, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 100, + 100, + 0, + 100, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 100, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 100, + 188, + 229, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 188, + 229, + 233, + 233, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 233, + 233, + ), + ) # Make sure to request at least 16 pixels in width to test the SSE2 implementation - data = ds.GetRasterBand(1).ReadRaster(0, 0, 38, 6, 19, 3, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack(struct_type * 19 * 3, data) == \ - (50, 0, 0, 50, 50, 0, 0, 50, 50, 50, 0, 0, 50, 50, 0, 0, 50, 50, 50, - 87, 1, 1, 0, 0, 1, 1, 0, 0, 87, 1, 1, 0, 0, 1, 1, 0, 0, 87, - 222,0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 222) - - ds.BuildOverviews('RMS', [2]) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 38, 6, 19, 3, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack(struct_type * 19 * 3, data) == ( + 50, + 0, + 0, + 50, + 50, + 0, + 0, + 50, + 50, + 50, + 0, + 0, + 50, + 50, + 0, + 0, + 50, + 50, + 50, + 87, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 87, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 87, + 222, + 0, + 255, + 0, + 0, + 0, + 255, + 0, + 0, + 0, + 0, + 255, + 0, + 0, + 0, + 255, + 0, + 0, + 222, + ) + + ds.BuildOverviews("RMS", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + def test_rasterio_rms_halfsize_downsampling_byte(): - internal_test_rasterio_rms_halfsize_downsampling_byte_content(gdal.GDT_Byte, 'B') + internal_test_rasterio_rms_halfsize_downsampling_byte_content(gdal.GDT_Byte, "B") + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with byte data type # and nodata never hit + def test_rasterio_rms_halfsize_downsampling_byte_nodata_not_hit(): - ds = gdal.GetDriverByName('MEM').Create('', 20, 6, 1, gdal.GDT_Byte) + ds = gdal.GetDriverByName("MEM").Create("", 20, 6, 1, gdal.GDT_Byte) ds.GetRasterBand(1).SetNoDataValue(180) - ds.WriteRaster(0, 0, 20, 6, - struct.pack('B' * 20 * 6, - 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, - 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 0, 0, 0, 0, 2, 100, 2, 100, 2, 100, - 100, 100, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 100, 100, - 0, 100, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 100, - 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0)) + ds.WriteRaster( + 0, + 0, + 20, + 6, + struct.pack( + "B" * 20 * 6, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 0, + 0, + 0, + 0, + 2, + 100, + 2, + 100, + 2, + 100, + 100, + 100, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 100, + 100, + 0, + 100, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + ), + ) # Make sure to request at least 8 pixels in width to test the SSE2 implementation - data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 6, 10, 3, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('B' * 30, data) == (50, 0, 0, 50, 50, 0, 0, 50, 50, 50, - 87, 1, 1, 0, 0, 1, 1, 0, 0, 87, - 0, 0, 255, 0, 0, 0, 255, 0, 0, 0) - - ds.BuildOverviews('RMS', [2]) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 20, 6, 10, 3, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("B" * 30, data) == ( + 50, + 0, + 0, + 50, + 50, + 0, + 0, + 50, + 50, + 50, + 87, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 87, + 0, + 0, + 255, + 0, + 0, + 0, + 255, + 0, + 0, + 0, + ) + + ds.BuildOverviews("RMS", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with uint16 data type def test_rasterio_rms_halfsize_downsampling_uint16(): - ds = gdal.GetDriverByName('MEM').Create('', 18, 4, 1, gdal.GDT_UInt16) - ds.WriteRaster(0, 0, 18, 4, - struct.pack('H' * 18 * 4, - 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, - 2, 65535, 0, 0, 65535, 65535, 2, 65535, 0, 0, 65535, 65535, 2, 65535, 0, 0, 65535, 65535, - 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, - 0, 65535, 0, 0, 0, 0, 0, 65535, 0, 0, 0, 0, 0, 65535, 0, 0, 0, 0)) + ds = gdal.GetDriverByName("MEM").Create("", 18, 4, 1, gdal.GDT_UInt16) + ds.WriteRaster( + 0, + 0, + 18, + 4, + struct.pack( + "H" * 18 * 4, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 2, + 65535, + 0, + 0, + 65535, + 65535, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 65535, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + 0, + 65535, + 0, + 0, + 0, + 0, + ), + ) # Ask for at least 4 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 18, 4, 9, 2, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('H' * 18, data) == (32768, 0, 65535, 32768, 0, 65535, 32768, 0, 65535, - 56755, 0, 0, 56755, 0, 0, 56755, 0, 0) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 18, 4, 9, 2, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("H" * 18, data) == ( + 32768, + 0, + 65535, + 32768, + 0, + 65535, + 32768, + 0, + 65535, + 56755, + 0, + 0, + 56755, + 0, + 0, + 56755, + 0, + 0, + ) ############################################################################### @@ -1263,26 +2522,64 @@ def test_rasterio_rms_halfsize_downsampling_uint16(): def test_rasterio_rms_halfsize_downsampling_uint16_fits_in_14bits(): - ds = gdal.GetDriverByName('MEM').Create('', 8, 4, 1, gdal.GDT_UInt16) - ds.WriteRaster(0, 0, 8, 4, - struct.pack('H' * 8 * 4, - 10, 9, 16383, 16383, 1, 0, 16380, 16380, - 10, 10, 16383, 16383, 1, 1, 16378, 16380, - 10, 9, 16383, 16383, 1, 0, 16380, 16380, - 10, 10, 16383, 16383, 1, 1, 16378, 16380)) + ds = gdal.GetDriverByName("MEM").Create("", 8, 4, 1, gdal.GDT_UInt16) + ds.WriteRaster( + 0, + 0, + 8, + 4, + struct.pack( + "H" * 8 * 4, + 10, + 9, + 16383, + 16383, + 1, + 0, + 16380, + 16380, + 10, + 10, + 16383, + 16383, + 1, + 1, + 16378, + 16380, + 10, + 9, + 16383, + 16383, + 1, + 0, + 16380, + 16380, + 10, + 10, + 16383, + 16383, + 1, + 1, + 16378, + 16380, + ), + ) # Ask for at least 4 output pixels in width to trigger SSE2 optim - data = ds.GetRasterBand(1).ReadRaster(0, 0, 8, 4, 4, 2, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('H' * 8, data) == (10, 16383, 1, 16380, - 10, 16383, 1, 16380) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 8, 4, 4, 2, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("H" * 8, data) == (10, 16383, 1, 16380, 10, 16383, 1, 16380) + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with uint16 data type # but with content as in test_rasterio_rms_halfsize_downsampling_byte to # check UInt16 resampling is consistent with Byte one + def test_rasterio_rms_halfsize_downsampling_uint16_with_byte_content(): - internal_test_rasterio_rms_halfsize_downsampling_byte_content(gdal.GDT_UInt16, 'H') + internal_test_rasterio_rms_halfsize_downsampling_byte_content(gdal.GDT_UInt16, "H") ############################################################################### @@ -1291,21 +2588,77 @@ def test_rasterio_rms_halfsize_downsampling_uint16_with_byte_content(): def test_rasterio_rms_two_third_downsampling_float32(): - ds = gdal.GetDriverByName('MEM').Create('', 6, 6, 1, gdal.GDT_Float32) - ds.WriteRaster(0, 0, 6, 6, - struct.pack('f' * 6 * 6, - 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)) - data = ds.GetRasterBand(1).ReadRaster(0, 0, 6, 6, 4, 4, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('f' * 16, data) == pytest.approx( - (33.34666442871094, 33.33333206176758, 0.0, 0.0, - 88.19674682617188, 57.73502731323242, 0.0, 0.0, - 47.14045333862305, 47.14045333862305, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0), rel=1e-10) + ds = gdal.GetDriverByName("MEM").Create("", 6, 6, 1, gdal.GDT_Float32) + ds.WriteRaster( + 0, + 0, + 6, + 6, + struct.pack( + "f" * 6 * 6, + 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, + ), + ) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 6, 6, 4, 4, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("f" * 16, data) == pytest.approx( + ( + 33.34666442871094, + 33.33333206176758, + 0.0, + 0.0, + 88.19674682617188, + 57.73502731323242, + 0.0, + 0.0, + 47.14045333862305, + 47.14045333862305, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ), + rel=1e-10, + ) + ############################################################################### # Test rms downsampling by a factor of 2 on exact boundaries, with CFloat32 @@ -1314,107 +2667,237 @@ def test_rasterio_rms_two_third_downsampling_float32(): def test_rasterio_rms_halfsize_downsampling_cfloat32(): # Test real part - ds = gdal.GetDriverByName('MEM').Create('', 4, 6, 1, gdal.GDT_CFloat32) - ds.WriteRaster(0, 0, 4, 6, - struct.pack('f' * 2 * 4 * 6, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 100, 0, 0, 0, 0, 0, - 100, 0, 100, 0, 0, 0, 0, 0, - 0, 0, 100, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0)) + ds = gdal.GetDriverByName("MEM").Create("", 4, 6, 1, gdal.GDT_CFloat32) + ds.WriteRaster( + 0, + 0, + 4, + 6, + struct.pack( + "f" * 2 * 4 * 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ), + ) # This will go through the warping code internally - data = ds.GetRasterBand(1).ReadRaster(0, 0, 4, 6, 2, 3, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('f' * 2 * 2 * 3, data) == pytest.approx( - (50.0099983215332, 0., 0., 0., - 86.6025390625, 0., 0., 0., - 0., 0., 0., 0.), rel = 1e-10) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 4, 6, 2, 3, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("f" * 2 * 2 * 3, data) == pytest.approx( + ( + 50.0099983215332, + 0.0, + 0.0, + 0.0, + 86.6025390625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ), + rel=1e-10, + ) # This will use the overview code - ds.BuildOverviews('RMS', [2]) + ds.BuildOverviews("RMS", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data - # Test imaginary part - ds = gdal.GetDriverByName('MEM').Create('', 4, 6, 1, gdal.GDT_CFloat32) - ds.WriteRaster(0, 0, 4, 6, - struct.pack('f' * 2 * 4 * 6, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 100, 0, 0, 0, 0, - 0, 100, 0, 100, 0, 0, 0, 0, - 0, 0, 0, 100, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0)) + ds = gdal.GetDriverByName("MEM").Create("", 4, 6, 1, gdal.GDT_CFloat32) + ds.WriteRaster( + 0, + 0, + 4, + 6, + struct.pack( + "f" * 2 * 4 * 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ), + ) # This will go through the warping code internally - data = ds.GetRasterBand(1).ReadRaster(0, 0, 4, 6, 2, 3, resample_alg = gdal.GRIORA_RMS) - assert struct.unpack('f' * 2 * 2 * 3, data) == pytest.approx( - (0.0, 50.0099983215332, 0., 0., - 0.0, 86.6025390625, 0., 0., - 0.0, 0., 0., 0.), rel = 1e-10) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 4, 6, 2, 3, resample_alg=gdal.GRIORA_RMS + ) + assert struct.unpack("f" * 2 * 2 * 3, data) == pytest.approx( + ( + 0.0, + 50.0099983215332, + 0.0, + 0.0, + 0.0, + 86.6025390625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ), + rel=1e-10, + ) # This will use the overview code - ds.BuildOverviews('RMS', [2]) + ds.BuildOverviews("RMS", [2]) ovr_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster() assert ovr_data == data + ############################################################################### # Test WriteRaster() on a bytearray def test_rasterio_writeraster_from_bytearray(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 2) ar = bytearray([1, 2]) ds.WriteRaster(0, 0, 1, 2, ar) assert ds.ReadRaster() == ar + ############################################################################### # Test WriteRaster() on a memoryview def test_rasterio_writeraster_from_memoryview(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 2) ar = memoryview(bytearray([1, 2, 3]))[1:] ds.WriteRaster(0, 0, 1, 2, ar) assert ds.ReadRaster() == ar + ############################################################################### # Test ReadRaster() in an existing buffer def test_rasterio_readraster_in_existing_buffer(): - ds = gdal.GetDriverByName('MEM').Create('', 2, 1) + ds = gdal.GetDriverByName("MEM").Create("", 2, 1) ar = bytearray([1, 2]) ds.WriteRaster(0, 0, 2, 1, ar) band = ds.GetRasterBand(1) # buf_obj is of expected size - assert ds.ReadRaster(buf_obj = bytearray([0, 0])) == ar + assert ds.ReadRaster(buf_obj=bytearray([0, 0])) == ar # buf_obj is larger than expected - assert ds.ReadRaster(buf_obj = bytearray([0, 0, 10])) == bytearray([1, 2, 10]) + assert ds.ReadRaster(buf_obj=bytearray([0, 0, 10])) == bytearray([1, 2, 10]) with gdaltest.error_handler(): - # buf_obj is a wrong object type - assert ds.ReadRaster(buf_obj = 123) is None - # buf_obj is not large enough - assert ds.ReadRaster(buf_obj = bytearray([0])) is None - # buf_obj is read-only - assert ds.ReadRaster(buf_obj = bytes(bytearray([0, 0]))) is None - + # buf_obj is a wrong object type + assert ds.ReadRaster(buf_obj=123) is None + # buf_obj is not large enough + assert ds.ReadRaster(buf_obj=bytearray([0])) is None + # buf_obj is read-only + assert ds.ReadRaster(buf_obj=bytes(bytearray([0, 0]))) is None # buf_obj is of expected size - assert band.ReadRaster(buf_obj = bytearray([0, 0])) == ar + assert band.ReadRaster(buf_obj=bytearray([0, 0])) == ar # buf_obj is larger than expected - assert band.ReadRaster(buf_obj = bytearray([0, 0, 10])) == bytearray([1, 2, 10]) + assert band.ReadRaster(buf_obj=bytearray([0, 0, 10])) == bytearray([1, 2, 10]) with gdaltest.error_handler(): - # buf_obj is a wrong object type - assert band.ReadRaster(buf_obj = 123) is None - # buf_obj is not large enough - assert band.ReadRaster(buf_obj = bytearray([0])) is None - # buf_obj is read-only - assert band.ReadRaster(buf_obj = bytes(bytearray([0, 0]))) is None + # buf_obj is a wrong object type + assert band.ReadRaster(buf_obj=123) is None + # buf_obj is not large enough + assert band.ReadRaster(buf_obj=bytearray([0])) is None + # buf_obj is read-only + assert band.ReadRaster(buf_obj=bytes(bytearray([0, 0]))) is None + ############################################################################### # Test ReadBlock() in an existing buffer @@ -1422,7 +2905,7 @@ def test_rasterio_readraster_in_existing_buffer(): def test_rasterio_readblock_in_existing_buffer(): - ds = gdal.GetDriverByName('MEM').Create('', 2, 1) + ds = gdal.GetDriverByName("MEM").Create("", 2, 1) ar = bytearray([1, 2]) ds.WriteRaster(0, 0, 2, 1, ar) band = ds.GetRasterBand(1) @@ -1430,57 +2913,72 @@ def test_rasterio_readblock_in_existing_buffer(): assert band.ReadBlock(0, 0) == ar # buf_obj is of expected size - assert band.ReadBlock(0, 0, buf_obj = bytearray([0, 0])) == ar + assert band.ReadBlock(0, 0, buf_obj=bytearray([0, 0])) == ar # buf_obj is larger than expected - assert band.ReadBlock(0, 0, buf_obj = bytearray([0, 0, 10])) == bytearray([1, 2, 10]) + assert band.ReadBlock(0, 0, buf_obj=bytearray([0, 0, 10])) == bytearray([1, 2, 10]) with gdaltest.error_handler(): - # buf_obj is a wrong object type - assert band.ReadBlock(0, 0, buf_obj = 123) is None - # buf_obj is not large enough - assert band.ReadBlock(0, 0, buf_obj = bytearray([0])) is None - # buf_obj is read-only - assert band.ReadBlock(0, 0, buf_obj = bytes(bytearray([0, 0]))) is None + # buf_obj is a wrong object type + assert band.ReadBlock(0, 0, buf_obj=123) is None + # buf_obj is not large enough + assert band.ReadBlock(0, 0, buf_obj=bytearray([0])) is None + # buf_obj is read-only + assert band.ReadBlock(0, 0, buf_obj=bytes(bytearray([0, 0]))) is None + ############################################################################### # Test ReadRaster() in an existing buffer and alignment issues -@pytest.mark.parametrize('datatype', [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], - ids=gdal.GetDataTypeName) +@pytest.mark.parametrize( + "datatype", + [ + 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, + ], + ids=gdal.GetDataTypeName, +) def test_rasterio_readraster_in_existing_buffer_alignment_issues(datatype): - ds = gdal.GetDriverByName('MEM').Create('', 2, 1, 1, datatype) + ds = gdal.GetDriverByName("MEM").Create("", 2, 1, 1, datatype) band = ds.GetRasterBand(1) band.Fill(1) ar = band.ReadRaster() buffer_size = 2 * 1 * (gdal.GetDataTypeSize(datatype) // 8) # buf_obj has appropriate alignment - assert ds.ReadRaster(buf_obj = bytearray([0] * buffer_size)) == ar + assert ds.ReadRaster(buf_obj=bytearray([0] * buffer_size)) == ar with gdaltest.error_handler(): # buf_obj has not appropriate alignment - assert ds.ReadRaster(buf_obj = memoryview(bytearray([0] * (buffer_size + 1)))[1:]) is None + assert ( + ds.ReadRaster(buf_obj=memoryview(bytearray([0] * (buffer_size + 1)))[1:]) + is None + ) # buf_obj has appropriate alignment - assert band.ReadRaster(buf_obj = bytearray([0] * buffer_size)) == ar + assert band.ReadRaster(buf_obj=bytearray([0] * buffer_size)) == ar with gdaltest.error_handler(): # buf_obj has not appropriate alignment - assert band.ReadRaster(buf_obj = memoryview(bytearray([0] * (buffer_size + 1)))[1:]) is None + assert ( + band.ReadRaster(buf_obj=memoryview(bytearray([0] * (buffer_size + 1)))[1:]) + is None + ) # buf_obj has appropriate alignment - assert band.ReadBlock(0, 0, buf_obj = bytearray([0] * buffer_size)) == ar + assert band.ReadBlock(0, 0, buf_obj=bytearray([0] * buffer_size)) == ar with gdaltest.error_handler(): # buf_obj has not appropriate alignment - assert band.ReadBlock(0, 0, buf_obj = memoryview(bytearray([0] * (2 * 8 + 1)))[1:]) is None + assert ( + band.ReadBlock(0, 0, buf_obj=memoryview(bytearray([0] * (2 * 8 + 1)))[1:]) + is None + ) diff --git a/autotest/gcore/rat.py b/autotest/gcore/rat.py index d5b9f6d451aa..adaa228ea0f3 100755 --- a/autotest/gcore/rat.py +++ b/autotest/gcore/rat.py @@ -32,9 +32,10 @@ import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### # Create a raster attribute table. @@ -48,8 +49,8 @@ def test_rat_1(): except: pytest.skip() - rat.CreateColumn('Value', gdal.GFT_Integer, gdal.GFU_MinMax) - rat.CreateColumn('Count', gdal.GFT_Integer, gdal.GFU_PixelCount) + 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) @@ -61,22 +62,23 @@ def test_rat_1(): rat2 = rat.Clone() - assert rat2.GetColumnCount() == 2, 'wrong column count' + assert rat2.GetColumnCount() == 2, "wrong column count" - assert rat2.GetRowCount() == 3, 'wrong row count' + assert rat2.GetRowCount() == 3, "wrong row count" - assert rat2.GetNameOfCol(1) == 'Count', 'wrong column name' + assert rat2.GetNameOfCol(1) == "Count", "wrong column name" - assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'wrong column usage' + assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, "wrong column usage" - assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, 'wrong column type' + assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, "wrong column type" - assert rat2.GetRowOfValue(11.0) == 1, 'wrong row for value' + assert rat2.GetRowOfValue(11.0) == 1, "wrong row for value" - assert rat2.GetValueAsInt(1, 1) == 200, 'wrong field 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. @@ -86,54 +88,55 @@ 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 = 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) + ds = gdal.Open("tmp/rat_2.pnm", gdal.GA_Update) rat2 = ds.GetRasterBand(1).GetDefaultRAT() - assert rat2.GetColumnCount() == 2, 'wrong column count' + assert rat2.GetColumnCount() == 2, "wrong column count" - assert rat2.GetRowCount() == 3, 'wrong row count' + assert rat2.GetRowCount() == 3, "wrong row count" - assert rat2.GetNameOfCol(1) == 'Count', 'wrong column name' + assert rat2.GetNameOfCol(1) == "Count", "wrong column name" - assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'wrong column usage' + assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, "wrong column usage" - assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, 'wrong column type' + assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, "wrong column type" - assert rat2.GetRowOfValue(11.0) == 1, 'wrong row for value' + assert rat2.GetRowOfValue(11.0) == 1, "wrong row for value" - assert rat2.GetValueAsInt(1, 1) == 200, 'wrong field 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') + ds = gdal.Open("tmp/rat_2.pnm") rat = ds.GetRasterBand(1).GetDefaultRAT() ds = None - assert rat is None, 'expected a NULL RAT.' + assert rat is None, "expected a NULL RAT." - gdal.GetDriverByName('PNM').Delete('tmp/rat_2.pnm') + 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 = 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/rat_3.tif") + ############################################################################### # Edit an existing RAT (#3783) @@ -142,17 +145,17 @@ def test_rat_3(): def test_rat_4(): # Create test RAT - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/rat_4.tif', 1, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/rat_4.tif", 1, 1) rat = gdal.RasterAttributeTable() - rat.CreateColumn('VALUE', gdal.GFT_Integer, gdal.GFU_MinMax) - rat.CreateColumn('CLASS', gdal.GFT_String, gdal.GFU_Name) + rat.CreateColumn("VALUE", gdal.GFT_Integer, gdal.GFU_MinMax) + rat.CreateColumn("CLASS", gdal.GFT_String, gdal.GFU_Name) rat.SetValueAsInt(0, 0, 111) - rat.SetValueAsString(0, 1, 'Class1') + rat.SetValueAsString(0, 1, "Class1") ds.GetRasterBand(1).SetDefaultRAT(rat) ds = None # Verify - ds = gdal.OpenEx('/vsimem/rat_4.tif') + ds = gdal.OpenEx("/vsimem/rat_4.tif") gdal_band = ds.GetRasterBand(1) rat = gdal_band.GetDefaultRAT() assert rat.GetValueAsInt(0, 0) == 111 @@ -160,23 +163,24 @@ def test_rat_4(): # Replace existing RAT rat = gdal.RasterAttributeTable() - rat.CreateColumn('VALUE', gdal.GFT_Integer, gdal.GFU_MinMax) - rat.CreateColumn('CLASS', gdal.GFT_String, gdal.GFU_Name) + rat.CreateColumn("VALUE", gdal.GFT_Integer, gdal.GFU_MinMax) + rat.CreateColumn("CLASS", gdal.GFT_String, gdal.GFU_Name) rat.SetValueAsInt(0, 0, 222) - rat.SetValueAsString(0, 1, 'Class1') - ds = gdal.OpenEx('/vsimem/rat_4.tif', gdal.OF_RASTER | gdal.OF_UPDATE) + rat.SetValueAsString(0, 1, "Class1") + ds = gdal.OpenEx("/vsimem/rat_4.tif", gdal.OF_RASTER | gdal.OF_UPDATE) gdal_band = ds.GetRasterBand(1) gdal_band.SetDefaultRAT(rat) ds = None # Verify - ds = gdal.OpenEx('/vsimem/rat_4.tif') + ds = gdal.OpenEx("/vsimem/rat_4.tif") gdal_band = ds.GetRasterBand(1) rat = gdal_band.GetDefaultRAT() assert rat is not None assert rat.GetValueAsInt(0, 0) == 222 ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/rat_4.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/rat_4.tif") + ############################################################################## diff --git a/autotest/gcore/relationship.py b/autotest/gcore/relationship.py index 571ca9931b2e..60d32f24085e 100755 --- a/autotest/gcore/relationship.py +++ b/autotest/gcore/relationship.py @@ -28,57 +28,61 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import pytest +from osgeo import gdal + def test_gdal_relationship(): with pytest.raises(ValueError): gdal.Relationship(None, None, None, gdal.GRC_ONE_TO_ONE) - relationship = gdal.Relationship('name', 'left_table', 'right_table', gdal.GRC_MANY_TO_ONE) - assert relationship.GetName() == 'name' + relationship = gdal.Relationship( + "name", "left_table", "right_table", gdal.GRC_MANY_TO_ONE + ) + assert relationship.GetName() == "name" assert relationship.GetCardinality() == gdal.GRC_MANY_TO_ONE - assert relationship.GetLeftTableName() == 'left_table' - assert relationship.GetRightTableName() == 'right_table' + assert relationship.GetLeftTableName() == "left_table" + assert relationship.GetRightTableName() == "right_table" - relationship = gdal.Relationship('name', 'left_table', 'right_table', gdal.GRC_ONE_TO_ONE) + relationship = gdal.Relationship( + "name", "left_table", "right_table", gdal.GRC_ONE_TO_ONE + ) assert relationship.GetCardinality() == gdal.GRC_ONE_TO_ONE - assert relationship.GetMappingTableName() == '' - relationship.SetMappingTableName('mapping_table') - assert relationship.GetMappingTableName() == 'mapping_table' + assert relationship.GetMappingTableName() == "" + relationship.SetMappingTableName("mapping_table") + assert relationship.GetMappingTableName() == "mapping_table" assert relationship.GetLeftTableFields() is None - relationship.SetLeftTableFields(['a_field']) - assert relationship.GetLeftTableFields() == ['a_field'] + relationship.SetLeftTableFields(["a_field"]) + assert relationship.GetLeftTableFields() == ["a_field"] assert relationship.GetRightTableFields() is None - relationship.SetRightTableFields(['b_field', 'c_field']) - assert relationship.GetRightTableFields() == ['b_field', 'c_field'] + relationship.SetRightTableFields(["b_field", "c_field"]) + assert relationship.GetRightTableFields() == ["b_field", "c_field"] assert relationship.GetLeftMappingTableFields() is None - relationship.SetLeftMappingTableFields(['a_field2']) - assert relationship.GetLeftMappingTableFields() == ['a_field2'] + relationship.SetLeftMappingTableFields(["a_field2"]) + assert relationship.GetLeftMappingTableFields() == ["a_field2"] assert relationship.GetRightMappingTableFields() is None - relationship.SetRightMappingTableFields(['b_field2', 'c_field2']) - assert relationship.GetRightMappingTableFields() == ['b_field2', 'c_field2'] + relationship.SetRightMappingTableFields(["b_field2", "c_field2"]) + assert relationship.GetRightMappingTableFields() == ["b_field2", "c_field2"] assert relationship.GetType() == gdal.GRT_ASSOCIATION relationship.SetType(gdal.GRT_AGGREGATION) assert relationship.GetType() == gdal.GRT_AGGREGATION - assert relationship.GetForwardPathLabel() == '' - relationship.SetForwardPathLabel('forward path') - assert relationship.GetForwardPathLabel() == 'forward path' + assert relationship.GetForwardPathLabel() == "" + relationship.SetForwardPathLabel("forward path") + assert relationship.GetForwardPathLabel() == "forward path" - assert relationship.GetBackwardPathLabel() == '' - relationship.SetBackwardPathLabel('backward path') - assert relationship.GetBackwardPathLabel() == 'backward path' + assert relationship.GetBackwardPathLabel() == "" + relationship.SetBackwardPathLabel("backward path") + assert relationship.GetBackwardPathLabel() == "backward path" - assert relationship.GetRelatedTableType() == '' - relationship.SetRelatedTableType('media') - assert relationship.GetRelatedTableType() == 'media' + assert relationship.GetRelatedTableType() == "" + relationship.SetRelatedTableType("media") + assert relationship.GetRelatedTableType() == "media" diff --git a/autotest/gcore/rfc30.py b/autotest/gcore/rfc30.py index 23b771bf0b6a..0a8f469edd17 100755 --- a/autotest/gcore/rfc30.py +++ b/autotest/gcore/rfc30.py @@ -31,36 +31,39 @@ import urllib.parse -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Try opening a file with a Chinese name using the Python UTF-8 string. def test_rfc30_1(): - filename = 'xx\u4E2D\u6587.\u4E2D\u6587' + filename = "xx\u4E2D\u6587.\u4E2D\u6587" filename_escaped = urllib.parse.quote(filename) - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/gtiff/' + filename_escaped, filename): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/gtiff/" + filename_escaped, filename + ): pytest.skip() - filename = 'tmp/cache/' + filename + filename = "tmp/cache/" + filename ds = gdal.Open(filename) file_list = ds.GetFileList() - assert ds is not None, 'failed to open utf filename.' + 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).' + assert ds is not None, "failed to open utf filename (2)." + ############################################################################### # Try creating, then renaming a utf-8 named file. @@ -68,29 +71,29 @@ def test_rfc30_1(): def test_rfc30_2(): - filename = 'tmp/yy\u4E2D\u6587.\u4E2D\u6587' - fd = gdal.VSIFOpenL(filename, 'w') - assert fd is not None, 'failed to create utf-8 named file.' + filename = "tmp/yy\u4E2D\u6587.\u4E2D\u6587" + fd = gdal.VSIFOpenL(filename, "w") + assert fd is not None, "failed to create utf-8 named file." - gdal.VSIFWriteL('abc', 3, 1, fd) + gdal.VSIFWriteL("abc", 3, 1, fd) gdal.VSIFCloseL(fd) # rename - new_filename = 'tmp/yy\u4E2D\u6587.\u4E2D\u6587' + new_filename = "tmp/yy\u4E2D\u6587.\u4E2D\u6587" filename_for_rename = filename - assert gdal.Rename(filename_for_rename, new_filename) == 0, 'utf-8 rename failed.' + 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' + fd = gdal.VSIFOpenL(new_filename, "r") + assert fd is not None, "reopen failed with utf8" data = gdal.VSIFReadL(3, 1, fd) gdal.VSIFCloseL(fd) - assert data == b'abc' + assert data == b"abc" gdal.Unlink(new_filename) - fd = gdal.VSIFOpenL(new_filename, 'r') - assert fd is None, 'did unlink fail on utf8 filename?' + fd = gdal.VSIFOpenL(new_filename, "r") + assert fd is None, "did unlink fail on utf8 filename?" diff --git a/autotest/gcore/test_driver_metadata.py b/autotest/gcore/test_driver_metadata.py index f152dcc6dbed..bab8c1cc0538 100644 --- a/autotest/gcore/test_driver_metadata.py +++ b/autotest/gcore/test_driver_metadata.py @@ -30,18 +30,32 @@ import pytest -from osgeo import gdal from lxml import etree -all_driver_names = [gdal.GetDriver(i).GetDescription() for i in range(gdal.GetDriverCount())] -ogr_driver_names = [driver_name for driver_name in all_driver_names - if gdal.GetDriverByName(driver_name).GetMetadataItem('DCAP_VECTOR') == 'YES'] -gdal_driver_names = [driver_name for driver_name in all_driver_names - if gdal.GetDriverByName(driver_name).GetMetadataItem('DCAP_RASTER') == 'YES'] -multidim_driver_name = [driver_name for driver_name in gdal_driver_names - if gdal.GetDriverByName(driver_name).GetMetadataItem('DCAP_MULTIDIM_RASTER') == 'YES'] +from osgeo import gdal -schema_openoptionslist = etree.XML(r""" +all_driver_names = [ + gdal.GetDriver(i).GetDescription() for i in range(gdal.GetDriverCount()) +] +ogr_driver_names = [ + driver_name + for driver_name in all_driver_names + if gdal.GetDriverByName(driver_name).GetMetadataItem("DCAP_VECTOR") == "YES" +] +gdal_driver_names = [ + driver_name + for driver_name in all_driver_names + if gdal.GetDriverByName(driver_name).GetMetadataItem("DCAP_RASTER") == "YES" +] +multidim_driver_name = [ + driver_name + for driver_name in gdal_driver_names + if gdal.GetDriverByName(driver_name).GetMetadataItem("DCAP_MULTIDIM_RASTER") + == "YES" +] + +schema_openoptionslist = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value"> <xs:complexType> @@ -106,9 +120,11 @@ </xs:complexType> </xs:element> </xs:schema> -""") +""" +) -schema_creationoptionslist_xml = etree.XML(r""" +schema_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value"> <xs:complexType> @@ -173,9 +189,11 @@ </xs:complexType> </xs:element> </xs:schema> -""") +""" +) -schema_layer_creationoptionslist_xml = etree.XML(r""" +schema_layer_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value"> <xs:complexType> @@ -240,10 +258,12 @@ </xs:complexType> </xs:element> </xs:schema> -""") +""" +) -schema_multidim_array_creationoptionslist_xml =etree.XML(r""" +schema_multidim_array_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value"> <xs:complexType> @@ -276,10 +296,12 @@ </xs:complexType> </xs:element> </xs:schema> -""") +""" +) -schema_multidim_attribute_creationoptionslist_xml = etree.XML(r""" +schema_multidim_attribute_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value" type="xs:string"/> <xs:element name="Option"> @@ -299,10 +321,12 @@ </xs:sequence> </xs:complexType> </xs:element> -</xs:schema>""") +</xs:schema>""" +) -schema_multidim_dataset_creationoptionslist_xml = etree.XML(r""" +schema_multidim_dataset_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Value" type="xs:string"/> <xs:element name="Option"> @@ -323,10 +347,12 @@ </xs:sequence> </xs:complexType> </xs:element> -</xs:schema>""") +</xs:schema>""" +) -schema_multidim_dimension_creationoptionslist_xml = etree.XML(r""" +schema_multidim_dimension_creationoptionslist_xml = etree.XML( + r""" <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Option"> <xs:complexType> @@ -347,17 +373,18 @@ </xs:sequence> </xs:complexType> </xs:element> -</xs:schema>""") +</xs:schema>""" +) -@pytest.mark.parametrize('driver_name', all_driver_names) +@pytest.mark.parametrize("driver_name", all_driver_names) def test_metadata_openoptionlist(driver_name): - """ Test if DMD_OPENOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_OPENOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_openoptionslist) driver = gdal.GetDriverByName(driver_name) - openoptionlist_xml = driver.GetMetadataItem('DMD_OPENOPTIONLIST') + openoptionlist_xml = driver.GetMetadataItem("DMD_OPENOPTIONLIST") if openoptionlist_xml is not None and len(openoptionlist_xml) > 0: # do not fail @@ -369,14 +396,14 @@ def test_metadata_openoptionlist(driver_name): raise -@pytest.mark.parametrize('driver_name', all_driver_names) +@pytest.mark.parametrize("driver_name", all_driver_names) def test_metadata_creationoptionslist(driver_name): - """ Test if DMD_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - creationoptionslist_xml = driver.GetMetadataItem('DMD_CREATIONOPTIONLIST') + creationoptionslist_xml = driver.GetMetadataItem("DMD_CREATIONOPTIONLIST") if creationoptionslist_xml is not None and len(creationoptionslist_xml) > 0: # do not fail @@ -388,14 +415,14 @@ def test_metadata_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', ogr_driver_names) +@pytest.mark.parametrize("driver_name", ogr_driver_names) def test_metadata_layer_creationoptionslist(driver_name): - """ Test if DS_LAYER_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DS_LAYER_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_layer_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - creationoptionslist_xml = driver.GetMetadataItem('DS_LAYER_CREATIONOPTIONLIST') + creationoptionslist_xml = driver.GetMetadataItem("DS_LAYER_CREATIONOPTIONLIST") if creationoptionslist_xml is not None and len(creationoptionslist_xml) > 0: # do not fail @@ -407,14 +434,14 @@ def test_metadata_layer_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', multidim_driver_name) +@pytest.mark.parametrize("driver_name", multidim_driver_name) def test_metadata_multidim_array_creationoptionslist(driver_name): - """ Test if DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_multidim_array_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - xml = driver.GetMetadataItem('DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST') + xml = driver.GetMetadataItem("DMD_MULTIDIM_ARRAY_CREATIONOPTIONLIST") if xml is not None and len(xml) > 0: # do not fail @@ -426,14 +453,14 @@ def test_metadata_multidim_array_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', multidim_driver_name) +@pytest.mark.parametrize("driver_name", multidim_driver_name) def test_metadata_multidim_attribute_creationoptionslist(driver_name): - """ Test if DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_multidim_attribute_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - xml = driver.GetMetadataItem('DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST') + xml = driver.GetMetadataItem("DMD_MULTIDIM_ATTRIBUTE_CREATIONOPTIONLIST") if xml is not None and len(xml) > 0: # do not fail @@ -445,14 +472,14 @@ def test_metadata_multidim_attribute_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', multidim_driver_name) +@pytest.mark.parametrize("driver_name", multidim_driver_name) def test_metadata_multidim_dataset_creationoptionslist(driver_name): - """ Test if DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_multidim_dataset_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - xml = driver.GetMetadataItem('DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST') + xml = driver.GetMetadataItem("DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST") if xml is not None and len(xml) > 0: # do not fail @@ -464,14 +491,14 @@ def test_metadata_multidim_dataset_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', multidim_driver_name) +@pytest.mark.parametrize("driver_name", multidim_driver_name) def test_metadata_multidim_dimension_creationoptionslist(driver_name): - """ Test if DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST metadataitem is present and can be parsed""" schema = etree.XMLSchema(schema_multidim_dimension_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - xml = driver.GetMetadataItem('DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST') + xml = driver.GetMetadataItem("DMD_MULTIDIM_DIMENSION_CREATIONOPTIONLIST") if xml is not None and len(xml) > 0: # do not fail @@ -483,15 +510,15 @@ def test_metadata_multidim_dimension_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', multidim_driver_name) +@pytest.mark.parametrize("driver_name", multidim_driver_name) def test_metadata_multidim_group_creationoptionslist(driver_name): - """ Test if DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST metadataitem is present and can be parsed """ + """Test if DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST metadataitem is present and can be parsed""" # TODO: create schema if xml is available # schema = etree.XMLSchema(schema_multidim_group_creationoptionslist_xml) driver = gdal.GetDriverByName(driver_name) - xml = driver.GetMetadataItem('DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST') + xml = driver.GetMetadataItem("DMD_MULTIDIM_GROUP_CREATIONOPTIONLIST") if xml is not None and len(xml) > 0: # do not fail @@ -504,41 +531,53 @@ def test_metadata_multidim_group_creationoptionslist(driver_name): raise -@pytest.mark.parametrize('driver_name', all_driver_names) +@pytest.mark.parametrize("driver_name", all_driver_names) def test_metadata_creation_field_datatypes(driver_name): - """ Test if DMD_CREATIONFIELDDATATYPES metadataitem returns valid datatypes """ - - valid_datatypes = {'Integer', 'Integer64', 'Real', 'String', 'Date', 'DateTime', 'Time', 'IntegerList', - 'Integer64List', 'RealList', 'StringList', 'Binary'} + """Test if DMD_CREATIONFIELDDATATYPES metadataitem returns valid datatypes""" + + valid_datatypes = { + "Integer", + "Integer64", + "Real", + "String", + "Date", + "DateTime", + "Time", + "IntegerList", + "Integer64List", + "RealList", + "StringList", + "Binary", + } driver = gdal.GetDriverByName(driver_name) - datatypes_str = driver.GetMetadataItem('DMD_CREATIONFIELDDATATYPES') + datatypes_str = driver.GetMetadataItem("DMD_CREATIONFIELDDATATYPES") if datatypes_str is not None: - for datatype in datatypes_str.split(' '): + for datatype in datatypes_str.split(" "): assert datatype in valid_datatypes -@pytest.mark.parametrize('driver_name', all_driver_names) +@pytest.mark.parametrize("driver_name", all_driver_names) def test_metadata_creation_sub_field_datatypes(driver_name): - """ Test if DMD_CREATIONFIELDDATASUBTYPES metadataitem returns valid data subtypes """ + """Test if DMD_CREATIONFIELDDATASUBTYPES metadataitem returns valid data subtypes""" - valid_datatypes = {'Boolean', 'Float32', 'Int16', 'JSON', 'UUID'} + valid_datatypes = {"Boolean", "Float32", "Int16", "JSON", "UUID"} driver = gdal.GetDriverByName(driver_name) - datatypes_str = driver.GetMetadataItem('DMD_CREATIONFIELDDATASUBTYPES') + datatypes_str = driver.GetMetadataItem("DMD_CREATIONFIELDDATASUBTYPES") if datatypes_str is not None: - for datatype in datatypes_str.split(' '): + for datatype in datatypes_str.split(" "): assert datatype in valid_datatypes -@pytest.mark.parametrize('driver_name', ogr_driver_names) +@pytest.mark.parametrize("driver_name", ogr_driver_names) def test_metadata_alter_geom_field_defn_flags(driver_name): - """ Test if GDAL_DMD_ALTER_GEOM_FIELD_DEFN_FLAGS metadataitem returns valid flags """ + """Test if GDAL_DMD_ALTER_GEOM_FIELD_DEFN_FLAGS metadataitem returns valid flags""" - supported_flags = {'Name', 'Type', 'Nullable', 'SRS', 'CoordinateEpoch'} + supported_flags = {"Name", "Type", "Nullable", "SRS", "CoordinateEpoch"} driver = gdal.GetDriverByName(driver_name) flags_str = driver.GetMetadataItem(gdal.DMD_ALTER_GEOM_FIELD_DEFN_FLAGS) if flags_str is not None: - for flag in flags_str.split(' '): + for flag in flags_str.split(" "): assert flag in supported_flags diff --git a/autotest/gcore/testnonboundtoswig.py b/autotest/gcore/testnonboundtoswig.py index 00efa45c53c6..ab3384758ade 100755 --- a/autotest/gcore/testnonboundtoswig.py +++ b/autotest/gcore/testnonboundtoswig.py @@ -31,10 +31,10 @@ import ctypes -from osgeo import gdal +import gdaltest import pytest -import gdaltest +from osgeo import gdal gdal_handle_init = False gdal_handle = None @@ -45,13 +45,14 @@ def find_libgdal(): - return gdaltest.find_lib('gdal') + return gdaltest.find_lib("gdal") + ############################################################################### # Init -@pytest.fixture(scope='module', autouse=True) +@pytest.fixture(scope="module", autouse=True) def setup(): global gdal_handle_init, gdal_handle, gdal_handle_stdcall @@ -66,7 +67,7 @@ def setup(): if name is None: pytest.skip() - print('Found libgdal we are running against : %s' % name) + print("Found libgdal we are running against : %s" % name) static_version = gdal.VersionInfo(None) # short_static_version = static_version[0:2] @@ -82,17 +83,20 @@ def setup(): gdal_handle_stdcall.GDALVersionInfo.restype = ctypes.c_char_p dynamic_version = gdal_handle_stdcall.GDALVersionInfo(None) - dynamic_version = dynamic_version.decode('utf-8') + dynamic_version = dynamic_version.decode("utf-8") if dynamic_version != static_version: gdal_handle = None gdal_handle_stdcall = None - pytest.skip(f'dynamic version({dynamic_version}) does not match ' - f'static version ({static_version})') + pytest.skip( + f"dynamic version({dynamic_version}) does not match " + f"static version ({static_version})" + ) return gdal_handle except Exception: - pytest.skip('cannot find gdal shared object') + pytest.skip("cannot find gdal shared object") + ############################################################################### # Call GDALDestroyDriverManager() @@ -105,6 +109,7 @@ def GDALDestroyDriverManager(): gdal_handle_stdcall.GDALDestroyDriverManager() + ############################################################################### # Call OGRCleanupAll() @@ -116,6 +121,7 @@ def OGRCleanupAll(): gdal_handle_stdcall.OGRCleanupAll() + ############################################################################### # Call OSRCleanup() @@ -127,13 +133,14 @@ def OSRCleanup(): gdal_handle.OSRCleanup() + ############################################################################### # Test GDALSimpleImageWarp def test_testnonboundtoswig_GDALSimpleImageWarp(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None @@ -145,31 +152,57 @@ def test_testnonboundtoswig_GDALSimpleImageWarp(): 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.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 = gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 20, 20, 1) out_ds.SetGeoTransform(gt) out_ds.SetProjection(wkt) out_ds = None - filename = b'data/byte.tif' + filename = b"data/byte.tif" native_in_ds = gdal_handle_stdcall.GDALOpen(filename, gdal.GA_ReadOnly) assert native_in_ds is not None - filename = b'/vsimem/out.tif' + filename = b"/vsimem/out.tif" 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) + 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) + 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) @@ -177,14 +210,15 @@ def test_testnonboundtoswig_GDALSimpleImageWarp(): gdal_handle_stdcall.GDALClose(native_in_ds) gdal_handle_stdcall.GDALClose(native_out_ds) - ds = gdal.Open('/vsimem/out.tif') + ds = gdal.Open("/vsimem/out.tif") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/out.tif') + gdal.Unlink("/vsimem/out.tif") assert cs == 4672 + ############################################################################### # Test VRT derived bands with callback functions implemented in Python! @@ -208,32 +242,42 @@ def GDALTypeToCTypes(gdaltype): return None -def my_pyDerivedPixelFunc(papoSources, nSources, pData, nBufXSize, nBufYSize, eSrcType, eBufType, nPixelSpace, nLineSpace): +def my_pyDerivedPixelFunc( + papoSources, + nSources, + pData, + nBufXSize, + nBufYSize, + eSrcType, + eBufType, + nPixelSpace, + nLineSpace, +): if nSources != 1: print(nSources) - print('did not get expected nSources') + print("did not get expected nSources") return 1 srcctype = GDALTypeToCTypes(eSrcType) if srcctype is None: print(eSrcType) - print('did not get expected eSrcType') + print("did not get expected eSrcType") return 1 dstctype = GDALTypeToCTypes(eBufType) if dstctype is None: print(eBufType) - print('did not get expected eBufType') + print("did not get expected eBufType") return 1 if nPixelSpace != gdal.GetDataTypeSize(eBufType) / 8: print(nPixelSpace) - print('did not get expected nPixelSpace') + print("did not get expected nPixelSpace") return 1 if (nLineSpace % nPixelSpace) != 0: print(nLineSpace) - print('did not get expected nLineSpace') + print("did not get expected nLineSpace") return 1 nLineStride = (int)(nLineSpace / nPixelSpace) @@ -249,27 +293,34 @@ def my_pyDerivedPixelFunc(papoSources, nSources, pData, nBufXSize, nBufYSize, eS 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 + 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.argtypes = [ + ctypes.c_char_p, + DerivedPixelFuncType, + ] gdal_handle_stdcall.GDALAddDerivedBandPixelFunc.restype = ctypes.c_int funcName = b"pyDerivedPixelFunc" - ret = gdal_handle_stdcall.GDALAddDerivedBandPixelFunc(funcName, my_cDerivedPixelFunc) + ret = gdal_handle_stdcall.GDALAddDerivedBandPixelFunc( + funcName, my_cDerivedPixelFunc + ) assert ret == 0 vrt_xml = """<VRTDataset rasterXSize="20" rasterYSize="20"> @@ -285,7 +336,7 @@ def test_testnonboundtoswig_VRTDerivedBands(): </VRTRasterBand> </VRTDataset>""" - src_ds = gdal.Open('data/byte.tif') + 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 @@ -295,6 +346,6 @@ def test_testnonboundtoswig_VRTDerivedBands(): got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20) ds = None - assert ref_cs == got_cs, 'wrong checksum' + assert ref_cs == got_cs, "wrong checksum" assert ref_data == got_data diff --git a/autotest/gcore/thread_test.py b/autotest/gcore/thread_test.py index 28aa05aa1b0f..c2f401988862 100755 --- a/autotest/gcore/thread_test.py +++ b/autotest/gcore/thread_test.py @@ -31,9 +31,10 @@ import threading -from osgeo import gdal import pytest +from osgeo import gdal + def my_error_handler(err_type, err_no, err_msg): # pylint: disable=unused-argument @@ -42,39 +43,35 @@ def my_error_handler(err_type, err_no, err_msg): def thread_test_1_worker(args_dict): for i in range(1000): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") if (i % 2) == 0: if ds.GetRasterBand(1).Checksum() != 4672: - args_dict['ret'] = False + 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') + ds = gdal.Open("i_dont_exist") gdal.PopErrorHandler() def test_thread_test_1(): - pytest.importorskip('numpy') + pytest.importorskip("numpy") threads = [] args_array = [] for i in range(4): - args_dict = {'ret': True} + 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' + ret = "success" for i in range(4): threads[i].join() if not args_array[i]: - ret = 'fail' + ret = "fail" return ret - - - - diff --git a/autotest/gcore/tiff_ovr.py b/autotest/gcore/tiff_ovr.py index c6dd800c4a19..984463a62890 100755 --- a/autotest/gcore/tiff_ovr.py +++ b/autotest/gcore/tiff_ovr.py @@ -30,26 +30,25 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import array import os import shutil -import array import stat import struct -from osgeo import osr -from osgeo import gdal +import gdaltest import pytest -import gdaltest +from osgeo import gdal, osr -@pytest.fixture(params=['invert', 'dont-invert']) +@pytest.fixture(params=["invert", "dont-invert"]) def both_endian(request): """ Runs tests with both values of GDAL_TIFF_ENDIANNESS """ - if request.param == 'invert': - with gdaltest.config_option('GDAL_TIFF_ENDIANNESS', 'INVERTED'): + if request.param == "invert": + with gdaltest.config_option("GDAL_TIFF_ENDIANNESS", "INVERTED"): yield else: yield @@ -58,28 +57,44 @@ def both_endian(request): ############################################################################### # Check the overviews + def tiff_ovr_check(src_ds): for i in (1, 2, 3): - assert src_ds.GetRasterBand(i).GetOverviewCount() == 2, 'overviews missing' + 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) + 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()) + 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) + 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()) + 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. @@ -87,23 +102,24 @@ def tiff_ovr_check(src_ds): def test_tiff_ovr_1(both_endian): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") - src_ds = gdal.Open('data/mfloat32.vrt') + src_ds = gdal.Open("data/mfloat32.vrt") - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - gdaltest.tiff_drv.CreateCopy('tmp/mfloat32.tif', src_ds, - options=['INTERLEAVE=PIXEL']) + gdaltest.tiff_drv.CreateCopy( + "tmp/mfloat32.tif", src_ds, options=["INTERLEAVE=PIXEL"] + ) src_ds = None - ds = gdal.Open('tmp/mfloat32.tif') + ds = gdal.Open("tmp/mfloat32.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." err = ds.BuildOverviews(overviewlist=[2, 4]) - assert err == 0, 'BuildOverviews reports an error' + assert err == 0, "BuildOverviews reports an error" ret = tiff_ovr_check(ds) @@ -115,11 +131,12 @@ def test_tiff_ovr_1(both_endian): ############################################################################### # Open file and verify some characteristics of the overviews. + def test_tiff_ovr_2(both_endian): - src_ds = gdal.Open('tmp/mfloat32.tif') + src_ds = gdal.Open("tmp/mfloat32.tif") - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." ret = tiff_ovr_check(src_ds) @@ -127,6 +144,7 @@ def test_tiff_ovr_2(both_endian): return ret + ############################################################################### # Open target file in update mode, and create internal overviews. @@ -134,16 +152,16 @@ def test_tiff_ovr_2(both_endian): def test_tiff_ovr_3(both_endian): try: - os.unlink('tmp/mfloat32.tif.ovr') + os.unlink("tmp/mfloat32.tif.ovr") except OSError: pass - src_ds = gdal.Open('tmp/mfloat32.tif', gdal.GA_Update) + src_ds = gdal.Open("tmp/mfloat32.tif", gdal.GA_Update) - assert src_ds is not None, 'Failed to open test dataset.' + 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' + assert err == 0, "BuildOverviews reports an error" ret = tiff_ovr_check(src_ds) @@ -151,6 +169,7 @@ def test_tiff_ovr_3(both_endian): return ret + ############################################################################### # Re-open target file and check overviews @@ -158,27 +177,29 @@ def test_tiff_ovr_3(both_endian): 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') + shutil.copyfile("data/oddsize_1bit2b.tif", "tmp/ovr4.tif") - wrk_ds = gdal.Open('tmp/ovr4.tif', gdal.GA_Update) + wrk_ds = gdal.Open("tmp/ovr4.tif", gdal.GA_Update) - assert wrk_ds is not None, 'Failed to open test dataset.' + assert wrk_ds is not None, "Failed to open test dataset." - wrk_ds.BuildOverviews('AVERAGE_BIT2GRAYSCALE', overviewlist=[2, 4]) + wrk_ds.BuildOverviews("AVERAGE_BIT2GRAYSCALE", overviewlist=[2, 4]) wrk_ds = None - wrk_ds = gdal.Open('tmp/ovr4.tif') + 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.' + 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) @@ -188,21 +209,26 @@ def test_tiff_ovr_4(both_endian): average = total / pix_count exp_average = 154.0992 - assert average == pytest.approx(exp_average, abs=0.1), 'got wrong average for overview image' + assert average == pytest.approx( + exp_average, abs=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) + ovimage = frband.ReadRaster( + 0, 0, frband.XSize, frband.YSize, ovband.XSize, ovband.YSize + ) pix_count = ovband.XSize * ovband.YSize total = float(sum(ovimage)) average = total / pix_count exp_average = 0.6096 - assert average == pytest.approx(exp_average, abs=0.01), 'got wrong average for downsampled image' + assert average == pytest.approx( + exp_average, abs=0.01 + ), "got wrong average for downsampled image" wrk_ds = None @@ -210,20 +236,22 @@ def test_tiff_ovr_4(both_endian): ############################################################################### # Test average overview generation with nodata. + def test_tiff_ovr_5(both_endian): - shutil.copyfile('data/nodata_byte.tif', 'tmp/ovr5.tif') + shutil.copyfile("data/nodata_byte.tif", "tmp/ovr5.tif") - wrk_ds = gdal.Open('tmp/ovr5.tif', gdal.GA_ReadOnly) + wrk_ds = gdal.Open("tmp/ovr5.tif", gdal.GA_ReadOnly) - assert wrk_ds is not None, 'Failed to open test dataset.' + assert wrk_ds is not None, "Failed to open test dataset." - wrk_ds.BuildOverviews('AVERAGE', overviewlist=[2]) + 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.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Same as tiff_ovr_5 but with USE_RDD=YES to force external overview @@ -231,12 +259,12 @@ def test_tiff_ovr_5(both_endian): def test_tiff_ovr_6(both_endian): - shutil.copyfile('data/nodata_byte.tif', 'tmp/ovr6.tif') + shutil.copyfile("data/nodata_byte.tif", "tmp/ovr6.tif") - with gdaltest.config_option('USE_RRD', 'YES'): - wrk_ds = gdal.Open('tmp/ovr6.tif', gdal.GA_Update) + with gdaltest.config_option("USE_RRD", "YES"): + wrk_ds = gdal.Open("tmp/ovr6.tif", gdal.GA_Update) - assert wrk_ds is not None, 'Failed to open test dataset.' + assert wrk_ds is not None, "Failed to open test dataset." def cbk(pct, _, user_data): if user_data[0] < 0: @@ -246,41 +274,45 @@ def cbk(pct, _, user_data): return 1 tab = [-1] - wrk_ds.BuildOverviews('AVERAGE', overviewlist=[2], callback=cbk, callback_data=tab) + wrk_ds.BuildOverviews( + "AVERAGE", overviewlist=[2], callback=cbk, callback_data=tab + ) assert tab[0] == 1.0 try: - os.stat('tmp/ovr6.aux') + os.stat("tmp/ovr6.aux") except OSError: - pytest.fail('no external overview.') + pytest.fail("no external overview.") cs = wrk_ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1130 - assert cs == exp_cs, 'got wrong overview checksum.' + 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') + 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) + ds = gdal.Open("tmp/test_average_palette.tif", gdal.GA_Update) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - ds.BuildOverviews('NEAREST', overviewlist=[2]) + 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.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Check average resampling on a dataset with a raster band that has a color table @@ -288,23 +320,24 @@ def test_tiff_ovr_7(both_endian): def test_tiff_ovr_8(both_endian): - shutil.copyfile('data/test_average_palette.tif', 'tmp/test_average_palette.tif') + 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) + ds = gdal.Open("tmp/test_average_palette.tif", gdal.GA_Update) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + 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.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Check RMS resampling on a dataset with a raster band that has a color table @@ -312,21 +345,22 @@ def test_tiff_ovr_8(both_endian): def test_tiff_ovr_rms_palette(both_endian): - shutil.copyfile('data/test_average_palette.tif', 'tmp/test_average_palette.tif') + 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 (180.3,180.3,180.3), # and the closest color is (127,127,127) at index 2. # So the result of the averaging is a uniform grey image. - ds = gdal.Open('tmp/test_average_palette.tif', gdal.GA_Update) - ds.BuildOverviews('RMS', overviewlist=[2]) + ds = gdal.Open("tmp/test_average_palette.tif", gdal.GA_Update) + ds.BuildOverviews("RMS", overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 200 ds = None - assert cs == exp_cs, 'got wrong overview checksum.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Test --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR -ro @@ -334,30 +368,32 @@ def test_tiff_ovr_rms_palette(both_endian): def test_tiff_ovr_9(both_endian): - gdaltest.tiff_drv.Delete('tmp/ovr9.tif') + gdaltest.tiff_drv.Delete("tmp/ovr9.tif") - shutil.copyfile('data/rgbsmall.tif', 'tmp/ovr9.tif') + shutil.copyfile("data/rgbsmall.tif", "tmp/ovr9.tif") - with gdaltest.config_options({'COMPRESS_OVERVIEW': 'JPEG', - 'PHOTOMETRIC_OVERVIEW': 'YCBCR'}): - ds = gdal.Open('tmp/ovr9.tif', gdal.GA_ReadOnly) + with gdaltest.config_options( + {"COMPRESS_OVERVIEW": "JPEG", "PHOTOMETRIC_OVERVIEW": "YCBCR"} + ): + ds = gdal.Open("tmp/ovr9.tif", gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - exp_cs_list = (5562, - 5635, - 5601, # libjpeg 9e - ) + exp_cs_list = ( + 5562, + 5635, + 5601, # libjpeg 9e + ) ds = None assert cs in exp_cs_list # Re-check after dataset reopening - ds = gdal.Open('tmp/ovr9.tif', gdal.GA_ReadOnly) + ds = gdal.Open("tmp/ovr9.tif", gdal.GA_ReadOnly) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -365,36 +401,41 @@ def test_tiff_ovr_9(both_endian): assert cs in exp_cs_list + ############################################################################### # 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) + src_ds = gdal.Open("data/rgbsmall.tif", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + 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']) + 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.' + assert ds is not None, "Failed to apply JPEG compression." - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr10.tif', gdal.GA_ReadOnly) + ds = gdal.Open("tmp/ovr10.tif", gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open copy of test dataset.' + assert ds is not None, "Failed to open copy of test dataset." cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None - assert cs in (5562, - 5635, - 5601, # libjpeg 9e - ) + assert cs in ( + 5562, + 5635, + 5601, # libjpeg 9e + ) + ############################################################################### # Overview on a dataset with NODATA_VALUES @@ -402,19 +443,19 @@ def test_tiff_ovr_10(both_endian): def test_tiff_ovr_11(both_endian): - src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) + src_ds = gdal.Open("data/test_nodatavalues.tif", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr11.tif', src_ds) + ds = gdaltest.tiff_drv.CreateCopy("tmp/ovr11.tif", src_ds) src_ds = None - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr11.tif', gdal.GA_ReadOnly) + ds = gdal.Open("tmp/ovr11.tif", gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open copy of test dataset.' + 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 @@ -422,7 +463,8 @@ def test_tiff_ovr_11(both_endian): ds = None - assert cs == exp_cs, 'got wrong overview checksum.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Same as tiff_ovr_11 but with compression to trigger the multiband overview @@ -431,19 +473,21 @@ def test_tiff_ovr_11(both_endian): def test_tiff_ovr_12(both_endian): - src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) + src_ds = gdal.Open("data/test_nodatavalues.tif", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr12.tif', src_ds, options=['COMPRESS=DEFLATE']) + ds = gdaltest.tiff_drv.CreateCopy( + "tmp/ovr12.tif", src_ds, options=["COMPRESS=DEFLATE"] + ) src_ds = None - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr12.tif', gdal.GA_ReadOnly) + ds = gdal.Open("tmp/ovr12.tif", gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open copy of test dataset.' + 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 @@ -451,31 +495,33 @@ def test_tiff_ovr_12(both_endian): ds = None - assert cs == exp_cs, 'got wrong overview checksum.' + assert cs == exp_cs, "got wrong overview checksum." ############################################################################### # Test gaussian resampling + def test_tiff_ovr_13(both_endian): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") - src_ds = gdal.Open('data/mfloat32.vrt') + src_ds = gdal.Open("data/mfloat32.vrt") - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - gdaltest.tiff_drv.CreateCopy('tmp/mfloat32.tif', src_ds, - options=['INTERLEAVE=PIXEL']) + gdaltest.tiff_drv.CreateCopy( + "tmp/mfloat32.tif", src_ds, options=["INTERLEAVE=PIXEL"] + ) src_ds = None - ds = gdal.Open('tmp/mfloat32.tif') + ds = gdal.Open("tmp/mfloat32.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - err = ds.BuildOverviews('GAUSS', overviewlist=[2, 4]) + err = ds.BuildOverviews("GAUSS", overviewlist=[2, 4]) - assert err == 0, 'BuildOverviews reports an error' + assert err == 0, "BuildOverviews reports an error" # if ds.GetRasterBand(1).GetOverview(0).Checksum() != 1225: # gdaltest.post_reason( 'bad checksum' ) @@ -483,26 +529,28 @@ def test_tiff_ovr_13(both_endian): 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') + shutil.copyfile("data/test_average_palette.tif", "tmp/test_gauss_palette.tif") - ds = gdal.Open('tmp/test_gauss_palette.tif', gdal.GA_Update) + ds = gdal.Open("tmp/test_gauss_palette.tif", gdal.GA_Update) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - ds.BuildOverviews('GAUSS', overviewlist=[2]) + 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.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Same as tiff_ovr_11 but with gauss, and compression to trigger the multiband overview @@ -511,19 +559,21 @@ def test_tiff_ovr_14(both_endian): def test_tiff_ovr_15(both_endian): - src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) + src_ds = gdal.Open("data/test_nodatavalues.tif", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr15.tif', src_ds, options=['COMPRESS=DEFLATE']) + ds = gdaltest.tiff_drv.CreateCopy( + "tmp/ovr15.tif", src_ds, options=["COMPRESS=DEFLATE"] + ) src_ds = None - ds.BuildOverviews('GAUSS', overviewlist=[2]) + ds.BuildOverviews("GAUSS", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr15.tif', gdal.GA_ReadOnly) + ds = gdal.Open("tmp/ovr15.tif", gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open copy of test dataset.' + 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 @@ -531,35 +581,35 @@ def test_tiff_ovr_15(both_endian): ds = None - assert cs == exp_cs, 'got wrong overview checksum.' + 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') + gdaltest.tiff_drv = gdal.GetDriverByName("GTiff") - src_ds = gdal.Open('data/mfloat32.vrt') + src_ds = gdal.Open("data/mfloat32.vrt") - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - gdaltest.tiff_drv.CreateCopy('tmp/ovr16.tif', src_ds, - options=['INTERLEAVE=PIXEL']) + gdaltest.tiff_drv.CreateCopy("tmp/ovr16.tif", src_ds, options=["INTERLEAVE=PIXEL"]) src_ds = None - ds = gdal.Open('tmp/ovr16.tif') + ds = gdal.Open("tmp/ovr16.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - err = ds.BuildOverviews('MODE', overviewlist=[2, 4]) + err = ds.BuildOverviews("MODE", overviewlist=[2, 4]) - assert err == 0, 'BuildOverviews reports an error' + assert err == 0, "BuildOverviews reports an error" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1122 - assert cs == exp_cs, 'bad checksum' + assert cs == exp_cs, "bad checksum" ds = None @@ -567,44 +617,47 @@ def test_tiff_ovr_16(both_endian): ############################################################################### # Test mode resampling on a byte dataset + def test_tiff_ovr_17(both_endian): - shutil.copyfile('data/byte.tif', 'tmp/ovr17.tif') + shutil.copyfile("data/byte.tif", "tmp/ovr17.tif") - ds = gdal.Open('tmp/ovr17.tif') + ds = gdal.Open("tmp/ovr17.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - err = ds.BuildOverviews('MODE', overviewlist=[2, 4]) + err = ds.BuildOverviews("MODE", overviewlist=[2, 4]) - assert err == 0, 'BuildOverviews reports an error' + assert err == 0, "BuildOverviews reports an error" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1122 - assert cs == exp_cs, 'bad checksum' + 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') + shutil.copyfile("data/test_average_palette.tif", "tmp/ovr18.tif") - ds = gdal.Open('tmp/ovr18.tif', gdal.GA_Update) + ds = gdal.Open("tmp/ovr18.tif", gdal.GA_Update) - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - ds.BuildOverviews('MODE', overviewlist=[2]) + 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.' + assert cs == exp_cs, "got wrong overview checksum." + ############################################################################### # Check that we can create overviews on a newly create file (#2621) @@ -612,17 +665,18 @@ def test_tiff_ovr_18(both_endian): def test_tiff_ovr_19(both_endian): - ds = gdal.GetDriverByName('GTiff').Create('tmp/ovr19.tif', 100, 100, 1) + 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.BuildOverviews("NEAR", overviewlist=[2]) ds.FlushCache() - ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + ds.BuildOverviews("NEAR", overviewlist=[2, 4]) - assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ - 'Overview could not be generated' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 2 + ), "Overview could not be generated" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 2500 @@ -636,56 +690,65 @@ def test_tiff_ovr_19(both_endian): ############################################################################### # Test BIGTIFF_OVERVIEW=YES option + def test_tiff_ovr_20(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr20.tif', 100, 100, 1) + ds = gdaltest.tiff_drv.Create("tmp/ovr20.tif", 100, 100, 1) ds = None - ds = gdal.Open('tmp/ovr20.tif') + ds = gdal.Open("tmp/ovr20.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - with gdaltest.config_option('BIGTIFF_OVERVIEW', 'YES'): - ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) + with gdaltest.config_option("BIGTIFF_OVERVIEW", "YES"): + ds.BuildOverviews("NEAREST", overviewlist=[2, 4]) ds = None - fileobj = open('tmp/ovr20.tif.ovr', mode='rb') - binvalues = array.array('b') + 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))) + 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): - ds = gdaltest.tiff_drv.Create('tmp/ovr21.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) + ds = gdaltest.tiff_drv.Create( + "tmp/ovr21.tif", 170000, 100000, 1, options=["SPARSE_OK=YES"] + ) ds = None - ds = gdal.Open('tmp/ovr21.tif') + ds = gdal.Open("tmp/ovr21.tif") - assert ds is not None, 'Failed to open test dataset.' + 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.BuildOverviews("NONE", overviewlist=[2]) ds = None - fileobj = open('tmp/ovr21.tif.ovr', mode='rb') - binvalues = array.array('b') + 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))) + 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 @@ -693,18 +756,20 @@ def test_tiff_ovr_21(both_endian): def test_tiff_ovr_22(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr22.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) + ds = gdaltest.tiff_drv.Create( + "tmp/ovr22.tif", 170000, 100000, 1, options=["SPARSE_OK=YES"] + ) ds = None - ds = gdal.Open('tmp/ovr22.tif') + ds = gdal.Open("tmp/ovr22.tif") - assert ds is not None, 'Failed to open test dataset.' + 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 - with gdaltest.config_option('BIGTIFF_OVERVIEW', 'NO'): + with gdaltest.config_option("BIGTIFF_OVERVIEW", "NO"): with gdaltest.error_handler(): - err = ds.BuildOverviews('NONE', overviewlist=[2]) + err = ds.BuildOverviews("NONE", overviewlist=[2]) ds = None @@ -712,6 +777,7 @@ def test_tiff_ovr_22(both_endian): return pytest.fail() + ############################################################################### # Same as before, but BigTIFF might be not needed as we use a compression # method for the overviews. @@ -719,27 +785,32 @@ def test_tiff_ovr_22(both_endian): def test_tiff_ovr_23(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr23.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) + ds = gdaltest.tiff_drv.Create( + "tmp/ovr23.tif", 170000, 100000, 1, options=["SPARSE_OK=YES"] + ) ds = None - ds = gdal.Open('tmp/ovr23.tif') + ds = gdal.Open("tmp/ovr23.tif") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - with gdaltest.config_option('BIGTIFF_OVERVIEW', 'NO'): - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - ds.BuildOverviews('NONE', overviewlist=[2]) + with gdaltest.config_option("BIGTIFF_OVERVIEW", "NO"): + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + ds.BuildOverviews("NONE", overviewlist=[2]) ds = None - fileobj = open('tmp/ovr23.tif.ovr', mode='rb') - binvalues = array.array('b') + 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))) + assert not ( + (binvalues[2] != 0x2A or binvalues[3] != 0) + and (binvalues[3] != 0x2A or binvalues[2] != 0) + ) + ############################################################################### # Test BIGTIFF_OVERVIEW=IF_SAFER option @@ -747,28 +818,33 @@ def test_tiff_ovr_23(both_endian): def test_tiff_ovr_24(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr24.tif', 85000, 100000, 1, options=['SPARSE_OK=YES']) + ds = gdaltest.tiff_drv.Create( + "tmp/ovr24.tif", 85000, 100000, 1, options=["SPARSE_OK=YES"] + ) ds = None - ds = gdal.Open('tmp/ovr24.tif') + ds = gdal.Open("tmp/ovr24.tif") - assert ds is not None, 'Failed to open test dataset.' + 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 - with gdaltest.config_option('BIGTIFF_OVERVIEW', 'IF_SAFER'): - ds.BuildOverviews('NONE', overviewlist=[16]) + with gdaltest.config_option("BIGTIFF_OVERVIEW", "IF_SAFER"): + ds.BuildOverviews("NONE", overviewlist=[16]) ds = None - fileobj = open('tmp/ovr24.tif.ovr', mode='rb') - binvalues = array.array('b') + 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))) + 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 @@ -777,13 +853,13 @@ def test_tiff_ovr_24(both_endian): def test_tiff_ovr_25(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr25.tif', 100, 100, 1) + 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.BuildOverviews("NEAR", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr25.tif') + ds = gdal.Open("tmp/ovr25.tif") assert ds is not None assert ds.GetRasterBand(1).Checksum() == 10000 @@ -792,35 +868,39 @@ def test_tiff_ovr_25(both_endian): 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 = gdaltest.tiff_drv.Create("tmp/ovr26.tif", 100, 100, 1) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).FlushCache() - ds.BuildOverviews('NEAR', overviewlist=[2]) + 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') + 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 = 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]) + 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) @@ -828,31 +908,40 @@ def test_tiff_ovr_27(both_endian): 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') + 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.' + 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.' + 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.' + 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. @@ -860,32 +949,33 @@ def test_tiff_ovr_28(both_endian): 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 = 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.' + assert open("tmp/ovr29.png.ovr") is not None, "Did not expected .ovr file." - png_ds = gdal.Open('tmp/ovr29.png') + png_ds = gdal.Open("tmp/ovr29.png") - assert png_ds.GetRasterBand(1).GetOverviewCount() == 1, 'did not find overview' + 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.' + assert png_ds.GetRasterBand(1).GetOverviewCount() == 0, "delete overview failed." png_ds = None - png_ds = gdal.Open('tmp/ovr29.png') + png_ds = gdal.Open("tmp/ovr29.png") - assert png_ds.GetRasterBand(1).GetOverviewCount() == 0, 'delete overview failed.' + assert png_ds.GetRasterBand(1).GetOverviewCount() == 0, "delete overview failed." png_ds = None - assert not os.path.exists('tmp/ovr29.png.ovr') + assert not os.path.exists("tmp/ovr29.png.ovr") + + gdal.GetDriverByName("PNG").Delete("tmp/ovr29.png") - gdal.GetDriverByName('PNG').Delete('tmp/ovr29.png') ############################################################################### # Test fix for #2988. @@ -893,26 +983,27 @@ def test_tiff_ovr_29(both_endian): def test_tiff_ovr_30(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr30.tif', 20, 20, 1) + 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 = 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 = 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 = 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 + ds = gdal.Open("tmp/ovr30.tif") + assert ds.GetProjectionRef().find("4326") != -1 + ############################################################################### # Test fix for #3033 @@ -920,18 +1011,21 @@ def test_tiff_ovr_30(both_endian): def test_tiff_ovr_31(both_endian): - ds = gdaltest.tiff_drv.Create('tmp/ovr31.tif', 100, 100, 4) + 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]) + 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)) + assert cs == expected_cs, "Checksum is %d. Expected checksum is %d" % ( + cs, + expected_cs, + ) ds = None + ############################################################################### # Test Cubic sampling. @@ -939,178 +1033,239 @@ def test_tiff_ovr_31(both_endian): def test_tiff_ovr_32(both_endian): # 4 regular band - shutil.copyfile('data/stefan_full_rgba_photometric_rgb.tif', 'tmp/ovr32.tif') + 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]) + 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)) + 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)) + 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') + 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_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]) + 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) + 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)) + 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') + 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') + shutil.copyfile("data/stefan_full_rgba_photometric_rgb.tif", "tmp/ovr32.tif") - ds = gdal.Open('tmp/ovr32.tif') - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - with gdaltest.config_option('INTERLEAVE_OVERVIEW', 'PIXEL'): - ds.BuildOverviews('cubic', overviewlist=[2, 5]) + ds = gdal.Open("tmp/ovr32.tif") + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + with gdaltest.config_option("INTERLEAVE_OVERVIEW", "PIXEL"): + 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)) + 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)) + 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') + gdaltest.tiff_drv.Delete("tmp/ovr32.tif") # 3 bands + alpha - shutil.copyfile('data/stefan_full_rgba.tif', 'tmp/ovr32.tif') + 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]) + ds = gdal.Open("tmp/ovr32.tif", gdal.GA_Update) + ds.BuildOverviews("cubic", overviewlist=[2, 5]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs_band1_overview0 = 21296 - assert cs == expected_cs_band1_overview0, \ - ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs_band1_overview0)) + assert ( + cs == expected_cs_band1_overview0 + ), "Checksum is %d. Expected checksum is %d for overview 0." % ( + cs, + expected_cs_band1_overview0, + ) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() expected_cs_band3_overview1 = 1994 - assert cs == expected_cs_band3_overview1, \ - ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs_band3_overview1)) + assert ( + cs == expected_cs_band3_overview1 + ), "Checksum is %d. Expected checksum is %d for overview 1." % ( + cs, + expected_cs_band3_overview1, + ) ds = None - gdaltest.tiff_drv.Delete('tmp/ovr32.tif') + 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_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]) + 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) + 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)) + 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') + 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]) + 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() - assert cs == expected_cs_band1_overview0, \ - ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs_band1_overview0)) + assert ( + cs == expected_cs_band1_overview0 + ), "Checksum is %d. Expected checksum is %d for overview 0." % ( + cs, + expected_cs_band1_overview0, + ) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() - assert cs == expected_cs_band3_overview1, \ - ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs_band3_overview1)) + assert ( + cs == expected_cs_band3_overview1 + ), "Checksum is %d. Expected checksum is %d for overview 1." % ( + cs, + expected_cs_band3_overview1, + ) ds = None - gdaltest.tiff_drv.Delete('tmp/ovr32.tif') + 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') + os.remove("tmp/ovr33.tif.ovr") except OSError: pass - ds = gdaltest.tiff_drv.Create('tmp/ovr33.tif', 1, 1, 1) + 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 = gdal.Open("tmp/ovr33.tif") + ds.BuildOverviews("NEAREST", overviewlist=[2, 4]) ds = None - gdaltest.tiff_drv.Delete('tmp/ovr33.tif') + 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_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') + 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.') + if data != " ".encode("ascii"): + print("[%s]" % data) + pytest.fail("did not get expected cleared overview.") + + gdaltest.tiff_drv.Delete("tmp/ovr34.tif") - gdaltest.tiff_drv.Delete('tmp/ovr34.tif') ############################################################################### # Confirm that overviews are used on a Band.RasterIO(). @@ -1118,22 +1273,23 @@ def test_tiff_ovr_34(both_endian): 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_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') + 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.') + if data != " ".encode("ascii"): + print("[%s]" % data) + pytest.fail("did not get expected cleared overview.") + + gdaltest.tiff_drv.Delete("tmp/ovr35.tif") - gdaltest.tiff_drv.Delete('tmp/ovr35.tif') ############################################################################### # Confirm that overviews are used on a Band.RasterIO() when using BlockBasedRasterIO() (#3124) @@ -1141,37 +1297,39 @@ def test_tiff_ovr_35(both_endian): def test_tiff_ovr_36(both_endian): - with gdaltest.config_option('GDAL_FORCE_CACHING', 'YES'): + with gdaltest.config_option("GDAL_FORCE_CACHING", "YES"): ret = test_tiff_ovr_35(both_endian) return ret + ############################################################################### # Test PREDICTOR_OVERVIEW=2 option. (#3414) def test_tiff_ovr_37(both_endian): - shutil.copy('../gdrivers/data/n43.dt0', 'tmp/ovr37.dt0') + shutil.copy("../gdrivers/data/n43.dt0", "tmp/ovr37.dt0") - ds = gdal.Open('tmp/ovr37.dt0') + ds = gdal.Open("tmp/ovr37.dt0") - assert ds is not None, 'Failed to open test dataset.' + assert ds is not None, "Failed to open test dataset." - with gdaltest.config_option('PREDICTOR_OVERVIEW', '2'): - with gdaltest.config_option('COMPRESS_OVERVIEW', 'LZW'): - ds.BuildOverviews('NEAR', overviewlist=[2]) + with gdaltest.config_option("PREDICTOR_OVERVIEW", "2"): + with gdaltest.config_option("COMPRESS_OVERVIEW", "LZW"): + ds.BuildOverviews("NEAR", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr37.dt0') + ds = gdal.Open("tmp/ovr37.dt0") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 45378, 'got wrong overview checksum.' + assert cs == 45378, "got wrong overview checksum." ds = None - predictor2_size = os.stat('tmp/ovr37.dt0.ovr')[stat.ST_SIZE] + predictor2_size = os.stat("tmp/ovr37.dt0.ovr")[stat.ST_SIZE] # 3789 : on little-endian host # 3738 : on big-endian host - assert predictor2_size in (3789, 3738), 'did not get expected file size.' + assert predictor2_size in (3789, 3738), "did not get expected file size." + ############################################################################### # Test that the predictor flag gets well propagated to internal overviews @@ -1179,14 +1337,17 @@ def test_tiff_ovr_37(both_endian): def test_tiff_ovr_38(both_endian): - src_ds = gdal.Open('../gdrivers/data/n43.dt0') - ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr38.tif', src_ds, options=['COMPRESS=LZW', 'PREDICTOR=2']) + 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] + file_size = os.stat("tmp/ovr38.tif")[stat.ST_SIZE] + + assert file_size <= 21000, "did not get expected file size." - assert file_size <= 21000, 'did not get expected file size.' ############################################################################### # Test external overviews on all datatypes @@ -1194,35 +1355,41 @@ def test_tiff_ovr_38(both_endian): 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)) + 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') + os.remove("tmp/ovr39.tif.ovr") except OSError: pass - ds = gdal.Open('tmp/ovr39.tif') - ds.BuildOverviews('NEAREST', overviewlist=[2]) + ds = gdal.Open("tmp/ovr39.tif") + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr39.tif.ovr') + ds = gdal.Open("tmp/ovr39.tif.ovr") ovr_datatype = ds.GetRasterBand(1).DataType ds = None - assert datatype == ovr_datatype, 'did not get expected datatype' + assert datatype == ovr_datatype, "did not get expected datatype" - ds = gdal.Open('tmp/ovr39.tif') + ds = gdal.Open("tmp/ovr39.tif") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None @@ -1231,8 +1398,11 @@ def test_tiff_ovr_39(both_endian): else: expected_cs = 1087 - assert cs == expected_cs, \ - ('did not get expected checksum for datatype %s' % gdal.GetDataTypeName(datatype)) + assert ( + cs == expected_cs + ), "did not get expected checksum for datatype %s" % gdal.GetDataTypeName( + datatype + ) ############################################################################### @@ -1241,21 +1411,22 @@ def test_tiff_ovr_39(both_endian): def test_tiff_ovr_40(both_endian): - shutil.copyfile('data/oddsize_1bit2b.tif', 'tmp/ovr40.tif') + shutil.copyfile("data/oddsize_1bit2b.tif", "tmp/ovr40.tif") - wrk_ds = gdal.Open('tmp/ovr40.tif') + wrk_ds = gdal.Open("tmp/ovr40.tif") - assert wrk_ds is not None, 'Failed to open test dataset.' + assert wrk_ds is not None, "Failed to open test dataset." - wrk_ds.BuildOverviews('AVERAGE_BIT2GRAYSCALE', overviewlist=[2, 4]) + wrk_ds.BuildOverviews("AVERAGE_BIT2GRAYSCALE", overviewlist=[2, 4]) wrk_ds = None - wrk_ds = gdal.Open('tmp/ovr40.tif') + 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.' + 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) @@ -1264,46 +1435,53 @@ def test_tiff_ovr_40(both_endian): total = float(sum(ovimage)) average = total / pix_count exp_average = 154.0992 - assert average == pytest.approx(exp_average, abs=0.1), 'got wrong average for overview image' + assert average == pytest.approx( + exp_average, abs=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) + ovimage = frband.ReadRaster( + 0, 0, frband.XSize, frband.YSize, ovband.XSize, ovband.YSize + ) pix_count = ovband.XSize * ovband.YSize total = float(sum(ovimage)) average = total / pix_count exp_average = 0.6096 - assert average == pytest.approx(exp_average, abs=0.01), 'got wrong average for downsampled image' + assert average == pytest.approx( + exp_average, abs=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') + shutil.copyfile("data/oddsize_1bit2b.tif", "tmp/ovr41.tif") - ds = gdal.Open('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.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') + ds = gdal.Open("tmp/ovr41.tif") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None - assert cs == 1496, 'did not get expected checksum' + assert cs == 1496, "did not get expected checksum" + ############################################################################### # Test external overviews on dataset with color table @@ -1317,73 +1495,79 @@ def test_tiff_ovr_42(both_endian): for i, data in enumerate(ct_data): ct.SetColorEntry(i, data) - ds = gdaltest.tiff_drv.Create('tmp/ovr42.tif', 1, 1) + 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 = gdal.Open("tmp/ovr42.tif") + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr42.tif.ovr') + 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.' + 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) -@pytest.mark.skipif('SKIP_TIFF_JPEG12' in os.environ, reason='Crashes on build-windows-msys2-mingw') +@pytest.mark.skipif( + "SKIP_TIFF_JPEG12" in os.environ, reason="Crashes on build-windows-msys2-mingw" +) def test_tiff_ovr_43(both_endian): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - with gdaltest.config_option('CPL_ACCUM_ERROR_MSG', 'ON'): + with gdaltest.config_option("CPL_ACCUM_ERROR_MSG", "ON"): gdal.ErrorReset() with gdaltest.error_handler(): try: - ds = gdal.Open('data/mandrilmini_12bitjpeg.tif') + ds = gdal.Open("data/mandrilmini_12bitjpeg.tif") ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) except: ds = None - if gdal.GetLastErrorMsg().find('Unsupported JPEG data precision 12') != -1: - pytest.skip('12bit jpeg not available') + if gdal.GetLastErrorMsg().find("Unsupported JPEG data precision 12") != -1: + pytest.skip("12bit jpeg not available") - ds = gdaltest.tiff_drv.Create('tmp/ovr43.tif', 16, 16, 1, gdal.GDT_UInt16) + 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') + os.remove("tmp/ovr43.tif.ovr") except OSError: pass - ds = gdal.Open('tmp/ovr43.tif') - with gdaltest.config_option('COMPRESS_OVERVIEW', 'JPEG'): - ds.BuildOverviews('NEAREST', overviewlist=[2]) + ds = gdal.Open("tmp/ovr43.tif") + with gdaltest.config_option("COMPRESS_OVERVIEW", "JPEG"): + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr43.tif.ovr') - md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') + 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 "NBITS" in md and md["NBITS"] == "12", "did not get expected NBITS" - assert cs == 642, 'did not get expected checksum' + assert cs == 642, "did not get expected checksum" + + gdaltest.tiff_drv.Delete("tmp/ovr43.tif") - gdaltest.tiff_drv.Delete('tmp/ovr43.tif') ############################################################################### # Test that we can change overview block size through GDAL_TIFF_OVR_BLOCKSIZE configuration @@ -1392,23 +1576,24 @@ def test_tiff_ovr_43(both_endian): def test_tiff_ovr_44(both_endian): - shutil.copyfile('data/byte.tif', 'tmp/ovr44.tif') - with gdaltest.config_option('GDAL_TIFF_OVR_BLOCKSIZE', '256'): - ds = gdal.Open('tmp/ovr44.tif', gdal.GA_Update) + shutil.copyfile("data/byte.tif", "tmp/ovr44.tif") + with gdaltest.config_option("GDAL_TIFF_OVR_BLOCKSIZE", "256"): + ds = gdal.Open("tmp/ovr44.tif", gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr44.tif') + ds = gdal.Open("tmp/ovr44.tif") ovr_band = ds.GetRasterBand(1).GetOverview(0) - if 'GetBlockSize' in dir(gdal.Band): + if "GetBlockSize" in dir(gdal.Band): (blockx, blocky) = ovr_band.GetBlockSize() - assert blockx == 256 and blocky == 256, 'did not get expected block size' + 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') + gdaltest.tiff_drv.Delete("tmp/ovr44.tif") + + assert cs == 1087, "did not get expected checksum" - assert cs == 1087, 'did not get expected checksum' ############################################################################### # Same as tiff_ovr_44, but with external overviews @@ -1416,37 +1601,43 @@ def test_tiff_ovr_44(both_endian): def test_tiff_ovr_45(both_endian): - shutil.copyfile('data/byte.tif', 'tmp/ovr45.tif') - with gdaltest.config_option('GDAL_TIFF_OVR_BLOCKSIZE', '256'): - ds = gdal.Open('tmp/ovr45.tif', gdal.GA_ReadOnly) + shutil.copyfile("data/byte.tif", "tmp/ovr45.tif") + with gdaltest.config_option("GDAL_TIFF_OVR_BLOCKSIZE", "256"): + ds = gdal.Open("tmp/ovr45.tif", gdal.GA_ReadOnly) ds.BuildOverviews(overviewlist=[2]) ds = None - ds = gdal.Open('tmp/ovr45.tif.ovr') + ds = gdal.Open("tmp/ovr45.tif.ovr") ovr_band = ds.GetRasterBand(1) - if 'GetBlockSize' in dir(gdal.Band): + if "GetBlockSize" in dir(gdal.Band): (blockx, blocky) = ovr_band.GetBlockSize() - assert blockx == 256 and blocky == 256, 'did not get expected block size' + 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') + gdaltest.tiff_drv.Delete("tmp/ovr45.tif") + + assert cs == 1087, "did not get expected checksum" - assert cs == 1087, 'did not get expected checksum' ############################################################################### # Test that SPARSE_OK creation option propagates on internal overviews -@pytest.mark.parametrize("apply_sparse", [False,True]) +@pytest.mark.parametrize("apply_sparse", [False, True]) def test_tiff_ovr_propagate_sparse_ok_creation_option(apply_sparse): - filename = '/vsimem/test_tiff_ovr_propagate_sparse_ok_creation_option.tif' - ds = gdaltest.tiff_drv.Create(filename, 100, 100, options=['SPARSE_OK=YES'] if apply_sparse else []) - ds.BuildOverviews('NEAREST', overviewlist=[2]) + filename = "/vsimem/test_tiff_ovr_propagate_sparse_ok_creation_option.tif" + ds = gdaltest.tiff_drv.Create( + filename, 100, 100, options=["SPARSE_OK=YES"] if apply_sparse else [] + ) + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None ds = gdal.Open(filename) - has_block = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is not None + has_block = ( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) if apply_sparse: assert not has_block else: @@ -1455,20 +1646,28 @@ def test_tiff_ovr_propagate_sparse_ok_creation_option(apply_sparse): gdaltest.tiff_drv.Delete(filename) + ############################################################################### # Test that SPARSE_OK open option propagates on internal overviews -@pytest.mark.parametrize("apply_sparse", [False,True]) +@pytest.mark.parametrize("apply_sparse", [False, True]) def test_tiff_ovr_propagate_sparse_ok_open_option_internal(apply_sparse): - filename = '/vsimem/test_tiff_ovr_propagate_sparse_ok_open_option_internal.tif' + filename = "/vsimem/test_tiff_ovr_propagate_sparse_ok_open_option_internal.tif" gdaltest.tiff_drv.Create(filename, 100, 100) - ds = gdal.OpenEx(filename, gdal.OF_UPDATE | gdal.OF_RASTER, open_options=['SPARSE_OK=YES'] if apply_sparse else []) - ds.BuildOverviews('NEAREST', overviewlist=[2]) + ds = gdal.OpenEx( + filename, + gdal.OF_UPDATE | gdal.OF_RASTER, + open_options=["SPARSE_OK=YES"] if apply_sparse else [], + ) + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None ds = gdal.Open(filename) - has_block = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is not None + has_block = ( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) if apply_sparse: assert not has_block else: @@ -1477,20 +1676,24 @@ def test_tiff_ovr_propagate_sparse_ok_open_option_internal(apply_sparse): gdaltest.tiff_drv.Delete(filename) + ############################################################################### # Test that SPARSE_OK open option propagates on internal overviews -@pytest.mark.parametrize("apply_sparse", [False,True]) +@pytest.mark.parametrize("apply_sparse", [False, True]) def test_tiff_ovr_propagate_sparse_ok_open_option_external(apply_sparse): - filename = '/vsimem/test_tiff_ovr_propagate_sparse_ok_open_option_external.tif' + filename = "/vsimem/test_tiff_ovr_propagate_sparse_ok_open_option_external.tif" gdaltest.tiff_drv.Create(filename, 100, 100) - ds = gdal.OpenEx(filename, open_options = ['SPARSE_OK=YES'] if apply_sparse else []) - ds.BuildOverviews('NEAREST', overviewlist=[2]) + ds = gdal.OpenEx(filename, open_options=["SPARSE_OK=YES"] if apply_sparse else []) + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None ds = gdal.Open(filename) - has_block = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is not None + has_block = ( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) if apply_sparse: assert not has_block else: @@ -1499,21 +1702,25 @@ def test_tiff_ovr_propagate_sparse_ok_open_option_external(apply_sparse): gdaltest.tiff_drv.Delete(filename) + ############################################################################### # Test SPARSE_OK_OVERVIEW on internal overview -@pytest.mark.parametrize("apply_sparse", [False,True]) +@pytest.mark.parametrize("apply_sparse", [False, True]) def test_tiff_ovr_sparse_ok_internal_overview(apply_sparse): - filename = '/vsimem/test_tiff_ovr_sparse_ok_internal_overview.tif' + filename = "/vsimem/test_tiff_ovr_sparse_ok_internal_overview.tif" gdaltest.tiff_drv.Create(filename, 100, 100) ds = gdal.Open(filename, gdal.GA_Update) - with gdaltest.config_options({'SPARSE_OK_OVERVIEW': 'YES'} if apply_sparse else {}): - ds.BuildOverviews('NEAREST', overviewlist=[2]) + with gdaltest.config_options({"SPARSE_OK_OVERVIEW": "YES"} if apply_sparse else {}): + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None ds = gdal.Open(filename) - has_block = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is not None + has_block = ( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) if apply_sparse: assert not has_block else: @@ -1522,21 +1729,25 @@ def test_tiff_ovr_sparse_ok_internal_overview(apply_sparse): gdaltest.tiff_drv.Delete(filename) + ############################################################################### # Test SPARSE_OK_OVERVIEW on external overview -@pytest.mark.parametrize("apply_sparse", [False,True]) +@pytest.mark.parametrize("apply_sparse", [False, True]) def test_tiff_ovr_sparse_ok_external_overview(apply_sparse): - filename = '/vsimem/test_tiff_ovr_sparse_ok_external_overview.tif' + filename = "/vsimem/test_tiff_ovr_sparse_ok_external_overview.tif" gdaltest.tiff_drv.Create(filename, 100, 100) ds = gdal.Open(filename) - with gdaltest.config_options({'SPARSE_OK_OVERVIEW': 'YES'} if apply_sparse else {}): - ds.BuildOverviews('NEAREST', overviewlist=[2]) + with gdaltest.config_options({"SPARSE_OK_OVERVIEW": "YES"} if apply_sparse else {}): + ds.BuildOverviews("NEAREST", overviewlist=[2]) ds = None ds = gdal.Open(filename) - has_block = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") is not None + has_block = ( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("BLOCK_OFFSET_0_0", "TIFF") + is not None + ) if apply_sparse: assert not has_block else: @@ -1556,86 +1767,103 @@ def test_tiff_ovr_46(): pytest.skip() # Test NEAREST - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test AVERAGE in optimized case (x2 reduction) - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test AVERAGE in un-optimized case (x3 reduction) - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test AVERAGE in un-optimized case (color table) - with gdaltest.config_option('GTIFF_DONT_WRITE_BLOCKS', 'YES'): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) + with gdaltest.config_option("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.BuildOverviews("AVERAGE", overviewlist=[2]) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test GAUSS - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test GAUSS with color table - with gdaltest.config_option('GTIFF_DONT_WRITE_BLOCKS', 'YES'): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) + with gdaltest.config_option("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.BuildOverviews("GAUSS", overviewlist=[2]) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test MODE - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_ovr_46.tif") # Test CUBIC - with gdaltest.config_option('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]) + with gdaltest.config_option("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 - gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') + 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) + mem_drv = gdal.GetDriverByName("MEM") + mem_ds = mem_drv.Create("", 852, 549, 3) for i in range(1, 4): band = mem_ds.GetRasterBand(i) @@ -1653,7 +1881,8 @@ def test_tiff_ovr_47(both_endian): gdal.Unlink("/vsimem/tiff_ovr_47.tif") - assert cs == 35721, 'did not get expected checksum' + assert cs == 35721, "did not get expected checksum" + ############################################################################### # Test that we don't average 0's in alpha band @@ -1661,25 +1890,25 @@ def test_tiff_ovr_47(both_endian): 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]) + 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') + 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') - with gdaltest.config_option('GDAL_OVR_PROPAGATE_NODATA', 'YES'): - ds.BuildOverviews('AVERAGE', [2]) + shutil.copy("data/rgba_with_alpha_0_and_255.tif", "tmp") + ds = gdal.Open("tmp/rgba_with_alpha_0_and_255.tif") + with gdaltest.config_option("GDAL_OVR_PROPAGATE_NODATA", "YES"): + ds.BuildOverviews("AVERAGE", [2]) ds = None - ds = gdal.Open('tmp/rgba_with_alpha_0_and_255.tif.ovr') + 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 @@ -1691,21 +1920,22 @@ def test_tiff_ovr_48(both_endian): def test_tiff_ovr_49(both_endian): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_ovr_49.tif', 1023, 1023, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/tiff_ovr_49.tif", 1023, 1023, 1) ds.GetRasterBand(1).Fill(0) - c = '\xFF' + 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') - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds = gdal.Open("/vsimem/tiff_ovr_49.tif") + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + ds.BuildOverviews("AVERAGE", overviewlist=[2]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_49.tif.ovr') + 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_ovr_49.tif") + ############################################################################### # Test overviews when X dimension is smaller than Y (#5794) @@ -1713,14 +1943,16 @@ def test_tiff_ovr_49(both_endian): def test_tiff_ovr_50(both_endian): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_ovr_50.tif', 6, 8192, 3, - options=['COMPRESS=DEFLATE']) + 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.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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_ovr_50.tif") + ############################################################################### # Test average overview on a color palette with nodata values (#6371) @@ -1728,20 +1960,21 @@ def test_tiff_ovr_50(both_endian): def test_tiff_ovr_51(): - src_ds = gdal.Open('data/stefan_full_rgba_pct32.png') + 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 = 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') + 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') + gdal.GetDriverByName("PNG").Delete("/vsimem/tiff_ovr_51.png") + ############################################################################### # Test unsorted external overview building (#6617) @@ -1749,44 +1982,45 @@ def test_tiff_ovr_51(): def test_tiff_ovr_52(): - src_ds = gdal.Open('data/byte.tif') + 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) - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - with gdaltest.config_option('INTERLEAVE_OVERVIEW', 'PIXEL'): - ds = gdal.Open('/vsimem/tiff_ovr_52.tif') - ds.BuildOverviews('NEAR', [4]) + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tiff_ovr_52.tif", src_ds) + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + with gdaltest.config_option("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 = gdal.Open("/vsimem/tiff_ovr_52.tif") + ds.BuildOverviews("NEAR", [2]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_52.tif') + 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").Delete("/vsimem/tiff_ovr_52.tif") - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_52.tif', src_ds) - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - with gdaltest.config_option('INTERLEAVE_OVERVIEW', 'PIXEL'): - ds = gdal.Open('/vsimem/tiff_ovr_52.tif') - ds.BuildOverviews('NEAR', [4, 2]) + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tiff_ovr_52.tif", src_ds) + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + with gdaltest.config_option("INTERLEAVE_OVERVIEW", "PIXEL"): + ds = gdal.Open("/vsimem/tiff_ovr_52.tif") + ds.BuildOverviews("NEAR", [4, 2]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_52.tif') + 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").Delete("/vsimem/tiff_ovr_52.tif") + ############################################################################### # Test external overviews building in several steps @@ -1794,50 +2028,51 @@ def test_tiff_ovr_52(): def test_tiff_ovr_53(): - src_ds = gdal.Open('data/byte.tif') + 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]) + 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 = gdal.Open("/vsimem/tiff_ovr_53.tif") + ds.BuildOverviews("NEAR", [4]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_53.tif') + 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_ovr_53.tif") # Compressed code path - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_53.tif', src_ds) - with gdaltest.config_option('COMPRESS_OVERVIEW', 'DEFLATE'): - with gdaltest.config_option('INTERLEAVE_OVERVIEW', 'PIXEL'): - ds = gdal.Open('/vsimem/tiff_ovr_53.tif') - ds.BuildOverviews('NEAR', [2]) + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tiff_ovr_53.tif", src_ds) + with gdaltest.config_option("COMPRESS_OVERVIEW", "DEFLATE"): + with gdaltest.config_option("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 = gdal.Open("/vsimem/tiff_ovr_53.tif") + ds.BuildOverviews("NEAR", [4]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_53.tif') + 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_ovr_53.tif") + ############################################################################### # Test external overviews building in several steps with jpeg compression @@ -1845,52 +2080,58 @@ def test_tiff_ovr_53(): def test_tiff_ovr_54(): - drv = gdal.GetDriverByName('GTiff') + drv = gdal.GetDriverByName("GTiff") md = drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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) - - with gdaltest.config_options({'COMPRESS_OVERVIEW': 'JPEG', - 'PHOTOMETRIC_OVERVIEW': 'YCBCR', - 'INTERLEAVE_OVERVIEW': 'PIXEL'}): - ds = gdal.Open('/vsimem/tiff_ovr_54.tif') - ds.BuildOverviews('AVERAGE', [2]) + src_ds = gdal.Open("../gdrivers/data/small_world.tif") + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tiff_ovr_54.tif", src_ds) + + with gdaltest.config_options( + { + "COMPRESS_OVERVIEW": "JPEG", + "PHOTOMETRIC_OVERVIEW": "YCBCR", + "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 = gdal.Open("/vsimem/tiff_ovr_54.tif") + ds.BuildOverviews("AVERAGE", [4]) ds = None - ds = gdal.Open('/vsimem/tiff_ovr_54.tif') + 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_ovr_54.tif") assert not (cs0 == 0 or cs1 == 0) + ############################################################################### # Test average overview generation with nodata. + def test_tiff_ovr_55(both_endian): - src_ds = gdal.Open('../gdrivers/data/int16.tif') - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_55.tif', src_ds) + src_ds = gdal.Open("../gdrivers/data/int16.tif") + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tiff_ovr_55.tif", src_ds) - wrk_ds = gdal.Open('/vsimem/tiff_ovr_55.tif') - assert wrk_ds is not None, 'Failed to open test dataset.' + wrk_ds = gdal.Open("/vsimem/tiff_ovr_55.tif") + assert wrk_ds is not None, "Failed to open test dataset." - wrk_ds.BuildOverviews('RMS', overviewlist=[2]) + wrk_ds.BuildOverviews("RMS", overviewlist=[2]) wrk_ds = None - wrk_ds = gdal.Open('/vsimem/tiff_ovr_55.tif') + wrk_ds = gdal.Open("/vsimem/tiff_ovr_55.tif") cs = wrk_ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1172 - assert cs == exp_cs, 'got wrong overview checksum.' + assert cs == exp_cs, "got wrong overview checksum." ############################################################################### @@ -1898,86 +2139,107 @@ def test_tiff_ovr_55(both_endian): 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]) + 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]) + 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) + 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]) + 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) + 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) + 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]) + 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]) + 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) + 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']) + 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 = 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 = 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') + 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 + ############################################################################### def test_tiff_ovr_multithreading_multiband(): # Test multithreading through GDALRegenerateOverviewsMultiBand - ds = gdal.Translate('/vsimem/test.tif', 'data/stefan_full_rgba.tif', - creationOptions=['COMPRESS=LZW', 'TILED=YES', - 'BLOCKXSIZE=16', 'BLOCKYSIZE=16']) - with gdaltest.config_options({'GDAL_NUM_THREADS': '8', - 'GDAL_OVR_CHUNK_MAX_SIZE': '100'}): - ds.BuildOverviews('AVERAGE', [2]) + ds = gdal.Translate( + "/vsimem/test.tif", + "data/stefan_full_rgba.tif", + creationOptions=["COMPRESS=LZW", "TILED=YES", "BLOCKXSIZE=16", "BLOCKYSIZE=16"], + ) + with gdaltest.config_options( + {"GDAL_NUM_THREADS": "8", "GDAL_OVR_CHUNK_MAX_SIZE": "100"} + ): + ds.BuildOverviews("AVERAGE", [2]) ds = None - ds = gdal.Open('/vsimem/test.tif') - assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == [12603, 58561, 36064, 10807] + ds = gdal.Open("/vsimem/test.tif") + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] == [ + 12603, + 58561, + 36064, + 10807, + ] ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### @@ -1985,113 +2247,148 @@ def test_tiff_ovr_multithreading_multiband(): def test_tiff_ovr_multithreading_singleband(): # Test multithreading through GDALRegenerateOverviews - ds = gdal.Translate('/vsimem/test.tif', 'data/stefan_full_rgba.tif', - creationOptions=['INTERLEAVE=BAND']) - with gdaltest.config_options({'GDAL_NUM_THREADS': '8', - 'GDAL_OVR_CHUNKYSIZE': '1'}): - ds.BuildOverviews('AVERAGE', [2, 4]) + ds = gdal.Translate( + "/vsimem/test.tif", + "data/stefan_full_rgba.tif", + creationOptions=["INTERLEAVE=BAND"], + ) + with gdaltest.config_options({"GDAL_NUM_THREADS": "8", "GDAL_OVR_CHUNKYSIZE": "1"}): + ds.BuildOverviews("AVERAGE", [2, 4]) ds = None - ds = gdal.Open('/vsimem/test.tif') - assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == [12603, 58561, 36064, 10807] + ds = gdal.Open("/vsimem/test.tif") + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] == [ + 12603, + 58561, + 36064, + 10807, + ] ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### def test_tiff_ovr_multiband_code_path_degenerate(): - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 5, 6) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 5, 6) ds.GetRasterBand(1).Fill(255) del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) - with gdaltest.config_option('COMPRESS_OVERVIEW', 'LZW'): - ds.BuildOverviews('nearest', overviewlist=[2, 4, 8]) + with gdaltest.config_option("COMPRESS_OVERVIEW", "LZW"): + ds.BuildOverviews("nearest", overviewlist=[2, 4, 8]) assert ds.GetRasterBand(1).GetOverview(0).Checksum() != 0 assert ds.GetRasterBand(1).GetOverview(1).Checksum() != 0 assert ds.GetRasterBand(1).GetOverview(2).Checksum() != 0 del ds - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) + ############################################################################### def test_tiff_ovr_color_table_bug_3336(): - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 242, 10442) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 242, 10442) ct = gdal.ColorTable() - ct.SetColorEntry(255, (255,2552,55)) + ct.SetColorEntry(255, (255, 2552, 55)) ds.GetRasterBand(1).SetRasterColorTable(ct) del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) - assert ds.BuildOverviews('nearest', overviewlist=[32]) == 0 + assert ds.BuildOverviews("nearest", overviewlist=[32]) == 0 del ds - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) + ############################################################################### def test_tiff_ovr_color_table_bug_3336_bis(): - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 128, 12531) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 128, 12531) ct = gdal.ColorTable() - ct.SetColorEntry(255, (255,2552,55)) + ct.SetColorEntry(255, (255, 2552, 55)) ds.GetRasterBand(1).SetRasterColorTable(ct) del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) - assert ds.BuildOverviews('nearest', overviewlist=[128]) == 0 + assert ds.BuildOverviews("nearest", overviewlist=[128]) == 0 del ds - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) + ############################################################################### def test_tiff_ovr_nodata_multiband(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 4, 4, 2, gdal.GDT_Float32) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 4, 4, 2, gdal.GDT_Float32) ds.GetRasterBand(1).SetNoDataValue(-10000) ds.GetRasterBand(1).WriteArray(numpy.array([[0.5, 1.0], [4.5, -10000]])) ds.GetRasterBand(2).SetNoDataValue(-10000) ds.GetRasterBand(2).WriteArray(numpy.array([[-10000, 4.0], [4.5, 0.5]])) ds.FlushCache() - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) ds.FlushCache() - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'Overview could not be generated' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "Overview could not be generated" pix = ds.GetRasterBand(1).GetOverview(0).ReadAsArray(win_xsize=1, win_ysize=1) - assert pix[0,0] == 2.0 + assert pix[0, 0] == 2.0 pix = ds.GetRasterBand(2).GetOverview(0).ReadAsArray(win_xsize=1, win_ysize=1) - assert pix[0,0] == 3.0 + assert pix[0, 0] == 3.0 ds = None + ############################################################################### -@pytest.mark.parametrize("external_ovr", [False,True]) -def test_tiff_ovr_nodata_multiband_interleave_band_non_default_color_interp(external_ovr): + +@pytest.mark.parametrize("external_ovr", [False, True]) +def test_tiff_ovr_nodata_multiband_interleave_band_non_default_color_interp( + external_ovr, +): nodatavalue = -10000 - data = struct.pack('f' * 4 * 4, - 0.5, 0.2, 0.5, 0.2, - 0.2, nodatavalue, 0.2, nodatavalue, - 0.5, 0.2, nodatavalue, nodatavalue, - 0.2, nodatavalue, nodatavalue, nodatavalue) + data = struct.pack( + "f" * 4 * 4, + 0.5, + 0.2, + 0.5, + 0.2, + 0.2, + nodatavalue, + 0.2, + nodatavalue, + 0.5, + 0.2, + nodatavalue, + nodatavalue, + 0.2, + nodatavalue, + nodatavalue, + nodatavalue, + ) numbands = 5 - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create( - temp_path, 4, 4, numbands, gdal.GDT_Float32, - options=['INTERLEAVE=BAND', 'PHOTOMETRIC=MINISBLACK', 'ALPHA=YES']) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create( + temp_path, + 4, + 4, + numbands, + gdal.GDT_Float32, + options=["INTERLEAVE=BAND", "PHOTOMETRIC=MINISBLACK", "ALPHA=YES"], + ) for i in range(1, numbands): ds.GetRasterBand(i).SetColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(i).SetNoDataValue(nodatavalue) @@ -2099,48 +2396,83 @@ def test_tiff_ovr_nodata_multiband_interleave_band_non_default_color_interp(exte ds.GetRasterBand(numbands).SetColorInterpretation(gdal.GCI_AlphaBand) ds.GetRasterBand(numbands).SetNoDataValue(nodatavalue) - ds.GetRasterBand(numbands).WriteRaster(0, 0, 4, 4, struct.pack('f' * 4 * 4, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 0, 0, 0, - 0, 0, 0, 0)) + ds.GetRasterBand(numbands).WriteRaster( + 0, + 0, + 4, + 4, + struct.pack( + "f" * 4 * 4, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ), + ) if external_ovr: ds = None ds = gdal.Open(temp_path) - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) - assert ds.GetRasterBand(1).GetOverview(0).GetColorInterpretation() == gdal.GCI_GreenBand + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) + assert ( + ds.GetRasterBand(1).GetOverview(0).GetColorInterpretation() + == gdal.GCI_GreenBand + ) ds = None ds = gdal.Open(temp_path) - assert ds.GetRasterBand(1).GetOverviewCount() == 2, 'Overview could not be generated' - assert ds.GetRasterBand(1).GetOverview(0).GetColorInterpretation() == gdal.GCI_GreenBand + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 2 + ), "Overview could not be generated" + assert ( + ds.GetRasterBand(1).GetOverview(0).GetColorInterpretation() + == gdal.GCI_GreenBand + ) for i in range(1, numbands): - pix = struct.unpack('f', ds.GetRasterBand(i).GetOverview(1).ReadRaster(0,0,1,1))[0] - assert abs(pix - 0.3) < 0.01, 'Error in band ' + str(i) + pix = struct.unpack( + "f", ds.GetRasterBand(i).GetOverview(1).ReadRaster(0, 0, 1, 1) + )[0] + assert abs(pix - 0.3) < 0.01, "Error in band " + str(i) - pix = struct.unpack('f', ds.GetRasterBand(numbands).GetOverview(1).ReadRaster(0,0,1,1))[0] - assert pix == 255, 'Error in alpha band ' + pix = struct.unpack( + "f", ds.GetRasterBand(numbands).GetOverview(1).ReadRaster(0, 0, 1, 1) + )[0] + assert pix == 255, "Error in alpha band " ds = None - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) + ############################################################################### -@pytest.mark.parametrize("external_ovr_and_msk", [False,True]) +@pytest.mark.parametrize("external_ovr_and_msk", [False, True]) def test_tiff_ovr_clean_with_mask(external_ovr_and_msk): - """ Test fix for https://github.com/OSGeo/gdal/issues/1047 """ + """Test fix for https://github.com/OSGeo/gdal/issues/1047""" - filename = '/vsimem/test_tiff_ovr_clean_with_mask.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 10, 10) - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'NO' if external_ovr_and_msk else 'YES'): + filename = "/vsimem/test_tiff_ovr_clean_with_mask.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 10, 10) + with gdaltest.config_option( + "GDAL_TIFF_INTERNAL_MASK", "NO" if external_ovr_and_msk else "YES" + ): ds.CreateMaskBand(gdal.GMF_PER_DATASET) if external_ovr_and_msk: ds = None ds = gdal.Open(filename) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) ds = None # Clear overviews @@ -2150,8 +2482,8 @@ def test_tiff_ovr_clean_with_mask(external_ovr_and_msk): assert ds.GetRasterBand(1).GetMaskBand().GetOverviewCount() == 0 ds = None - assert gdal.VSIStatL(filename + '.ovr') is None - assert gdal.VSIStatL(filename + '.msk.ovr') is None + assert gdal.VSIStatL(filename + ".ovr") is None + assert gdal.VSIStatL(filename + ".msk.ovr") is None # Check after reopening ds = gdal.Open(filename) @@ -2159,7 +2491,7 @@ def test_tiff_ovr_clean_with_mask(external_ovr_and_msk): assert ds.GetRasterBand(1).GetMaskBand().GetOverviewCount() == 0 ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -2170,11 +2502,14 @@ def test_tiff_ovr_clean_with_mask(external_ovr_and_msk): def test_tiff_ovr_fallback_to_multiband_overview_generate(): - filename = '/vsimem/test_tiff_ovr_issue_4932_src.tif' - ds = gdal.Translate(filename, 'data/byte.tif', - options='-b 1 -b 1 -b 1 -co INTERLEAVE=BAND -co TILED=YES -outsize 1024 1024') - with gdaltest.config_option('GDAL_OVR_CHUNK_MAX_SIZE', '1000'): - ds.BuildOverviews('NEAR', overviewlist=[2, 4, 8]) + filename = "/vsimem/test_tiff_ovr_issue_4932_src.tif" + ds = gdal.Translate( + filename, + "data/byte.tif", + options="-b 1 -b 1 -b 1 -co INTERLEAVE=BAND -co TILED=YES -outsize 1024 1024", + ) + with gdaltest.config_option("GDAL_OVR_CHUNK_MAX_SIZE", "1000"): + ds.BuildOverviews("NEAR", overviewlist=[2, 4, 8]) ds = None ds = gdal.Open(filename) @@ -2182,7 +2517,7 @@ def test_tiff_ovr_fallback_to_multiband_overview_generate(): assert cs == 37308 ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -2190,19 +2525,22 @@ def test_tiff_ovr_fallback_to_multiband_overview_generate(): def test_tiff_ovr_int64(): - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 2, 1, 1, gdal.GDT_Int64) - ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, - struct.pack('q' * 2, -10000000000, -10000000000)) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 2, 1, 1, gdal.GDT_Int64) + ds.GetRasterBand(1).WriteRaster( + 0, 0, 2, 1, struct.pack("q" * 2, -10000000000, -10000000000) + ) del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) assert ds.GetRasterBand(1).DataType == gdal.GDT_Int64 - assert ds.BuildOverviews('nearest', overviewlist=[2]) == 0 + assert ds.BuildOverviews("nearest", overviewlist=[2]) == 0 del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) - assert struct.unpack('q', ds.GetRasterBand(1).GetOverview(0).ReadRaster()) == (-10000000000,) + assert struct.unpack("q", ds.GetRasterBand(1).GetOverview(0).ReadRaster()) == ( + -10000000000, + ) del ds - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) ############################################################################### @@ -2210,54 +2548,58 @@ def test_tiff_ovr_int64(): def test_tiff_ovr_uint64(): - temp_path = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(temp_path, 2, 1, 1, gdal.GDT_UInt64) - ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, - struct.pack('Q' * 2, 10000000000, 10000000000)) + temp_path = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(temp_path, 2, 1, 1, gdal.GDT_UInt64) + ds.GetRasterBand(1).WriteRaster( + 0, 0, 2, 1, struct.pack("Q" * 2, 10000000000, 10000000000) + ) del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt64 - assert ds.BuildOverviews('nearest', overviewlist=[2]) == 0 + assert ds.BuildOverviews("nearest", overviewlist=[2]) == 0 del ds ds = gdal.OpenEx(temp_path, gdal.GA_ReadOnly) - assert struct.unpack('Q', ds.GetRasterBand(1).GetOverview(0).ReadRaster()) == (10000000000,) + assert struct.unpack("Q", ds.GetRasterBand(1).GetOverview(0).ReadRaster()) == ( + 10000000000, + ) del ds - gdal.GetDriverByName('GTiff').Delete(temp_path) + gdal.GetDriverByName("GTiff").Delete(temp_path) ############################################################################### # Cleanup + def test_tiff_ovr_cleanup(): - gdaltest.tiff_drv.Delete('tmp/mfloat32.tif') - gdaltest.tiff_drv.Delete('tmp/ovr4.tif') - gdaltest.tiff_drv.Delete('tmp/ovr5.tif') - gdaltest.tiff_drv.Delete('tmp/ovr6.tif') - gdaltest.tiff_drv.Delete('tmp/test_average_palette.tif') - gdaltest.tiff_drv.Delete('tmp/ovr9.tif') - gdaltest.tiff_drv.Delete('tmp/ovr10.tif') - gdaltest.tiff_drv.Delete('tmp/ovr11.tif') - gdaltest.tiff_drv.Delete('tmp/ovr12.tif') - gdaltest.tiff_drv.Delete('tmp/test_gauss_palette.tif') - gdaltest.tiff_drv.Delete('tmp/ovr15.tif') - gdaltest.tiff_drv.Delete('tmp/ovr16.tif') - gdaltest.tiff_drv.Delete('tmp/ovr17.tif') - gdaltest.tiff_drv.Delete('tmp/ovr18.tif') - gdaltest.tiff_drv.Delete('tmp/ovr19.tif') - gdaltest.tiff_drv.Delete('tmp/ovr20.tif') - gdaltest.tiff_drv.Delete('tmp/ovr21.tif') - gdaltest.tiff_drv.Delete('tmp/ovr22.tif') - gdaltest.tiff_drv.Delete('tmp/ovr23.tif') - gdaltest.tiff_drv.Delete('tmp/ovr24.tif') - gdaltest.tiff_drv.Delete('tmp/ovr25.tif') - gdaltest.tiff_drv.Delete('tmp/ovr26.tif') - gdaltest.tiff_drv.Delete('tmp/ovr27.tif') - gdaltest.tiff_drv.Delete('tmp/ovr30.tif') - gdaltest.tiff_drv.Delete('tmp/ovr31.tif') - gdaltest.tiff_drv.Delete('tmp/ovr37.dt0') - gdaltest.tiff_drv.Delete('tmp/ovr38.tif') - gdaltest.tiff_drv.Delete('tmp/ovr39.tif') - gdaltest.tiff_drv.Delete('tmp/ovr40.tif') - gdaltest.tiff_drv.Delete('tmp/ovr41.tif') - gdaltest.tiff_drv.Delete('tmp/ovr42.tif') - gdaltest.tiff_drv.Delete('tmp/rgba_with_alpha_0_and_255.tif') + gdaltest.tiff_drv.Delete("tmp/mfloat32.tif") + gdaltest.tiff_drv.Delete("tmp/ovr4.tif") + gdaltest.tiff_drv.Delete("tmp/ovr5.tif") + gdaltest.tiff_drv.Delete("tmp/ovr6.tif") + gdaltest.tiff_drv.Delete("tmp/test_average_palette.tif") + gdaltest.tiff_drv.Delete("tmp/ovr9.tif") + gdaltest.tiff_drv.Delete("tmp/ovr10.tif") + gdaltest.tiff_drv.Delete("tmp/ovr11.tif") + gdaltest.tiff_drv.Delete("tmp/ovr12.tif") + gdaltest.tiff_drv.Delete("tmp/test_gauss_palette.tif") + gdaltest.tiff_drv.Delete("tmp/ovr15.tif") + gdaltest.tiff_drv.Delete("tmp/ovr16.tif") + gdaltest.tiff_drv.Delete("tmp/ovr17.tif") + gdaltest.tiff_drv.Delete("tmp/ovr18.tif") + gdaltest.tiff_drv.Delete("tmp/ovr19.tif") + gdaltest.tiff_drv.Delete("tmp/ovr20.tif") + gdaltest.tiff_drv.Delete("tmp/ovr21.tif") + gdaltest.tiff_drv.Delete("tmp/ovr22.tif") + gdaltest.tiff_drv.Delete("tmp/ovr23.tif") + gdaltest.tiff_drv.Delete("tmp/ovr24.tif") + gdaltest.tiff_drv.Delete("tmp/ovr25.tif") + gdaltest.tiff_drv.Delete("tmp/ovr26.tif") + gdaltest.tiff_drv.Delete("tmp/ovr27.tif") + gdaltest.tiff_drv.Delete("tmp/ovr30.tif") + gdaltest.tiff_drv.Delete("tmp/ovr31.tif") + gdaltest.tiff_drv.Delete("tmp/ovr37.dt0") + gdaltest.tiff_drv.Delete("tmp/ovr38.tif") + gdaltest.tiff_drv.Delete("tmp/ovr39.tif") + gdaltest.tiff_drv.Delete("tmp/ovr40.tif") + gdaltest.tiff_drv.Delete("tmp/ovr41.tif") + gdaltest.tiff_drv.Delete("tmp/ovr42.tif") + gdaltest.tiff_drv.Delete("tmp/rgba_with_alpha_0_and_255.tif") diff --git a/autotest/gcore/tiff_read.py b/autotest/gcore/tiff_read.py index 20e8b86be204..73688108097a 100755 --- a/autotest/gcore/tiff_read.py +++ b/autotest/gcore/tiff_read.py @@ -28,59 +28,58 @@ ############################################################################### import os -import sys import shutil import struct +import sys +import gdaltest 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), + ("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), - ('gtiff/int64_full_range.tif', 1, 65535), - ('gtiff/uint64_full_range.tif', 1, 1), + ("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), + ("gtiff/int64_full_range.tif", 1, 65535), + ("gtiff/uint64_full_range.tif", 1, 1), ] @pytest.mark.parametrize( - 'filename,band,checksum', + "filename,band,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('GTiff') +@pytest.mark.require_driver("GTiff") def test_tiff_open(filename, band, checksum): - ut = gdaltest.GDALTest('GTiff', filename, band, checksum) + ut = gdaltest.GDALTest("GTiff", filename, band, checksum) ut.testOpen() @@ -91,49 +90,55 @@ def test_tiff_open(filename, band, checksum): def test_tiff_read_off(): # Test absolute/offset directory access. - ds = gdal.Open('GTIFF_DIR:off:408:data/byte.tif') + 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') + 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') + 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' + 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:') + ds = gdal.Open("GTIFF_DIR:") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('GTIFF_DIR:1') + ds = gdal.Open("GTIFF_DIR:1") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('GTIFF_DIR:1:') + 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') + 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') + 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) + ds = gdal.Open("GTIFF_DIR:1:data/byte.tif", gdal.GA_Update) assert ds is not None @@ -141,20 +146,22 @@ def test_tiff_read_off(): # 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') + ds = gdal.Open("data/stefan_full_greyalpha.tif") - assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ - 'Wrong color interpretation (stefan_full_greyalpha).' + 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) + 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 @@ -165,17 +172,18 @@ def test_tiff_check_alpha(): # RGB + alpha - ds = gdal.Open('data/stefan_full_rgba.tif') + ds = gdal.Open("data/stefan_full_rgba.tif") - assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ - 'Wrong color interpretation (stefan_full_rgba).' + 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) + 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] @@ -183,42 +191,48 @@ def test_tiff_check_alpha(): # RGB + undefined - ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') + 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).' + 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) + 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') + 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]" - 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(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand + ), "Wrong color interpretation (alpha)." - 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()) - 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 @@ -226,13 +240,16 @@ def test_tiff_read_cmyk_rgba(): def test_tiff_read_cmyk_raw(): - ds = gdal.Open('GTIFF_RAW:data/rgbsmall_cmyk.tif') + ds = gdal.Open("GTIFF_RAW:data/rgbsmall_cmyk.tif") - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ - 'Wrong color interpretation.' + 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()) - assert ds.GetRasterBand(1).Checksum() == 29430, \ - ('Expected checksum = %d. Got = %d' % (29430, ds.GetRasterBand(1).Checksum())) ############################################################################### # Test reading a OJPEG image @@ -240,32 +257,37 @@ def test_tiff_read_cmyk_raw(): def test_tiff_read_ojpeg(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/zackthecat.tif') + 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: + if ( + gdal.GetLastErrorMsg().find("Cannot open TIFF file due to missing codec") + == 0 + ): pytest.skip() pytest.fail(gdal.GetLastErrorMsg()) - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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)) + assert got_cs == expected_cs, "Expected checksum = %d. Got = %d" % ( + expected_cs, + got_cs, + ) # - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/zackthecat_corrupted.tif') + 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') + print("Should be 0 with internal libtiff") ############################################################################### @@ -275,110 +297,128 @@ def test_tiff_read_ojpeg(): def test_tiff_read_gzip(): try: - os.remove('data/byte.tif.gz.properties') + 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 = 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') + 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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') + gdal.Unlink("data/byte.tgz.properties") + ############################################################################### # Read a .tgz file (with implicit filename) @@ -386,12 +426,14 @@ def test_tiff_read_tgz_1(): 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 = 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') + gdal.Unlink("data/byte.tgz.properties") + ############################################################################### # Check handling of non-degree angular units (#601) @@ -399,11 +441,13 @@ def test_tiff_read_tgz_2(): def test_tiff_grads(): - ds = gdal.Open('data/test_gf.tif') + 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) + 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. @@ -411,18 +455,18 @@ def test_tiff_grads(): def test_tiff_citation(): - build_info = gdal.VersionInfo('BUILD_INFO') - if build_info.find('ESRI_BUILD=YES') == -1: + build_info = gdal.VersionInfo("BUILD_INFO") + if build_info.find("ESRI_BUILD=YES") == -1: pytest.skip() - ds = gdal.Open('data/citation_mixedcase.tif') + 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?') + print("got: ", wkt) + pytest.fail("Erdas citation processing failing?") ############################################################################### @@ -433,36 +477,43 @@ def test_tiff_linearparmunits(): # Test the file with the correct formulation. - ds = gdal.Open('data/spaf27_correct.tif') + 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 fe == pytest.approx(2000000.0, abs=0.001), 'did not get expected false easting (1)' + assert fe == pytest.approx( + 2000000.0, abs=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') + 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 fe == pytest.approx(609601.219202438, abs=0.001), 'did not get expected false easting (2)' + assert fe == pytest.approx( + 609601.219202438, abs=0.001 + ), "did not get expected false easting (2)" # Test the file when using an EPSG code. - ds = gdal.Open('data/spaf27_epsg.tif') + 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 fe == pytest.approx(2000000.0, abs=0.001), 'did not get expected false easting (3)' + assert fe == pytest.approx( + 2000000.0, abs=0.001 + ), "did not get expected false easting (3)" + ############################################################################### # Check that the GTIFF_LINEAR_UNITS handling works properly (#3901) @@ -470,42 +521,49 @@ def test_tiff_linearparmunits(): def test_tiff_linearparmunits2(): - gdal.SetConfigOption('GTIFF_LINEAR_UNITS', 'BROKEN') + gdal.SetConfigOption("GTIFF_LINEAR_UNITS", "BROKEN") # Test the file with the correct formulation. - ds = gdal.Open('data/spaf27_correct.tif') + 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 fe == pytest.approx(6561666.66667, abs=0.001), 'did not get expected false easting (1)' + assert fe == pytest.approx( + 6561666.66667, abs=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') + 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 fe == pytest.approx(2000000.0, abs=0.001), 'did not get expected false easting (2)' + assert fe == pytest.approx( + 2000000.0, abs=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') + 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 fe == pytest.approx(2000000.0, abs=0.001), 'did not get expected false easting (3)' + assert fe == pytest.approx( + 2000000.0, abs=0.001 + ), "did not get expected false easting (3)" + + gdal.SetConfigOption("GTIFF_LINEAR_UNITS", "DEFAULT") - gdal.SetConfigOption('GTIFF_LINEAR_UNITS', 'DEFAULT') ############################################################################### # Test GTiffSplitBitmapBand to treat one row 1bit files as scanline blocks (#2622) @@ -513,14 +571,15 @@ def test_tiff_linearparmunits2(): def test_tiff_g4_split(): - ds = gdal.Open('data/slim_g4.tif') + ds = gdal.Open("data/slim_g4.tif") (_, blocky) = ds.GetRasterBand(1).GetBlockSize() - assert blocky == 1, 'Did not get scanline sized blocks.' + assert blocky == 1, "Did not get scanline sized blocks." cs = ds.GetRasterBand(1).Checksum() - assert cs == 3322, 'Got wrong checksum' + assert cs == 3322, "Got wrong checksum" + ############################################################################### # Test reading a tiff with multiple images in it @@ -529,28 +588,33 @@ def test_tiff_g4_split(): 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())) + 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.' + 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 = 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 = 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) @@ -562,30 +626,36 @@ def test_tiff_vsimem(): except AttributeError: pytest.skip() - content = open('data/byte.tif', mode='rb').read() + content = open("data/byte.tif", mode="rb").read() # Create in-memory file - gdal.FileFromMemBuffer('/vsimem/tiffinmem', content) + 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 = 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 = 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 = 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') + gdal.Unlink("/vsimem/tiffinmem") + ############################################################################### # Test reading a tiff from inside a zip in a memory buffer ! @@ -598,17 +668,19 @@ def test_tiff_vsizip_and_mem(): except AttributeError: pytest.skip() - content = open('data/byte.tif.zip', mode='rb').read() + content = open("data/byte.tif.zip", mode="rb").read() # Create in-memory file - gdal.FileFromMemBuffer('/vsimem/tiffinmem.zip', content) + 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())) + 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') + gdal.Unlink("/vsimem/tiffinmem.zip") + ############################################################################### # Test reading a GeoTIFF with only ProjectedCSTypeGeoKey defined (ticket #3019) @@ -616,58 +688,67 @@ def test_tiff_vsizip_and_mem(): def test_tiff_ProjectedCSTypeGeoKey_only(): - ds = gdal.Open('data/ticket3019.tif') - assert ds.GetProjectionRef().find('WGS 84 / UTM zone 31N') != -1 + 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() in ('LOCAL_CS["unnamed"]', 'LOCAL_CS["unnamed",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]') + ds = gdal.Open("data/GTModelTypeGeoKey_only.tif") + assert ds.GetProjectionRef() in ( + 'LOCAL_CS["unnamed"]', + 'LOCAL_CS["unnamed",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]', + ) ds = None + ############################################################################### # Test reading a 12bit jpeg compressed geotiff. -@pytest.mark.skipif('SKIP_TIFF_JPEG12' in os.environ, reason='Crashes on build-windows-msys2-mingw') +@pytest.mark.skipif( + "SKIP_TIFF_JPEG12" in os.environ, reason="Crashes on build-windows-msys2-mingw" +) def test_tiff_12bitjpeg(): - old_accum = gdal.GetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') - gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') + old_accum = gdal.GetConfigOption("CPL_ACCUM_ERROR_MSG", "OFF") + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "ON") gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") - gdal.Unlink('data/mandrilmini_12bitjpeg.tif.aux.xml') + gdal.Unlink("data/mandrilmini_12bitjpeg.tif.aux.xml") try: - ds = gdal.Open('data/mandrilmini_12bitjpeg.tif') + 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) + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", old_accum) - if gdal.GetLastErrorMsg().find('Unsupported JPEG data precision 12') != -1: - pytest.skip('12bit jpeg not available') + if gdal.GetLastErrorMsg().find("Unsupported JPEG data precision 12") != -1: + pytest.skip("12bit jpeg not available") elif ds is None: - pytest.fail('failed to open 12bit jpeg file with unexpected error') + 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.' + 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') + os.unlink("data/mandrilmini_12bitjpeg.tif.aux.xml") + ############################################################################### # Test that statistics for TIFF files are stored and correctly read from .aux.xml @@ -676,13 +757,13 @@ def test_tiff_12bitjpeg(): def test_tiff_read_stats_from_pam(): try: - os.remove('data/byte.tif.aux.xml') + os.remove("data/byte.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") md = ds.GetRasterBand(1).GetMetadata() - assert 'STATISTICS_MINIMUM' not in md, 'Unexpected presence of STATISTICS_MINIMUM' + assert "STATISTICS_MINIMUM" not in md, "Unexpected presence of STATISTICS_MINIMUM" # Force statistics computation stats = ds.GetRasterBand(1).GetStatistics(0, 1) @@ -690,18 +771,18 @@ def test_tiff_read_stats_from_pam(): ds = None try: - os.stat('data/byte.tif.aux.xml') + os.stat("data/byte.tif.aux.xml") except OSError: - pytest.fail('Expected generation of data/byte.tif.aux.xml') + pytest.fail("Expected generation of data/byte.tif.aux.xml") - ds = gdal.Open('data/byte.tif') + 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') + os.remove("data/byte.tif.aux.xml") except OSError: pass @@ -712,11 +793,12 @@ def test_tiff_read_stats_from_pam(): def test_tiff_read_from_tab(): - ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_read_from_tab.tif', 1, 1) + 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 + f = open("tmp/tiff_read_from_tab.tab", "wt") + f.write( + """!table !version 300 !charset WindowsLatin1 @@ -729,22 +811,30 @@ def test_tiff_read_from_tab(): (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') + 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') + gdal.GetDriverByName("GTiff").Delete("tmp/tiff_read_from_tab.tif") - assert not os.path.exists('tmp/tiff_read_from_tab.tab') + 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 gt == ( + 400000.0, + 25.0, + 0.0, + 1300000.0, + 0.0, + -25.0, + ), "did not get expected geotransform" + + assert "_1936" in wkt, "did not get expected SRS" - assert '_1936' in wkt, 'did not get expected SRS' ############################################################################### # Test reading PixelIsPoint file. @@ -752,28 +842,30 @@ def test_tiff_read_from_tab(): def test_tiff_read_pixelispoint(): - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "FALSE") - ds = gdal.Open('data/byte_point.tif') + 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' + assert gt == gt_expected, "did not get expected geotransform" - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "TRUE") - ds = gdal.Open('data/byte_point.tif') + 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' + assert ( + gt == gt_expected + ), "did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE" + + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", None) - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) ############################################################################### # Test reading a GeoTIFF file with a geomatrix in PixelIsPoint format. @@ -781,28 +873,30 @@ def test_tiff_read_pixelispoint(): def test_tiff_read_geomatrix(): - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "FALSE") - ds = gdal.Open('data/geomatrix.tif') + 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' + assert gt == gt_expected, "did not get expected geotransform" - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "TRUE") - ds = gdal.Open('data/geomatrix.tif') + 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' + assert ( + gt == gt_expected + ), "did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE" + + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", None) - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) ############################################################################### # Test reading a GeoTIFF file with tiepoints in PixelIsPoint format. @@ -810,26 +904,31 @@ def test_tiff_read_geomatrix(): def test_tiff_read_tiepoints_pixelispoint(): - ds = gdal.Open('data/byte_gcp_pixelispoint.tif') - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point' + ds = gdal.Open("data/byte_gcp_pixelispoint.tif") + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point" assert ds.GetGCPCount() == 4 gcp = ds.GetGCPs()[0] - assert (gcp.GCPPixel == pytest.approx(0.5, abs=1e-5) and \ - gcp.GCPLine == pytest.approx(0.5, abs=1e-5) and \ - gcp.GCPX == pytest.approx(-180, abs=1e-5) and \ - gcp.GCPY == pytest.approx(90, abs=1e-5) and \ - gcp.GCPZ == pytest.approx(0, abs=1e-5)) - - with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'YES'): - ds = gdal.Open('data/byte_gcp_pixelispoint.tif') - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point' + assert ( + gcp.GCPPixel == pytest.approx(0.5, abs=1e-5) + and gcp.GCPLine == pytest.approx(0.5, abs=1e-5) + and gcp.GCPX == pytest.approx(-180, abs=1e-5) + and gcp.GCPY == pytest.approx(90, abs=1e-5) + and gcp.GCPZ == pytest.approx(0, abs=1e-5) + ) + + with gdaltest.config_option("GTIFF_POINT_GEO_IGNORE", "YES"): + ds = gdal.Open("data/byte_gcp_pixelispoint.tif") + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point" assert ds.GetGCPCount() == 4 gcp = ds.GetGCPs()[0] - assert (gcp.GCPPixel == pytest.approx(0, abs=1e-5) and \ - gcp.GCPLine == pytest.approx(0, abs=1e-5) and \ - gcp.GCPX == pytest.approx(-180, abs=1e-5) and \ - gcp.GCPY == pytest.approx(90, abs=1e-5) and \ - gcp.GCPZ == pytest.approx(0, abs=1e-5)) + assert ( + gcp.GCPPixel == pytest.approx(0, abs=1e-5) + and gcp.GCPLine == pytest.approx(0, abs=1e-5) + and gcp.GCPX == pytest.approx(-180, abs=1e-5) + and gcp.GCPY == pytest.approx(90, abs=1e-5) + and gcp.GCPZ == pytest.approx(0, abs=1e-5) + ) + ############################################################################### # Test that we don't crash when reading a TIFF with corrupted GeoTIFF tags @@ -837,15 +936,17 @@ def test_tiff_read_tiepoints_pixelispoint(): def test_tiff_read_corrupted_gtiff(): - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/corrupted_gtiff_tags.tif') + 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' + 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 @@ -854,59 +955,65 @@ def test_tiff_read_corrupted_gtiff(): 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' + 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') + 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' + 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') + 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' + 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') + 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') + 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["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" - 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 @@ -915,14 +1022,16 @@ def test_tiff_read_rpc_txt(): def test_tiff_read_rpc_tif(): - ds = gdal.Open('data/byte_rpc.tif') - rpc_md = ds.GetMetadata('RPC') + 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["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" - assert rpc_md['LINE_DEN_COEFF'].find('1 -0.00520769693945429') == 0, \ - 'LINE_DEN_COEFF wrong' ############################################################################### # Test a very small TIFF with only 4 tags : @@ -936,17 +1045,20 @@ def test_tiff_read_rpc_tif(): 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' + 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) + 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())) + 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') + gdal.Unlink("/vsimem/small.tif") + ############################################################################### # Test that we can workaround a DoS with @@ -954,101 +1066,115 @@ def test_tiff_small(): def test_tiff_dos_strip_chop(): - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/tiff_dos_strip_chop.tif') + 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 = 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 = 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 = gdal.Open("data/byte.tif") + exif_md = ds.GetMetadata("EXIF") ds = None - assert (exif_md is None or not exif_md) + 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: + 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' + 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 + 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: + 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' + 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 + 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: + 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'): + 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') + ds = gdal.Open("tmp/cache/imgpb17.tif") gdal.ErrorReset() cs = ds.GetRasterBand(1).Checksum() ds = None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" assert cs == 62628 or cs == 28554 + ############################################################################### # Use GTIFF_DIRECT_IO=YES option combined with /vsicurl to test for multi-range # support @@ -1056,13 +1182,15 @@ def test_tiff_read_online_1(): def test_tiff_read_vsicurl_multirange(): - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() webserver_process = None webserver_port = 0 - (webserver_process, webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (webserver_process, webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if webserver_port == 0: pytest.skip() @@ -1071,74 +1199,82 @@ def test_tiff_read_vsicurl_multirange(): try: filesize = 262976 handler = webserver.SequentialHandler() - handler.add('HEAD', '/utm.tif', 200, {'Content-Length': '%d' % filesize}) + handler.add("HEAD", "/utm.tif", 200, {"Content-Length": "%d" % filesize}) + def method(request): - #sys.stderr.write('%s\n' % str(request.headers)) + # 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]) + 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.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.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: + 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) + 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' + 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 = 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' + 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(): - if not gdaltest.filesystem_supports_sparse_files('tmp'): - ds = gdal.Open('data/huge4GB.tif') + 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+') + shutil.copy("data/huge4GB.tif", "tmp/huge4GB.tif") + f = open("tmp/huge4GB.tif", "rb+") f.seek(65535 * 65535 + 401) - f.write(' '.encode('ascii')) + f.write(" ".encode("ascii")) f.close() - ds = gdal.Open('tmp/huge4GB.tif') + ds = gdal.Open("tmp/huge4GB.tif") if ds is None: - os.remove('tmp/huge4GB.tif') + os.remove("tmp/huge4GB.tif") pytest.fail() ds = None - os.remove('tmp/huge4GB.tif') + os.remove("tmp/huge4GB.tif") ############################################################################### @@ -1147,34 +1283,36 @@ def test_tiff_read_huge4GB(): def test_tiff_read_bigtiff(): - ds = gdal.Open('data/byte_bigtiff_strip5lines.tif') + 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: + 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_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" - 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) @@ -1182,24 +1320,25 @@ def test_tiff_read_tiff_metadata(): def test_tiff_read_irregular_tile_size_jpeg_in_tiff(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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') + ds = gdal.Open("data/irregular_tile_size_jpeg_in_tiff.tif") gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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 @@ -1209,96 +1348,175 @@ 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') + 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) + 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): - new_vals.append(chr(data[2 * i]).encode('latin1')) - new_vals.append(chr(255 - data[2 * i]).encode('latin1')) - data = b''.join(new_vals) - mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data, buf_type=dt) + new_vals.append(chr(data[2 * i]).encode("latin1")) + new_vals.append(chr(255 - data[2 * i]).encode("latin1")) + data = b"".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) + 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): - 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')) - data = b''.join(new_vals) - mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data, buf_type=dt) + 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")) + data = b"".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')] + 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')] + 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': + elif prefix == "tmp": niter = 4 else: niter = nitermax for i in range(niter): if i == 0: - filename = '%s/tiff_direct_io_contig.tif' % prefix + 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) + 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']) + 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) + 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 = 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']) + 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']) + 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']) + 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']) + 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']) + 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 @@ -1308,13 +1526,20 @@ def test_tiff_direct_and_virtual_mem_io(): nxsize = ds.RasterXSize nysize = ds.RasterYSize (nblockxsize, nblockysize) = ds.GetRasterBand(1).GetBlockSize() - band_interleaved = ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'BAND' + 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)) + padding = ( + (nxsize + nblockxsize - 1) + / nblockxsize + * nblockxsize + ) * (nblockysize - (nysize % nblockysize)) if (nxsize % nblockxsize) != 0: padding += nblockxsize - (nxsize % nblockxsize) padding *= dt_size @@ -1326,10 +1551,10 @@ def test_tiff_direct_and_virtual_mem_io(): if not band_interleaved: to_remove += (nbands - 1) * dt_size - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL(filename, 'wb') + f = gdal.VSIFOpenL(filename, "wb") gdal.VSIFWriteL(data, 1, len(data) - padding - to_remove, f) gdal.VSIFCloseL(f) @@ -1343,29 +1568,150 @@ def test_tiff_direct_and_virtual_mem_io(): if truncated: gdal.PushErrorHandler() - ref_data_native_type = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize) + 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_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) + 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) + 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 @@ -1373,33 +1719,167 @@ def test_tiff_direct_and_virtual_mem_io(): if truncated: gdal.PushErrorHandler() old_val = gdal.GetConfigOption(option) - gdal.SetConfigOption(option, 'YES') + 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) + 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_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) + 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) + 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: @@ -1422,11 +1902,18 @@ def test_tiff_direct_and_virtual_mem_io(): print(i) pytest.fail(option) - if ref_data_native_type_downsampled != got_data_native_type_downsampled: + 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: + 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) @@ -1438,19 +1925,48 @@ def test_tiff_direct_and_virtual_mem_io(): 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]: + 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]: + 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]: + 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) @@ -1460,7 +1976,10 @@ def test_tiff_direct_and_virtual_mem_io(): print(option) pytest.fail(i) - if not truncated and ref_nbands_data_native_type != got_nbands_data_native_type: + if ( + not truncated + and ref_nbands_data_native_type != got_nbands_data_native_type + ): print(band_interleaved) print(option) pytest.fail(i) @@ -1470,20 +1989,33 @@ def test_tiff_direct_and_virtual_mem_io(): print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) - elif ref_nbands_data_native_type_whole != got_nbands_data_native_type_whole: + 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: + 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: + 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: + if ( + truncated + and got_nbands_data_native_type_bottom_right_downsampled + is not None + ): print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) @@ -1491,19 +2023,31 @@ def test_tiff_direct_and_virtual_mem_io(): if truncated: continue - if ref_nbands_data_native_type_downsampled != got_nbands_data_native_type_downsampled: + 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: + 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: + 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: + if ( + ref_nbands_data_native_type_upsampled + != got_nbands_data_native_type_upsampled + ): print(option) # import struct # f1 = open('out1.txt', 'wb') @@ -1514,7 +2058,10 @@ def test_tiff_direct_and_virtual_mem_io(): # 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: + 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') @@ -1525,11 +2072,17 @@ def test_tiff_direct_and_virtual_mem_io(): # 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: + 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: + if ( + ref_nbands_data_native_type_pixel_interleaved + != got_nbands_data_native_type_pixel_interleaved + ): print(option) pytest.fail(i) @@ -1537,7 +2090,14 @@ def test_tiff_direct_and_virtual_mem_io(): 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]: + 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) @@ -1545,16 +2105,19 @@ def test_tiff_direct_and_virtual_mem_io(): print(option) pytest.fail(i) - if ref_nbands_data_float32_pixel_interleaved != got_nbands_data_float32_pixel_interleaved: + 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 = 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()') + print("unreached = %s" % unreached) + pytest.fail("missing code coverage in VirtualMemIO()") ############################################################################### @@ -1564,31 +2127,34 @@ def test_tiff_direct_and_virtual_mem_io(): def test_tiff_read_md1(): try: - os.remove('data/md_dg.tif.aux.xml') + os.remove("data/md_dg.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_dg.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_dg.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_dg.tif.aux.xml") + ############################################################################### # Test CPLKeywordParser on non-conformant .IMD files @@ -1597,15 +2163,17 @@ def test_tiff_read_md1(): def test_tiff_read_non_conformant_imd(): - gdal.FileFromMemBuffer('/vsimem/test.imd', - """BEGIN_GROUP = foo\n\tkey = value with space ' not quoted;\n\tkey2 = another one ;\r\nEND_GROUP\nEND\n"""); - gdal.FileFromMemBuffer('/vsimem/test.tif', open('data/byte.tif', 'rb').read()) - ds = gdal.Open('/vsimem/test.tif') - md = ds.GetMetadata('IMD') - gdal.Unlink('/vsimem/test.imd') - gdal.Unlink('/vsimem/test.tif') - assert md == { 'foo.key': "value with space ' not quoted", - 'foo.key2': "another one" } + gdal.FileFromMemBuffer( + "/vsimem/test.imd", + """BEGIN_GROUP = foo\n\tkey = value with space ' not quoted;\n\tkey2 = another one ;\r\nEND_GROUP\nEND\n""", + ) + gdal.FileFromMemBuffer("/vsimem/test.tif", open("data/byte.tif", "rb").read()) + ds = gdal.Open("/vsimem/test.tif") + md = ds.GetMetadata("IMD") + gdal.Unlink("/vsimem/test.imd") + gdal.Unlink("/vsimem/test.tif") + assert md == {"foo.key": "value with space ' not quoted", "foo.key2": "another one"} + ############################################################################### # Check read Digital Globe metadata XML format @@ -1614,31 +2182,33 @@ def test_tiff_read_non_conformant_imd(): def test_tiff_read_md2(): try: - os.remove('data/md_dg_2.tif.aux.xml') + os.remove("data/md_dg_2.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_dg_2.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_dg_2.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 2, 'did not get expected file list.' + assert len(filelist) == 2, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_dg_2.tif.aux.xml") ############################################################################### @@ -1648,31 +2218,33 @@ def test_tiff_read_md2(): def test_tiff_read_md3(): try: - os.remove('data/md_ge_rgb_0010000.tif.aux.xml') + 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) + 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.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_ge_rgb_0010000.tif.aux.xml") ############################################################################### @@ -1682,31 +2254,33 @@ def test_tiff_read_md3(): def test_tiff_read_md4(): try: - os.remove('data/md_ov.tif.aux.xml') + os.remove("data/md_ov.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_ov.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_ov.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_ov.tif.aux.xml") ############################################################################### @@ -1716,31 +2290,33 @@ def test_tiff_read_md4(): def test_tiff_read_md5(): try: - os.remove('data/md_rdk1.tif.aux.xml') + os.remove("data/md_rdk1.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_rdk1.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_rdk1.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 2, 'did not get expected file list.' + assert len(filelist) == 2, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 5, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_rdk1.tif.aux.xml") ############################################################################### @@ -1750,31 +2326,33 @@ def test_tiff_read_md5(): def test_tiff_read_md6(): try: - os.remove('data/md_ls_b1.tif.aux.xml') + os.remove("data/md_ls_b1.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_ls_b1.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_ls_b1.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 2, 'did not get expected file list.' + assert len(filelist) == 2, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 5, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_ls_b1.tif.aux.xml") ############################################################################### @@ -1784,31 +2362,33 @@ def test_tiff_read_md6(): def test_tiff_read_md7(): try: - os.remove('data/spot/md_spot.tif.aux.xml') + os.remove("data/spot/md_spot.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/spot/md_spot.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/spot/md_spot.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 2, 'did not get expected file list.' + assert len(filelist) == 2, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 5, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/spot/md_spot.tif.aux.xml") ############################################################################### @@ -1818,31 +2398,33 @@ def test_tiff_read_md7(): def test_tiff_read_md8(): try: - os.remove('data/md_re.tif.aux.xml') + os.remove("data/md_re.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_re.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_re.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 2, 'did not get expected file list.' + assert len(filelist) == 2, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 5, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_re.tif.aux.xml") ############################################################################### @@ -1852,30 +2434,32 @@ def test_tiff_read_md8(): def test_tiff_read_md9(): try: - os.remove('data/alos/IMG-md_alos.tif.aux.xml') + 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) + 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.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/alos/IMG-md_alos.tif.aux.xml") ############################################################################### @@ -1885,31 +2469,33 @@ def test_tiff_read_md9(): def test_tiff_read_md10(): try: - os.remove('data/md_eros.tif.aux.xml') + os.remove("data/md_eros.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_eros.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_eros.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_eros.tif.aux.xml") ############################################################################### @@ -1919,31 +2505,33 @@ def test_tiff_read_md10(): def test_tiff_read_md11(): try: - os.remove('data/md_kompsat.tif.aux.xml') + os.remove("data/md_kompsat.tif.aux.xml") except OSError: pass - ds = gdal.Open('data/md_kompsat.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_kompsat.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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') + assert not os.path.exists("data/md_kompsat.tif.aux.xml") ############################################################################### @@ -1952,44 +2540,56 @@ def test_tiff_read_md11(): def test_tiff_read_md12(): - ds = gdal.Open('../gdrivers/data/dimap2/single_component/IMG_foo_R2C1.TIF', gdal.GA_ReadOnly) + ds = gdal.Open( + "../gdrivers/data/dimap2/single_component/IMG_foo_R2C1.TIF", gdal.GA_ReadOnly + ) filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." metadata = ds.GetMetadataDomainList() - assert len(metadata) == 6, 'did not get expected metadata list.' + 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' + 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]' + 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.' + rpc = ds.GetMetadata("RPC") + assert rpc["LINE_OFF"] == "-11", "RPC wrong." ds = None - assert not os.path.exists('data/md_kompsat.tif.aux.xml') + 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/single_component/IMG_foo_R2C1.TIF', 'tmp/IMG_foo_temp.TIF') - shutil.copy('../gdrivers/data/dimap2/single_component/DIM_foo.XML', 'tmp/DIM_foo.XML') - shutil.copy('../gdrivers/data/dimap2/single_component/RPC_foo.XML', 'tmp/RPC_foo.XML') - ds = gdal.Open('tmp/IMG_foo_temp.TIF', gdal.GA_ReadOnly) + shutil.copy( + "../gdrivers/data/dimap2/single_component/IMG_foo_R2C1.TIF", + "tmp/IMG_foo_temp.TIF", + ) + shutil.copy( + "../gdrivers/data/dimap2/single_component/DIM_foo.XML", "tmp/DIM_foo.XML" + ) + shutil.copy( + "../gdrivers/data/dimap2/single_component/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') + 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." - assert len(filelist) <= 1, 'did not get expected file list.' ############################################################################### # Test reading a TIFFTAG_GDAL_NODATA with empty text @@ -1997,24 +2597,25 @@ def test_tiff_read_md12(): def test_tiff_read_empty_nodata_tag(): - ds = gdal.Open('data/empty_nodata.tif') + 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 -@pytest.mark.skipif(sys.platform != 'linux', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "linux", reason="Incorrect platform") def test_tiff_read_strace_check(): python_exe = sys.executable - cmd = "strace -f %s -c \"from osgeo import gdal; " % python_exe + ( + 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: @@ -2022,26 +2623,28 @@ def test_tiff_read_strace_check(): pytest.skip() lines_with_dotdot_gcore = [] - for line in err.split('\n'): - if '../gcore' in line: + 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') + gdal.SetConfigOption("GDAL_READDIR_LIMIT_ON_OPEN", "1") - ds = gdal.Open('data/md_kompsat.tif', gdal.GA_ReadOnly) + ds = gdal.Open("data/md_kompsat.tif", gdal.GA_ReadOnly) filelist = ds.GetFileList() - gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', None) + gdal.SetConfigOption("GDAL_READDIR_LIMIT_ON_OPEN", None) + + assert len(filelist) == 3, "did not get expected file list." - assert len(filelist) == 3, 'did not get expected file list.' ############################################################################### # @@ -2052,13 +2655,14 @@ 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) + 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 + ############################################################################### # @@ -2068,13 +2672,14 @@ 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) + 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 + ############################################################################### # @@ -2084,14 +2689,15 @@ 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) + 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 + ############################################################################### # @@ -2102,31 +2708,38 @@ def test_tiff_read_strip_separate_as_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) + 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') + 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) + 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') + gdal.Unlink("/vsimem/tiff_read_strip_separate_as_rgba.tif") + ############################################################################### # @@ -2138,30 +2751,37 @@ def test_tiff_read_tiled_separate_as_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) + 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') + 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) + 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') + gdal.Unlink("/vsimem/tiff_read_tiled_separate_as_rgba.tif") + ############################################################################### # @@ -2170,12 +2790,13 @@ def test_tiff_read_tiled_separate_as_rgba(): def test_tiff_read_scanline_more_than_2GB(): with gdaltest.error_handler(): - ds = gdal.Open('data/scanline_more_than_2GB.tif') + 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 @@ -2185,63 +2806,175 @@ 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 + 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.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, '_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, '_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: + 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, + "_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, + "_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()) + 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()) + 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()) + 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()) + gdal.FileFromMemBuffer( + "/vsimem/byte_nogeoref.tab", + open("data/byte_nogeoref.tab", "rb").read(), + ) - ds = gdal.Open('/vsimem/byte_nogeoref.tif') + ds = gdal.Open("/vsimem/byte_nogeoref.tif") if iteration == 0: gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() @@ -2249,23 +2982,47 @@ def test_tiff_read_nogeoref(): 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') + 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 == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': - pass # ok - elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): - print('Got ' + srs_wkt) - print('Expected ' + expected_srs) - pytest.fail('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))) + 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 == 'LOCAL_CS["PAM"]' + and srs_wkt + == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ): + pass # ok + elif (expected_srs == "" and srs_wkt != "") or ( + expected_srs != "" and expected_srs not in srs_wkt + ): + print("Got " + srs_wkt) + print("Expected " + expected_srs) + pytest.fail( + "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), + ) + ) ############################################################################### @@ -2274,34 +3031,110 @@ def test_tiff_read_nogeoref(): 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, '_1936', (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0)), - ('TABFILE,PAM', True, True, True, '_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: + 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, + "_1936", + (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0), + ), + ( + "TABFILE,PAM", + True, + True, + True, + "_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()) + 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()) + 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()) + 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') + 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() @@ -2309,23 +3142,47 @@ def test_tiff_read_inconsistent_georef(): 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') + 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 == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': - pass # ok - elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): - print('Got ' + srs_wkt) - print('Expected ' + expected_srs) - pytest.fail('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))) + 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 == 'LOCAL_CS["PAM"]' + and srs_wkt + == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ): + pass # ok + elif (expected_srs == "" and srs_wkt != "") or ( + expected_srs != "" and expected_srs not in srs_wkt + ): + print("Got " + srs_wkt) + print("Expected " + expected_srs) + pytest.fail( + "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), + ) + ) ############################################################################### @@ -2334,27 +3191,33 @@ def test_tiff_read_inconsistent_georef(): 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), - ] + 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()) + 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()) + 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) + 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() @@ -2362,20 +3225,32 @@ def test_tiff_read_gcp_internal_and_auxxml(): srs_wkt = ds.GetGCPProjection() gcp_count = ds.GetGCPCount() ds = None - gdal.Unlink('/vsimem/byte_gcp.tif') - gdal.Unlink('/vsimem/byte_gcp.tif.aux.xml') + 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 == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': - pass # ok - elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): - print('Got ' + srs_wkt) - print('Expected ' + expected_srs) - pytest.fail('Iteration %d, did not get expected SRS for %s,copy_pam=%s' % (iteration, config_option_value, str(copy_pam))) + 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 == 'LOCAL_CS["PAM"]' + and srs_wkt + == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ): + pass # ok + elif (expected_srs == "" and srs_wkt != "") or ( + expected_srs != "" and expected_srs not in srs_wkt + ): + print("Got " + srs_wkt) + print("Expected " + expected_srs) + pytest.fail( + "Iteration %d, did not get expected SRS for %s,copy_pam=%s" + % (iteration, config_option_value, str(copy_pam)) + ) ############################################################################### @@ -2388,39 +3263,48 @@ def __init__(self): def handler(self, eErrClass, err_no, msg): # pylint: disable=unused-argument - if 'File open of' in msg: + if "File open of" in msg: self.msg = msg def test_tiff_read_aux(): gdal.ErrorReset() - ds = gdal.Open('data/f2r23.tif') + 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) + 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') + 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') + 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) + 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 @@ -2435,14 +3319,14 @@ def test_tiff_read_jpeg_cloud_optimized(): def test_tiff_read_corrupted_jpeg_cloud_optimized(): - ds = gdal.Open('data/byte_ovr_jpeg_tablesmode_not_correctly_set_on_ovr.tif') + 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') + print("Expected error while writing overview with libjpeg-6b") elif cs1 != 1133: pytest.fail(cs1) @@ -2453,20 +3337,22 @@ def test_tiff_read_corrupted_jpeg_cloud_optimized(): 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)] + 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) + ds = gdal.Open("data/" + filename) if cs1 == 0: gdal.PushErrorHandler() got_cs1 = ds.GetRasterBand(1).Checksum() @@ -2474,8 +3360,12 @@ def test_tiff_read_ycbcr_lzw(): 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) + assert got_cs1 == cs1 and got_cs2 == cs2 and got_cs3 == cs3, ( + filename, + got_cs1, + got_cs2, + got_cs3, + ) ############################################################################### @@ -2485,9 +3375,10 @@ def test_tiff_read_ycbcr_lzw(): def test_tiff_read_ycbcr_int12(): with gdaltest.error_handler(): - ds = gdal.Open('data/int12_ycbcr_contig.tif') + ds = gdal.Open("data/int12_ycbcr_contig.tif") assert ds is None - assert gdal.GetLastErrorMsg().find('Cannot open TIFF file with') >= 0 + assert gdal.GetLastErrorMsg().find("Cannot open TIFF file with") >= 0 + ############################################################################### # Test reading band unit from VERT_CS unit (#6675) @@ -2495,35 +3386,39 @@ def test_tiff_read_ycbcr_int12(): def test_tiff_read_unit_from_srs(): - filename = '/vsimem/tiff_read_unit_from_srs.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/tiff_read_unit_from_srs.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) sr = osr.SpatialReference() - sr.SetFromUserInput('EPSG:4326+3855') + sr.SetFromUserInput("EPSG:4326+3855") ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open(filename) unit = ds.GetRasterBand(1).GetUnitType() - assert unit == 'metre' + 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 + ds = gdal.Open("data/arcgis93_geodataxform_gcp.tif") + assert ds.GetGCPProjection().find("26712") >= 0 assert ds.GetGCPCount() == 16 gcp = ds.GetGCPs()[0] - assert (gcp.GCPPixel == pytest.approx(565, abs=1e-5) and \ - gcp.GCPLine == pytest.approx(11041, abs=1e-5) and \ - gcp.GCPX == pytest.approx(500000, abs=1e-5) and \ - gcp.GCPY == pytest.approx(4705078.79016612, abs=1e-5) and \ - gcp.GCPZ == pytest.approx(0, abs=1e-5)) + assert ( + gcp.GCPPixel == pytest.approx(565, abs=1e-5) + and gcp.GCPLine == pytest.approx(11041, abs=1e-5) + and gcp.GCPX == pytest.approx(500000, abs=1e-5) + and gcp.GCPY == pytest.approx(4705078.79016612, abs=1e-5) + and gcp.GCPZ == pytest.approx(0, abs=1e-5) + ) + ############################################################################### # Test reading file with block size > signed int 32 bit @@ -2532,9 +3427,10 @@ def test_tiff_read_arcgis93_geodataxform_gcp(): def test_tiff_read_block_width_above_32bit(): with gdaltest.error_handler(): - ds = gdal.Open('data/block_width_above_32bit.tif') + ds = gdal.Open("data/block_width_above_32bit.tif") assert ds is None + ############################################################################### # Test reading file with image size > signed int 32 bit @@ -2542,23 +3438,25 @@ def test_tiff_read_block_width_above_32bit(): def test_tiff_read_image_width_above_32bit(): with gdaltest.error_handler(): - ds = gdal.Open('data/image_width_above_32bit.tif') + 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') + 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') + 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 @@ -2566,10 +3464,11 @@ def test_tiff_read_second_image_width_above_32bit(): 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 = gdal.Open("data/minimum_tiff_tags_no_warning.tif") + assert gdal.GetLastErrorMsg() == "" ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" + ############################################################################### # Test reading file with minimal number of warnings but warning @@ -2579,24 +3478,25 @@ 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() != '' + ds = gdal.Open("data/minimum_tiff_tags_with_warning.tif") + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + 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': + 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('.') + 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) @@ -2611,15 +3511,17 @@ def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micr return got_micro >= expected_micro return False + ############################################################################### def test_tiff_read_unknown_compression(): with gdaltest.error_handler(): - ds = gdal.Open('data/unknown_compression.tif') + ds = gdal.Open("data/unknown_compression.tif") assert ds is None + ############################################################################### @@ -2629,7 +3531,7 @@ def test_tiff_read_leak_ZIPSetupDecode(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/leak-ZIPSetupDecode.tif') + ds = gdal.Open("data/leak-ZIPSetupDecode.tif") for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Checksum() @@ -2643,7 +3545,7 @@ def test_tiff_read_excessive_memory_TIFFFillStrip(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/excessive-memory-TIFFFillStrip.tif') + ds = gdal.Open("data/excessive-memory-TIFFFillStrip.tif") for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Checksum() @@ -2657,7 +3559,7 @@ def test_tiff_read_excessive_memory_TIFFFillStrip2(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/excessive-memory-TIFFFillStrip2.tif') + ds = gdal.Open("data/excessive-memory-TIFFFillStrip2.tif") ds.GetRasterBand(1).Checksum() @@ -2670,7 +3572,7 @@ def test_tiff_read_excessive_memory_TIFFFillTile(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/excessive-memory-TIFFFillTile.tif') + ds = gdal.Open("data/excessive-memory-TIFFFillTile.tif") ds.GetRasterBand(1).Checksum() @@ -2682,13 +3584,18 @@ 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: + 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') + ds = gdal.Open("/vsimem/test.tif") assert ds.GetRasterBand(1).Checksum() == 2676 ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### # (Potentially) test libtiff CHUNKY_STRIP_READ_SUPPORT @@ -2696,12 +3603,17 @@ def test_tiff_read_big_strip(): 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') + 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') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### @@ -2711,13 +3623,18 @@ 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: + 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') + ds = gdal.Open("/vsimem/test.tif") assert ds.GetRasterBand(1).Checksum() == 2676 ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### @@ -2725,20 +3642,21 @@ def test_tiff_read_big_tile(): def test_tiff_read_huge_tile(): with gdaltest.error_handler(): - ds = gdal.Open('data/hugeblocksize.tif') + 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': + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["LIBTIFF"] != "INTERNAL": pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/huge-number-strips.tif') + ds = gdal.Open("data/huge-number-strips.tif") ds.GetRasterBand(1).Checksum() @@ -2751,7 +3669,7 @@ def test_tiff_read_huge_implied_number_strips(): pytest.skip() with gdaltest.error_handler(): - gdal.Open('data/huge-implied-number-strips.tif') + gdal.Open("data/huge-implied-number-strips.tif") ############################################################################### @@ -2759,31 +3677,35 @@ def test_tiff_read_huge_implied_number_strips(): def test_tiff_read_many_blocks(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['LIBTIFF'] != 'INTERNAL': + 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 = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test.tif", 1, 2000000, options=["BLOCKYSIZE=1"] + ) ds = None - ds = gdal.Open('/vsimem/test.tif') + ds = gdal.Open("/vsimem/test.tif") assert ds.GetRasterBand(1).Checksum() == 0 ds = None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### def test_tiff_read_many_blocks_truncated(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['LIBTIFF'] != 'INTERNAL': + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["LIBTIFF"] != "INTERNAL": pytest.skip() - ds = gdal.Open('data/many_blocks_truncated.tif') + ds = gdal.Open("data/many_blocks_truncated.tif") gdal.ErrorReset() with gdaltest.error_handler(): - ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_2000000', 'TIFF') - assert gdal.GetLastErrorMsg() != '' + ds.GetRasterBand(1).GetMetadataItem("BLOCK_OFFSET_0_2000000", "TIFF") + assert gdal.GetLastErrorMsg() != "" + ############################################################################### # Test reading images with nbits > 32 @@ -2792,9 +3714,10 @@ def test_tiff_read_many_blocks_truncated(): def test_tiff_read_uint33(): with gdaltest.error_handler(): - ds = gdal.Open('data/uint33.tif') + ds = gdal.Open("data/uint33.tif") assert ds is None - assert gdal.GetLastErrorMsg().find('Unsupported TIFF configuration') >= 0 + assert gdal.GetLastErrorMsg().find("Unsupported TIFF configuration") >= 0 + ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1545 @@ -2806,7 +3729,7 @@ def test_tiff_read_corrupted_deflate_singlestrip(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/corrupted_deflate_singlestrip.tif') + ds = gdal.Open("data/corrupted_deflate_singlestrip.tif") ds.GetRasterBand(1).Checksum() @@ -2820,7 +3743,7 @@ def test_tiff_read_packbits_not_enough_data(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/packbits-not-enough-data.tif') + ds = gdal.Open("data/packbits-not-enough-data.tif") ds.GetRasterBand(1).Checksum() @@ -2831,19 +3754,21 @@ def test_tiff_read_packbits_not_enough_data(): def test_tiff_read_toomanyblocks(): with gdaltest.error_handler(): - ds = gdal.Open('data/toomanyblocks.tif') + 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') + 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 @@ -2851,52 +3776,55 @@ def test_tiff_read_toomanyblocks_separate(): def test_tiff_read_size_of_stripbytecount_lower_than_stripcount(): - ds = gdal.Open('data/size_of_stripbytecount_lower_than_stripcount.tif') + 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 + 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') + 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' + 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]), + ("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': + if ( + not expected_offsets + and gdal.GetDriverByName("GTiff").GetMetadataItem("LIBTIFF") != "INTERNAL" + ): continue ds = gdal.Open(filename) @@ -2904,7 +3832,8 @@ def test_tiff_read_stripoffset_types(): for row in range(4): with gdaltest.error_handler(): mdi = ds.GetRasterBand(1).GetMetadataItem( - 'BLOCK_OFFSET_0_%d' % row, 'TIFF') + "BLOCK_OFFSET_0_%d" % row, "TIFF" + ) if mdi is None: break offsets.append(int(mdi)) @@ -2927,40 +3856,42 @@ def test_tiff_read_progressive_jpeg_denial_of_service(): # libjpeg to allocate at least...' gdal.ErrorReset() with gdaltest.error_handler(): - os.environ['JPEGMEM'] = '10M' - os.environ['LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER'] = '1000' - ds = gdal.Open('/vsizip/data/eofloop_valid_huff.tif.zip') - del os.environ['LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER'] - del os.environ['JPEGMEM'] + os.environ["JPEGMEM"] = "10M" + os.environ["LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER"] = "1000" + ds = gdal.Open("/vsizip/data/eofloop_valid_huff.tif.zip") + del os.environ["LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER"] + del os.environ["JPEGMEM"] cs = ds.GetRasterBand(1).Checksum() - assert cs == 0 and gdal.GetLastErrorMsg() != '' + 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') + 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' + 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 cs == 0 and gdal.GetLastErrorMsg() != '' + del os.environ["LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC"] + del os.environ["LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER"] + assert cs == 0 and 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') + 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) @@ -2968,17 +3899,14 @@ def test_tiff_read_old_style_lzw(): 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') + 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) + gdal.SetConfigOption("GTIFF_USE_MMAP", None) assert cs == 4672, (options, cs) f = gdal.VSIFOpenL(tmpfile, "rb") @@ -2987,11 +3915,11 @@ def test_tiff_read_mmap_interface(): f = gdal.VSIFOpenL(tmpfile, "wb") gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - gdal.SetConfigOption('GTIFF_USE_MMAP', 'YES') + 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) + gdal.SetConfigOption("GTIFF_USE_MMAP", None) assert cs == 0, (options, cs) gdal.Unlink(tmpfile) @@ -3003,17 +3931,18 @@ def test_tiff_read_mmap_interface(): # 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') + 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') + ds = gdal.Open("data/tif_jpeg_ycbcr_too_big_last_stripe.tif") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 4557 @@ -3022,18 +3951,19 @@ def test_tiff_read_jpeg_too_big_last_stripe(): ############################################################################### # Test reading GeoTIFF file with negative ScaleY in GeoPixelScale tag + def test_tiff_read_negative_scaley(): - ds = gdal.Open('data/negative_scaley.tif') + 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'): + 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'): + ds = gdal.Open("data/negative_scaley.tif") + with gdaltest.config_option("GTIFF_HONOUR_NEGATIVE_SCALEY", "YES"): assert ds.GetGeoTransform()[5] == 60 @@ -3043,38 +3973,40 @@ def test_tiff_read_negative_scaley(): def test_tiff_read_zstd(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("ZSTD") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte_zstd.tif', 1, 4672) + 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: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("ZSTD") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte_zstd_corrupted.tif', 1, 0) + 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: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("ZSTD") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte_zstd_corrupted2.tif', 1, 0) + ut = gdaltest.GDALTest("GTiff", "byte_zstd_corrupted2.tif", 1, 0) with gdaltest.error_handler(): return ut.testOpen() @@ -3085,60 +4017,64 @@ def test_tiff_read_zstd_corrupted2(): def test_tiff_read_webp(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + 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) + 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') + 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: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("WEBP") == -1: pytest.skip() - ds = gdal.Open('data/tif_webp_huge_single_strip.tif') + 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') + 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: + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["DMD_CREATIONOPTIONLIST"].find("LERC") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte_lerc.tif', 1, 4672) + 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') + 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.BuildOverviews("CUBIC", overviewlist=[2]) ds = None - ds = gdal.Open(filename + '.msk', gdal.GA_Update) - ds.BuildOverviews('NEAREST', overviewlist=[2]) + 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() @@ -3147,18 +4083,20 @@ def test_tiff_read_overview_of_external_mask(): ds = None gdal.Unlink(filename) - gdal.Unlink(filename + '.msk') + 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') + ds = gdal.Open("data/ModelTiepointTag_z_non_zero_but_ModelPixelScaleTag_z_zero.tif") assert not ds.GetRasterBand(1).GetScale() assert not ds.GetRasterBand(1).GetOffset() @@ -3166,30 +4104,37 @@ def test_tiff_read_ModelTiepointTag_z_non_zero_but_ModelPixelScaleTag_z_zero(): ############################################################################### # 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') + 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' + 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') + ds = gdal.Open("/vsizip/data/test_deflate_4GB.tif.zip/test_deflate_4GB.tif") if sys.maxsize < 2**32: assert ds is None return @@ -3198,15 +4143,19 @@ def test_tiff_read_deflate_4GB(): 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) + 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 our use of TileByteCounts is minimal for COG (only for last tile) # and for interleaved mask that we also hardly use TileOffsets. + def test_tiff_read_cog_strile_arrays_zeroified_when_possible(): if not check_libtiff_internal_or_at_least(4, 0, 11): @@ -3218,16 +4167,18 @@ def test_tiff_read_cog_strile_arrays_zeroified_when_possible(): # and then with an hex editor, zeroify all entries of TileByteCounts except the last tile for both IFDs # and zeroify all entries of TileOffsets for 2nd IFD (mask) except the last tile. - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): - ds = gdal.Open('data/cog_strile_arrays_zeroified_when_possible.tif') + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): + ds = gdal.Open("data/cog_strile_arrays_zeroified_when_possible.tif") cs = ds.GetRasterBand(1).Checksum() cs_mask = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 4873 assert cs_mask == 1222 + ############################################################################### # Check that our reading of a COG with /vsicurl is efficient + def test_tiff_read_cog_vsicurl(): if not check_libtiff_internal_or_at_least(4, 0, 11): @@ -3241,81 +4192,113 @@ def test_tiff_read_cog_vsicurl(): webserver_process = None webserver_port = 0 - (webserver_process, webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (webserver_process, webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if webserver_port == 0: pytest.skip() - in_filename = 'tmp/test_tiff_read_cog_vsicurl_in.tif' - cog_filename = 'tmp/test_tiff_read_cog_vsicurl_out.tif' + in_filename = "tmp/test_tiff_read_cog_vsicurl_in.tif" + cog_filename = "tmp/test_tiff_read_cog_vsicurl_out.tif" try: - src_ds = gdal.GetDriverByName('GTIFF').Create(in_filename, 1024, 1024, options = ['BIGTIFF=YES', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'SPARSE_OK=YES']) - src_ds.BuildOverviews('NEAR', [256]) - gdal.GetDriverByName('GTIFF').CreateCopy(cog_filename, src_ds, options = ['BIGTIFF=YES', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'COPY_SRC_OVERVIEWS=YES', 'COMPRESS=LZW']) + src_ds = gdal.GetDriverByName("GTIFF").Create( + in_filename, + 1024, + 1024, + options=[ + "BIGTIFF=YES", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=16", + "SPARSE_OK=YES", + ], + ) + src_ds.BuildOverviews("NEAR", [256]) + gdal.GetDriverByName("GTIFF").CreateCopy( + cog_filename, + src_ds, + options=[ + "BIGTIFF=YES", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=16", + "COPY_SRC_OVERVIEWS=YES", + "COMPRESS=LZW", + ], + ) filesize = gdal.VSIStatL(cog_filename).size handler = webserver.SequentialHandler() - handler.add('HEAD', '/cog.tif', 200, {'Content-Length': '%d' % filesize}) + handler.add("HEAD", "/cog.tif", 200, {"Content-Length": "%d" % filesize}) + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=0-16383': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + 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/%d' % filesize) - request.send_header('Content-Length', 16384) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header("Content-Range", "bytes 0-16383/%d" % filesize) + request.send_header("Content-Length", 16384) + request.send_header("Connection", "close") request.end_headers() - request.wfile.write(open(cog_filename, 'rb').read(16384)) + request.wfile.write(open(cog_filename, "rb").read(16384)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) with webserver.install_http_handler(handler): - ds = gdal.Open('/vsicurl/http://localhost:%d/cog.tif' % webserver_port) + ds = gdal.Open("/vsicurl/http://localhost:%d/cog.tif" % webserver_port) assert ds handler = webserver.SequentialHandler() + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=32768-49151': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + if request.headers["Range"] == "bytes=32768-49151": + request.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'text/plain') - request.send_header('Content-Range', 'bytes 32768-49151/%d' % filesize) - request.send_header('Content-Length', 16384) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header("Content-Range", "bytes 32768-49151/%d" % filesize) + request.send_header("Content-Length", 16384) + request.send_header("Connection", "close") request.end_headers() - with open(cog_filename, 'rb') as f: + with open(cog_filename, "rb") as f: f.seek(32768, 0) request.wfile.write(f.read(16384)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=180224-193497': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + if request.headers["Range"] == "bytes=180224-193497": + request.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'text/plain') - request.send_header('Content-Range', 'bytes 180224-193497/%d' % filesize) - request.send_header('Content-Length', 13274) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header( + "Content-Range", "bytes 180224-193497/%d" % filesize + ) + request.send_header("Content-Length", 13274) + request.send_header("Connection", "close") request.end_headers() - with open(cog_filename, 'rb') as f: + with open(cog_filename, "rb") as f: f.seek(180224, 0) request.wfile.write(f.read(13274)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) with webserver.install_http_handler(handler): - ret = ds.ReadRaster(1024 - 32,1024 - 32,16,16) + ret = ds.ReadRaster(1024 - 32, 1024 - 32, 16, 16) assert ret finally: @@ -3323,12 +4306,14 @@ def method(request): gdal.VSICurlClearCache() - gdal.GetDriverByName('GTIFF').Delete(in_filename) - gdal.GetDriverByName('GTIFF').Delete(cog_filename) + gdal.GetDriverByName("GTIFF").Delete(in_filename) + gdal.GetDriverByName("GTIFF").Delete(cog_filename) + ############################################################################### # Check that our reading of a COG with /vsicurl is efficient + def test_tiff_read_cog_with_mask_vsicurl(): if not check_libtiff_internal_or_at_least(4, 0, 11): @@ -3342,86 +4327,120 @@ def test_tiff_read_cog_with_mask_vsicurl(): webserver_process = None webserver_port = 0 - (webserver_process, webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (webserver_process, webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if webserver_port == 0: pytest.skip() - in_filename = 'tmp/test_tiff_read_cog_with_mask_vsicurl_in.tif' - cog_filename = 'tmp/test_tiff_read_cog_with_mask_vsicurl_out.tif' + in_filename = "tmp/test_tiff_read_cog_with_mask_vsicurl_in.tif" + cog_filename = "tmp/test_tiff_read_cog_with_mask_vsicurl_out.tif" try: - src_ds = gdal.GetDriverByName('GTIFF').Create(in_filename, 1024, 1024, options = ['BIGTIFF=YES', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'SPARSE_OK=YES']) - src_ds.BuildOverviews('NEAR', [256]) - with gdaltest.config_options({'GDAL_TIFF_INTERNAL_MASK': 'YES', 'GDAL_TIFF_DEFLATE_SUBCODEC': 'ZLIB'}): + src_ds = gdal.GetDriverByName("GTIFF").Create( + in_filename, + 1024, + 1024, + options=[ + "BIGTIFF=YES", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=16", + "SPARSE_OK=YES", + ], + ) + src_ds.BuildOverviews("NEAR", [256]) + with gdaltest.config_options( + {"GDAL_TIFF_INTERNAL_MASK": "YES", "GDAL_TIFF_DEFLATE_SUBCODEC": "ZLIB"} + ): src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - gdal.GetDriverByName('GTIFF').CreateCopy(cog_filename, src_ds, options = ['BIGTIFF=YES', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'COPY_SRC_OVERVIEWS=YES', 'COMPRESS=LZW']) + gdal.GetDriverByName("GTIFF").CreateCopy( + cog_filename, + src_ds, + options=[ + "BIGTIFF=YES", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=16", + "COPY_SRC_OVERVIEWS=YES", + "COMPRESS=LZW", + ], + ) filesize = gdal.VSIStatL(cog_filename).size handler = webserver.SequentialHandler() - handler.add('HEAD', '/cog.tif', 200, {'Content-Length': '%d' % filesize}) + handler.add("HEAD", "/cog.tif", 200, {"Content-Length": "%d" % filesize}) + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=0-16383': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + 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/%d' % filesize) - request.send_header('Content-Length', 16384) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header("Content-Range", "bytes 0-16383/%d" % filesize) + request.send_header("Content-Length", 16384) + request.send_header("Connection", "close") request.end_headers() - request.wfile.write(open(cog_filename, 'rb').read(16384)) + request.wfile.write(open(cog_filename, "rb").read(16384)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) with webserver.install_http_handler(handler): - ds = gdal.Open('/vsicurl/http://localhost:%d/cog.tif' % webserver_port) + ds = gdal.Open("/vsicurl/http://localhost:%d/cog.tif" % webserver_port) assert ds handler = webserver.SequentialHandler() + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=32768-49151': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + if request.headers["Range"] == "bytes=32768-49151": + request.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'text/plain') - request.send_header('Content-Range', 'bytes 32768-49151/%d' % filesize) - request.send_header('Content-Length', 16384) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header("Content-Range", "bytes 32768-49151/%d" % filesize) + request.send_header("Content-Length", 16384) + request.send_header("Connection", "close") request.end_headers() - with open(cog_filename, 'rb') as f: + with open(cog_filename, "rb") as f: f.seek(32768, 0) request.wfile.write(f.read(16384)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) + def method(request): - #sys.stderr.write('%s\n' % request.headers['Range']) - if request.headers['Range'] == 'bytes=294912-311295': - request.protocol_version = 'HTTP/1.1' + # sys.stderr.write('%s\n' % request.headers['Range']) + if request.headers["Range"] == "bytes=294912-311295": + request.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'text/plain') - request.send_header('Content-Range', 'bytes 294912-311295/%d' % filesize) - request.send_header('Content-Length', 32768) - request.send_header('Connection', 'close') + request.send_header("Content-type", "text/plain") + request.send_header( + "Content-Range", "bytes 294912-311295/%d" % filesize + ) + request.send_header("Content-Length", 32768) + request.send_header("Connection", "close") request.end_headers() - with open(cog_filename, 'rb') as f: + with open(cog_filename, "rb") as f: f.seek(294912, 0) request.wfile.write(f.read(32768)) else: request.send_response(404) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('GET', '/cog.tif', custom_method=method) + + handler.add("GET", "/cog.tif", custom_method=method) with webserver.install_http_handler(handler): - ret = ds.ReadRaster(1024 - 32,1024 - 32,16,16) + ret = ds.ReadRaster(1024 - 32, 1024 - 32, 16, 16) assert ret - ret = ds.GetRasterBand(1).GetMaskBand().ReadRaster(1024 - 32,1024 - 32,16,16) + ret = ds.GetRasterBand(1).GetMaskBand().ReadRaster(1024 - 32, 1024 - 32, 16, 16) assert ret finally: @@ -3429,8 +4448,9 @@ def method(request): gdal.VSICurlClearCache() - gdal.GetDriverByName('GTIFF').Delete(in_filename) - gdal.GetDriverByName('GTIFF').Delete(cog_filename) + gdal.GetDriverByName("GTIFF").Delete(in_filename) + gdal.GetDriverByName("GTIFF").Delete(cog_filename) + ############################################################################### # Check that GetMetadataDomainList() works properly @@ -3438,9 +4458,9 @@ def method(request): def test_tiff_GetMetadataDomainList(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") mdd1_set = set([x for x in ds.GetMetadataDomainList()]) - assert mdd1_set == set(['', 'DERIVED_SUBDATASETS', 'IMAGE_STRUCTURE']) + assert mdd1_set == set(["", "DERIVED_SUBDATASETS", "IMAGE_STRUCTURE"]) mdd2_set = set([x for x in ds.GetMetadataDomainList()]) assert mdd1_set == mdd2_set @@ -3455,7 +4475,7 @@ def test_tiff_read_bigtiff_invalid_slong8_for_stripoffsets(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/byte_bigtiff_invalid_slong8_for_stripoffsets.tif') + ds = gdal.Open("data/byte_bigtiff_invalid_slong8_for_stripoffsets.tif") cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 @@ -3467,10 +4487,10 @@ def test_tiff_read_bigtiff_invalid_slong8_for_stripoffsets(): def test_tiff_read_tiff_single_band_with_whitepoint_primarychroma_tags(): - ds = gdal.Open('data/tiff_single_band_with_whitepoint_primarychroma_tags.tif') + ds = gdal.Open("data/tiff_single_band_with_whitepoint_primarychroma_tags.tif") # Check that it doesn't crash. We could perhaps return something more # useful - assert ds.GetMetadata('COLOR_PROFILE') == {} + assert ds.GetMetadata("COLOR_PROFILE") == {} ############################################################################### @@ -3481,45 +4501,52 @@ def test_tiff_read_tiff_single_band_with_whitepoint_primarychroma_tags(): def test_tiff_read_geodetic_tiff_grid(): - ds = gdal.Open('data/test_hgrid_with_subgrid.tif') - assert ds.GetSubDatasets()[0][1] == 'Page 1 (10P x 10L x 2B): CAwest' - + ds = gdal.Open("data/test_hgrid_with_subgrid.tif") + assert ds.GetSubDatasets()[0][1] == "Page 1 (10P x 10L x 2B): CAwest" ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/2903 # related to precomposed vs decomposed UTF-8 filenames on MacOSX + def test_tiff_read_utf8_encoding_issue_2903(): - if gdaltest.is_travis_branch('mingw_w64'): + if gdaltest.is_travis_branch("mingw_w64"): pytest.skip() - precomposed_utf8 = b'\xc3\xa4'.decode('utf-8') - tmp_tif_filename = 'tmp/%s.tif' % precomposed_utf8 - tmp_tfw_filename = 'tmp/%s.tfw' % precomposed_utf8 - open(tmp_tif_filename, 'wb').write(open('data/byte_nogeoref.tif', 'rb').read()) - open(tmp_tfw_filename, 'wb').write(open('data/byte_nogeoref.tfw', 'rb').read()) + precomposed_utf8 = b"\xc3\xa4".decode("utf-8") + tmp_tif_filename = "tmp/%s.tif" % precomposed_utf8 + tmp_tfw_filename = "tmp/%s.tfw" % precomposed_utf8 + open(tmp_tif_filename, "wb").write(open("data/byte_nogeoref.tif", "rb").read()) + open(tmp_tfw_filename, "wb").write(open("data/byte_nogeoref.tfw", "rb").read()) ds = gdal.Open(tmp_tif_filename) assert ds.GetGeoTransform()[0] != 0 ds = None os.unlink(tmp_tif_filename) os.unlink(tmp_tfw_filename) + ############################################################################### # Check over precision issue with nodata and Float32 (#3791) def test_tiff_read_overprecision_nodata_float32(): - filename = '/vsimem/test_tiff_read_overprecision_nodata_float32.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1, 1, gdal.GDT_Float32) + filename = "/vsimem/test_tiff_read_overprecision_nodata_float32.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1, 1, gdal.GDT_Float32) ds.GetRasterBand(1).SetNoDataValue(-3.4e38) ds.GetRasterBand(1).Fill(-3.4e38) ds = None ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetNoDataValue() == struct.unpack('f', struct.pack('f', -3.4e38))[0] - assert struct.unpack('f', ds.GetRasterBand(1).ReadRaster())[0] == ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).GetNoDataValue() + == struct.unpack("f", struct.pack("f", -3.4e38))[0] + ) + assert ( + struct.unpack("f", ds.GetRasterBand(1).ReadRaster())[0] + == ds.GetRasterBand(1).GetNoDataValue() + ) ds = None gdal.Unlink(filename) @@ -3532,8 +4559,8 @@ def test_tiff_read_unhandled_codec_known_name(): gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.Open('data/gtiff/unsupported_codec_jp2000.tif') is None - assert 'missing codec JP2000' in gdal.GetLastErrorMsg() + assert gdal.Open("data/gtiff/unsupported_codec_jp2000.tif") is None + assert "missing codec JP2000" in gdal.GetLastErrorMsg() ############################################################################### @@ -3544,5 +4571,5 @@ def test_tiff_read_unhandled_codec_unknown_name(): gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.Open('data/gtiff/unsupported_codec_unknown.tif') is None - assert 'missing codec of code 44510' in gdal.GetLastErrorMsg() + assert gdal.Open("data/gtiff/unsupported_codec_unknown.tif") is None + assert "missing codec of code 44510" in gdal.GetLastErrorMsg() diff --git a/autotest/gcore/tiff_read_subifds.py b/autotest/gcore/tiff_read_subifds.py index 0fa3f6f65ef5..922d83c36e3e 100755 --- a/autotest/gcore/tiff_read_subifds.py +++ b/autotest/gcore/tiff_read_subifds.py @@ -33,14 +33,13 @@ from osgeo import gdal - ############################################################################### # Test absolute/offset && index directory access def test_tiff_read_subifds(): - ds = gdal.Open('data/tiff_with_subifds.tif') + ds = gdal.Open("data/tiff_with_subifds.tif") assert ds.GetRasterBand(1).Checksum() == 35731 sds = ds.GetSubDatasets() @@ -48,26 +47,44 @@ def test_tiff_read_subifds(): assert sds[0][0] == "GTIFF_DIR:1:data/tiff_with_subifds.tif" assert sds[1][0] == "GTIFF_DIR:2:data/tiff_with_subifds.tif" - data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 220 + data = ds.GetRasterBand(1).ReadRaster( + buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16 + ) + assert struct.unpack("H", data)[0] == 220 - data = ds.GetRasterBand(1).GetOverview(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 12 + data = ( + ds.GetRasterBand(1) + .GetOverview(1) + .ReadRaster(buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16) + ) + assert struct.unpack("H", data)[0] == 12 - ds = gdal.Open('GTIFF_DIR:1:data/tiff_with_subifds.tif') + ds = gdal.Open("GTIFF_DIR:1:data/tiff_with_subifds.tif") assert ds.GetRasterBand(1).Checksum() == 35731 - data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 220 + data = ds.GetRasterBand(1).ReadRaster( + buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16 + ) + assert struct.unpack("H", data)[0] == 220 - data = ds.GetRasterBand(1).GetOverview(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 12 + data = ( + ds.GetRasterBand(1) + .GetOverview(1) + .ReadRaster(buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16) + ) + assert struct.unpack("H", data)[0] == 12 - ds = gdal.Open('GTIFF_DIR:2:data/tiff_with_subifds.tif') + ds = gdal.Open("GTIFF_DIR:2:data/tiff_with_subifds.tif") assert ds.GetRasterBand(1).Checksum() == 0 - data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 0 - - data = ds.GetRasterBand(1).GetOverview(1).ReadRaster(buf_xsize=1,buf_ysize=1, xsize=1, ysize=1,buf_type=gdal.GDT_Int16) - assert struct.unpack('H', data)[0] == 128 \ No newline at end of file + data = ds.GetRasterBand(1).ReadRaster( + buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16 + ) + assert struct.unpack("H", data)[0] == 0 + + data = ( + ds.GetRasterBand(1) + .GetOverview(1) + .ReadRaster(buf_xsize=1, buf_ysize=1, xsize=1, ysize=1, buf_type=gdal.GDT_Int16) + ) + assert struct.unpack("H", data)[0] == 128 diff --git a/autotest/gcore/tiff_srs.py b/autotest/gcore/tiff_srs.py index 9e721b38d0b2..3691d214b3c9 100755 --- a/autotest/gcore/tiff_srs.py +++ b/autotest/gcore/tiff_srs.py @@ -31,9 +31,7 @@ import gdaltest import pytest -from osgeo import gdal -from osgeo import osr - +from osgeo import gdal, osr ############################################################################### # Test fix for #4677: @@ -42,21 +40,24 @@ def test_tiff_srs_without_linear_units(): sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=vandg +datum=WGS84') + sr.ImportFromProj4("+proj=vandg +datum=WGS84") - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_without_linear_units.tif', 1, 1) + 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') + 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') + gdal.Unlink("/vsimem/tiff_srs_without_linear_units.tif") + + assert sr.IsSame(sr2) == 1, "did not get expected SRS" - assert sr.IsSame(sr2) == 1, 'did not get expected SRS' ############################################################################### # Test writing a COMPDCS without VerticalCSType @@ -66,7 +67,8 @@ def test_srs_write_compd_cs(): sr = osr.SpatialReference() # EPSG:7400 without the Authority - sr.SetFromUserInput("""COMPD_CS["unknown", + sr.SetFromUserInput( + """COMPD_CS["unknown", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936265, @@ -80,38 +82,44 @@ def test_srs_write_compd_cs(): AUTHORITY["EPSG","5119"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], - AXIS["Up",UP]]]""") + AXIS["Up",UP]]]""" + ) - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_compd_cs.tif', 1, 1) + 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') + gdal.SetConfigOption("GTIFF_REPORT_COMPD_CS", "YES") + ds = gdal.Open("/vsimem/tiff_srs_compd_cs.tif") gdal.ErrorReset() wkt = ds.GetProjectionRef() - assert gdal.GetLastErrorMsg() == '' - gdal.SetConfigOption('GTIFF_REPORT_COMPD_CS', None) + assert gdal.GetLastErrorMsg() == "" + gdal.SetConfigOption("GTIFF_REPORT_COMPD_CS", None) sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None - gdal.Unlink('/vsimem/tiff_srs_compd_cs.tif') + gdal.Unlink("/vsimem/tiff_srs_compd_cs.tif") assert sr.IsSame(sr2) == 1, wkt + ############################################################################### # 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') + 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) + 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]]]' + ) - 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) @@ -119,18 +127,19 @@ def test_srs_read_compd_cs(): def test_tiff_srs_weird_mercator_2sp(): - ds = gdal.Open('data/weird_mercator_2sp.tif') + ds = gdal.Open("data/weird_mercator_2sp.tif") gdal.PushErrorHandler() wkt = ds.GetProjectionRef() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'warning expected' + 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", + sr.SetFromUserInput( + """PROJCS["Global Mercator", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.2572221010002, @@ -146,9 +155,11 @@ def test_tiff_srs_weird_mercator_2sp(): PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, - AUTHORITY["EPSG","9001"]]]""") + AUTHORITY["EPSG","9001"]]]""" + ) + + assert sr.IsSame(sr2) == 1, "did not get expected SRS" - assert sr.IsSame(sr2) == 1, 'did not get expected SRS' ############################################################################### # Test reading ESRI WGS_1984_Web_Mercator_Auxiliary_Sphere @@ -156,14 +167,16 @@ def test_tiff_srs_weird_mercator_2sp(): def test_tiff_srs_WGS_1984_Web_Mercator_Auxiliary_Sphere(): - ds = gdal.Open('data/WGS_1984_Web_Mercator_Auxiliary_Sphere.tif') + 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", + assert ( + wkt + == """PROJCS["WGS 84 / Pseudo-Mercator", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, @@ -184,6 +197,8 @@ def test_tiff_srs_WGS_1984_Web_Mercator_Auxiliary_Sphere(): 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 reading ESRI:102113 WGS_1984_Web_Mercator @@ -191,12 +206,13 @@ def test_tiff_srs_WGS_1984_Web_Mercator_Auxiliary_Sphere(): def test_tiff_srs_WGS_1984_Web_Mercator(): - ds = gdal.Open('data/WGS_1984_Web_Mercator.tif') + ds = gdal.Open("data/WGS_1984_Web_Mercator.tif") sr = ds.GetSpatialRef() ds = None - assert sr.GetAuthorityName(None) == 'ESRI' - assert sr.GetAuthorityCode(None) == '102113' + assert sr.GetAuthorityName(None) == "ESRI" + assert sr.GetAuthorityCode(None) == "102113" + ############################################################################### # Test writing and reading various angular units @@ -204,79 +220,104 @@ def test_tiff_srs_WGS_1984_Web_Mercator(): 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)", + 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]]""") + UNIT["arc-second",4.848136811095361e-06]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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)", + 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]]""") + UNIT["arc-minute",0.0002908882086657216]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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)", + 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]]""") + UNIT["grad",0.01570796326794897]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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)", + 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]]""") + UNIT["gon",0.01570796326794897]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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)", + 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]]""") + UNIT["radian",1]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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)", + 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]]""") + UNIT["custom",1.23]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') + 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') + gdal.Unlink("/vsimem/tiff_srs_angular_units.tif") + ############################################################################### # Test writing and reading a unknown datum but with a known ellipsoid @@ -284,19 +325,27 @@ def test_tiff_srs_angular_units(): 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", + 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]]""") + UNIT["degree",1]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_custom_datum_known_ellipsoid.tif') + 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]]' + 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') + gdal.Unlink("/vsimem/tiff_custom_datum_known_ellipsoid.tif") + ############################################################################### # Test reading a GeoTIFF file with only PCS set, but with a ProjLinearUnitsGeoKey @@ -305,18 +354,27 @@ def test_tiff_custom_datum_known_ellipsoid(): 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) + 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) + 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 + 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 = ..." @@ -324,8 +382,11 @@ def test_tiff_srs_epsg_2853_with_us_feet(): 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", + 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], @@ -338,14 +399,19 @@ def test_tiff_srs_PCSCitationGeoKey_LUnits(): PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",50000000], PARAMETER["false_northing",0], - UNIT["Centimeter",0.01]]""") + UNIT["Centimeter",0.01]]""" + ) ds = None - ds = gdal.Open('/vsimem/tiff_srs_PCSCitationGeoKey_LUnits.tif') + 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]]' + 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') + gdal.Unlink("/vsimem/tiff_srs_PCSCitationGeoKey_LUnits.tif") + ############################################################################### # Test reading a geotiff key ProjectionGeoKey (Short,1): Unknown-3856 @@ -353,11 +419,15 @@ def test_tiff_srs_PCSCitationGeoKey_LUnits(): def test_tiff_srs_projection_3856(): - ds = gdal.Open('data/projection_3856.tif') + 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 + 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 @@ -365,11 +435,14 @@ def test_tiff_srs_projection_3856(): def test_tiff_srs_imagine_localcs_citation(): - ds = gdal.Open('data/imagine_localcs_citation.tif') + 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"') + 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 @@ -378,21 +451,22 @@ def test_tiff_srs_imagine_localcs_citation(): def test_tiff_srs_towgs84_override_OSR_STRIP_TOWGS84_NO(): - with gdaltest.config_option('OSR_STRIP_TOWGS84', 'NO'): - ds = gdal.Open('data/gtiff_towgs84_override.tif') + with gdaltest.config_option("OSR_STRIP_TOWGS84", "NO"): + 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 + assert "TOWGS84[584.8,67,400.3,0.105,0.013,-2.378,10.29]" in wkt, wkt def test_tiff_srs_towgs84_override_OSR_STRIP_TOWGS84_default(): - ds = gdal.Open('data/gtiff_towgs84_override.tif') + ds = gdal.Open("data/gtiff_towgs84_override.tif") wkt = ds.GetProjectionRef() ds = None - assert 'TOWGS84' not in wkt + assert "TOWGS84" not in wkt + ############################################################################### # Test reading PCSCitationGeoKey (#7199) @@ -400,19 +474,20 @@ def test_tiff_srs_towgs84_override_OSR_STRIP_TOWGS84_default(): def test_tiff_srs_pcscitation(): - ds = gdal.Open('data/pcscitation.tif') + 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') + ds = gdal.Open("data/utmsmall.tif") sr = ds.GetSpatialRef() assert sr.GetAuthorityCode(None) == "26711" @@ -421,36 +496,41 @@ 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 = gdal.GetDriverByName("GTiff").Create("/vsimem/TestTiffSRS.tif", 1, 1) ds.SetSpatialRef(sr) ds = None # The GeoTIFF driver is smart enough to figure out that a CRS with # '+proj=longlat +datum=WGS84' is EPSG:4326 - if sr.GetAuthorityCode(None) is None and '+proj=longlat +datum=WGS84' in sr.ExportToProj4(): + if ( + sr.GetAuthorityCode(None) is None + and "+proj=longlat +datum=WGS84" in sr.ExportToProj4() + ): sr.ImportFromEPSG(4326) - ds = gdal.Open('/vsimem/TestTiffSRS.tif') + ds = gdal.Open("/vsimem/TestTiffSRS.tif") sr2 = ds.GetSpatialRef() - if 'Miller' in sr2.ExportToWkt(): + if "Miller" in sr2.ExportToWkt(): # 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') + 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!') + pytest.xfail( + "did not get expected SRS. known to be broken currently. FIXME!" + ) - #print(sr.ExportToWkt(['FORMAT=WKT2_2019'])) - #print(sr2.ExportToWkt(['FORMAT=WKT2_2019'])) + # print(sr.ExportToWkt(['FORMAT=WKT2_2019'])) + # print(sr2.ExportToWkt(['FORMAT=WKT2_2019'])) print(sr) print(sr2) - assert False, 'did not get expected SRS' + assert False, "did not get expected SRS" else: if expect_fail: - print('Succeeded but expected fail...') + print("Succeeded but expected fail...") ############################################################################### @@ -465,13 +545,13 @@ def _test_tiff_srs(sr, expect_fail): [32661, False], # stere [3408, False], # laea [2062, False], # lcc 1SP - #[2065, True], # krovak South-West + # [2065, True], # krovak South-West [5221, True], # krovak east-north [2066, False], # cass [2964, False], # aea - #[3410, False], # cea spherical, method=9834. EPSG:3410 is now deprecated + # [3410, False], # cea spherical, method=9834. EPSG:3410 is now deprecated [6933, False], # cea ellipsoidal, method=9835 - #[3786, False], # eqc spherical, method=9823. EPSG:3786 is now deprecated + # [3786, False], # eqc spherical, method=9823. EPSG:3786 is now deprecated [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 @@ -496,16 +576,16 @@ def _test_tiff_srs(sr, expect_fail): ] -@pytest.mark.parametrize('use_epsg_code', [0, 1]) +@pytest.mark.parametrize("use_epsg_code", [0, 1]) @pytest.mark.parametrize( - 'epsg_code,epsg_proj4_broken', + "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)) + sr.SetFromUserInput("ESRI:" + str(epsg_code)) else: sr.ImportFromEPSG(epsg_code) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) @@ -521,21 +601,22 @@ def test_tiff_srs(use_epsg_code, epsg_code, epsg_proj4_broken): @pytest.mark.parametrize( - 'proj4', + "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), + '+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', - ] + "eqdc", + "mill", + "gnom", + "robin", + "sinu", + ], ) def test_tiff_srs_proj4(proj4): sr = osr.SpatialReference() @@ -543,164 +624,176 @@ def test_tiff_srs_proj4(proj4): _test_tiff_srs(sr, False) -def _create_geotiff1_1_from_copy_and_compare(srcfilename, options = []): - if int(gdal.GetDriverByName('GTiff').GetMetadataItem('LIBGEOTIFF')) < 1600: +def _create_geotiff1_1_from_copy_and_compare(srcfilename, options=[]): + if int(gdal.GetDriverByName("GTiff").GetMetadataItem("LIBGEOTIFF")) < 1600: pytest.skip() src_ds = gdal.Open(srcfilename) - tmpfile = '/vsimem/tmp.tif' - gdal.GetDriverByName('GTiff').CreateCopy(tmpfile, src_ds, options = options + ['ENDIANNESS=LITTLE']) - f = gdal.VSIFOpenL(tmpfile, 'rb') + tmpfile = "/vsimem/tmp.tif" + gdal.GetDriverByName("GTiff").CreateCopy( + tmpfile, src_ds, options=options + ["ENDIANNESS=LITTLE"] + ) + f = gdal.VSIFOpenL(tmpfile, "rb") data = gdal.VSIFReadL(1, 100000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) - assert data == open(src_ds.GetDescription(), 'rb').read() + assert data == open(src_ds.GetDescription(), "rb").read() def test_tiff_srs_read_epsg4326_geotiff1_1(): - ds = gdal.Open('data/epsg4326_geotiff1_1.tif') + ds = gdal.Open("data/epsg4326_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '4326' + assert sr.GetAuthorityCode(None) == "4326" def test_tiff_srs_write_epsg4326_geotiff1_1(): - _create_geotiff1_1_from_copy_and_compare('data/epsg4326_geotiff1_1.tif', - options = ['GEOTIFF_VERSION=1.1']) + _create_geotiff1_1_from_copy_and_compare( + "data/epsg4326_geotiff1_1.tif", options=["GEOTIFF_VERSION=1.1"] + ) def test_tiff_srs_read_epsg26711_geotiff1_1(): - ds = gdal.Open('data/epsg26711_geotiff1_1.tif') + ds = gdal.Open("data/epsg26711_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '26711' + assert sr.GetAuthorityCode(None) == "26711" def test_tiff_srs_write_epsg26711_geotiff1_1(): - _create_geotiff1_1_from_copy_and_compare('data/epsg26711_geotiff1_1.tif', - options = ['GEOTIFF_VERSION=1.1']) + _create_geotiff1_1_from_copy_and_compare( + "data/epsg26711_geotiff1_1.tif", options=["GEOTIFF_VERSION=1.1"] + ) def test_tiff_srs_read_epsg4326_3855_geotiff1_1(): - ds = gdal.Open('data/epsg4326_3855_geotiff1_1.tif') + ds = gdal.Open("data/epsg4326_3855_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetName() == 'WGS 84 + EGM2008 height' - assert sr.GetAuthorityCode('COMPD_CS|GEOGCS') == '4326' - assert sr.GetAuthorityCode('COMPD_CS|VERT_CS') == '3855' + assert sr.GetName() == "WGS 84 + EGM2008 height" + assert sr.GetAuthorityCode("COMPD_CS|GEOGCS") == "4326" + assert sr.GetAuthorityCode("COMPD_CS|VERT_CS") == "3855" def test_tiff_srs_write_epsg4326_3855_geotiff1_1(): - _create_geotiff1_1_from_copy_and_compare('data/epsg4326_3855_geotiff1_1.tif') + _create_geotiff1_1_from_copy_and_compare("data/epsg4326_3855_geotiff1_1.tif") def test_tiff_srs_read_epsg4979_geotiff1_1(): - ds = gdal.Open('data/epsg4979_geotiff1_1.tif') + ds = gdal.Open("data/epsg4979_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '4979' + assert sr.GetAuthorityCode(None) == "4979" def test_tiff_srs_write_epsg4979_geotiff1_1(): - _create_geotiff1_1_from_copy_and_compare('data/epsg4979_geotiff1_1.tif') + _create_geotiff1_1_from_copy_and_compare("data/epsg4979_geotiff1_1.tif") def test_tiff_srs_write_epsg4937_etrs89_3D_geotiff1_1(): - if int(gdal.GetDriverByName('GTiff').GetMetadataItem('LIBGEOTIFF')) < 1600: + if int(gdal.GetDriverByName("GTiff").GetMetadataItem("LIBGEOTIFF")) < 1600: pytest.skip() - tmpfile = '/vsimem/tmp.tif' - ds = gdal.GetDriverByName('GTiff').Create(tmpfile, 1, 1) + tmpfile = "/vsimem/tmp.tif" + ds = gdal.GetDriverByName("GTiff").Create(tmpfile, 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(4937) ds.SetSpatialRef(sr) ds = None ds = gdal.Open(tmpfile) - assert sr.GetName() == 'ETRS89' - assert sr.GetAuthorityCode(None) == '4937' + assert sr.GetName() == "ETRS89" + assert sr.GetAuthorityCode(None) == "4937" ds = None gdal.Unlink(tmpfile) # Deprecated way of conveying GeographicCRS 3D def test_tiff_srs_read_epsg4326_5030_geotiff1_1(): - ds = gdal.Open('data/epsg4326_5030_geotiff1_1.tif') + ds = gdal.Open("data/epsg4326_5030_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '4979' + assert sr.GetAuthorityCode(None) == "4979" def test_tiff_srs_read_epsg26711_3855_geotiff1_1(): - ds = gdal.Open('data/epsg26711_3855_geotiff1_1.tif') + ds = gdal.Open("data/epsg26711_3855_geotiff1_1.tif") sr = ds.GetSpatialRef() - assert sr.GetName() == 'NAD27 / UTM zone 11N + EGM2008 height' - assert sr.GetAuthorityCode('COMPD_CS|PROJCS') == '26711' - assert sr.GetAuthorityCode('COMPD_CS|VERT_CS') == '3855' + assert sr.GetName() == "NAD27 / UTM zone 11N + EGM2008 height" + assert sr.GetAuthorityCode("COMPD_CS|PROJCS") == "26711" + assert sr.GetAuthorityCode("COMPD_CS|VERT_CS") == "3855" def test_tiff_srs_write_epsg26711_3855_geotiff1_1(): - _create_geotiff1_1_from_copy_and_compare('data/epsg26711_3855_geotiff1_1.tif') + _create_geotiff1_1_from_copy_and_compare("data/epsg26711_3855_geotiff1_1.tif") # ProjectedCRS 3D not really defined yet in GeoTIFF 1.1, but this is # a natural extension def test_tiff_srs_read_epsg32631_4979_geotiff1_1(): - ds = gdal.Open('data/epsg32631_4979_geotiff1_1.tif') + ds = gdal.Open("data/epsg32631_4979_geotiff1_1.tif") sr = ds.GetSpatialRef() assert sr.IsProjected() assert sr.GetAxesCount() == 3 - assert sr.GetName() == 'WGS 84 / UTM zone 31N' + assert sr.GetName() == "WGS 84 / UTM zone 31N" sr_geog = osr.SpatialReference() sr_geog.CopyGeogCSFrom(sr) - assert sr_geog.GetAuthorityCode(None) == '4979' + assert sr_geog.GetAuthorityCode(None) == "4979" def test_tiff_srs_write_vertical_perspective(): if osr.GetPROJVersionMajor() * 100 + osr.GetPROJVersionMinor() < 700: - pytest.skip('requires PROJ 7 or later') + pytest.skip("requires PROJ 7 or later") - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src.tif', 1, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src.tif", 1, 1) sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 3000000, 0) sr.SetVerticalPerspective(1, 2, 0, 1000, 0, 0) gdal.ErrorReset() ds.SetSpatialRef(sr) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - src_ds = gdal.Open('/vsimem/src.tif') + src_ds = gdal.Open("/vsimem/src.tif") # First is PROJ 7 - assert src_ds.GetSpatialRef().ExportToProj4() in ('+proj=nsper +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +R=3000000 +units=m +no_defs', '+proj=nsper +R=3000000 +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +wktext +no_defs') + assert src_ds.GetSpatialRef().ExportToProj4() in ( + "+proj=nsper +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +R=3000000 +units=m +no_defs", + "+proj=nsper +R=3000000 +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +wktext +no_defs", + ) gdal.ErrorReset() - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/dst.tif', src_ds) - assert gdal.GetLastErrorMsg() == '' + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/dst.tif", src_ds) + assert gdal.GetLastErrorMsg() == "" - ds = gdal.Open('/vsimem/dst.tif') + ds = gdal.Open("/vsimem/dst.tif") assert ds.GetSpatialRef().ExportToProj4() == src_ds.GetSpatialRef().ExportToProj4() src_ds = None ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/src.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/dst.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/src.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/dst.tif") def test_tiff_srs_write_ob_tran_eqc(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src.tif', 1, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src.tif", 1, 1) sr = osr.SpatialReference() - sr.ImportFromProj4( '+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs' ) + sr.ImportFromProj4( + "+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs" + ) ds.SetSpatialRef(sr) ds = None - assert gdal.VSIStatL('/vsimem/src.tif.aux.xml') + assert gdal.VSIStatL("/vsimem/src.tif.aux.xml") - ds = gdal.Open('/vsimem/src.tif') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs' + ds = gdal.Open("/vsimem/src.tif") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs" + ) ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/src.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/src.tif") def test_tiff_srs_towgs84_from_epsg_do_not_write_it(): - filename = '/vsimem/test.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/test.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) srs_in = osr.SpatialReference() srs_in.ImportFromEPSG(31468) srs_in.AddGuessedTOWGS84() @@ -709,36 +802,37 @@ def test_tiff_srs_towgs84_from_epsg_do_not_write_it(): ds = None ds = gdal.Open(filename) - with gdaltest.config_option('OSR_ADD_TOWGS84_ON_IMPORT_FROM_EPSG', 'NO'): + 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) + 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'): + with gdaltest.config_option("GTIFF_WRITE_TOWGS84", "YES"): ds.SetSpatialRef(srs_in) ds = None - with gdaltest.config_option('OSR_STRIP_TOWGS84', 'NO'): + with gdaltest.config_option("OSR_STRIP_TOWGS84", "NO"): ds = gdal.Open(filename) - with gdaltest.config_option('OSR_ADD_TOWGS84_ON_IMPORT_FROM_EPSG', 'NO'): + 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) + 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", + srs_in.SetFromUserInput( + """PROJCS["DHDN / 3-degree Gauss-Kruger zone 4", GEOGCS["DHDN", DATUM["Deutsches_Hauptdreiecksnetz", SPHEROID["Bessel 1841",6377397.155,299.1528128, @@ -760,27 +854,28 @@ def test_tiff_srs_towgs84_with_epsg_code_but_non_default_TOWGS84(): AUTHORITY["EPSG","9001"]], AXIS["Northing",NORTH], AXIS["Easting",EAST], - AUTHORITY["EPSG","31468"]]""") + AUTHORITY["EPSG","31468"]]""" + ) ds.SetSpatialRef(srs_in) ds = None - with gdaltest.config_option('OSR_STRIP_TOWGS84', 'NO'): + with gdaltest.config_option("OSR_STRIP_TOWGS84", "NO"): ds = gdal.Open(filename) srs = ds.GetSpatialRef() - assert srs.GetTOWGS84() == (1,2,3,4,5,6,7) + 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) + 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') + 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) @@ -788,56 +883,56 @@ def test_tiff_srs_write_epsg3857(): def test_tiff_srs_read_epsg26730_with_linear_units_set(): - ds = gdal.Open('data/epsg26730_with_linear_units_set.tif') + ds = gdal.Open("data/epsg26730_with_linear_units_set.tif") sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '26730' + assert sr.GetAuthorityCode(None) == "26730" def test_tiff_srs_read_user_defined_geokeys(): - if int(gdal.GetDriverByName('GTiff').GetMetadataItem('LIBGEOTIFF')) < 1600: + if int(gdal.GetDriverByName("GTiff").GetMetadataItem("LIBGEOTIFF")) < 1600: pytest.skip() gdal.ErrorReset() - ds = gdal.Open('data/byte_user_defined_geokeys.tif') + ds = gdal.Open("data/byte_user_defined_geokeys.tif") sr = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" assert sr is not None def test_tiff_srs_read_compoundcrs_without_gtcitation(): - if int(gdal.GetDriverByName('GTiff').GetMetadataItem('LIBGEOTIFF')) < 1600: + if int(gdal.GetDriverByName("GTiff").GetMetadataItem("LIBGEOTIFF")) < 1600: pytest.skip() - ds = gdal.Open('data/gtiff/compdcrs_without_gtcitation.tif') + ds = gdal.Open("data/gtiff/compdcrs_without_gtcitation.tif") sr = ds.GetSpatialRef() - assert sr.GetName() == 'WGS 84 / UTM zone 32N + EGM08_Geoid' + assert sr.GetName() == "WGS 84 / UTM zone 32N + EGM08_Geoid" def test_tiff_srs_read_getspatialref_getgcpspatialref(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") assert ds.GetSpatialRef() is not None assert ds.GetGCPSpatialRef() is None - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") assert ds.GetGCPSpatialRef() is None assert ds.GetSpatialRef() is not None - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") assert ds.GetSpatialRef() is not None assert ds.GetSpatialRef() is not None assert ds.GetGCPSpatialRef() is None assert ds.GetGCPSpatialRef() is None - ds = gdal.Open('data/byte_gcp_pixelispoint.tif') + ds = gdal.Open("data/byte_gcp_pixelispoint.tif") assert ds.GetSpatialRef() is None assert ds.GetGCPSpatialRef() is not None - ds = gdal.Open('data/byte_gcp_pixelispoint.tif') + ds = gdal.Open("data/byte_gcp_pixelispoint.tif") assert ds.GetGCPSpatialRef() is not None assert ds.GetSpatialRef() is None - ds = gdal.Open('data/byte_gcp_pixelispoint.tif') + ds = gdal.Open("data/byte_gcp_pixelispoint.tif") assert ds.GetGCPSpatialRef() is not None assert ds.GetGCPSpatialRef() is not None assert ds.GetSpatialRef() is None @@ -845,15 +940,15 @@ def test_tiff_srs_read_getspatialref_getgcpspatialref(): def test_tiff_srs_read_VerticalUnitsGeoKey_private_range(): - ds = gdal.Open('data/gtiff/VerticalUnitsGeoKey_private_range.tif') + ds = gdal.Open("data/gtiff/VerticalUnitsGeoKey_private_range.tif") with gdaltest.error_handler(): sr = ds.GetSpatialRef() assert sr.GetName() == "NAD83 / UTM zone 16N" - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" def test_tiff_srs_read_invalid_semimajoraxis_compound(): - ds = gdal.Open('data/gtiff/invalid_semimajoraxis_compound.tif') + ds = gdal.Open("data/gtiff/invalid_semimajoraxis_compound.tif") # Check that it doesn't crash. PROJ >= 8.2.0 will return a NULL CRS # whereas previous versions will return a non-NULL one with gdaltest.error_handler(): @@ -865,20 +960,20 @@ def test_tiff_srs_try_write_derived_geographic(): if osr.GetPROJVersionMajor() < 7: pytest.skip() - tmpfile = '/vsimem/tmp.tif' - ds = gdal.GetDriverByName('GTiff').Create(tmpfile, 1, 1) + tmpfile = "/vsimem/tmp.tif" + ds = gdal.GetDriverByName("GTiff").Create(tmpfile, 1, 1) wkt = 'GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-30,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-15,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]' ds.SetProjection(wkt) ds = None - assert gdal.VSIStatL(tmpfile + '.aux.xml') + assert gdal.VSIStatL(tmpfile + ".aux.xml") ds = gdal.Open(tmpfile) srs = ds.GetSpatialRef() assert srs is not None assert srs.IsDerivedGeographic() ds = None - gdal.Unlink(tmpfile + '.aux.xml') + gdal.Unlink(tmpfile + ".aux.xml") ds = gdal.Open(tmpfile) assert ds.GetSpatialRef() is None ds = None @@ -887,60 +982,66 @@ def test_tiff_srs_try_write_derived_geographic(): def test_tiff_srs_read_GeogGeodeticDatumGeoKey_reserved_range(): - ds = gdal.Open('data/gtiff/GeogGeodeticDatumGeoKey_reserved.tif') + ds = gdal.Open("data/gtiff/GeogGeodeticDatumGeoKey_reserved.tif") with gdaltest.error_handler(): sr = ds.GetSpatialRef() assert sr.GetName() == "WGS 84 / Pseudo-Mercator" - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" assert gdal.GetLastErrorType() == gdal.CE_Warning def test_tiff_srs_read_buggy_sentinel1_ellipsoid_code_4326(): # That file has GeogEllipsoidGeoKey=4326, instead of 7030 - ds = gdal.Open('data/gtiff/buggy_sentinel1_ellipsoid_code_4326.tif') + ds = gdal.Open("data/gtiff/buggy_sentinel1_ellipsoid_code_4326.tif") sr = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '' - assert sr.GetAuthorityCode('GEOGCS|DATUM|SPHEROID') == '7030' + assert gdal.GetLastErrorMsg() == "" + assert sr.GetAuthorityCode("GEOGCS|DATUM|SPHEROID") == "7030" def test_tiff_srs_read_invalid_GeogAngularUnitSizeGeoKey(): # That file has GeogAngularUnitSizeGeoKey = 0 - ds = gdal.Open('data/gtiff/invalid_GeogAngularUnitSizeGeoKey.tif') + ds = gdal.Open("data/gtiff/invalid_GeogAngularUnitSizeGeoKey.tif") gdal.ErrorReset() with gdaltest.error_handler(): ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" def test_tiff_srs_read_inconsistent_invflattening(): # That file has GeogSemiMinorAxisGeoKey / GeogInvFlatteningGeoKey values # which are inconsistent with the ones from the ellipsoid of the datum - ds = gdal.Open('data/gtiff/inconsistent_invflattening.tif') + ds = gdal.Open("data/gtiff/inconsistent_invflattening.tif") gdal.ErrorReset() with gdaltest.error_handler(): srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() != '' - assert srs.GetAuthorityCode(None) == '28992' - assert srs.GetAuthorityCode('GEOGCS') == '4289' - assert srs.GetInvFlattening() == pytest.approx(299.1528131, abs=1e-7) # wrong value w.r.t Bessel 1841 official definition - - ds = gdal.Open('data/gtiff/inconsistent_invflattening.tif') + assert gdal.GetLastErrorMsg() != "" + assert srs.GetAuthorityCode(None) == "28992" + assert srs.GetAuthorityCode("GEOGCS") == "4289" + assert srs.GetInvFlattening() == pytest.approx( + 299.1528131, abs=1e-7 + ) # wrong value w.r.t Bessel 1841 official definition + + ds = gdal.Open("data/gtiff/inconsistent_invflattening.tif") gdal.ErrorReset() - with gdaltest.config_option('GTIFF_SRS_SOURCE', 'GEOKEYS'): + with gdaltest.config_option("GTIFF_SRS_SOURCE", "GEOKEYS"): srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" assert srs.GetAuthorityCode(None) is None - assert srs.GetAuthorityCode('GEOGCS') is None - assert srs.GetInvFlattening() == pytest.approx(299.1528131, abs=1e-7) # wrong value w.r.t Bessel 1841 official definition + assert srs.GetAuthorityCode("GEOGCS") is None + assert srs.GetInvFlattening() == pytest.approx( + 299.1528131, abs=1e-7 + ) # wrong value w.r.t Bessel 1841 official definition - ds = gdal.Open('data/gtiff/inconsistent_invflattening.tif') + ds = gdal.Open("data/gtiff/inconsistent_invflattening.tif") gdal.ErrorReset() - with gdaltest.config_option('GTIFF_SRS_SOURCE', 'EPSG'): + with gdaltest.config_option("GTIFF_SRS_SOURCE", "EPSG"): srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '' - assert srs.GetAuthorityCode(None) == '28992' - assert srs.GetAuthorityCode('GEOGCS') == '4289' - assert srs.GetInvFlattening() == pytest.approx(299.1528128, abs=1e-7) # Bessel 1841 official definition + assert gdal.GetLastErrorMsg() == "" + assert srs.GetAuthorityCode(None) == "28992" + assert srs.GetAuthorityCode("GEOGCS") == "4289" + assert srs.GetInvFlattening() == pytest.approx( + 299.1528128, abs=1e-7 + ) # Bessel 1841 official definition def test_tiff_srs_dynamic_geodetic_crs(): @@ -949,88 +1050,104 @@ def test_tiff_srs_dynamic_geodetic_crs(): pytest.skip() srs = osr.SpatialReference() - srs.ImportFromEPSG(8999) # ITRF2008 - ds = gdal.GetDriverByName('GTiff').Create( - '/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif', 1, 1) + srs.ImportFromEPSG(8999) # ITRF2008 + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif", 1, 1 + ) ds.SetSpatialRef(srs) ds = None - ds = gdal.Open('/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif') + ds = gdal.Open("/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif") gdal.ErrorReset() srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '', srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetAuthorityCode(None) == '8999' + assert gdal.GetLastErrorMsg() == "", srs.ExportToWkt(["FORMAT=WKT2_2019"]) + assert srs.GetAuthorityCode(None) == "8999" ds = None - gdal.Unlink('/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif') + gdal.Unlink("/vsimem/test_tiff_srs_dynamic_geodetic_crs.tif") -@pytest.mark.parametrize('geotiff_version', ['1.0', '1.1']) +@pytest.mark.parametrize("geotiff_version", ["1.0", "1.1"]) def test_tiff_srs_geographic_crs_3D(geotiff_version): srs = osr.SpatialReference() - srs.ImportFromEPSG(4959) # NZGD2000 3D - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_tiff_srs_geographic_crs_3D.tif', 1, 1, - options = ['GEOTIFF_VERSION=' + geotiff_version]) + srs.ImportFromEPSG(4959) # NZGD2000 3D + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_tiff_srs_geographic_crs_3D.tif", + 1, + 1, + options=["GEOTIFF_VERSION=" + geotiff_version], + ) ds.SetSpatialRef(srs) ds = None - ds = gdal.Open('/vsimem/test_tiff_srs_geographic_crs_3D.tif') + ds = gdal.Open("/vsimem/test_tiff_srs_geographic_crs_3D.tif") gdal.ErrorReset() srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '', srs.ExportToWkt(['FORMAT=WKT2_2019']) - if geotiff_version == '1.1': - assert srs.GetAuthorityCode(None) == '4959' + assert gdal.GetLastErrorMsg() == "", srs.ExportToWkt(["FORMAT=WKT2_2019"]) + if geotiff_version == "1.1": + assert srs.GetAuthorityCode(None) == "4959" ds = None - gdal.Unlink('/vsimem/test_tiff_srs_geographic_crs_3D.tif') + gdal.Unlink("/vsimem/test_tiff_srs_geographic_crs_3D.tif") def test_tiff_srs_datum_name_with_space(): srs = osr.SpatialReference() - srs.ImportFromEPSG(4312) # MGI with datum name = 'Militar-Geographische Institut"" - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_tiff_srs_datum_name_with_space.tif', 1, 1) + srs.ImportFromEPSG(4312) # MGI with datum name = 'Militar-Geographische Institut"" + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_tiff_srs_datum_name_with_space.tif", 1, 1 + ) ds.SetSpatialRef(srs) ds = None - ds = gdal.Open('/vsimem/test_tiff_srs_datum_name_with_space.tif') + ds = gdal.Open("/vsimem/test_tiff_srs_datum_name_with_space.tif") gdal.ErrorReset() srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '', srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetAuthorityCode(None) == '4312' + assert gdal.GetLastErrorMsg() == "", srs.ExportToWkt(["FORMAT=WKT2_2019"]) + assert srs.GetAuthorityCode(None) == "4312" ds = None - gdal.Unlink('/vsimem/test_tiff_srs_datum_name_with_space.tif') + gdal.Unlink("/vsimem/test_tiff_srs_datum_name_with_space.tif") def test_tiff_srs_compound_crs_with_local_cs(): - filename = '/vsimem/test_tiff_srs_compound_crs_with_local_cs.tif' + filename = "/vsimem/test_tiff_srs_compound_crs_with_local_cs.tif" srs = osr.SpatialReference() - srs.SetFromUserInput('COMPD_CS["COMPD_CS_name",LOCAL_CS["None",LOCAL_DATUM["None",32767],UNIT["Foot_US",0.304800609601219],AXIS["None",OTHER]],VERT_CS["VERT_CS_Name",VERT_DATUM["Local",2005],UNIT["Meter",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP]]]') - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + srs.SetFromUserInput( + 'COMPD_CS["COMPD_CS_name",LOCAL_CS["None",LOCAL_DATUM["None",32767],UNIT["Foot_US",0.304800609601219],AXIS["None",OTHER]],VERT_CS["VERT_CS_Name",VERT_DATUM["Local",2005],UNIT["Meter",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP]]]' + ) + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds.SetSpatialRef(srs) assert srs.IsCompound() assert srs.GetLinearUnits() == pytest.approx(0.304800609601219) gdal.ErrorReset() ds = None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = gdal.Open(filename) gdal.ErrorReset() srs = ds.GetSpatialRef() - assert gdal.GetLastErrorMsg() == '', srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetName() == 'COMPD_CS_name', srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.IsCompound(), srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetLinearUnits() == pytest.approx(0.304800609601219), srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetAttrValue('COMPD_CS|VERT_CS') == 'VERT_CS_Name', srs.ExportToWkt(['FORMAT=WKT2_2019']) - assert srs.GetAttrValue('COMPD_CS|VERT_CS|UNIT') in ('Meter', 'metre'), srs.ExportToWkt(['FORMAT=WKT2_2019']) + assert gdal.GetLastErrorMsg() == "", srs.ExportToWkt(["FORMAT=WKT2_2019"]) + assert srs.GetName() == "COMPD_CS_name", srs.ExportToWkt(["FORMAT=WKT2_2019"]) + assert srs.IsCompound(), srs.ExportToWkt(["FORMAT=WKT2_2019"]) + assert srs.GetLinearUnits() == pytest.approx(0.304800609601219), srs.ExportToWkt( + ["FORMAT=WKT2_2019"] + ) + assert srs.GetAttrValue("COMPD_CS|VERT_CS") == "VERT_CS_Name", srs.ExportToWkt( + ["FORMAT=WKT2_2019"] + ) + assert srs.GetAttrValue("COMPD_CS|VERT_CS|UNIT") in ( + "Meter", + "metre", + ), srs.ExportToWkt(["FORMAT=WKT2_2019"]) ds = None gdal.Unlink(filename) def test_tiff_srs_read_esri_pcs_gcs_ellipsoid_names(): - ds = gdal.Open('data/gtiff/esri_pcs_gcs_ellipsoid_names.tif') + ds = gdal.Open("data/gtiff/esri_pcs_gcs_ellipsoid_names.tif") srs = ds.GetSpatialRef() # Check that the names of the SRS components are morphed from ESRI names # to EPSG WKT2 names - wkt = srs.ExportToWkt(['FORMAT=WKT2']) + wkt = srs.ExportToWkt(["FORMAT=WKT2"]) assert 'PROJCRS["RT90 5 gon O"' in wkt assert 'BASEGEOGCRS["RT90"' in wkt assert 'DATUM["Rikets koordinatsystem 1990"' in wkt diff --git a/autotest/gcore/tiff_write.py b/autotest/gcore/tiff_write.py index 0333381505b5..1f35dfb6cbb8 100755 --- a/autotest/gcore/tiff_write.py +++ b/autotest/gcore/tiff_write.py @@ -30,16 +30,16 @@ import copy import math import os -import sys import shutil import struct -from osgeo import gdal -from osgeo import osr -import pytest +import sys import gdaltest +import pytest from test_py_scripts import samples_path +from osgeo import gdal, osr + ############################################################################### @@ -49,11 +49,15 @@ def _check_cog(filename, check_tiled=True, full_check=False): if path not in sys.path: sys.path.append(path) import validate_cloud_optimized_geotiff + try: - _, errors, _ = validate_cloud_optimized_geotiff.validate(filename, check_tiled=check_tiled, full_check=full_check) - assert not errors, 'validate_cloud_optimized_geotiff failed' + _, errors, _ = validate_cloud_optimized_geotiff.validate( + filename, check_tiled=check_tiled, full_check=full_check + ) + assert not errors, "validate_cloud_optimized_geotiff failed" except OSError: - pytest.fail('validate_cloud_optimized_geotiff failed') + pytest.fail("validate_cloud_optimized_geotiff failed") + ############################################################################### # Get the GeoTIFF driver, and verify a few things about it. @@ -61,11 +65,12 @@ def _check_cog(filename, check_tiled=True, full_check=False): def test_tiff_write_1(): - gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') - assert gdaltest.tiff_drv is not None, 'GTiff driver not found!' + 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' + assert drv_md["DMD_MIMETYPE"] == "image/tiff", "mime type is wrong" + ############################################################################### # Create a simple file by copying from an existing one. @@ -73,29 +78,32 @@ def test_tiff_write_1(): def test_tiff_write_2(): - src_ds = gdal.Open('data/cfloat64.tif') + src_ds = gdal.Open("data/cfloat64.tif") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_2.tif', src_ds) + 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' + 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') + 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.Checksum() == 5028, "Didnt get expected checksum on reopened file" - assert bnd.ComputeRasterMinMax() == (74.0, 255.0), \ - 'ComputeRasterMinMax() returned wrong value' + assert bnd.ComputeRasterMinMax() == ( + 74.0, + 255.0, + ), "ComputeRasterMinMax() returned wrong value" bnd = None new_ds = None - gdaltest.tiff_drv.Delete('tmp/test_2.tif') + gdaltest.tiff_drv.Delete("tmp/test_2.tif") + ############################################################################### # Create a simple file by copying from an existing one. @@ -103,20 +111,20 @@ def test_tiff_write_2(): def test_tiff_write_3(): - src_ds = gdal.Open('data/utmsmall.tif') + src_ds = gdal.Open("data/utmsmall.tif") - options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32'] + options = ["TILED=YES", "BLOCKXSIZE=32", "BLOCKYSIZE=32"] - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_3.tif', src_ds, - options=options) + 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' + 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') + gdaltest.tiff_drv.Delete("tmp/test_3.tif") + ############################################################################### # Create a tiled file. @@ -124,12 +132,13 @@ def test_tiff_write_3(): def test_tiff_write_4(): - np = pytest.importorskip('numpy') + np = pytest.importorskip("numpy") - options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32'] + options = ["TILED=YES", "BLOCKXSIZE=32", "BLOCKYSIZE=32"] - new_ds = gdaltest.tiff_drv.Create('tmp/test_4.tif', 40, 50, 3, - gdal.GDT_Byte, options) + new_ds = gdaltest.tiff_drv.Create( + "tmp/test_4.tif", 40, 50, 3, gdal.GDT_Byte, options + ) data_red = np.zeros((50, 40), dtype=np.uint8) data_green = np.zeros((50, 40), dtype=np.uint8) @@ -148,31 +157,38 @@ def test_tiff_write_4(): 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 ( + 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.' + assert gt == new_ds.GetGeoTransform(), "Wrong geotransform." - new_ds.SetMetadata({'TEST_KEY': 'TestValue <>'}) + new_ds.SetMetadata({"TEST_KEY": "TestValue <>"}) new_ds = None - new_ds = gdal.Open('tmp/test_4.tif') + 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 ( + 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).' + assert gt == new_ds.GetGeoTransform(), "Wrong geotransform(2)." nd = new_ds.GetRasterBand(1).GetNoDataValue() - assert nd is None, 'Got unexpected nodata value.' + assert nd is None, "Got unexpected nodata value." md_dict = new_ds.GetMetadata() - assert md_dict['TEST_KEY'] == 'TestValue <>', 'Missing metadata' + assert md_dict["TEST_KEY"] == "TestValue <>", "Missing metadata" new_ds = None - gdaltest.tiff_drv.Delete('tmp/test_4.tif') + gdaltest.tiff_drv.Delete("tmp/test_4.tif") + ############################################################################### # Write a file with GCPs. @@ -180,44 +196,51 @@ def test_tiff_write_4(): def test_tiff_write_5(): - src_ds = gdal.Open('data/gcps.vrt') + src_ds = gdal.Open("data/gcps.vrt") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_5.tif', src_ds) + 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.' + 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.' + assert len(gcps) == 4, "GCP count wrong." new_ds = None - gdaltest.tiff_drv.Delete('tmp/test_5.tif') + 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 = 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') + new_ds = gdal.Open("tmp/test_5.tif") gcps = new_ds.GetGCPs() - assert len(gcps) == 4, 'GCP count wrong.' + assert len(gcps) == 4, "GCP count wrong." new_ds = None - gdaltest.tiff_drv.Delete('tmp/test_5.tif') + gdaltest.tiff_drv.Delete("tmp/test_5.tif") + ############################################################################### # Test a mixture of reading and writing on a DEFLATE compressed file. + def test_tiff_write_6(): - 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) + 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 = b''.join(struct.pack('B', v) for v in range(32)) * 32 + buf = b"".join(struct.pack("B", v) for v in range(32)) * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() @@ -227,29 +250,30 @@ def test_tiff_write_6(): if buf_read != buf: gdaltest.tiff_write_6_failed = True - pytest.fail('did not get back expected data.') + pytest.fail("did not get back expected data.") ds = None - ds = gdal.Open('tmp/test_6.tif') - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'DEFLATE' - assert ds.GetMetadataItem('PREDICTOR', 'IMAGE_STRUCTURE') == '2' + ds = gdal.Open("tmp/test_6.tif") + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "DEFLATE" + assert ds.GetMetadataItem("PREDICTOR", "IMAGE_STRUCTURE") == "2" ds = None gdaltest.tiff_write_6_failed = False - gdaltest.tiff_drv.Delete('tmp/test_6.tif') + gdaltest.tiff_drv.Delete("tmp/test_6.tif") + ############################################################################### # Test a mixture of reading and writing on a LZW compressed file. + def test_tiff_write_7(): - options = ['TILED=YES', 'COMPRESS=LZW', 'PREDICTOR=2'] - ds = gdaltest.tiff_drv.Create('tmp/test_7.tif', 200, 200, 1, - gdal.GDT_Byte, options) + 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 = b''.join(struct.pack('B', v) for v in range(32)) * 32 + buf = b"".join(struct.pack("B", v) for v in range(32)) * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() @@ -257,11 +281,12 @@ def test_tiff_write_7(): 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.' + assert buf_read == buf, "did not get back expected data." ds = None - gdaltest.tiff_drv.Delete('tmp/test_7.tif') + gdaltest.tiff_drv.Delete("tmp/test_7.tif") + ############################################################################### # Test a mixture of reading and writing on a PACKBITS compressed file. @@ -269,12 +294,11 @@ def test_tiff_write_7(): 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) + 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 = b''.join(struct.pack('B', v) for v in range(32)) * 32 + buf = b"".join(struct.pack("B", v) for v in range(32)) * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() @@ -283,11 +307,12 @@ def test_tiff_write_8(): buf_read = ds.ReadRaster(0, 0, 32, 32, buf_type=gdal.GDT_Byte) - assert buf_read == buf, 'did not get back expected data.' + assert buf_read == buf, "did not get back expected data." ds = None - gdaltest.tiff_drv.Delete('tmp/test_8.tif') + gdaltest.tiff_drv.Delete("tmp/test_8.tif") + ############################################################################### # Create a simple file by copying from an existing one. @@ -295,20 +320,20 @@ def test_tiff_write_8(): 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']) + 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') + new_ds = gdal.Open("tmp/test_9.tif") bnd = new_ds.GetRasterBand(1) - assert bnd.Checksum() == 5287, 'Didnt get expected checksum on reopened file' + assert bnd.Checksum() == 5287, "Didnt get expected checksum on reopened file" bnd = None new_ds = None - gdaltest.tiff_drv.Delete('tmp/test_9.tif') + gdaltest.tiff_drv.Delete("tmp/test_9.tif") + ############################################################################### # 1bit file but with band interleaving, and odd size (not multiple of 8) #1957 @@ -316,20 +341,24 @@ def test_tiff_write_9(): def test_tiff_write_10(): - ut = gdaltest.GDALTest('GTiff', 'oddsize_1bit2b.tif', 2, 5918, - options=['NBITS=1', 'INTERLEAVE=BAND']) + 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']) + ut = gdaltest.GDALTest( + "GTiff", "oddsize1bit.tif", 1, 5918, options=["NBITS=1", "COMPRESS=CCITTFAX4"] + ) return ut.testCreateCopy() + ############################################################################### # Read JPEG Compressed YCbCr subsampled image. @@ -337,13 +366,14 @@ def test_tiff_write_11(): def test_tiff_write_12(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - ds = gdal.Open('data/sasha.tif') + ds = gdal.Open("data/sasha.tif") cs = ds.GetRasterBand(3).Checksum() assert cs == 31952 or cs == 30145 + ############################################################################### # Write JPEG Compressed YCbCr subsampled image. @@ -351,32 +381,40 @@ def test_tiff_write_12(): def test_tiff_write_13(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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') + 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 + size = os.stat("tmp/sasha.tif").st_size - gdaltest.tiff_drv.Delete('tmp/sasha.tif') - assert cs in (17347, 14445, - 14135, # libjpeg 9e - ) + gdaltest.tiff_drv.Delete("tmp/sasha.tif") + assert cs in ( + 17347, + 14445, + 14135, # libjpeg 9e + ) - if md['LIBTIFF'] == 'INTERNAL': + if md["LIBTIFF"] == "INTERNAL": # 22816 with libjpeg-6b or libjpeg-turbo # 22828 with libjpeg-9d - assert size <= 22828, 'fail: bad size' + assert size <= 22828, "fail: bad size" ############################################################################### @@ -385,7 +423,7 @@ def test_tiff_write_13(): def test_tiff_write_14(): - tst = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("GTiff", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) @@ -394,41 +432,51 @@ def test_tiff_write_14(): # 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_in = gdal.Open("data/byte.vrt") - ds = gdaltest.tiff_drv.CreateCopy('tmp/tw_15.tif', ds_in, options=['PROFILE=BASELINE']) + 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') + ds = gdal.Open("tmp/tw_15.tif") md = ds.GetMetadata() - assert 'test' in md, 'Metadata absent from .aux.xml file.' + 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.' + assert "testBand" in md, "Metadata absent from .aux.xml file." ds = None - gdal.Unlink('tmp/tw_15.tif.aux.xml') + gdal.Unlink("tmp/tw_15.tif.aux.xml") - ds = gdal.Open('tmp/tw_15.tif') + 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?' + 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.' + 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.' + assert "testBand" not in md, "Metadata written to BASELINE file." ds = None - gdaltest.tiff_drv.Delete('tmp/tw_15.tif') + gdaltest.tiff_drv.Delete("tmp/tw_15.tif") + ############################################################################### # Test that we can restrict metadata and georeferencing in the output @@ -437,13 +485,14 @@ def test_tiff_write_15(): def test_tiff_write_16(): - ds_in = gdal.Open('data/byte.vrt') + 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 = 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.SetMetadata({"test": "testvalue"}) + ds.GetRasterBand(1).SetMetadata({"testBand": "testvalueBand"}) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) @@ -457,35 +506,42 @@ def test_tiff_write_16(): ds = None # Check first from PAM - assert gdal.VSIStatL('tmp/tw_16.tif.aux.xml') is not None - ds = gdal.Open('tmp/tw_16.tif') + assert gdal.VSIStatL("tmp/tw_16.tif.aux.xml") is not None + ds = gdal.Open("tmp/tw_16.tif") assert ds.GetGeoTransform() == (10, 5, 0, 30, 0, -5) assert ds.GetSpatialRef() is not None - assert ds.GetSpatialRef().GetAuthorityCode(None) == '4326' + assert ds.GetSpatialRef().GetAuthorityCode(None) == "4326" md = ds.GetMetadata() - assert 'test' in md, 'Metadata absent from .aux.xml file.' + 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.' + assert "testBand" in md, "Metadata absent from .aux.xml file." ds = None - gdal.Unlink('tmp/tw_16.tif.aux.xml') + gdal.Unlink("tmp/tw_16.tif.aux.xml") - 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?' + 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?" assert ds.GetSpatialRef() is None md = ds.GetMetadata() - assert 'test' not in md, 'Metadata written to BASELINE file.' + 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.' + assert "testBand" not in md, "Metadata written to BASELINE file." ds = None - gdaltest.tiff_drv.Delete('tmp/tw_16.tif') + gdaltest.tiff_drv.Delete("tmp/tw_16.tif") + ############################################################################### # Test writing a TIFF with an RPC tag. @@ -495,66 +551,70 @@ def test_tiff_write_17(): # Translate RPC controlled data to GeoTIFF. - ds_in = gdal.Open('data/rpc.vrt') - rpc_md = ds_in.GetMetadata('RPC') + ds_in = gdal.Open("data/rpc.vrt") + rpc_md = ds_in.GetMetadata("RPC") - tmpfilename = '/vsimem/tiff_write_17.tif' + 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' + 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' + 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' + 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) + 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' + modified_rpc["LINE_OFF"] = "123456" ds = gdal.Open(tmpfilename, gdal.GA_Update) - ds.SetMetadata(modified_rpc, 'RPC') + ds.SetMetadata(modified_rpc, "RPC") ds = None ds = gdal.Open(tmpfilename) - assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), modified_rpc) + 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.SetMetadata(None, "RPC") ds = None ds = gdal.Open(tmpfilename) - assert not ds.GetMetadata('RPC'), 'got RPC, but was not expected' + 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') + 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) + gdal.SetConfigOption("GDAL_DISABLE_READDIR_ON_OPEN", oldval) return ret + ############################################################################### # Test writing a TIFF with an RPB file and IMD file. @@ -563,59 +623,64 @@ def test_tiff_write_18(): # Translate RPC controlled data to GeoTIFF. - ds_in = gdal.Open('data/rpc.vrt') - rpc_md = ds_in.GetMetadata('RPC') + 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']) + 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' + 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.' + 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' + 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') + ds = gdal.Open("tmp/tw_18.tif") - assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) + 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?' + 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 = 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') + 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.RPB"), "RPB did not get cleaned up." - assert not gdal.VSIStatL('tmp/tw_18.IMD'), 'IMD 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') + 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' + assert not os.path.exists("tmp/tw_18.RPB"), "RPB did not get removed" + + gdaltest.tiff_drv.Delete("tmp/tw_18.tif") - gdaltest.tiff_drv.Delete('tmp/tw_18.tif') ############################################################################### # Test writing a IMD files with space in values @@ -623,23 +688,27 @@ def test_tiff_write_18(): def test_tiff_write_imd_with_space_in_values(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1) - ds.SetMetadataItem('foo.key', 'value with space', 'IMD') - ds.SetMetadataItem('foo.key2', 'value with " double quote', 'IMD') - ds.SetMetadataItem('foo.key3', "value with ' single quote", 'IMD') - ds.SetMetadataItem('foo.key4', """value with " double and ' single quote""", 'IMD') - ds.SetMetadataItem('foo.key5', 'value_with_;', 'IMD') - ds.SetMetadataItem('foo.key6', 'regular_value', 'IMD') + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1) + ds.SetMetadataItem("foo.key", "value with space", "IMD") + ds.SetMetadataItem("foo.key2", 'value with " double quote', "IMD") + ds.SetMetadataItem("foo.key3", "value with ' single quote", "IMD") + ds.SetMetadataItem("foo.key4", """value with " double and ' single quote""", "IMD") + ds.SetMetadataItem("foo.key5", "value_with_;", "IMD") + ds.SetMetadataItem("foo.key6", "regular_value", "IMD") ds = None - f = gdal.VSIFOpenL('/vsimem/out.IMD', 'rb') + f = gdal.VSIFOpenL("/vsimem/out.IMD", "rb") assert f data = gdal.VSIFReadL(1, 1000, f) gdal.VSIFCloseL(f) - gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/out.tif") + + assert ( + data + == b'BEGIN_GROUP = foo\n\tkey = "value with space";\n\tkey2 = \'value with " double quote\';\n\tkey3 = "value with \' single quote";\n\tkey4 = "value with \'\' double and \' single quote";\n\tkey5 = "value_with_;";\n\tkey6 = regular_value;\nEND_GROUP = foo\nEND;\n' + ) - assert data == b'BEGIN_GROUP = foo\n\tkey = "value with space";\n\tkey2 = \'value with " double quote\';\n\tkey3 = "value with \' single quote";\n\tkey4 = "value with \'\' double and \' single quote";\n\tkey5 = "value_with_;";\n\tkey6 = regular_value;\nEND_GROUP = foo\nEND;\n' ############################################################################### # Test that above test still work with the optimization in the GDAL_DISABLE_READDIR_ON_OPEN @@ -647,12 +716,13 @@ def test_tiff_write_imd_with_space_in_values(): def test_tiff_write_18_disable_readdir(): - oldval = gdal.GetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN') - gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'TRUE') + 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) + gdal.SetConfigOption("GDAL_DISABLE_READDIR_ON_OPEN", oldval) return ret + ############################################################################### # Test writing a TIFF with an _RPC.TXT @@ -661,44 +731,47 @@ def test_tiff_write_rpc_txt(): # Translate RPC controlled data to GeoTIFF. - ds_in = gdal.Open('data/rpc.vrt') + 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') + ds_in_without_imd = gdal.GetDriverByName("VRT").CreateCopy("", ds_in) + ds_in_without_imd.SetMetadata(None, "IMD") - rpc_md = ds_in.GetMetadata('RPC') + 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 = 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') + 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') + 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') + ds = gdal.Open("tmp/tiff_write_rpc_txt.tif") - assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) + assert gdaltest.rpcs_equal(ds.GetMetadata("RPC"), rpc_md) ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_rpc_txt.tif') + 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') + assert not os.path.exists("tmp/tiff_write_rpc_txt_RPC.TXT") ############################################################################### @@ -707,80 +780,88 @@ def test_tiff_write_rpc_txt(): def test_tiff_write_rpc_in_pam(): - ds_in = gdal.Open('data/rpc.vrt') - rpc_md = ds_in.GetMetadata('RPC') + 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 = 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') + os.stat("tmp/tiff_write_rpc_in_pam.tif.aux.xml") except OSError: - pytest.fail('missing .aux.xml file.') + pytest.fail("missing .aux.xml file.") # confirm there is no .RPB file created. - assert not os.path.exists('tmp/tiff_write_rpc_txt.RPB') + 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') + ds = gdal.Open("tmp/tiff_write_rpc_in_pam.tif") - assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) + assert gdaltest.rpcs_equal(ds.GetMetadata("RPC"), rpc_md) ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_rpc_in_pam.tif') + 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') + 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 = 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 = 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') + gdaltest.tiff_drv.Delete("tmp/contig_strip_7.tif") + ############################################################################### # Test write and read of some TIFF tags # 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 = 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)) @@ -788,44 +869,52 @@ def test_tiff_write_20(): # hopefully it's closed now! - assert not os.path.exists('tmp/tags.tif.aux.xml') + assert not os.path.exists("tmp/tags.tif.aux.xml") - new_ds = gdal.Open('tmp/tags.tif') + 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 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])) + 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 = 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') + 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 = 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 = gdal.Open("tmp/tags.tif", gdal.GA_Update) ds.SetMetadata({}) ds = None - ds = gdal.Open('tmp/tags.tif') + ds = gdal.Open("tmp/tags.tif") got_md = ds.GetMetadata() ds = None - assert got_md == {}, 'expected empty metadata list, but got some' + assert got_md == {}, "expected empty metadata list, but got some" + + gdaltest.tiff_drv.Delete("tmp/tags.tif") - gdaltest.tiff_drv.Delete('tmp/tags.tif') ############################################################################### # Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_ASSOCALPHA @@ -833,22 +922,29 @@ def test_tiff_write_20(): def test_tiff_write_21(): - src_ds = gdal.Open('data/stefan_full_rgba.tif') + src_ds = gdal.Open("data/stefan_full_rgba.tif") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_rgba.tif', src_ds) + 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') + 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() + 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') + gdaltest.tiff_drv.Delete("tmp/stefan_full_rgba.tif") + ############################################################################### # Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_UNSPECIFIED @@ -856,22 +952,31 @@ def test_tiff_write_21(): def test_tiff_write_22(): - src_ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') + 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 = 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') + 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() + 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') + gdaltest.tiff_drv.Delete("tmp/stefan_full_rgba_photometric_rgb.tif") + ############################################################################### # Test grey+alpha images with ALPHA=YES @@ -879,22 +984,31 @@ def test_tiff_write_22(): def test_tiff_write_23(): - src_ds = gdal.Open('data/stefan_full_greyalpha.tif') + 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 = 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') + 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() + 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') + gdaltest.tiff_drv.Delete("tmp/stefan_full_greyalpha.tif") + ############################################################################### # Test grey+alpha images without ALPHA=YES @@ -902,22 +1016,29 @@ def test_tiff_write_23(): def test_tiff_write_24(): - src_ds = gdal.Open('data/stefan_full_greyalpha.tif') + src_ds = gdal.Open("data/stefan_full_greyalpha.tif") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_greyunspecified.tif', src_ds) + 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') + 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() + 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') + gdaltest.tiff_drv.Delete("tmp/stefan_full_greyunspecified.tif") + ############################################################################### # Read a CIELAB image to test the RGBA image TIFF interface @@ -925,7 +1046,7 @@ def test_tiff_write_24(): def test_tiff_write_25(): - src_ds = gdal.Open('data/cielab.tif') + 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 @@ -941,9 +1062,10 @@ def test_tiff_write_25(): ############################################################################### # 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) + ds = gdaltest.tiff_drv.Create("tmp/ct8.tif", 1, 1, 1, gdal.GDT_Byte) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) @@ -956,19 +1078,22 @@ def test_tiff_write_26(): ct = None ds = None - ds = gdal.Open('tmp/ct8.tif') + 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.' + 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') + gdaltest.tiff_drv.Delete("tmp/ct8.tif") + ############################################################################### # Test color table in a 16 bit image @@ -976,7 +1101,7 @@ def test_tiff_write_26(): def test_tiff_write_27(): - ds = gdaltest.tiff_drv.Create('tmp/ct16.tif', 1, 1, 1, gdal.GDT_UInt16) + ds = gdaltest.tiff_drv.Create("tmp/ct16.tif", 1, 1, 1, gdal.GDT_UInt16) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) @@ -989,25 +1114,28 @@ def test_tiff_write_27(): ct = None ds = None - ds = gdal.Open('tmp/ct16.tif') - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/ct16_copy.tif', ds) + 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') + 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.' + 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') + gdaltest.tiff_drv.Delete("tmp/ct16.tif") + gdaltest.tiff_drv.Delete("tmp/ct16_copy.tif") + ############################################################################### # Test SetRasterColorInterpretation on a 2 channel image @@ -1015,7 +1143,7 @@ def test_tiff_write_27(): def test_tiff_write_28(): - ds = gdaltest.tiff_drv.Create('tmp/greyalpha.tif', 1, 1, 2) + ds = gdaltest.tiff_drv.Create("tmp/greyalpha.tif", 1, 1, 2) assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_Undefined @@ -1025,12 +1153,13 @@ def test_tiff_write_28(): ds = None - ds = gdal.Open('tmp/greyalpha.tif') + ds = gdal.Open("tmp/greyalpha.tif") assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdaltest.tiff_drv.Delete('tmp/greyalpha.tif') + gdaltest.tiff_drv.Delete("tmp/greyalpha.tif") + ############################################################################### # Test SetRasterColorInterpretation on a 4 channel image @@ -1040,70 +1169,78 @@ 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' + 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' + assert ds.GetMetadataItem("TIFFTAG_EXTRASAMPLES", "_DEBUG_") == "2" ds = None - assert gdal.VSIStatL('/vsimem/rgba.tif.aux.xml') is None + assert gdal.VSIStatL("/vsimem/rgba.tif.aux.xml") is None - ds = gdal.Open('/vsimem/rgba.tif') - assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '2' + 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']) + 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 + 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' + 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']) + 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 + 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' + 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') + 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(): - ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 1, 1, 1, options=['BigTIFF=YES']) + ds = gdaltest.tiff_drv.Create("tmp/bigtiff.tif", 1, 1, 1, options=["BigTIFF=YES"]) ds = None - ds = gdal.Open('tmp/bigtiff.tif') + ds = gdal.Open("tmp/bigtiff.tif") assert ds is not None ds = None - fileobj = open('tmp/bigtiff.tif', mode='rb') - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + fileobj = open("tmp/bigtiff.tif", mode="rb") + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() - gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') + 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))) + 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). @@ -1111,23 +1248,27 @@ def test_tiff_write_30(): def test_tiff_write_31(): - ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 100000, 100000, 1, - options=['SPARSE_OK=TRUE']) + ds = gdaltest.tiff_drv.Create( + "tmp/bigtiff.tif", 100000, 100000, 1, options=["SPARSE_OK=TRUE"] + ) ds = None - ds = gdal.Open('tmp/bigtiff.tif') + ds = gdal.Open("tmp/bigtiff.tif") assert ds is not None ds = None - fileobj = open('tmp/bigtiff.tif', mode='rb') - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + fileobj = open("tmp/bigtiff.tif", mode="rb") + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() - gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') + 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))) + assert not ( + (binvalues[2] != 0x2B or binvalues[3] != 0) + and (binvalues[3] != 0x2B or binvalues[2] != 0) + ) + ############################################################################### # Create a rotated image @@ -1135,10 +1276,10 @@ def test_tiff_write_31(): def test_tiff_write_32(): - ds_in = gdal.Open('data/byte.vrt') + ds_in = gdal.Open("data/byte.vrt") # Test creation - ds = gdaltest.tiff_drv.Create('tmp/byte_rotated.tif', 20, 20, gdal.GDT_Byte) + 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) @@ -1149,23 +1290,24 @@ def test_tiff_write_32(): ds_in = None # Test copy - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/byte_rotated_copy.tif', ds) + 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') + ds = gdal.Open("tmp/byte_rotated_copy.tif") new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(gt[i], abs=1e-5): - print('') - print(('old = ', gt)) - print(('new = ', new_gt)) - pytest.fail('Geotransform differs.') + 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') + 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 @@ -1174,43 +1316,46 @@ def test_tiff_write_32(): def test_tiff_write_33(): - ds_in = gdal.Open('data/byte.vrt') + ds_in = gdal.Open("data/byte.vrt") - ds = gdaltest.tiff_drv.CreateCopy('tmp/tw_33.tif', ds_in, options=['PROFILE=GeoTIFF']) + 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') + ds = gdal.Open("tmp/tw_33.tif") md = ds.GetMetadata() - assert 'test' in md, 'Metadata absent from .aux.xml file.' + 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.' + assert "testBand" in md, "Metadata absent from .aux.xml file." ds = None try: - os.remove('tmp/tw_33.tif.aux.xml') + os.remove("tmp/tw_33.tif.aux.xml") except OSError: try: - os.stat('tmp/tw_33.tif.aux.xml') + os.stat("tmp/tw_33.tif.aux.xml") except OSError: - pytest.fail('No .aux.xml file.') + pytest.fail("No .aux.xml file.") - ds = gdal.Open('tmp/tw_33.tif') + ds = gdal.Open("tmp/tw_33.tif") md = ds.GetMetadata() - assert 'test' not in md, 'Metadata written to GeoTIFF file.' + 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.' + assert "testBand" not in md, "Metadata written to GeoTIFF file." ds = None - gdaltest.tiff_drv.Delete('tmp/tw_33.tif') + gdaltest.tiff_drv.Delete("tmp/tw_33.tif") + ############################################################################### # Test that metadata is written in .aux.xml file in GeoTIFF profile with Create @@ -1219,42 +1364,44 @@ def test_tiff_write_33(): 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 = 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') + ds = gdal.Open("tmp/tw_34.tif") md = ds.GetMetadata() - assert 'test' in md, 'Metadata absent from .aux.xml file.' + 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.' + assert "testBand" in md, "Metadata absent from .aux.xml file." ds = None try: - os.remove('tmp/tw_34.tif.aux.xml') + os.remove("tmp/tw_34.tif.aux.xml") except OSError: try: - os.stat('tmp/tw_34.tif.aux.xml') + os.stat("tmp/tw_34.tif.aux.xml") except OSError: - pytest.fail('No .aux.xml file.') + pytest.fail("No .aux.xml file.") - ds = gdal.Open('tmp/tw_34.tif') + ds = gdal.Open("tmp/tw_34.tif") md = ds.GetMetadata() - assert 'test' not in md, 'Metadata written to GeoTIFF file.' + 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.' + assert "testBand" not in md, "Metadata written to GeoTIFF file." ds = None - gdaltest.tiff_drv.Delete('tmp/tw_34.tif') + gdaltest.tiff_drv.Delete("tmp/tw_34.tif") + ############################################################################### # Test big metadata (that was used to consider too big to fit into the GDALGeotiff tag @@ -1263,21 +1410,22 @@ def test_tiff_write_34(): def test_tiff_write_35(): - big_string = 'a' * 12345678 - ds = gdaltest.tiff_drv.Create('tmp/tw_35.tif', 1, 1, gdal.GDT_Byte) + big_string = "a" * 12345678 + ds = gdaltest.tiff_drv.Create("tmp/tw_35.tif", 1, 1, gdal.GDT_Byte) md = {} - md['test'] = big_string + md["test"] = big_string ds.SetMetadata(md) ds = None - assert not os.path.exists('tmp/tw_35.tif.aux.xml') + assert not os.path.exists("tmp/tw_35.tif.aux.xml") - ds = gdal.Open('tmp/tw_35.tif') - assert ds.GetMetadataItem('test') == big_string + ds = gdal.Open("tmp/tw_35.tif") + assert ds.GetMetadataItem("test") == big_string ds = None - gdaltest.tiff_drv.Delete('tmp/tw_35.tif') + gdaltest.tiff_drv.Delete("tmp/tw_35.tif") + ############################################################################### # Generic functions for the 8 following tests @@ -1286,7 +1434,11 @@ def test_tiff_write_35(): 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 = gdaltest.tiff_drv.CreateCopy( + tmpfilename, + ds_in, + options=["NBITS=" + str(nbits), "INTERLEAVE=" + interleaving], + ) ds_in = None @@ -1295,18 +1447,18 @@ def tiff_write_big_odd_bits(vrtfilename, tmpfilename, nbits, interleaving): 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' + 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' + 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' + 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' + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert md["INTERLEAVE"] == interleaving, "Didnt get expected interleaving" ds = None @@ -1316,86 +1468,102 @@ def tiff_write_big_odd_bits(vrtfilename, tmpfilename, nbits, interleaving): ############################################################################### # 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') + 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') + 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') + 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') + 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') + 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') + 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') + 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') + 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 = 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') + ds = gdal.Open("tmp/tw_44.tif") bnd = ds.GetRasterBand(1) - md = bnd.GetMetadata('IMAGE_STRUCTURE') + md = bnd.GetMetadata("IMAGE_STRUCTURE") bnd = None - assert md['NBITS'] == '9', 'Didnt get expected NBITS value' + assert md["NBITS"] == "9", "Didnt get expected NBITS value" - ds2 = gdaltest.tiff_drv.CreateCopy('tmp/tw_44_copy.tif', ds) + ds2 = gdaltest.tiff_drv.CreateCopy("tmp/tw_44_copy.tif", ds) ds2 = None - ds2 = gdal.Open('tmp/tw_44_copy.tif') + ds2 = gdal.Open("tmp/tw_44_copy.tif") bnd = ds2.GetRasterBand(1) - md = bnd.GetMetadata('IMAGE_STRUCTURE') + md = bnd.GetMetadata("IMAGE_STRUCTURE") bnd = None - assert md['NBITS'] == '9', 'Didnt get expected NBITS value' + 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') + 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 @@ -1403,41 +1571,48 @@ def test_tiff_write_44(): def test_tiff_write_45(): - ds = gdaltest.tiff_drv.Create('tmp/tw_45.tif', 1, 1, 1, gdal.GDT_UInt32, options=['NBITS=17']) + 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') + ds = gdal.Open("tmp/tw_45.tif") bnd = ds.GetRasterBand(1) - md = bnd.GetMetadata('IMAGE_STRUCTURE') + md = bnd.GetMetadata("IMAGE_STRUCTURE") bnd = None - assert md['NBITS'] == '17', 'Didnt get expected NBITS value' + assert md["NBITS"] == "17", "Didnt get expected NBITS value" - ds2 = gdaltest.tiff_drv.CreateCopy('tmp/tw_45_copy.tif', ds) + ds2 = gdaltest.tiff_drv.CreateCopy("tmp/tw_45_copy.tif", ds) ds2 = None - ds2 = gdal.Open('tmp/tw_45_copy.tif') + ds2 = gdal.Open("tmp/tw_45_copy.tif") bnd = ds2.GetRasterBand(1) - md = bnd.GetMetadata('IMAGE_STRUCTURE') + md = bnd.GetMetadata("IMAGE_STRUCTURE") bnd = None - assert md['NBITS'] == '17', 'Didnt get expected NBITS value' + 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') + 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(): with gdaltest.SetCacheMax(0): - ds = gdaltest.tiff_drv.Create("tmp/tiff_write_46_1.tif", 10, 10, 1, options=['NBITS=1']) + 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 = 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) @@ -1455,16 +1630,17 @@ def test_tiff_write_46(): 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) + 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') + 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 @@ -1480,12 +1656,19 @@ def test_tiff_write_47(): ############################################################################### # 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']) + 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) @@ -1493,117 +1676,141 @@ def test_tiff_write_48(): 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 = 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') + 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') + 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']) + 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.' + 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') + 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 ' + 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') + 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']) + 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) + 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.' + 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') + 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 ' + 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') + 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') + shutil.copyfile("data/utmsmall.tif", "tmp/tiff_write_51.tif") - ds = gdal.Open('tmp/tiff_write_51.tif', gdal.GA_Update) + ds = gdal.Open("tmp/tiff_write_51.tif", gdal.GA_Update) srs = osr.SpatialReference() - srs.SetFromUserInput('EPSG:32601') + srs.SetFromUserInput("EPSG:32601") ds.SetProjection(srs.ExportToWkt()) ds = None - ds = gdal.Open('tmp/tiff_write_51.tif') + 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 = 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') + 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.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.' + 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') + 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') + 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)] @@ -1611,19 +1818,20 @@ def test_tiff_write_52(): 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 = 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') + 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.' + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_52.tif") + ############################################################################### # Test the ability to create a paletted image and then update later. @@ -1636,31 +1844,32 @@ def test_tiff_write_53(): 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 = 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 = 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') + 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.' + 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') + 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)] @@ -1668,26 +1877,27 @@ def test_tiff_write_53_bis(): 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 = 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.BuildOverviews("NONE", overviewlist=[2]) ds = None - ds = gdal.Open('tmp/tiff_write_53_bis.tif', gdal.GA_Update) + 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') + 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.' + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_53_bis.tif") + ############################################################################### # Test the ability to create a JPEG compressed TIFF, with PHOTOMETRIC=YCBCR @@ -1697,32 +1907,36 @@ def test_tiff_write_53_bis(): def test_tiff_write_54(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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 = 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') + ds = gdal.Open("tmp/tiff_write_54.tif") cs = ds.GetRasterBand(1).Checksum() ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_54.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_54.tif") - assert cs != 0, 'did not get expected checksum' + 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) + 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) @@ -1730,14 +1944,16 @@ def test_tiff_write_55(): ds.SetGeoTransform((100, 1, 0, 200, 0, -1)) ds = None - ds = gdal.Open('tmp/tiff_write_55.tif') + 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?' + assert ( + srs == srs_expected + ), "failed to preserve Equirectangular projection as expected, old libgeotiff?" + + gdaltest.tiff_drv.Delete("tmp/tiff_write_55.tif") - gdaltest.tiff_drv.Delete('tmp/tiff_write_55.tif') ############################################################################### # Test clearing the colormap from an existing paletted TIFF file. @@ -1751,27 +1967,28 @@ def test_tiff_write_56(): 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 = 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 = 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') + ds = gdal.Open("tmp/tiff_write_56.tif") ct = ds.GetRasterBand(1).GetRasterColorTable() - assert ct is None, 'color table seemingly not cleared.' + assert ct is None, "color table seemingly not cleared." ct = None ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_56.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_56.tif") + ############################################################################### # Test replacing normal norm up georef with rotated georef (#2625) @@ -1780,22 +1997,29 @@ def test_tiff_write_56(): def test_tiff_write_57(): # copy a file to tmp dir to modify. - open('tmp/tiff57.tif', 'wb').write(open('data/byte.tif', 'rb').read()) + 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 = gdal.Open("tmp/tiff57.tif", gdal.GA_Update) ds.SetGeoTransform([100, 1, 3, 200, 3, 1]) ds = None - ds = gdal.Open('tmp/tiff57.tif') + 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?' + 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") - gdaltest.tiff_drv.Delete('tmp/tiff57.tif') ############################################################################### # Test writing partial end strips (#2748) @@ -1805,20 +2029,22 @@ def test_tiff_write_58(): md = gdaltest.tiff_drv.GetMetadata() - for compression in ('NONE', 'JPEG', 'LZW', 'DEFLATE', 'PACKBITS'): + 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]) + 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 = 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_58.tif") else: - print(('Skipping compression method %s' % compression)) + print(("Skipping compression method %s" % compression)) ############################################################################### @@ -1827,22 +2053,29 @@ def test_tiff_write_58(): def test_tiff_write_59(): - ret = 'success' + 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' + ctype = "B" elif nbits <= 16: gdal_type = gdal.GDT_UInt16 - ctype = 'h' + 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]) + 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 @@ -1860,57 +2093,74 @@ def test_tiff_write_59(): got = struct.unpack(ctype * 10, data) for g in got: if g != 0: - print(('nbands=%d, NBITS=%d' % (nbands, nbits))) + print(("nbands=%d, NBITS=%d" % (nbands, nbits))) print(got) - ret = 'fail' + ret = "fail" break ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_59.tif') + 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')] + 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']) + 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 = 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') + 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') + 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']) + 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') + 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 = 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_60.tif") assert not os.path.exists(options_tuple[1]) @@ -1921,23 +2171,31 @@ def test_tiff_write_60(): def test_tiff_write_61(): - ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 50000, 50000, 1, - options=['BIGTIFF=IF_NEEDED', 'SPARSE_OK=TRUE']) + 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') + ds = gdal.Open("tmp/bigtiff.tif") assert ds is not None ds = None - fileobj = open('tmp/bigtiff.tif', mode='rb') - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + fileobj = open("tmp/bigtiff.tif", mode="rb") + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() - gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') + 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))) + assert not ( + (binvalues[2] != 0x2A or binvalues[3] != 0) + and (binvalues[3] != 0x2A or binvalues[2] != 0) + ) + ############################################################################### # Test BigTIFF=IF_SAFER creation option @@ -1945,23 +2203,31 @@ def test_tiff_write_61(): def test_tiff_write_62(): - ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 50000, 50000, 1, - options=['BIGTIFF=IF_SAFER', 'SPARSE_OK=TRUE']) + 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') + ds = gdal.Open("tmp/bigtiff.tif") assert ds is not None ds = None - fileobj = open('tmp/bigtiff.tif', mode='rb') - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + fileobj = open("tmp/bigtiff.tif", mode="rb") + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() - gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') + 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))) + 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 @@ -1969,9 +2235,10 @@ def test_tiff_write_62(): def test_tiff_write_63(): - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 150000, 150000, 1, - options=['BIGTIFF=NO']) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdaltest.tiff_drv.Create( + "tmp/bigtiff.tif", 150000, 150000, 1, options=["BIGTIFF=NO"] + ) gdal.PopErrorHandler() if ds is None: @@ -1979,27 +2246,29 @@ def test_tiff_write_63(): 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) + ds = gdaltest.tiff_drv.Create("tmp/tiff_write_64.tif", 1, 1, 1) srs = osr.SpatialReference() - srs.SetFromUserInput('WGS84') + srs.SetFromUserInput("WGS84") ds.SetProjection(srs.ExportToWkt()) ds = None - ds = gdal.Open('tmp/tiff_write_64.tif') + 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.' + assert wkt == expected_wkt, "coordinate system does not exactly match." + + gdaltest.tiff_drv.Delete("tmp/tiff_write_64.tif") - gdaltest.tiff_drv.Delete('tmp/tiff_write_64.tif') ############################################################################### # Verify that we can write XML metadata. @@ -2007,34 +2276,37 @@ def test_tiff_write_64(): def test_tiff_write_65(): - ds = gdaltest.tiff_drv.Create('tmp/tiff_write_65.tif', 10, 10) + ds = gdaltest.tiff_drv.Create("tmp/tiff_write_65.tif", 10, 10) doc = '<doc><test xml:attr="abc"/></doc>' - ds.SetMetadata([doc], 'xml:test') + ds.SetMetadata([doc], "xml:test") ds = None - ds = gdal.Open('tmp/tiff_write_65.tif') - md = ds.GetMetadata('xml:test') + 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' + assert len(md) == 1 and md[0] == doc, "did not get xml back clean" - gdaltest.tiff_drv.Delete('tmp/tiff_write_65.tif') + 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: + 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 = 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') + ds = gdal.Open("tmp/tiff_write_66.tif") assert ds.RasterCount == 65535 assert ds.GetRasterBand(1).Checksum() == 0 @@ -2043,21 +2315,24 @@ def test_tiff_write_66(): ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_66.tif') + 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: + 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 = 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') + ds = gdal.Open("tmp/tiff_write_67.tif") assert ds.RasterCount == 65535 assert ds.GetRasterBand(1).Checksum() == 0 @@ -2066,7 +2341,8 @@ def test_tiff_write_67(): ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_67.tif') + 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) @@ -2074,7 +2350,9 @@ def test_tiff_write_67(): def test_tiff_write_68(): - ds = gdaltest.tiff_drv.Create('tmp/tiff_write_68.tif', 151, 161, options=['COMPRESS=LZW']) + 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)) @@ -2084,11 +2362,12 @@ def test_tiff_write_68(): ds.GetRasterBand(1).Fill(255) ds = None - ds = gdal.Open('tmp/tiff_write_68.tif') + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_68.tif") + ############################################################################### # Verify GTiffRasterBand::NullBlock() when reading empty block without any nodata value set @@ -2096,14 +2375,17 @@ def test_tiff_write_68(): 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 = 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') + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_69.tif") + ############################################################################### # Verify GTiffRasterBand::NullBlock() when reading empty block with nodata value set @@ -2111,82 +2393,88 @@ def test_tiff_write_69(): 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 = 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') + 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 = 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' + 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 = 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 = 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) + 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') + os.stat("tmp/tiff_write_70.tif.aux.xml") - - ds = gdal.Open('tmp/tiff_write_70.tif') + 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') + 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(): # 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'): + if not gdaltest.filesystem_supports_sparse_files("tmp"): pytest.skip() - header = open('data/bigtiff_header_extract.tif', 'rb').read() + header = open("data/bigtiff_header_extract.tif", "rb").read() - f = open('tmp/tiff_write_71.tif', 'wb') + 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') + f.write(b"\xa0\x86\x01\x00\x00\x00\x00\x00") # Write StripOffsets tag offset = 1600252 for _ in range(100000): - f.write(struct.pack('<Q', offset)) + f.write(struct.pack("<Q", offset)) offset = offset + 100000 # Write 0x78 as value of pixel (99999, 99999) f.seek(10001600252 - 1, 0) - f.write(b'\x78') + f.write(b"\x78") f.close() - ds = gdal.Open('tmp/tiff_write_71.tif') + ds = gdal.Open("tmp/tiff_write_71.tif") data = ds.GetRasterBand(1).ReadRaster(99999, 99999, 1, 1) - assert struct.unpack('b', data)[0] == 0x78 + assert struct.unpack("b", data)[0] == 0x78 ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_71.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_71.tif") + ############################################################################### # With CreateCopy(), check that TIFF directory is in the first bytes of the file @@ -2195,28 +2483,37 @@ def test_tiff_write_71(): def test_tiff_write_72(): - shutil.copyfile('data/byte.tif', 'tmp/byte.tif') - ds = gdal.Open('tmp/byte.tif', gdal.GA_Update) - ds.SetMetadata({'TEST_KEY': 'TestValue'}) + shutil.copyfile("data/byte.tif", "tmp/byte.tif") + ds = gdal.Open("tmp/byte.tif", gdal.GA_Update) + ds.SetMetadata({"TEST_KEY": "TestValue"}) ds = None - for profile in ('GDALGeotiff', 'GEOTIFF', 'BASELINE'): - src_ds = gdal.Open('tmp/byte.tif') - out_ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_72.tif', src_ds, options=['ENDIANNESS=LITTLE', 'PROFILE=' + profile]) + for profile in ("GDALGeotiff", "GEOTIFF", "BASELINE"): + src_ds = gdal.Open("tmp/byte.tif") + out_ds = gdaltest.tiff_drv.CreateCopy( + "tmp/tiff_write_72.tif", + src_ds, + options=["ENDIANNESS=LITTLE", "PROFILE=" + profile], + ) del out_ds src_ds = None - fileobj = open('tmp/tiff_write_72.tif', mode='rb') + fileobj = open("tmp/tiff_write_72.tif", mode="rb") fileobj.seek(4) - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() # Directory should be at offset 8 of the file - assert (binvalues[0] == 0x08 and binvalues[1] == 0x00 and binvalues[2] == 0x00 and binvalues[3] == 0x00), \ - ('Failed with profile %s' % profile) + assert ( + binvalues[0] == 0x08 + and binvalues[1] == 0x00 + and binvalues[2] == 0x00 + and binvalues[3] == 0x00 + ), ("Failed with profile %s" % profile) + + gdaltest.tiff_drv.Delete("tmp/byte.tif") + gdaltest.tiff_drv.Delete("tmp/tiff_write_72.tif") - gdaltest.tiff_drv.Delete('tmp/byte.tif') - gdaltest.tiff_drv.Delete('tmp/tiff_write_72.tif') ############################################################################### # With Create(), check that TIFF directory is in the first bytes of the file @@ -2225,107 +2522,129 @@ def test_tiff_write_72(): def test_tiff_write_73(): - out_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_73.tif', 10, 10, options=['ENDIANNESS=LITTLE']) + out_ds = gdaltest.tiff_drv.Create( + "tmp/tiff_write_73.tif", 10, 10, options=["ENDIANNESS=LITTLE"] + ) out_ds.SetGeoTransform([1, 0.01, 0, 1, 0, -0.01]) srs = osr.SpatialReference() - srs.SetFromUserInput('EPSG:32601') + srs.SetFromUserInput("EPSG:32601") out_ds.SetProjection(srs.ExportToWkt()) - out_ds.SetMetadata({'TEST_KEY': 'TestValue'}) - out_ds.BuildOverviews('NONE', [2]) + out_ds.SetMetadata({"TEST_KEY": "TestValue"}) + out_ds.BuildOverviews("NONE", [2]) out_ds.GetRasterBand(1).Fill(255) out_ds = None - fileobj = open('tmp/tiff_write_73.tif', mode='rb') + fileobj = open("tmp/tiff_write_73.tif", mode="rb") fileobj.seek(4) - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() # Directory should be at offset 8 of the file - assert (binvalues[0] == 0x08 and binvalues[1] == 0x00 and binvalues[2] == 0x00 and binvalues[3] == 0x00) + assert ( + binvalues[0] == 0x08 + and binvalues[1] == 0x00 + and binvalues[2] == 0x00 + and binvalues[3] == 0x00 + ) # Re-open the file and modify the pixel content - out_ds = gdal.Open('tmp/tiff_write_73.tif', gdal.GA_Update) + out_ds = gdal.Open("tmp/tiff_write_73.tif", gdal.GA_Update) out_ds.GetRasterBand(1).Fill(0) out_ds = None - fileobj = open('tmp/tiff_write_73.tif', mode='rb') + fileobj = open("tmp/tiff_write_73.tif", mode="rb") fileobj.seek(4) - binvalues = struct.unpack('B' * 4, fileobj.read(4)) + binvalues = struct.unpack("B" * 4, fileobj.read(4)) fileobj.close() # Directory should be at offset 8 of the file - assert (binvalues[0] == 0x08 and binvalues[1] == 0x00 and binvalues[2] == 0x00 and binvalues[3] == 0x00) + assert ( + binvalues[0] == 0x08 + and binvalues[1] == 0x00 + and binvalues[2] == 0x00 + and binvalues[3] == 0x00 + ) + + gdaltest.tiff_drv.Delete("tmp/tiff_write_73.tif") - gdaltest.tiff_drv.Delete('tmp/tiff_write_73.tif') ############################################################################### # Verify we can write 12bit jpeg encoded tiff. -@pytest.mark.skipif('SKIP_TIFF_JPEG12' in os.environ, reason='Crashes on build-windows-msys2-mingw') +@pytest.mark.skipif( + "SKIP_TIFF_JPEG12" in os.environ, reason="Crashes on build-windows-msys2-mingw" +) def test_tiff_write_74(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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') + old_accum = gdal.GetConfigOption("CPL_ACCUM_ERROR_MSG", "OFF") + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "ON") gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") try: - ds = gdal.Open('data/mandrilmini_12bitjpeg.tif') + 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: - pytest.skip('12bit jpeg not available') - - for photometric in ('YCBCR', 'RGB'): - - drv = gdal.GetDriverByName('GTiff') - dst_ds = drv.CreateCopy('tmp/test_74.tif', ds, - options=['COMPRESS=JPEG', 'NBITS=12', - 'JPEG_QUALITY=95', - 'PHOTOMETRIC=' + photometric]) + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", old_accum) + + if gdal.GetLastErrorMsg().find("Unsupported JPEG data precision 12") != -1: + pytest.skip("12bit jpeg not available") + + for photometric in ("YCBCR", "RGB"): + + drv = gdal.GetDriverByName("GTiff") + dst_ds = drv.CreateCopy( + "tmp/test_74.tif", + ds, + options=[ + "COMPRESS=JPEG", + "NBITS=12", + "JPEG_QUALITY=95", + "PHOTOMETRIC=" + photometric, + ], + ) dst_ds = None - dst_ds = gdal.Open('tmp/test_74.tif') + dst_ds = gdal.Open("tmp/test_74.tif") stats = dst_ds.GetRasterBand(1).GetStatistics(0, 1) if stats[2] < 2150 or stats[2] > 2180: print(photometric) - pytest.fail('did not get expected mean for band1.') + pytest.fail("did not get expected mean for band1.") try: - compression = dst_ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') + compression = dst_ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") except: - md = dst_ds.GetMetadata('IMAGE_STRUCTURE') - compression = md['COMPRESSION'] + md = dst_ds.GetMetadata("IMAGE_STRUCTURE") + compression = md["COMPRESSION"] - if (photometric == 'YCBCR' and compression != 'YCbCr JPEG') or \ - (photometric == 'RGB' and compression != 'JPEG'): + 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') + pytest.fail("did not get expected COMPRESSION value") try: - nbits = dst_ds.GetRasterBand(3).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') + nbits = dst_ds.GetRasterBand(3).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") except: - md = dst_ds.GetRasterBand(3).GetMetadata('IMAGE_STRUCTURE') - nbits = md['NBITS'] + md = dst_ds.GetRasterBand(3).GetMetadata("IMAGE_STRUCTURE") + nbits = md["NBITS"] - if nbits != '12': + if nbits != "12": print(photometric) - pytest.fail('did not get expected NBITS value') + pytest.fail("did not get expected NBITS value") dst_ds = None - gdaltest.tiff_drv.Delete('tmp/test_74.tif') + gdaltest.tiff_drv.Delete("tmp/test_74.tif") ############################################################################### @@ -2334,11 +2653,12 @@ def test_tiff_write_74(): def test_tiff_write_75(): - ds = gdaltest.tiff_drv.Create('tmp/tiff_write_75.tif', 1, 1, 1) + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_75.tif") + ############################################################################### # Test generating a G4 band to use the TIFFWriteScanline() @@ -2346,19 +2666,24 @@ def test_tiff_write_75(): 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]) + 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') + new_ds = gdal.Open("tmp/tiff_write_76.tif") cs = new_ds.GetRasterBand(1).Checksum() - assert cs == 3322, 'Got wrong checksum' + assert cs == 3322, "Got wrong checksum" src_ds = None new_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_76.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_76.tif") + ############################################################################### # Test generating & reading a 8bit all-in-one-strip multiband TIFF (#3904) @@ -2366,44 +2691,63 @@ def test_tiff_write_76(): def test_tiff_write_77(): - src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_77_src.tif', 1, 5000, 3) + 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 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)] + 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' + 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' + assert cs == expected_cs, "Got wrong checksum" if attempt == 0: new_ds = None - new_ds = gdal.Open('tmp/tiff_write_77.tif') + new_ds = gdal.Open("tmp/tiff_write_77.tif") new_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_77.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_77.tif") src_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_77_src.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_77_src.tif") + ############################################################################### # Test generating & reading a YCbCr JPEG all-in-one-strip multiband TIFF (#3259) @@ -2412,31 +2756,51 @@ def test_tiff_write_77(): def test_tiff_write_78(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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 = 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']) + 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): + 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)') + 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)] + 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: @@ -2449,7 +2813,7 @@ def test_tiff_write_78(): expected_cs = 1 % 7 if cs != expected_cs: print(band_line) - pytest.fail('Got wrong checksum') + pytest.fail("Got wrong checksum") # Test whole bands for i in range(3): @@ -2459,13 +2823,14 @@ def test_tiff_write_78(): # 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' + assert cs == expected_cs, "Got wrong checksum" new_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_78.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_78.tif") src_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_78_src.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_78_src.tif") + ############################################################################### # Test reading & updating GDALMD_AREA_OR_POINT (#3522) @@ -2473,66 +2838,75 @@ def test_tiff_write_78(): def test_tiff_write_79(): - ds = gdaltest.tiff_drv.Create('tmp/tiff_write_79.tif', 1, 1) + ds = gdaltest.tiff_drv.Create("tmp/tiff_write_79.tif", 1, 1) srs = osr.SpatialReference() - srs.SetFromUserInput('EPSG:32601') + 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') + 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)) + 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 # Now update to 'Point' - ds = gdal.Open('tmp/tiff_write_79.tif', gdal.GA_Update) + ds = gdal.Open("tmp/tiff_write_79.tif", gdal.GA_Update) if do_projection_ref: ds.GetProjectionRef() - ds.SetMetadataItem('AREA_OR_POINT', 'Point') + 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)) + 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') + assert not os.path.exists("tmp/tiff_write_79.tif.aux.xml") # Now should get 'Point' - ds = gdal.Open('tmp/tiff_write_79.tif') + 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)) + 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) + ds = gdal.Open("tmp/tiff_write_79.tif", gdal.GA_Update) if do_projection_ref: ds.GetProjectionRef() md = {} - md['AREA_OR_POINT'] = 'Area' + 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)) + 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') + 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' + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_79.tif") + ############################################################################### # Test SetOffset() & SetScale() @@ -2541,87 +2915,92 @@ def test_tiff_write_79(): 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 = 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') + assert not os.path.exists("tmp/tiff_write_80.tif.aux.xml") - ds = gdal.Open('tmp/tiff_write_80.tif') + 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)' + 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 = 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') + 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' + 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') + 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 = 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') + ds = gdal.Open("tmp/tiff_write_80.tif") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert not scale assert not offset ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_80.tif') + 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 = 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 = 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') + os.stat("tmp/tiff_write_80_bis.tif.aux.xml") except OSError: - pytest.fail('did not go to PAM as expected') + pytest.fail("did not go to PAM as expected") - ds = gdal.Open('tmp/tiff_write_80_bis.tif') + 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)' + 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 = 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') + assert not os.path.exists("tmp/tiff_write_80_bis.tif.aux.xml") - ds = gdal.Open('tmp/tiff_write_80_bis.tif') + ds = gdal.Open("tmp/tiff_write_80_bis.tif") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert not scale assert not offset ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_80_bis.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_80_bis.tif") + ############################################################################### # Test retrieving GCP from PAM @@ -2629,9 +3008,10 @@ def test_tiff_write_80(): 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(""" + shutil.copyfile("data/byte.tif", "tmp/tiff_write_81.tif") + f = open("tmp/tiff_write_81.tif.aux.xml", "wt") + f.write( + """ <PAMDataset> <GCPList Projection="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"]]"> <GCP Id="" Pixel="0.0000" Line="0.0000" X="4.407200000000E+05" Y="3.751320000000E+06"/> @@ -2639,20 +3019,23 @@ def test_tiff_write_81(): <GCP Id="" Pixel="0.0000" Line="100.0000" X="4.407200000000E+05" Y="3.745320000000E+06"/> <GCP Id="" Pixel="100.0000" Line="100.0000" X="4.467200000000E+05" Y="3.745320000000E+06"/> </GCPList> -</PAMDataset>""") +</PAMDataset>""" + ) f.close() - ds = gdal.Open('tmp/tiff_write_81.tif') + ds = gdal.Open("tmp/tiff_write_81.tif") - assert (ds.GetGCPProjection().find( - 'AUTHORITY["EPSG","26711"]') != -1), 'GCP Projection not set properly.' + assert ( + ds.GetGCPProjection().find('AUTHORITY["EPSG","26711"]') != -1 + ), "GCP Projection not set properly." gcps = ds.GetGCPs() - assert len(gcps) == 4, 'GCP count wrong.' + assert len(gcps) == 4, "GCP count wrong." ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_81.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_81.tif") + ############################################################################### # Test writing & reading a signedbyte 8 bit geotiff @@ -2660,26 +3043,29 @@ def test_tiff_write_81(): 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 = 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 = 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') + 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) + 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) @@ -2688,24 +3074,29 @@ def test_tiff_write_83(): 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 = 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') + 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' + 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' + 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' + 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') + 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 @@ -2716,30 +3107,31 @@ def test_tiff_write_84(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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 = gdal.GetDriverByName("GTiff").Create("tmp/tiff_write_84.tif", 128, 128, 3) ds = None try: - os.remove('tmp/tiff_write_84.tif.ovr') + 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]) + 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) + gdal.SetConfigOption("COMPRESS_OVERVIEW", None) + gdal.SetConfigOption("JPEG_QUALITY_OVERVIEW", None) + + gdaltest.tiff_drv.Delete("tmp/tiff_write_84.tif") - gdaltest.tiff_drv.Delete('tmp/tiff_write_84.tif') + assert cs == 0, "did not get expected checksum" - assert cs == 0, 'did not get expected checksum' ############################################################################### # Test SetUnitType() @@ -2748,73 +3140,74 @@ def test_tiff_write_84(): 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 = 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') + assert not os.path.exists("tmp/tiff_write_85.tif.aux.xml") - ds = gdal.Open('tmp/tiff_write_85.tif') + 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)' + 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 = 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') + ds = gdal.Open("tmp/tiff_write_85_copy.tif") unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == 'ft', 'did not get expected values in copy' + assert unittype == "ft", "did not get expected values in copy" ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_85_copy.tif') + 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 = 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') + ds = gdal.Open("tmp/tiff_write_85.tif") unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == '', 'did not get expected values in internal case (2)' + assert unittype == "", "did not get expected values in internal case (2)" ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_85.tif') + 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 = 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 = 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') + os.stat("tmp/tiff_write_85_bis.tif.aux.xml") except OSError: - pytest.fail('did not go to PAM as expected') + pytest.fail("did not go to PAM as expected") - ds = gdal.Open('tmp/tiff_write_85_bis.tif') + 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)' + 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 = 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') + assert not os.path.exists("tmp/tiff_write_85_bis.tif.aux.xml") - ds = gdal.Open('tmp/tiff_write_85_bis.tif') + 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)' + assert unittype == "", "did not get expected values in PAM case (2)" ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_85_bis.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_85_bis.tif") + ############################################################################### # Test special handling of xml:ESRI domain. When the ESRI_XML_PAM config @@ -2825,111 +3218,125 @@ def test_tiff_write_85(): def test_tiff_write_86(): - gdal.SetConfigOption('ESRI_XML_PAM', 'YES') + gdal.SetConfigOption("ESRI_XML_PAM", "YES") - ds = gdaltest.tiff_drv.Create('tmp/tiff_write_86.tif', 100, 100, - 1, gdal.GDT_Byte) - ds.SetMetadata(['<abc></abc>'], 'xml:ESRI') - ds.SetMetadataItem('BaseTest', 'Value') + ds = gdaltest.tiff_drv.Create("tmp/tiff_write_86.tif", 100, 100, 1, gdal.GDT_Byte) + ds.SetMetadata(["<abc></abc>"], "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') == ['<abc />\n'], \ - 'did not get expected xml:ESRI metadata.' + ds = gdal.Open("tmp/tiff_write_86.tif") + assert ds.GetMetadata("xml:ESRI") == [ + "<abc />\n" + ], "did not get expected xml:ESRI metadata." - if ds.GetMetadataItem('BaseTest') != 'Value': - gdaltest.post_value('missing metadata(1)') + 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') + 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' + 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)') + 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') + 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 = 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') == ['<abc />\n'], \ - 'did not get expected xml:ESRI metadata (cc).' + ds = gdal.Open("tmp/tiff_write_86_cc.tif") + assert ds.GetMetadata("xml:ESRI") == [ + "<abc />\n" + ], "did not get expected xml:ESRI metadata (cc)." - if ds.GetMetadataItem('BaseTest') != 'Value': - gdaltest.post_value('missing metadata(1cc)') + 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') + 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)' + 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)') + if ds.GetMetadataItem("BaseTest") != "Value": + gdaltest.post_value("missing metadata(2cc)") pytest.fail() ds = None # Cleanup - gdal.SetConfigOption('ESRI_XML_PAM', 'NO') + 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') + 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') + 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]) + 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 = 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') + 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')) - size_main = int(ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_0', 'TIFF')) - with open('tmp/tiff_write_87_dst.tif', 'rb') as f: + 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")) + size_main = int(ds.GetRasterBand(1).GetMetadataItem("BLOCK_SIZE_0_0", "TIFF")) + with open("tmp/tiff_write_87_dst.tif", "rb") as f: f.seek(data_main - 4) - size_from_header = struct.unpack('<I', f.read(4))[0] + size_from_header = struct.unpack("<I", f.read(4))[0] assert size_main == size_from_header f.seek(data_main + size_main - 4) last_bytes = f.read(4) @@ -2938,17 +3345,24 @@ def test_tiff_write_87(): ds = None - _check_cog('tmp/tiff_write_87_dst.tif', check_tiled=False, full_check=True) + _check_cog("tmp/tiff_write_87_dst.tif", check_tiled=False, full_check=True) - gdaltest.tiff_drv.Delete('tmp/tiff_write_87_src.tif') - gdaltest.tiff_drv.Delete('tmp/tiff_write_87_dst.tif') + 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 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 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 + ) - 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 @@ -2958,9 +3372,14 @@ def test_tiff_write_87(): def test_tiff_write_88(): # 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]) + 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) @@ -2968,40 +3387,47 @@ def test_tiff_write_88(): # 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 = 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 = open("tmp/tiff_write_88_src.tif", "wb") f.write(data) f.close() - src_ds = gdal.Open('tmp/tiff_write_88_src.tif') + 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.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) + 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') + 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') + os.remove("tmp/tiff_write_88_src.tif") + os.remove("tmp/tiff_write_88_dst.tif") + + 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" - 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 @@ -3009,19 +3435,24 @@ def test_tiff_write_88(): def test_tiff_write_89(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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') + 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]) + 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') + gdal.SetConfigOption("GDAL_TIFF_INTERNAL_MASK", "YES") ds.CreateMaskBand(gdal.GMF_PER_DATASET) - gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) + 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) @@ -3038,7 +3469,7 @@ def test_tiff_write_89(): except AttributeError: os.SEEK_END = 2 - f = open('tmp/tiff_write_89.tif', 'rb') + f = open("tmp/tiff_write_89.tif", "rb") f.seek(0, os.SEEK_END) size = f.tell() f.close() @@ -3046,11 +3477,12 @@ def test_tiff_write_89(): # print('quality = %d, size = %d' % (quality, size)) if quality != 90: - assert size < last_size, 'did not get decreasing file sizes' + assert size < last_size, "did not get decreasing file sizes" last_size = size - gdaltest.tiff_drv.Delete('tmp/tiff_write_89.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_89.tif") + ############################################################################### # Test JPEG_QUALITY propagation/override while creating (internal) overviews @@ -3058,17 +3490,22 @@ def test_tiff_write_89(): def test_tiff_write_90(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() checksums = {} - qualities = [90,75,75] + qualities = [90, 75, 75] for i, quality in enumerate(qualities): - src_ds = gdal.Open('../gdrivers/data/utm.tif') - fname = 'tmp/tiff_write_90_%d' % i + src_ds = gdal.Open("../gdrivers/data/utm.tif") + fname = "tmp/tiff_write_90_%d" % i - ds = gdal.GetDriverByName('GTiff').Create(fname, 1024, 1024, 3, - options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=%d' % quality]) + ds = gdal.GetDriverByName("GTiff").Create( + fname, + 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) @@ -3076,16 +3513,18 @@ def test_tiff_write_90(): ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) if i == 2: quality = 30 - with gdaltest.config_option('JPEG_QUALITY_OVERVIEW', '%d'%quality): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + with gdaltest.config_option("JPEG_QUALITY_OVERVIEW", "%d" % quality): + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) src_ds = None ds = None ds = gdal.Open(fname) - checksums[i] = [ ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(1).GetOverview(0).Checksum(), - ds.GetRasterBand(1).GetOverview(1).Checksum() ] + checksums[i] = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(1).GetOverview(0).Checksum(), + ds.GetRasterBand(1).GetOverview(1).Checksum(), + ] ds = None gdaltest.tiff_drv.Delete(fname) @@ -3101,24 +3540,27 @@ def test_tiff_write_90(): assert checksums[1][1] != checksums[2][1] assert checksums[1][2] != checksums[2][2] + ############################################################################### # Test WEBP_LEVEL propagation and overriding while creating overviews # on a newly created dataset + @pytest.mark.parametrize("external_ovr", [True, False]) def test_tiff_write_90_webp(external_ovr): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("WEBP") == -1: pytest.skip() checksums = {} - qualities = [90,75,75] + qualities = [90, 75, 75] for i, quality in enumerate(qualities): - src_ds = gdal.Open('../gdrivers/data/utm.tif') - fname = 'tmp/tiff_write_90_webp_%d' % i + src_ds = gdal.Open("../gdrivers/data/utm.tif") + fname = "tmp/tiff_write_90_webp_%d" % i - ds = gdal.GetDriverByName('GTiff').Create(fname, 512, 512, 3, - options=['COMPRESS=WEBP', 'WEBP_LEVEL=%d' % quality]) + ds = gdal.GetDriverByName("GTiff").Create( + fname, 512, 512, 3, options=["COMPRESS=WEBP", "WEBP_LEVEL=%d" % quality] + ) data = src_ds.GetRasterBand(1).ReadRaster() ds.GetRasterBand(1).WriteRaster(0, 0, 512, 512, data) @@ -3130,18 +3572,20 @@ def test_tiff_write_90_webp(external_ovr): if external_ovr: ds = None ds = gdal.Open(fname) - options['COMPRESS_OVERVIEW'] = 'WEBP' - options['WEBP_LEVEL_OVERVIEW'] = '%d' % quality + options["COMPRESS_OVERVIEW"] = "WEBP" + options["WEBP_LEVEL_OVERVIEW"] = "%d" % quality with gdaltest.config_options(options): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) src_ds = None ds = None ds = gdal.Open(fname) - checksums[i] = [ ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(1).GetOverview(0).Checksum(), - ds.GetRasterBand(1).GetOverview(1).Checksum() ] + checksums[i] = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(1).GetOverview(0).Checksum(), + ds.GetRasterBand(1).GetOverview(1).Checksum(), + ] ds = None gdaltest.tiff_drv.Delete(fname) @@ -3161,17 +3605,23 @@ def test_tiff_write_90_webp(external_ovr): ############################################################################### # 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('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() checksums = {} for quality in [90, 75, 30]: - src_ds = gdal.Open('../gdrivers/data/utm.tif') + 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]) + 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) @@ -3179,22 +3629,23 @@ def test_tiff_write_91(): 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) + 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 - ds = gdal.Open('tmp/tiff_write_91.tif') - checksums[quality] = [ ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(1).GetOverview(0).Checksum(), - ds.GetRasterBand(1).GetOverview(1).Checksum() ] + ds = gdal.Open("tmp/tiff_write_91.tif") + checksums[quality] = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(1).GetOverview(0).Checksum(), + ds.GetRasterBand(1).GetOverview(1).Checksum(), + ] ds = None - - gdaltest.tiff_drv.Delete('tmp/tiff_write_91.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_91.tif") assert checksums[75][0] != checksums[90][0] assert checksums[75][1] != checksums[90][1] @@ -3208,21 +3659,24 @@ def test_tiff_write_91(): assert checksums[90][1] != checksums[30][1] assert checksums[90][2] != checksums[30][2] + ############################################################################### # Test WEBP_LEVEL_OVERVIEW while creating (internal) overviews after re-opening + def test_tiff_write_91_webp(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("WEBP") == -1: pytest.skip() checksums = {} for quality in [90, 75, 30]: - src_ds = gdal.Open('../gdrivers/data/utm.tif') - fname = 'tmp/tiff_write_91_webp_%d' % quality + src_ds = gdal.Open("../gdrivers/data/utm.tif") + fname = "tmp/tiff_write_91_webp_%d" % quality - ds = gdal.GetDriverByName('GTiff').Create(fname, 1024, 1024, 3, - options=['COMPRESS=WEBP']) + ds = gdal.GetDriverByName("GTiff").Create( + fname, 1024, 1024, 3, options=["COMPRESS=WEBP"] + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) @@ -3232,15 +3686,17 @@ def test_tiff_write_91_webp(): src_ds = None ds = gdal.Open(fname, gdal.GA_Update) - with gdaltest.config_option('WEBP_LEVEL_OVERVIEW', '%d'%quality): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + with gdaltest.config_option("WEBP_LEVEL_OVERVIEW", "%d" % quality): + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) ds = None ds = gdal.Open(fname) - checksums[quality] = [ ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(1).GetOverview(0).Checksum(), - ds.GetRasterBand(1).GetOverview(1).Checksum() ] + checksums[quality] = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(1).GetOverview(0).Checksum(), + ds.GetRasterBand(1).GetOverview(1).Checksum(), + ] ds = None gdaltest.tiff_drv.Delete(fname) @@ -3257,22 +3713,29 @@ def test_tiff_write_91_webp(): assert checksums[90][1] != checksums[30][1] assert checksums[90][2] != checksums[30][2] + ############################################################################### # 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('JPEG') == -1: + 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') + 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]) + 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) @@ -3280,17 +3743,17 @@ def test_tiff_write_92(): ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds = None - ds = gdal.Open('tmp/tiff_write_92.tif', gdal.GA_Update) - assert ds.GetMetadataItem('JPEG_QUALITY', 'IMAGE_STRUCTURE') == str(quality) + ds = gdal.Open("tmp/tiff_write_92.tif", gdal.GA_Update) + assert ds.GetMetadataItem("JPEG_QUALITY", "IMAGE_STRUCTURE") == str(quality) 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) + 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 = open("tmp/tiff_write_92.tif", "rb") f.seek(0, os.SEEK_END) size = f.tell() f.close() @@ -3298,13 +3761,14 @@ def test_tiff_write_92(): # print('quality = %d, size = %d' % (quality, size)) if jpeg_quality_overview == 30: - assert size == last_size, 'did not get equal file sizes' + 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' + assert size > last_size, "did not get growing file sizes" last_size = size - gdaltest.tiff_drv.Delete('tmp/tiff_write_92.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_92.tif") + ############################################################################### # Test JPEG_QUALITY_OVERVIEW propagation while creating external overviews @@ -3312,12 +3776,17 @@ def test_tiff_write_92(): def test_tiff_write_93(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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']) + 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) @@ -3331,21 +3800,21 @@ def test_tiff_write_93(): for quality in [90, 75, 30]: try: - os.remove('tmp/tiff_write_93.tif.ovr') + 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 = 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 = open("tmp/tiff_write_93.tif.ovr", "rb") f.seek(0, os.SEEK_END) size = f.tell() f.close() @@ -3353,47 +3822,55 @@ def test_tiff_write_93(): # print('quality = %d, size = %d' % (quality, size)) if quality != 90: - assert size < last_size, 'did not get decreasing file sizes' + 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' + 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') + 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('JPEG') == -1: + 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 = 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", 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) + 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') + 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') + 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" - assert cs == 3, 'wrong checksum' ############################################################################### # Test that COPY_SRC_OVERVIEWS deal well with rounding issues when computing @@ -3402,62 +3879,88 @@ def test_tiff_write_94(): 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) + 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') + 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(other_options = [], nbands = 1, nbits = 8): +def test_tiff_write_96(other_options=[], nbands=1, nbits=8): - gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') - src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_96_src.tif', 100, 100, nbands, options = ['NBITS=' + str(nbits)]) + gdal.SetConfigOption("GDAL_TIFF_INTERNAL_MASK", "YES") + src_ds = gdaltest.tiff_drv.Create( + "tmp/tiff_write_96_src.tif", 100, 100, nbands, options=["NBITS=" + str(nbits)] + ) src_ds.GetRasterBand(1).Fill(255 if nbits == 8 else 127) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( - 25, 25, 50, 50, b'\xff', 1, 1) - src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(25, 25, 50, 50, b"\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_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() + 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'] + other_options + ['NBITS=' + str(nbits)]) + ds = gdaltest.tiff_drv.CreateCopy( + "tmp/tiff_write_96_dst.tif", + src_ds, + options=["COPY_SRC_OVERVIEWS=YES"] + other_options + ["NBITS=" + str(nbits)], + ) ds = None src_ds = None - gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) + gdal.SetConfigOption("GDAL_TIFF_INTERNAL_MASK", None) - ds = gdal.Open('tmp/tiff_write_96_dst.tif') + 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() - assert ds.GetMetadataItem('HAS_USED_READ_ENCODED_API', '_DEBUG_') == '1' - ds = None - - 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' + assert ds.GetMetadataItem("HAS_USED_READ_ENCODED_API", "_DEBUG_") == "1" + ds = None + + 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" if check_libtiff_internal_or_at_least(4, 0, 11): - with gdaltest.config_option('GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE', 'YES'): - ds = gdal.Open('tmp/tiff_write_96_dst.tif') + with gdaltest.config_option("GTIFF_HAS_OPTIMIZED_READ_MULTI_RANGE", "YES"): + 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() @@ -3465,23 +3968,50 @@ def test_tiff_write_96(other_options = [], nbands = 1, nbits = 8): cs_ovr_2 = ds.GetRasterBand(1).GetOverview(1).Checksum() cs_ovr_mask_2 = ds.GetRasterBand(1).GetOverview(1).GetMaskBand().Checksum() - 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' - assert ds.GetMetadataItem('HAS_USED_READ_ENCODED_API', '_DEBUG_') == '0' + 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" + assert ds.GetMetadataItem("HAS_USED_READ_ENCODED_API", "_DEBUG_") == "0" ds = None - _check_cog('tmp/tiff_write_96_dst.tif', check_tiled=False, full_check=True) + _check_cog("tmp/tiff_write_96_dst.tif", check_tiled=False, full_check=True) - gdaltest.tiff_drv.Delete('tmp/tiff_write_96_src.tif') - gdaltest.tiff_drv.Delete('tmp/tiff_write_96_dst.tif') + gdaltest.tiff_drv.Delete("tmp/tiff_write_96_src.tif") + gdaltest.tiff_drv.Delete("tmp/tiff_write_96_dst.tif") def test_tiff_write_96_tiled_threads_nbits7_nbands1(): - return test_tiff_write_96(['TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32', 'NUM_THREADS=ALL_CPUS'], nbands = 1, nbits = 7) + return test_tiff_write_96( + ["TILED=YES", "BLOCKXSIZE=16", "BLOCKYSIZE=32", "NUM_THREADS=ALL_CPUS"], + nbands=1, + nbits=7, + ) + def test_tiff_write_96_tiled_threads_nbits7_nbands2(): - return test_tiff_write_96(['BIGTIFF=YES', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32', 'NUM_THREADS=ALL_CPUS'], nbands = 2, nbits = 7) + return test_tiff_write_96( + [ + "BIGTIFF=YES", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=32", + "NUM_THREADS=ALL_CPUS", + ], + nbands=2, + nbits=7, + ) ############################################################################### @@ -3493,19 +4023,39 @@ def test_tiff_write_ifd_offsets(): if not check_libtiff_internal_or_at_least(4, 0, 11): pytest.skip() - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100) + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) - - filename = '/vsimem/test_tiff_write_ifd_offsets.tif' - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=['COPY_SRC_OVERVIEWS=YES', 'TILED=YES', 'COMPRESS=LZW']) - val0_ref = int(ds.GetRasterBand(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val1_ref = int(ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) - val2_ref = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val3_ref = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val4_ref = int(ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) - val5_ref = int(ds.GetRasterBand(1).GetOverview(1).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) + src_ds.BuildOverviews("NEAR", overviewlist=[2, 4]) + + filename = "/vsimem/test_tiff_write_ifd_offsets.tif" + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + ds = gdal.GetDriverByName("GTiff").CreateCopy( + filename, + src_ds, + options=["COPY_SRC_OVERVIEWS=YES", "TILED=YES", "COMPRESS=LZW"], + ) + val0_ref = int(ds.GetRasterBand(1).GetMetadataItem("IFD_OFFSET", "TIFF")) + val1_ref = int( + ds.GetRasterBand(1).GetMaskBand().GetMetadataItem("IFD_OFFSET", "TIFF") + ) + val2_ref = int( + ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("IFD_OFFSET", "TIFF") + ) + val3_ref = int( + ds.GetRasterBand(1).GetOverview(1).GetMetadataItem("IFD_OFFSET", "TIFF") + ) + val4_ref = int( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("IFD_OFFSET", "TIFF") + ) + val5_ref = int( + ds.GetRasterBand(1) + .GetOverview(1) + .GetMaskBand() + .GetMetadataItem("IFD_OFFSET", "TIFF") + ) ds = None assert val0_ref < val1_ref @@ -3516,43 +4066,65 @@ def test_tiff_write_ifd_offsets(): assert val5_ref < 1100 # Retry with larger file - src_ds = gdal.GetDriverByName('MEM').Create('', 4096, 4096) + src_ds = gdal.GetDriverByName("MEM").Create("", 4096, 4096) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) - - with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): - ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=['COPY_SRC_OVERVIEWS=YES', 'TILED=YES', 'COMPRESS=LZW']) - val0 = int(ds.GetRasterBand(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val1 = int(ds.GetRasterBand(1).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) - val2 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val3 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) - val4 = int(ds.GetRasterBand(1).GetOverview(0).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) - val5 = int(ds.GetRasterBand(1).GetOverview(1).GetMaskBand().GetMetadataItem('IFD_OFFSET', 'TIFF')) + src_ds.BuildOverviews("NEAR", overviewlist=[2, 4]) + + with gdaltest.config_option("GDAL_TIFF_INTERNAL_MASK", "YES"): + ds = gdal.GetDriverByName("GTiff").CreateCopy( + filename, + src_ds, + options=["COPY_SRC_OVERVIEWS=YES", "TILED=YES", "COMPRESS=LZW"], + ) + val0 = int(ds.GetRasterBand(1).GetMetadataItem("IFD_OFFSET", "TIFF")) + val1 = int(ds.GetRasterBand(1).GetMaskBand().GetMetadataItem("IFD_OFFSET", "TIFF")) + val2 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem("IFD_OFFSET", "TIFF")) + val3 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem("IFD_OFFSET", "TIFF")) + val4 = int( + ds.GetRasterBand(1) + .GetOverview(0) + .GetMaskBand() + .GetMetadataItem("IFD_OFFSET", "TIFF") + ) + val5 = int( + ds.GetRasterBand(1) + .GetOverview(1) + .GetMaskBand() + .GetMetadataItem("IFD_OFFSET", "TIFF") + ) ds = None # Test rewriting but without changing strile size ds = gdal.Open(filename, gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None - assert gdal.GetLastErrorMsg() == '' - f = gdal.VSIFOpenL(filename, 'rb') - data = gdal.VSIFReadL(1, 1000, f).decode('LATIN1') + assert gdal.GetLastErrorMsg() == "" + f = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 1000, f).decode("LATIN1") gdal.VSIFCloseL(f) - assert 'KNOWN_INCOMPATIBLE_EDITION=NO\n ' in data + assert "KNOWN_INCOMPATIBLE_EDITION=NO\n " in data # Test rewriting with changing strile size ds = gdal.Open(filename, gdal.GA_Update) - ds.GetRasterBand(1).WriteRaster(0,0,1,1,'x') + ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, "x") ds = None - assert gdal.GetLastErrorMsg() != '' - f = gdal.VSIFOpenL(filename, 'rb') - data = gdal.VSIFReadL(1, 1000, f).decode('LATIN1') + assert gdal.GetLastErrorMsg() != "" + f = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 1000, f).decode("LATIN1") gdal.VSIFCloseL(f) - assert 'KNOWN_INCOMPATIBLE_EDITION=YES\n' in data + assert "KNOWN_INCOMPATIBLE_EDITION=YES\n" in data + + gdal.GetDriverByName("GTiff").Delete(filename) - gdal.GetDriverByName('GTiff').Delete(filename) + assert (val0_ref, val1_ref, val2_ref, val3_ref, val4_ref, val5_ref) == ( + val0, + val1, + val2, + val3, + val4, + val5, + ) - assert (val0_ref, val1_ref, val2_ref, val3_ref, val4_ref, val5_ref) == (val0, val1, val2, val3, val4, val5) ############################################################################### # Create a simple file by copying from an existing one - PixelIsPoint @@ -3560,60 +4132,63 @@ def test_tiff_write_ifd_offsets(): def test_tiff_write_97(): - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "FALSE") - src_ds = gdal.Open('data/byte_point.tif') + src_ds = gdal.Open("data/byte_point.tif") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_97.tif', src_ds) + new_ds = gdaltest.tiff_drv.CreateCopy("tmp/test_97.tif", src_ds) gt = new_ds.GetGeoTransform() - md = new_ds.GetMetadataItem('AREA_OR_POINT') + 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 gt == gt_expected, "did not get expected geotransform" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' + assert md == "Point", "did not get expected AREA_OR_POINT value" - gdaltest.tiff_drv.Delete('tmp/test_97.tif') + gdaltest.tiff_drv.Delete("tmp/test_97.tif") # Again, but ignoring PixelIsPoint - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "TRUE") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_97_2.tif', src_ds) + new_ds = gdaltest.tiff_drv.CreateCopy("tmp/test_97_2.tif", src_ds) gt = new_ds.GetGeoTransform() - md = new_ds.GetMetadataItem('AREA_OR_POINT') + 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 ( + gt == gt_expected + ), "did not get expected geotransform when ignoring PixelIsPoint" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' + assert md == "Point", "did not get expected AREA_OR_POINT value" - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", None) # read back this file with pixelispoint behavior enabled. - new_ds = gdal.Open('tmp/test_97_2.tif') + new_ds = gdal.Open("tmp/test_97_2.tif") gt = new_ds.GetGeoTransform() - md = new_ds.GetMetadataItem('AREA_OR_POINT') + 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 ( + gt == gt_expected + ), "did not get expected geotransform when ignoring PixelIsPoint (2)" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' + assert md == "Point", "did not get expected AREA_OR_POINT value" + + gdaltest.tiff_drv.Delete("tmp/test_97_2.tif") - gdaltest.tiff_drv.Delete('tmp/test_97_2.tif') ############################################################################### # Create a rotated geotiff file (uses a geomatrix) with - PixelIsPoint @@ -3621,39 +4196,40 @@ def test_tiff_write_97(): 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", "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) + 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') + 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 gt == gt_expected, "did not get expected geotransform" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' + assert md == "Point", "did not get expected AREA_OR_POINT value" - with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'FALSE'): + with gdaltest.config_option("GTIFF_POINT_GEO_IGNORE", "FALSE"): - new_ds = gdal.Open('tmp/test_98.tif') + new_ds = gdal.Open("tmp/test_98.tif") gt = new_ds.GetGeoTransform() - md = new_ds.GetMetadataItem('AREA_OR_POINT') + 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 gt == gt_expected, "did not get expected geotransform (2)" + + assert md == "Point", "did not get expected AREA_OR_POINT value" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' + gdaltest.tiff_drv.Delete("tmp/test_98.tif") - gdaltest.tiff_drv.Delete('tmp/test_98.tif') ############################################################################### # Create a rotated geotiff file (uses a geomatrix) with - PixelIsPoint @@ -3661,54 +4237,61 @@ def test_tiff_write_98(): def test_tiff_write_tiepoints_pixelispoint(): - tmpfilename = '/vsimem/test_tiff_write_tiepoints_pixelispoint.tif' + tmpfilename = "/vsimem/test_tiff_write_tiepoints_pixelispoint.tif" - gdal.Translate(tmpfilename, 'data/byte_gcp_pixelispoint.tif') + gdal.Translate(tmpfilename, "data/byte_gcp_pixelispoint.tif") ds = gdal.Open(tmpfilename) - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point' + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point" assert ds.GetGCPCount() == 4 gcp = ds.GetGCPs()[0] - assert (gcp.GCPPixel == pytest.approx(0.5, abs=1e-5) and \ - gcp.GCPLine == pytest.approx(0.5, abs=1e-5) and \ - gcp.GCPX == pytest.approx(-180, abs=1e-5) and \ - gcp.GCPY == pytest.approx(90, abs=1e-5) and \ - gcp.GCPZ == pytest.approx(0, abs=1e-5)) - - - with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'YES'): - gdal.Translate(tmpfilename, 'data/byte_gcp_pixelispoint.tif') + assert ( + gcp.GCPPixel == pytest.approx(0.5, abs=1e-5) + and gcp.GCPLine == pytest.approx(0.5, abs=1e-5) + and gcp.GCPX == pytest.approx(-180, abs=1e-5) + and gcp.GCPY == pytest.approx(90, abs=1e-5) + and gcp.GCPZ == pytest.approx(0, abs=1e-5) + ) + + with gdaltest.config_option("GTIFF_POINT_GEO_IGNORE", "YES"): + gdal.Translate(tmpfilename, "data/byte_gcp_pixelispoint.tif") ds = gdal.Open(tmpfilename) - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point' + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point" assert ds.GetGCPCount() == 4 gcp = ds.GetGCPs()[0] - assert (gcp.GCPPixel == pytest.approx(0, abs=1e-5) and \ - gcp.GCPLine == pytest.approx(0, abs=1e-5) and \ - gcp.GCPX == pytest.approx(-180, abs=1e-5) and \ - gcp.GCPY == pytest.approx(90, abs=1e-5) and \ - gcp.GCPZ == pytest.approx(0, abs=1e-5)) + assert ( + gcp.GCPPixel == pytest.approx(0, abs=1e-5) + and gcp.GCPLine == pytest.approx(0, abs=1e-5) + and gcp.GCPX == pytest.approx(-180, abs=1e-5) + and gcp.GCPY == pytest.approx(90, abs=1e-5) + and gcp.GCPZ == pytest.approx(0, abs=1e-5) + ) gdal.Unlink(tmpfilename) + ############################################################################### # 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']) + 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') + 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') + gdaltest.tiff_drv.Delete("tmp/test_99.tif") + + assert (cs1, cs2, cs3) == (21629, 21651, 21371), "%d,%d,%d" % (cs1, cs2, cs3) - assert (cs1, cs2, cs3) == (21629, 21651, 21371), ('%d,%d,%d' % (cs1, cs2, cs3)) ############################################################################### # Create copy into a 2 band JPEG-IN-TIFF (#3887) @@ -3716,21 +4299,24 @@ def test_tiff_write_99(): def test_tiff_write_100(): - src_ds = gdaltest.tiff_drv.Create('/vsimem/test_100_src.tif', 16, 16, 2) + 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']) + 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') + 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') + 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) - assert (cs1, cs2) == (3118, 0), ('%d,%d' % (cs1, cs2)) ############################################################################### # Test CHUNKY_STRIP_READ_SUPPORT (#3894) @@ -3744,21 +4330,25 @@ def test_tiff_write_101(): if not gdaltest.run_slow_tests(): pytest.skip() - if sys.platform.startswith('linux'): + if sys.platform.startswith("linux"): # Much faster to use /dev/urandom than python random generator ! - f = open('/dev/urandom', 'rb') + f = open("/dev/urandom", "rb") rand_array = f.read(10 * 1024 * 1024) f.close() else: import random - rand_array = b''.join(struct.pack('B', random.randint(0, 255)) for _ in range(10 * 1024 * 1024)) - f = open('tmp/tiff_write_101.bin', 'wb') + rand_array = b"".join( + struct.pack("B", random.randint(0, 255)) for _ in range(10 * 1024 * 1024) + ) + + 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 + f = open("tmp/tiff_write_101.hdr", "wb") + f.write( + """ENVI samples = 2500 lines = 4000 bands = 1 @@ -3769,40 +4359,54 @@ def test_tiff_write_101(): byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { -Band 1}""".encode('ascii')) +Band 1}""".encode( + "ascii" + ) + ) f.close() - src_ds = gdal.Open('tmp/tiff_write_101.bin') + 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: + 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 = 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') + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_101.tif") - if error_msg != '': + if error_msg != "": src_ds = None - gdaltest.tiff_drv.Delete('tmp/tiff_write_101.bin') + gdaltest.tiff_drv.Delete("tmp/tiff_write_101.bin") pytest.fail() - if compression_method != 'JPEG' and cs != expected_cs: + 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)) + 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') + gdaltest.tiff_drv.Delete("tmp/tiff_write_101.bin") + ############################################################################### # Test writing and reading back COMPD_CS @@ -3810,83 +4414,97 @@ def test_tiff_write_101(): def test_tiff_write_102(): - if int(gdal.GetDriverByName('GTiff').GetMetadataItem('LIBGEOTIFF')) < 1600: - pytest.skip('requires libgeotiff >= 1.6') + if int(gdal.GetDriverByName("GTiff").GetMetadataItem("LIBGEOTIFF")) < 1600: + pytest.skip("requires libgeotiff >= 1.6") - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_102.tif', 1, 1) + ds = gdaltest.tiff_drv.Create("/vsimem/tiff_write_102.tif", 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(7401) - name = sr.GetAttrValue('COMPD_CS') + name = sr.GetAttrValue("COMPD_CS") wkt = sr.ExportToWkt() ds.SetProjection(wkt) ds = None - ds = gdal.Open('/vsimem/tiff_write_102.tif') + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_102.tif") - assert wkt1.startswith('COMPD_CS'), 'expected COMPD_CS, but got something else' + 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' + 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') + got_name = sr2.GetAttrValue("COMPD_CS") assert got_name == name, wkt2 + ############################################################################### # 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') + 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') + 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' + 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 = 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') + 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 fe == pytest.approx(2000000.0, abs=0.001), 'did not get expected false easting' + assert fe == pytest.approx( + 2000000.0, abs=0.001 + ), "did not get expected false easting" + + gdaltest.tiff_drv.Delete("tmp/test_104.tif") - gdaltest.tiff_drv.Delete('tmp/test_104.tif') ############################################################################### # Confirm as best we can that we can write geotiff files with detailed @@ -3895,35 +4513,38 @@ def test_tiff_write_104(): def test_tiff_write_105(): - shutil.copyfile('data/bug4468.tif', 'tmp/bug4468.tif') + shutil.copyfile("data/bug4468.tif", "tmp/bug4468.tif") # Update a pixel and close again. - ds = gdal.Open('tmp/bug4468.tif', gdal.GA_Update) + 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') + ds = gdal.Open("tmp/bug4468.tif") cs = ds.GetRasterBand(1).Checksum() - assert cs == 2923, ('Did not get expected checksum, got %d.' % cs) + assert cs == 2923, "Did not get expected checksum, got %d." % cs ds = None - gdaltest.tiff_drv.Delete('tmp/bug4468.tif') + gdaltest.tiff_drv.Delete("tmp/bug4468.tif") + ############################################################################### # Test the direct copy mechanism of JPEG source -def test_tiff_write_106(filename='../gdrivers/data/jpeg/byte_with_xmp.jpg', options=None, check_cs=True): +def test_tiff_write_106( + filename="../gdrivers/data/jpeg/byte_with_xmp.jpg", options=None, check_cs=True +): if options is None: - options = ['COMPRESS=JPEG'] + options = ["COMPRESS=JPEG"] md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() src_ds = gdal.Open(filename) @@ -3932,68 +4553,95 @@ def test_tiff_write_106(filename='../gdrivers/data/jpeg/byte_with_xmp.jpg', opti 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 = 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') + 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') + 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' + 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' - + assert cs[i] != 0, "did not get expected checksum" def test_tiff_write_107(): - return test_tiff_write_106(options=['COMPRESS=JPEG', 'BLOCKYSIZE=8']) + 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']) + 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']) + 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/jpeg/albania.jpg', check_cs=False) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/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/jpeg/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260']) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/albania.jpg", + options=["COMPRESS=JPEG", "BLOCKYSIZE=260"], + ) def test_tiff_write_111_bis(): - return test_tiff_write_106(filename='../gdrivers/data/jpeg/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260', 'INTERLEAVE=PIXEL']) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/albania.jpg", + options=["COMPRESS=JPEG", "BLOCKYSIZE=260", "INTERLEAVE=PIXEL"], + ) def test_tiff_write_111_ter(): - return test_tiff_write_106(filename='../gdrivers/data/jpeg/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260', 'INTERLEAVE=BAND'], check_cs=False) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/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/jpeg/albania.jpg', options=['COMPRESS=JPEG', 'TILED=YES'], check_cs=False) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/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/jpeg/rgbsmall_rgb.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=8']) + return test_tiff_write_106( + filename="../gdrivers/data/jpeg/rgbsmall_rgb.jpg", + options=["COMPRESS=JPEG", "BLOCKYSIZE=8"], + ) + ############################################################################### # Test CreateCopy() interruption @@ -4001,36 +4649,37 @@ def test_tiff_write_113(): def test_tiff_write_114(): - tst = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) + 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: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - tmpfilename = '/vsimem/tiff_write_115.tif' + 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']) + 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') + 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': + md = ds.GetMetadata("IMAGE_STRUCTURE") + if md["INTERLEAVE"] != "PIXEL": ds = None gdal.Unlink(tmpfilename) pytest.fail() @@ -4043,7 +4692,10 @@ def test_tiff_write_115(): gdal.Unlink(tmpfilename) pytest.fail() - if ds.GetRasterBand(i + 1).GetRasterColorInterpretation() != gdal.GCI_RedBand + i: + if ( + ds.GetRasterBand(i + 1).GetRasterColorInterpretation() + != gdal.GCI_RedBand + i + ): ds = None gdal.Unlink(tmpfilename) pytest.fail() @@ -4051,32 +4703,35 @@ def test_tiff_write_115(): 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: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - tmpfilename = '/vsimem/tiff_write_116.tif' + 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']) + 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') + 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': + md = ds.GetMetadata("IMAGE_STRUCTURE") + if md["INTERLEAVE"] != "BAND": ds = None gdal.Unlink(tmpfilename) pytest.fail() @@ -4089,7 +4744,10 @@ def test_tiff_write_116(): gdal.Unlink(tmpfilename) pytest.fail() - if ds.GetRasterBand(i + 1).GetRasterColorInterpretation() != gdal.GCI_RedBand + i: + if ( + ds.GetRasterBand(i + 1).GetRasterColorInterpretation() + != gdal.GCI_RedBand + i + ): ds = None gdal.Unlink(tmpfilename) pytest.fail() @@ -4097,6 +4755,7 @@ def test_tiff_write_116(): ds = None gdal.Unlink(tmpfilename) + ############################################################################### # Test bugfix for ticket #4771 (rewriting of a deflate compressed tile, libtiff bug) @@ -4104,7 +4763,7 @@ def test_tiff_write_116(): def test_tiff_write_117(): # This fail with a libtiff 4.x older than 2012-08-13 md = gdaltest.tiff_drv.GetMetadata() - if md['LIBTIFF'] != 'INTERNAL': + if md["LIBTIFF"] != "INTERNAL": pytest.skip() import random @@ -4112,11 +4771,19 @@ def test_tiff_write_117(): # 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']) + 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)]) + 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 @@ -4124,13 +4791,13 @@ def test_tiff_write_117(): ds = None - ds = gdal.Open('/vsimem/tiff_write_117.tif', gdal.GA_Update) + 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)]) + 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 @@ -4141,10 +4808,12 @@ def test_tiff_write_117(): ds = None - gdal.Unlink('/vsimem/tiff_write_117.tif') + 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" - 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 gh #4538 (rewriting of a deflate compressed tile, libtiff bug) @@ -4153,28 +4822,38 @@ def test_tiff_write_117(): def test_tiff_write_rewrite_in_place_issue_gh_4538(): # This fail with libtiff <= 4.3.0 md = gdaltest.tiff_drv.GetMetadata() - if md['LIBTIFF'] != 'INTERNAL': + if md["LIBTIFF"] != "INTERNAL": pytest.skip() # Defeats the logic that fixed test_tiff_write_117 import array - filename = '/vsimem/tmp.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 144*2, 128, 1, - options = ['TILED=YES', - 'COMPRESS=PACKBITS', - 'BLOCKXSIZE=144', - 'BLOCKYSIZE=128']) - x = ((144*128)//2) - 645 - ds.GetRasterBand(1).WriteRaster(0, 0, 144, 128, - b'\x00' * x + array.array('B', [i % 255 for i in range(144*128-x)])) - block1_data = b'\x00' * (x + 8) + array.array('B', [i % 255 for i in range(144*128-(x+8))]) + + filename = "/vsimem/tmp.tif" + ds = gdal.GetDriverByName("GTiff").Create( + filename, + 144 * 2, + 128, + 1, + options=["TILED=YES", "COMPRESS=PACKBITS", "BLOCKXSIZE=144", "BLOCKYSIZE=128"], + ) + x = ((144 * 128) // 2) - 645 + ds.GetRasterBand(1).WriteRaster( + 0, + 0, + 144, + 128, + b"\x00" * x + array.array("B", [i % 255 for i in range(144 * 128 - x)]), + ) + block1_data = b"\x00" * (x + 8) + array.array( + "B", [i % 255 for i in range(144 * 128 - (x + 8))] + ) ds.GetRasterBand(1).WriteRaster(144, 0, 144, 128, block1_data) ds = None ds = gdal.Open(filename, gdal.GA_Update) ds.GetRasterBand(1).ReadRaster(144, 0, 144, 128) - block0_data = array.array('B', [i % 255 for i in range(144*128)]) + block0_data = array.array("B", [i % 255 for i in range(144 * 128)]) ds.GetRasterBand(1).WriteRaster(0, 0, 144, 128, block0_data) ds = None @@ -4185,42 +4864,45 @@ def test_tiff_write_rewrite_in_place_issue_gh_4538(): gdal.Unlink(filename) + ############################################################################### # Test bugfix for ticket #4816 def test_tiff_write_118(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_118.tif', 1, 1) + 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.SetMetadata("bla", "foo") ds = None - ds = gdal.Open('/vsimem/tiff_write_118.tif') - md = ds.GetMetadata('foo') + ds = gdal.Open("/vsimem/tiff_write_118.tif") + md = ds.GetMetadata("foo") ds = None - gdal.Unlink('/vsimem/tiff_write_118.tif') + 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 = 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 = gdal.Open("/vsimem/tiff_write_119.tif") + md = ds.GetMetadata("foo") ds = None - gdal.Unlink('/vsimem/tiff_write_119.tif') + gdal.Unlink("/vsimem/tiff_write_119.tif") + + assert md["foo"] == "bar" - assert md['foo'] == 'bar' ############################################################################### # Test bugfix for ticket #4816 @@ -4228,18 +4910,19 @@ def test_tiff_write_119(): def test_tiff_write_120(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_120.tif', 1, 1) - ds.SetMetadata('<foo/>', 'xml:foo') + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/tiff_write_120.tif", 1, 1) + ds.SetMetadata("<foo/>", "xml:foo") ds = None - ds = gdal.Open('/vsimem/tiff_write_120.tif') - md = ds.GetMetadata('xml:foo') + ds = gdal.Open("/vsimem/tiff_write_120.tif") + md = ds.GetMetadata("xml:foo") ds = None - gdal.Unlink('/vsimem/tiff_write_120.tif') + gdal.Unlink("/vsimem/tiff_write_120.tif") assert len(md) == 1 - assert md[0] == '<foo/>' + assert md[0] == "<foo/>" + ############################################################################### # Test error cases of COPY_SRC_OVERVIEWS creation option @@ -4248,7 +4931,8 @@ def test_tiff_write_120(): def test_tiff_write_121(): # Test when the overview band is NULL - src_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + src_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> @@ -4259,15 +4943,19 @@ def test_tiff_write_121(): <SourceBand>1</SourceBand> </Overview> </VRTRasterBand> -</VRTDataset>""") - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) +</VRTDataset>""" + ) + 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("""<VRTDataset rasterXSize="20" rasterYSize="20"> + src_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> @@ -4284,15 +4972,19 @@ def test_tiff_write_121(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) +</VRTDataset>""" + ) + 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("""<VRTDataset rasterXSize="20" rasterYSize="20"> + src_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> @@ -4313,13 +5005,17 @@ def test_tiff_write_121(): <SourceBand>1</SourceBand> </Overview> </VRTRasterBand> -</VRTDataset>""") - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) +</VRTDataset>""" + ) + 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) @@ -4327,27 +5023,33 @@ def test_tiff_write_121(): def test_tiff_write_122(): - new_ds = gdaltest.tiff_drv.Create('tmp/tags122.tif', 1, 1, 1) + new_ds = gdaltest.tiff_drv.Create("tmp/tags122.tif", 1, 1, 1) - new_ds.SetMetadata({ - 'TIFFTAG_RESOLUTIONUNIT': '*', - }) + new_ds.SetMetadata( + { + "TIFFTAG_RESOLUTIONUNIT": "*", + } + ) new_ds = None # hopefully it's closed now! - new_ds = gdal.Open('tmp/tags122.tif') + new_ds = gdal.Open("tmp/tags122.tif") md = new_ds.GetMetadata() - if 'TIFFTAG_RESOLUTIONUNIT' not in md: - pytest.fail('Couldnt find tag TIFFTAG_RESOLUTIONUNIT') + 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']) + 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') + gdaltest.tiff_drv.Delete("tmp/tags122.tif") + ############################################################################### # Test implicit photometric interpretation @@ -4355,171 +5057,217 @@ def test_tiff_write_122(): 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 = 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' + 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' + assert src_ds.GetMetadataItem("TIFFTAG_EXTRASAMPLES", "_DEBUG_") == "0,2" - new_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_123.tif', src_ds) + 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' + 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' + 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') + 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 = 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' + 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 = 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') + 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') + 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 = 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' + 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') + 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' + 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' + 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' + 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') + 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 = 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' + 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') + 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 = 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 + 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') + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_123_rgb.tif") - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 5) + 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') + 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') + 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) + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_123_rgba_to_undefined.tif") + ############################################################################### # Test error cases with palette creation @@ -4527,15 +5275,15 @@ def test_tiff_write_123(): def test_tiff_write_124(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_124.tif', 1, 1, 3, gdal.GDT_Byte) + ds = gdaltest.tiff_drv.Create("/vsimem/tiff_write_124.tif", 1, 1, 3, gdal.GDT_Byte) - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") # Test "SetColorTable() not supported for multi-sample TIFF files" ret = ds.GetRasterBand(1).SetColorTable(gdal.ColorTable()) gdal.PopErrorHandler() @@ -4543,21 +5291,31 @@ def test_tiff_write_124(): ds = None - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_124.tif', 1, 1, 1, gdal.GDT_UInt32) - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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') + 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']) + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_124.tif") + ############################################################################### # Test out-of-memory conditions with SplitBand and SplitBitmapBand @@ -4565,30 +5323,49 @@ def test_tiff_write_124(): def test_tiff_write_125(): - if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: + 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 = 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') + 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') + 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') + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds.GetRasterBand(1).ReadBlock(0, 0) gdal.PopErrorHandler() - gdal.Unlink('/vsimem/tiff_write_125.tif') + gdal.Unlink("/vsimem/tiff_write_125.tif") + ############################################################################### # Test implicit JPEG-in-TIFF overviews @@ -4597,31 +5374,100 @@ def test_tiff_write_125(): def test_tiff_write_126(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]), - (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEGTABLESMODE=0'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]), - (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]), - (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=800'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]), - (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=64'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]), - (['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]), - ] + src_ds = gdal.Open("../gdrivers/data/small_world_400pct.vrt") + + options_list = [ + ( + ["COMPRESS=JPEG", "PHOTOMETRIC=YCBCR"], + [48788, 56561, 56462], + [61397, 2463, 2454, 2727], + [29605, 33654, 34633], + [10904, 10453, 10361], + ), + ( + ["COMPRESS=JPEG", "PHOTOMETRIC=YCBCR", "JPEGTABLESMODE=0"], + [48788, 56561, 56462], + [61397, 2463, 2454, 2727], + [29605, 33654, 34633], + [10904, 10453, 10361], + ), + ( + ["COMPRESS=JPEG", "PHOTOMETRIC=YCBCR", "TILED=YES"], + [48788, 56561, 56462], + [61397, 2463, 2454, 2727], + [29605, 33654, 34633], + [10904, 10453, 10361], + ), + ( + ["COMPRESS=JPEG", "PHOTOMETRIC=YCBCR", "BLOCKYSIZE=800"], + [48788, 56561, 56462], + [61397, 2463, 2454, 2727], + [29605, 33654, 34633], + [10904, 10453, 10361], + ), + ( + ["COMPRESS=JPEG", "PHOTOMETRIC=YCBCR", "BLOCKYSIZE=64"], + [48788, 56561, 56462], + [61397, 2463, 2454, 2727], + [29605, 33654, 34633], + [10904, 10453, 10361], + ), + ( + ["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) + os.environ["JPEGMEM"] = "500M" + ds = gdaltest.tiff_drv.CreateCopy( + "/vsimem/tiff_write_126.tif", src_ds, options=options + ) ds = None - del os.environ['JPEGMEM'] + del os.environ["JPEGMEM"] - ds = gdal.Open('/vsimem/tiff_write_126.tif') + 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... @@ -4635,28 +5481,48 @@ def test_tiff_write_126(): 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) + 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]), - ] + 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) + os.environ["JPEGMEM"] = "500M" + ds = gdaltest.tiff_drv.CreateCopy( + "/vsimem/tiff_write_126.tif", src_ds, options=options + ) ds = None - del os.environ['JPEGMEM'] + del os.environ["JPEGMEM"] - ds = gdal.Open('/vsimem/tiff_write_126.tif') + 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... @@ -4666,22 +5532,28 @@ def test_tiff_write_126(): 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) + 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') + 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 = 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']) + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_126_src.tif") ds = None - ds = gdal.Open('/vsimem/tiff_write_126.tif') + 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) @@ -4689,36 +5561,48 @@ def test_tiff_write_126(): assert ovr_1_data == subsampled_data ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') + 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') + 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 = 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') + 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 + 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') + 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']) + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_126.tif") + ############################################################################### # Test setting/unsetting metadata in update mode (#5628) @@ -4726,52 +5610,53 @@ def test_tiff_write_126(): def test_tiff_write_127(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_127.tif', 1, 1) + 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) + 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.SetMetadata({"key": "value"}) obj = None ds = None - ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) + 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': + 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) + 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.SetMetadataItem("key", "value") obj = None ds = None - ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) + 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) + 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) + 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') + statBuf = gdal.VSIStatL("/vsimem/tiff_write_127.tif.aux.xml") if statBuf is not None: print(i) - pytest.fail('unexpected PAM file') + pytest.fail("unexpected PAM file") + + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_127.tif") - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_127.tif') ############################################################################### # Test lossless copying of a CMYK JPEG into JPEG-in-TIFF (#5712) @@ -4780,61 +5665,87 @@ def test_tiff_write_127(): def test_tiff_write_128(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') - src_ds = gdal.Open('../gdrivers/data/jpeg/rgb_ntf_cmyk.jpg') - gdal.SetConfigOption('GDAL_JPEG_TO_RGB', None) + gdal.SetConfigOption("GDAL_JPEG_TO_RGB", "NO") + src_ds = gdal.Open("../gdrivers/data/jpeg/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']) + 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) + 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') + 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() + 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') + 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']) + 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) + 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') + 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() + 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') + 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']) + 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) + gdal.SetConfigOption("GDAL_PAM_ENABLED", old_val) # Here we can reopen without GTIFF_RAW trick - ds = gdal.Open('/vsimem/tiff_write_128.tif') + 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() + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_128.tif") + ############################################################################### # Check effective guessing of existing JPEG quality @@ -4842,31 +5753,44 @@ def test_tiff_write_128(): def test_tiff_write_129(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - for jpegtablesmode in ['1', '3']: - for photometric in ['RGB', 'YCBCR']: + 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') + 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 = 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_129.tif") if i == 0: cs_ref = cs @@ -4882,32 +5806,37 @@ def test_tiff_write_129(): def test_tiff_write_130(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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) + 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) + 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') + 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') + 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) + 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) + 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') + ds = gdal.Open("tmp/byte_jpg_tablesmodezero.tif") assert ds.GetRasterBand(1).Checksum() == 4743 ds = None - os.unlink('tmp/byte_jpg_tablesmodezero.tif') + os.unlink("tmp/byte_jpg_tablesmodezero.tif") + ############################################################################### # Test LZMA compression @@ -4916,18 +5845,19 @@ def test_tiff_write_130(): def test_tiff_write_131(level=1): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LZMA') == -1: + 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)]) + 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: + if gdal.GetLastErrorMsg().find("cannot allocate memory") >= 0: gdal.Unlink(filename) pytest.skip() @@ -4950,36 +5880,39 @@ def test_tiff_write_132(): for i in range(2): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_132.tif', 1, 1) + 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 = 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 + 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) + ds = gdal.Open("/vsimem/tiff_write_132.tif", gdal.GA_Update) if i == 0: - ds.SetMetadataItem('FOO', 'BAZ') - ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAZ') + ds.SetMetadataItem("FOO", "BAZ") + ds.GetRasterBand(1).SetMetadataItem("FOO", "BAZ") else: - ds.SetMetadata({'FOO': 'BAZ'}) - ds.GetRasterBand(1).SetMetadata({'FOO': 'BAZ'}) + 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 + 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 = 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_132.tif") ############################################################################### @@ -4988,12 +5921,14 @@ def test_tiff_write_132(): 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 = 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') + srs.SetFromUserInput("EPSG:32601") src_ds.SetProjection(srs.ExportToWkt()) - src_ds.SetMetadataItem('FOO', 'BAR') + src_ds.SetMetadataItem("FOO", "BAR") src_ds.GetRasterBand(1).SetNoDataValue(127) src_ds.GetRasterBand(1).Fill(64) src_ds.GetRasterBand(2).Fill(127) @@ -5009,7 +5944,7 @@ def test_tiff_write_133(): gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() - ret = src_ds.SetMetadataItem('FOO', 'BAZ') + ret = src_ds.SetMetadataItem("FOO", "BAZ") gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() @@ -5017,7 +5952,7 @@ def test_tiff_write_133(): gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() - ret = src_ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAZ') + ret = src_ds.GetRasterBand(1).SetMetadataItem("FOO", "BAZ") gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() @@ -5030,16 +5965,20 @@ def test_tiff_write_133(): 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 = 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 + 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 + assert ds.GetMetadataItem("FOO") == "BAR" + assert ds.GetMetadataItem("UNORDERED_BLOCKS", "TIFF") is None with gdaltest.SetCacheMax(0): for y in range(1000): @@ -5053,19 +5992,23 @@ def test_tiff_write_133(): gdal.PopErrorHandler() assert got_data is None ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') + 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 = 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 + 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 + 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)): @@ -5082,16 +6025,20 @@ def test_tiff_write_133(): assert got_data is not None ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') + 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 = 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 + 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): @@ -5099,18 +6046,22 @@ def test_tiff_write_133(): 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') + 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']) + 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 + 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): @@ -5118,61 +6069,73 @@ def test_tiff_write_133(): assert got_data is not None ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') + 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']) + 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']) + 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']) + 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.SetConfigOption("TIFF_READ_STREAMING", "YES") gdal.PushErrorHandler() - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") gdal.PopErrorHandler() - gdal.SetConfigOption('TIFF_READ_STREAMING', None) + 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']) + 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.SetConfigOption("TIFF_READ_STREAMING", "YES") gdal.PushErrorHandler() - ds = gdal.Open('/vsimem/tiff_write_133.tif') + ds = gdal.Open("/vsimem/tiff_write_133.tif") gdal.PopErrorHandler() - gdal.SetConfigOption('TIFF_READ_STREAMING', None) + 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']) + 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.WriteRaster(0, 1000 - y - 1, 1024, 1, "a" * (3 * 1024)) ds.FlushCache() ds = None - gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') + gdal.SetConfigOption("TIFF_READ_STREAMING", "YES") gdal.PushErrorHandler() - ds = gdal.Open('/vsimem/tiff_write_133.tif') + ds = gdal.Open("/vsimem/tiff_write_133.tif") gdal.PopErrorHandler() - gdal.SetConfigOption('TIFF_READ_STREAMING', None) - assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') == 'YES' + gdal.SetConfigOption("TIFF_READ_STREAMING", None) + assert ds.GetMetadataItem("UNORDERED_BLOCKS", "TIFF") == "YES" with gdaltest.SetCacheMax(0): for y in range(1000): @@ -5180,26 +6143,39 @@ def test_tiff_write_133(): 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']) + 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)) + ret = ds.WriteRaster(0, 999, 1024, 1, "a" * (3 * 1024)) ds.FlushCache() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + 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']) + 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)) + ret = ds.WriteRaster(256, 256, 256, 256, "a" * (3 * 256 * 256)) ds.FlushCache() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_133.tif") + ############################################################################### # Test DISCARD_LSB @@ -5207,82 +6183,144 @@ def test_tiff_write_133(): def test_tiff_write_134(): - for interleave in ['BAND', 'PIXEL']: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 3, options=['DISCARD_LSB=0,1,3', 'INTERLEAVE='+interleave]) + for interleave in ["BAND", "PIXEL"]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 3, + options=["DISCARD_LSB=0,1,3", "INTERLEAVE=" + interleave], + ) 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') - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster())[0] - val2 = struct.unpack('B', ds.GetRasterBand(2).ReadRaster())[0] - val3 = struct.unpack('B', ds.GetRasterBand(3).ReadRaster())[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack("B", ds.GetRasterBand(1).ReadRaster())[0] + val2 = struct.unpack("B", ds.GetRasterBand(2).ReadRaster())[0] + val3 = struct.unpack("B", ds.GetRasterBand(3).ReadRaster())[0] assert val1 == 127 and val2 == 126 and val3 == 128 ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + 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 = 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(255) - 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') - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster())[0] - val2 = struct.unpack('B', ds.GetRasterBand(2).ReadRaster())[0] - val3 = struct.unpack('B', ds.GetRasterBand(3).ReadRaster())[0] + 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") + val1 = struct.unpack("B", ds.GetRasterBand(1).ReadRaster())[0] + val2 = struct.unpack("B", ds.GetRasterBand(2).ReadRaster())[0] + val3 = struct.unpack("B", ds.GetRasterBand(3).ReadRaster())[0] assert val1 == 127 and val2 == 126 and val3 == 255 ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134_src.tif') - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') - - for (inval, expected_val) in [(0, 0), (1, 0), (2, 0), (3, 0), (4, 8), (254, 255), (255, 255)]: - for interleave in ['BAND', 'PIXEL']: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, gdal.GDT_Byte, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134_src.tif") + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") + + for (inval, expected_val) in [ + (0, 0), + (1, 0), + (2, 0), + (3, 0), + (4, 8), + (254, 255), + (255, 255), + ]: + for interleave in ["BAND", "PIXEL"]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + gdal.GDT_Byte, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).Fill(inval) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster())[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack("B", ds.GetRasterBand(1).ReadRaster())[0] assert val1 == expected_val, (inval, expected_val) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') - - for (inval, expected_val) in [(-32768, -32768), - (-32767,-32768), - (-32764,-32768), - (-8, -8), - (-1, -8), # this truncation is questionable - (0, 0), - (1,0), - (3, 0), - (4,8), - (8,8), - (32766,32760), - (32767, 32760)]: - for interleave in ['BAND', 'PIXEL']: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, gdal.GDT_Int16, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") + + for (inval, expected_val) in [ + (-32768, -32768), + (-32767, -32768), + (-32764, -32768), + (-8, -8), + (-1, -8), # this truncation is questionable + (0, 0), + (1, 0), + (3, 0), + (4, 8), + (8, 8), + (32766, 32760), + (32767, 32760), + ]: + for interleave in ["BAND", "PIXEL"]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + gdal.GDT_Int16, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).Fill(inval) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('h', ds.GetRasterBand(1).ReadRaster())[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack("h", ds.GetRasterBand(1).ReadRaster())[0] assert val1 == expected_val, (inval, expected_val) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') - - for (inval, expected_val) in [(0,0), (1,0), (3, 0), (4,8), (8,8), (65534,65528), (65535,65528)]: - for interleave in ['BAND', 'PIXEL']: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, gdal.GDT_UInt16, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") + + for (inval, expected_val) in [ + (0, 0), + (1, 0), + (3, 0), + (4, 8), + (8, 8), + (65534, 65528), + (65535, 65528), + ]: + for interleave in ["BAND", "PIXEL"]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + gdal.GDT_UInt16, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).Fill(inval) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('H', ds.GetRasterBand(1).ReadRaster())[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack("H", ds.GetRasterBand(1).ReadRaster())[0] assert val1 == expected_val, (inval, expected_val) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') - - for interleave in ['BAND', 'PIXEL']: - for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 3, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") + + for interleave in ["BAND", "PIXEL"]: + for dt in [ + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + ]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 3, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) if dt == gdal.GDT_Int16: ds.GetRasterBand(1).Fill(-127) else: @@ -5290,109 +6328,203 @@ def test_tiff_write_134(): ds.GetRasterBand(2).Fill(123) ds.GetRasterBand(3).Fill(127) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('h', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Int16))[0] - val2 = struct.unpack('h', ds.GetRasterBand(2).ReadRaster(0,0,1,1,1,1,gdal.GDT_Int16))[0] - val3 = struct.unpack('h', ds.GetRasterBand(3).ReadRaster(0,0,1,1,1,1,gdal.GDT_Int16))[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack( + "h", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Int16) + )[0] + val2 = struct.unpack( + "h", ds.GetRasterBand(2).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Int16) + )[0] + val3 = struct.unpack( + "h", ds.GetRasterBand(3).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Int16) + )[0] if dt in (gdal.GDT_Float32, gdal.GDT_Float64): - assert val1 == 127 and val2 == 123 and val3 == 127, (interleave, dt, (val1, val2, val3)) + assert val1 == 127 and val2 == 123 and val3 == 127, ( + interleave, + dt, + (val1, val2, val3), + ) elif dt == gdal.GDT_Int16: - assert val1 == -128 and val2 == 120 and val3 == 128, (interleave, dt, (val1, val2, val3)) + assert val1 == -128 and val2 == 120 and val3 == 128, ( + interleave, + dt, + (val1, val2, val3), + ) else: - assert val1 == 128 and val2 == 120 and val3 == 128, (interleave, dt, (val1, val2, val3)) + assert val1 == 128 and val2 == 120 and val3 == 128, ( + interleave, + dt, + (val1, val2, val3), + ) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Test with nodata - for interleave in ['BAND', 'PIXEL']: - for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + for interleave in ["BAND", "PIXEL"]: + for dt in [ + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + ]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).SetNoDataValue(127) ds.GetRasterBand(1).Fill(127) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Byte))[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack( + "B", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Byte) + )[0] assert val1 == 127, (interleave, dt, val1) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Test with nodata and discarding non-nodata value would result to nodata without correction - for interleave in ['BAND', 'PIXEL']: - for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + for interleave in ["BAND", "PIXEL"]: + for dt in [ + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + ]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).SetNoDataValue(0) ds.GetRasterBand(1).Fill(1) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Byte))[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack( + "B", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Byte) + )[0] if dt in (gdal.GDT_Float32, gdal.GDT_Float64): assert val1 == 1, (interleave, dt, val1) else: assert val1 == 8, (interleave, dt, val1) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Test with nodata out of range for integer values - for interleave in ['BAND', 'PIXEL']: - for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + for interleave in ["BAND", "PIXEL"]: + for dt in [ + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + ]: + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).SetNoDataValue(127.5) ds.GetRasterBand(1).Fill(127) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') + ds = gdal.Open("/vsimem/tiff_write_134.tif") assert ds.GetRasterBand(1).GetNoDataValue() == 127.5 - val1 = struct.unpack('B', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Byte))[0] + val1 = struct.unpack( + "B", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Byte) + )[0] if dt in (gdal.GDT_Float32, gdal.GDT_Float64): assert val1 == 127, (interleave, dt, val1) else: assert val1 == 128, (interleave, dt, val1) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Test with some non-integer float value - for interleave in ['BAND', 'PIXEL']: + for interleave in ["BAND", "PIXEL"]: for dt in [gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) ds.GetRasterBand(1).Fill(-0.3) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('d', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Float64))[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack( + "d", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Float64) + )[0] assert val1 != -0.3 and abs(val1 - -0.3) < 1e-5, dt ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Test with nan - for interleave in ['BAND', 'PIXEL']: + for interleave in ["BAND", "PIXEL"]: for dt in [gdal.GDT_Float32, gdal.GDT_Float64]: - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 2, dt, options=['DISCARD_LSB=3', 'INTERLEAVE='+interleave]) - ds.GetRasterBand(1).Fill(float('nan')) + ds = gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + 2, + dt, + options=["DISCARD_LSB=3", "INTERLEAVE=" + interleave], + ) + ds.GetRasterBand(1).Fill(float("nan")) ds = None - ds = gdal.Open('/vsimem/tiff_write_134.tif') - val1 = struct.unpack('f', ds.GetRasterBand(1).ReadRaster(0,0,1,1,1,1,gdal.GDT_Float32))[0] + ds = gdal.Open("/vsimem/tiff_write_134.tif") + val1 = struct.unpack( + "f", ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1, 1, 1, gdal.GDT_Float32) + )[0] assert math.isnan(val1) ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_134.tif") # Error cases gdal.ErrorReset() with gdaltest.error_handler(): - gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, - options=['DISCARD_LSB=1', 'PHOTOMETRIC=PALETTE']) - assert gdal.GetLastErrorMsg() != '' + gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", + 1, + 1, + options=["DISCARD_LSB=1", "PHOTOMETRIC=PALETTE"], + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): # Too many elements - gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, - options=['DISCARD_LSB=1,2']) - assert gdal.GetLastErrorMsg() != '' + gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", 1, 1, options=["DISCARD_LSB=1,2"] + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): # Too many elements - gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, - options=['DISCARD_LSB=1', 'NBITS=7']) - assert gdal.GetLastErrorMsg() != '' + gdaltest.tiff_drv.Create( + "/vsimem/tiff_write_134.tif", 1, 1, options=["DISCARD_LSB=1", "NBITS=7"] + ) + assert gdal.GetLastErrorMsg() != "" + ############################################################################### # Test clearing GCPs (#5945) @@ -5401,54 +6533,55 @@ def test_tiff_write_134(): 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) + 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 = gdal.Open("/vsimem/tiff_write_135.tif", gdal.GA_Update) + ds.SetGCPs([], "") ds = None - ds = gdal.Open('/vsimem/tiff_write_135.tif') + ds = gdal.Open("/vsimem/tiff_write_135.tif") assert not ds.GetGCPs() - assert ds.GetGCPProjection() == '' + 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) + 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 = gdal.Open("/vsimem/tiff_write_135.tif", gdal.GA_Update) + ds.SetGCPs([], "") + ds.SetGCPs([], "") ds = None - ds = gdal.Open('/vsimem/tiff_write_135.tif') + ds = gdal.Open("/vsimem/tiff_write_135.tif") assert not ds.GetGCPs() - assert ds.GetGCPProjection() == '' + 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) + 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 = 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') + srs.SetFromUserInput("EPSG:32601") ds.SetProjection(srs.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/tiff_write_135.tif') + 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 + assert ds.GetProjectionRef().find("32601") >= 0 ds = None - gdal.Unlink('/vsimem/tiff_write_135.tif') + gdal.Unlink("/vsimem/tiff_write_135.tif") + ############################################################################### # Test writing a single-strip mono-bit dataset @@ -5456,19 +6589,24 @@ def test_tiff_write_135(): def test_tiff_write_136(): - src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_136_src.tif', 8, 2001) + 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']) + 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') + 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') + 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 @@ -5476,66 +6614,88 @@ def test_tiff_write_136(): def test_tiff_write_137(): - src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_137_src.tif', 4000, 4000) + 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']) + 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') + 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 = 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') + 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 = 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') + 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 = 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' + 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') + 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 = 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') + 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') + gdal.Unlink("/vsimem/tiff_write_137.tif") + ############################################################################### # Test that pixel-interleaved writing generates optimal size @@ -5545,42 +6705,46 @@ 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 = 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).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).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 + 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 = 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) + 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 = 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 + 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') + gdal.Unlink("/vsimem/tiff_write_138.tif") + gdal.Unlink("/vsimem/tiff_write_138_saturate.tif") + ############################################################################### # Test that pixel-interleaved writing generates optimal size @@ -5588,100 +6752,130 @@ def test_tiff_write_138(): def test_tiff_write_139(): - drv = gdal.GetDriverByName('GTiff') + 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' + 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) + 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') + 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') + gdal.Unlink("/vsimem/tiff_write_139.tif") # Int16 - for endianness in ['NATIVE', 'INVERTED']: + for endianness in ["NATIVE", "INVERTED"]: - if endianness == 'INVERTED' and not has_inverted_swab_fix: + 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 = 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') + 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)) + pytest.fail(struct.unpack("h" * 6, content)) ds = None - gdal.Unlink('/vsimem/tiff_write_139.tif') + gdal.Unlink("/vsimem/tiff_write_139.tif") # UInt16 (same code path) - for endianness in ['NATIVE', 'INVERTED']: + for endianness in ["NATIVE", "INVERTED"]: - if endianness == 'INVERTED' and not has_inverted_swab_fix: + 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 = 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') + 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)) + pytest.fail(struct.unpack("H" * 6, content)) ds = None - gdal.Unlink('/vsimem/tiff_write_139.tif') + gdal.Unlink("/vsimem/tiff_write_139.tif") # Int32 - for endianness in ['NATIVE', 'INVERTED']: + for endianness in ["NATIVE", "INVERTED"]: - if endianness == 'INVERTED' and not has_inverted_swab_fix: + 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 = 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') + 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)) + pytest.fail(struct.unpack("I" * 6, content)) ds = None - gdal.Unlink('/vsimem/tiff_write_139.tif') + 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 = 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') + ds = gdal.Open("/vsimem/tiff_write_139.tif") content = ds.GetRasterBand(1).ReadRaster() - assert ref_content == content, struct.unpack('d' * 4, content) + assert ref_content == content, struct.unpack("d" * 4, content) ds = None - gdal.Unlink('/vsimem/tiff_write_139.tif') + gdal.Unlink("/vsimem/tiff_write_139.tif") + ############################################################################### # Test setting a band to alpha @@ -5690,49 +6884,61 @@ def test_tiff_write_139(): 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 = 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') + 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 = 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 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') + 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']) + 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 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_140.tif") + ############################################################################### # Test GEOTIFF_KEYS_FLAVOR=ESRI_PE with EPSG:3857 @@ -5740,13 +6946,15 @@ def test_tiff_write_140(): def test_tiff_write_141(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_141.tif', 1, 1, options=['GEOTIFF_KEYS_FLAVOR=ESRI_PE']) + 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') + ds = gdal.Open("/vsimem/tiff_write_141.tif") wkt = ds.GetProjectionRef() ds = None @@ -5754,35 +6962,37 @@ def test_tiff_write_141(): assert 'EXTENSION["PROJ4"' in wkt - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_141.tif') + 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 = 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 = 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') + ds = gdal.Open("/vsimem/tiff_write_142_2.tif") gt = ds.GetGeoTransform() - md = ds.GetMetadataItem('AREA_OR_POINT') + 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') + 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 gt == gt_expected, "did not get expected geotransform" + + assert md == "Point", "did not get expected AREA_OR_POINT value" - assert md == 'Point', 'did not get expected AREA_OR_POINT value' ############################################################################### # Check that we detect that free space isn't sufficient @@ -5791,9 +7001,12 @@ def test_tiff_write_142(): def test_tiff_write_143(): with gdaltest.error_handler(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_143.tif', 1000000000, 1000000000) + 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) @@ -5802,85 +7015,142 @@ def test_tiff_write_144(): # 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'): + 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 = 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 = open("tmp/tiff_write_144.tif", "rb+") f.seek(4294967296, 0) - f.write(' '.encode('ascii')) + f.write(" ".encode("ascii")) f.close() - ds = gdal.Open('tmp/tiff_write_144.tif', gdal.GA_Update) - ds.BuildOverviews('NEAR', [2]) + 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') + 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') + 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}, - ] + 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) + 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' + filename = "tmp/tiff_write_145.tif" else: - filename = '/vsimem/tiff_write_145.tif' - creation_options = options.get('creation_options', []) + 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): + 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): + 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') + pytest.fail("got failure, but did not expect it") ds = None # print(gdal.GetLastErrorMsg()) - if gdal.GetLastErrorMsg() == '': + if gdal.GetLastErrorMsg() == "": print(options) - pytest.fail('did not get any warning/error') + pytest.fail("did not get any warning/error") gdal.Unlink(filename) @@ -5892,21 +7162,33 @@ def test_tiff_write_145(): def test_tiff_write_146(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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)] + 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') + 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 original_stats[i][j] == pytest.approx(got_stats[i][j], abs=5), \ - 'did not get expected statistics' + assert ( + i == 2 + or j < 2 + or original_stats[i][j] == pytest.approx(got_stats[i][j], abs=5) + ), "did not get expected statistics" ############################################################################### @@ -5917,18 +7199,23 @@ def test_tiff_write_146(): def test_tiff_write_147(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + 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/jpeg/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' + gdal.SetConfigOption("GDAL_JPEG_TO_RGB", "NO") + gdal.SetConfigOption("GDAL_PAM_ENABLED", "NO") + gdal.Translate( + "/vsimem/tiff_write_147.tif", + "../gdrivers/data/jpeg/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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_write_147.tif") + ############################################################################### # Test that we can use implicit JPEG-in-TIFF overviews with CMYK in raw mode @@ -5937,27 +7224,37 @@ def test_tiff_write_147(): def test_tiff_write_148(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') - tmp_ds = gdal.Translate('', '../gdrivers/data/jpeg/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/jpeg/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)] + gdal.SetConfigOption("GDAL_JPEG_TO_RGB", "NO") + tmp_ds = gdal.Translate("", "../gdrivers/data/jpeg/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/jpeg/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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tiff_write_148.tif") for i in range(4): for j in range(4): - assert j < 2 or original_stats[i][j] == pytest.approx(got_stats[i][j], abs=5), \ - 'did not get expected statistics' + assert j < 2 or original_stats[i][j] == pytest.approx( + got_stats[i][j], abs=5 + ), "did not get expected statistics" ############################################################################### @@ -5967,48 +7264,89 @@ def test_tiff_write_148(): def test_tiff_write_149(): # Power-of-two bit depth - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_149.tif', 1, 1) + 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') + 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') + 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 = 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') + 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') + 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 = 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') + 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') + 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 = 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_149.tif") + ############################################################################### # Test failure when loading block from disk in IWriteBlock() @@ -6016,15 +7354,16 @@ def test_tiff_write_149(): 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) + 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() != '' + assert gdal.GetLastErrorMsg() != "" ds = None - gdaltest.tiff_drv.Delete('tmp/tiled_bad_offset.tif') + gdaltest.tiff_drv.Delete("tmp/tiled_bad_offset.tif") + ############################################################################### # Test IWriteBlock() with more than 10 bands @@ -6032,22 +7371,23 @@ def test_tiff_write_150(): def test_tiff_write_151(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_151.tif', 1, 1, 11) + 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 = 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 = 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_151.tif") + ############################################################################### # Test flushing of blocks in a contig multi band file with Create() @@ -6055,15 +7395,18 @@ def test_tiff_write_151(): def test_tiff_write_152(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_152.tif', 1, 1, 2, options=['NBITS=2']) + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_152.tif") + ############################################################################### # Test that empty blocks are created in a filesystem sparse way @@ -6071,154 +7414,195 @@ def test_tiff_write_152(): def test_tiff_write_153(): - target_dir = 'tmp' + target_dir = "tmp" if gdal.VSISupportsSparseFiles(target_dir) == 0: pytest.skip() - gdaltest.tiff_drv.Create(target_dir + '/tiff_write_153.tif', 500, 500) + gdaltest.tiff_drv.Create(target_dir + "/tiff_write_153.tif", 500, 500) - f = gdal.VSIFOpenL(target_dir + '/tiff_write_153.tif', 'rb') + 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') + 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(): - src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500) + src_ds = gdal.GetDriverByName("MEM").Create("", 500, 500) - ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['BLOCKYSIZE=256']) + 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 + 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']) + 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 # 461 is with libdeflate, 462 with zlib - assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size in (461, 462) + assert gdal.VSIStatL("/vsimem/tiff_write_154.tif").size in (461, 462) ds = None - assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size in (461, 462) - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') + assert gdal.VSIStatL("/vsimem/tiff_write_154.tif").size in (461, 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 = 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 + 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 = 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 + 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 = 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 + assert gdal.VSIStatL("/vsimem/tiff_write_154.tif").size == 250162 ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') + 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 = 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') + 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 = 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') + 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]: + 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'] + 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 + 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]: + 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'] + 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 = 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 = 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 + 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 = 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 + 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') + 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 = 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 = 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') + 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 = 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 + 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 = gdal.Open("/vsimem/tiff_write_155.tif") + assert ds.GetRasterBand(1).GetDescription() == "foo" ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_155.tif') + 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 = 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 + 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 = gdal.Open("/vsimem/tiff_write_155.tif") + assert ds.GetRasterBand(1).GetDescription() == "foo" ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_155.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_155.tif") + ############################################################################### # Test GetDataCoverageStatus() @@ -6226,8 +7610,13 @@ def test_tiff_write_155(): 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') + 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 @@ -6236,20 +7625,27 @@ def test_tiff_write_156(): 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 + 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') + 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 = 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_156.tif") + ############################################################################### # Test Float16 @@ -6258,39 +7654,57 @@ def test_tiff_write_156(): def test_tiff_write_157(): # 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+') + 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] + 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] @@ -6300,58 +7714,78 @@ def test_tiff_write_157(): pytest.fail(i) # Check that we properly decode&re-encode Float16 values - gdal.Translate('/vsimem/tiff_write_157_dst.tif', ds) + 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 = 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') + 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)) + 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') + 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 = 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()) + 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 in (4, 5, 6, 7): @@ -6360,18 +7794,23 @@ def test_tiff_write_157(): else: assert got[i] == pytest.approx(expected[i], abs=1e-15) - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_157.tif') + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_157.tif") + ############################################################################### # Test GetActualBlockSize() (perhaps not the best place for that...) @@ -6379,7 +7818,13 @@ def test_tiff_write_157(): 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']) + 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) @@ -6394,7 +7839,8 @@ def test_tiff_write_158(): assert res is None ds = None - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_158.tif') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_158.tif") + ############################################################################### # Test that COPY_SRC_OVERVIEWS creation option with JPEG compression @@ -6404,77 +7850,111 @@ def test_tiff_write_158(): def test_tiff_write_159(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - prev_table = '' - for options in [[], ['JPEG_QUALITY=50'], ['PHOTOMETRIC=YCBCR']]: + 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) + 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') + 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') + 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') + 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]) + 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') + 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') - + 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 = 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_160.tif") + ############################################################################### # Test setting GCPs on an image with already a geotransform and vice-versa (#6751) @@ -6482,18 +7962,18 @@ def test_tiff_write_160(): def test_tiff_write_161(): - ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_161.tif', 1, 1) + 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') + 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.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) + 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(): @@ -6502,12 +7982,13 @@ def test_tiff_write_161(): assert not ds.GetGCPs() ds = None - ds = gdal.Open('/vsimem/tiff_write_161.tif', gdal.GA_Update) + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_161.tif") + ############################################################################### # Test creating a JPEG compressed file with big tiles (#6757) @@ -6515,16 +7996,16 @@ def test_tiff_write_161(): def test_tiff_write_162(): - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 3) + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 512, 3) - options = ['TILED=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=512', 'COMPRESS=JPEG'] + options = ["TILED=YES", "BLOCKXSIZE=512", "BLOCKYSIZE=512", "COMPRESS=JPEG"] - gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_162.tif', src_ds, - options=options) + gdaltest.tiff_drv.CreateCopy("/vsimem/tiff_write_162.tif", src_ds, options=options) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" + + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_162.tif") - gdaltest.tiff_drv.Delete('/vsimem/tiff_write_162.tif') ############################################################################### # Test creating a file that would trigger strip chopping (#6924) @@ -6533,20 +8014,24 @@ def test_tiff_write_162(): 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') + 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') + 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') + gdaltest.tiff_drv.Delete("/vsimem/tiff_write_163.tif") + ############################################################################### # Test that we handle [0,1,0,0,0,1] geotransform as a regular geotransform @@ -6554,28 +8039,29 @@ def test_tiff_write_163(): def test_tiff_write_164(): - ds = gdaltest.tiff_drv.Create('/vsimem/test.tif', 1, 1) + 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') + 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 = 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') + 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') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### # Test the current behaviour of per-band nodata vs per-dataset serialization @@ -6583,13 +8069,13 @@ def test_tiff_write_164(): def test_tiff_write_165(): - ds = gdaltest.tiff_drv.Create('/vsimem/test.tif', 1, 1, 3) + 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 gdal.GetLastErrorMsg() != "", "warning expected, but not emitted" assert ret == 0 nd = ds.GetRasterBand(1).GetNoDataValue() @@ -6600,13 +8086,14 @@ def test_tiff_write_165(): ds = None - ds = gdal.Open('/vsimem/test.tif') + ds = gdal.Open("/vsimem/test.tif") nd = ds.GetRasterBand(1).GetNoDataValue() ds = None assert nd == 200 - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") + ############################################################################### # Test reading & writing Z dimension for ModelTiepointTag and ModelPixelScaleTag (#7093) @@ -6614,154 +8101,175 @@ def test_tiff_write_165(): def test_tiff_write_166(): - with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): - ds = gdal.Open('data/tiff_vertcs_scale_offset.tif') + 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') + 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') + 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') + 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') + 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']) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tiff_write_166.tif", 1, 1, options=["PROFILE=GEOTIFF"] + ) sr = osr.SpatialReference() - sr.SetFromUserInput('EPSG:26711+5773') + 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 + 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') + 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') + 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']) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tiff_write_166.tif", 1, 1, options=["PROFILE=GEOTIFF"] + ) sr = osr.SpatialReference() - sr.SetFromUserInput('EPSG:26711+5773') + 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 + 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') + 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') + 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']) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tiff_write_166.tif", 1, 1, options=["PROFILE=GEOTIFF"] + ) sr = osr.SpatialReference() - sr.SetFromUserInput('EPSG:26711+5773') + 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 + 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') + 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') + 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 + 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') + 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 = 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') + 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']) + 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']) + 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') + 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') + gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/out.tif", src_ds, options=["COMPRESS=INVALID"] + ) + assert gdal.GetLastErrorMsg() != "" + gdal.Unlink("/vsimem/out.tif") + ############################################################################### # Test ZSTD compression @@ -6770,13 +8278,15 @@ def test_tiff_write_170_invalid_compresion(): def test_tiff_write_171_zstd(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("ZSTD") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, - options=['COMPRESS=ZSTD', 'ZSTD_LEVEL=1']) + ut = gdaltest.GDALTest( + "GTiff", "byte.tif", 1, 4672, options=["COMPRESS=ZSTD", "ZSTD_LEVEL=1"] + ) return ut.testCreateCopy() + ############################################################################### # Test ZSTD compression with PREDICTOR = 2 @@ -6784,13 +8294,19 @@ def test_tiff_write_171_zstd(): def test_tiff_write_171_zstd_predictor(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: + 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']) + ut = gdaltest.GDALTest( + "GTiff", + "byte.tif", + 1, + 4672, + options=["COMPRESS=ZSTD", "ZSTD_LEVEL=1", "PREDICTOR=2"], + ) return ut.testCreateCopy() + ############################################################################### # Test WEBP compression @@ -6798,13 +8314,15 @@ def test_tiff_write_171_zstd_predictor(): def test_tiff_write_webp(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("WEBP") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'md_ge_rgb_0010000.tif', 0, None, - options=['COMPRESS=WEBP']) + ut = gdaltest.GDALTest( + "GTiff", "md_ge_rgb_0010000.tif", 0, None, options=["COMPRESS=WEBP"] + ) return ut.testCreateCopy() + ############################################################################### # Test WEBP compression with internal tiling @@ -6812,24 +8330,24 @@ def test_tiff_write_webp(): def test_tiff_write_tiled_webp(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("WEBP") == -1: pytest.skip() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP_LOSSLESS') == -1: + 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']) + 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)] + 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') + gdal.Unlink("data/md_ge_rgb_0010000.tif.aux.xml") + ############################################################################### # Test WEBP compression with huge single strip @@ -6838,27 +8356,30 @@ def test_tiff_write_tiled_webp(): def test_tiff_write_webp_huge_single_strip(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: + 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']) + 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)] + 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 original_stats[i][j] == pytest.approx(got_stats[i][j], abs=1e-1 * abs(original_stats[i][j])), \ - 'did not get expected statistics' + assert original_stats[i][j] == pytest.approx( + got_stats[i][j], abs=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') + gdal.Unlink("data/tif_webp_huge_single_strip.tif.aux.xml") ############################################################################### @@ -6867,25 +8388,26 @@ def test_tiff_write_webp_huge_single_strip(): 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') + 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() + 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() + 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 @@ -6893,13 +8415,13 @@ def test_tiff_write_172_geometadata_tiff_rsid(): def test_tiff_write_173_lerc(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, - options=['COMPRESS=LERC']) + ut = gdaltest.GDALTest("GTiff", "byte.tif", 1, 4672, options=["COMPRESS=LERC"]) return ut.testCreateCopy() + ############################################################################### # Test LERC_DEFLATE compression @@ -6907,13 +8429,15 @@ def test_tiff_write_173_lerc(): def test_tiff_write_174_lerc_deflate(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC_DEFLATE') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC_DEFLATE") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, - options=['COMPRESS=LERC_DEFLATE']) + ut = gdaltest.GDALTest( + "GTiff", "byte.tif", 1, 4672, options=["COMPRESS=LERC_DEFLATE"] + ) return ut.testCreateCopy() + ############################################################################### # Test LERC_DEFLATE compression @@ -6921,13 +8445,15 @@ def test_tiff_write_174_lerc_deflate(): def test_tiff_write_174_lerc_deflate_with_level(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC_DEFLATE') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC_DEFLATE") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, - options=['COMPRESS=LERC_DEFLATE', 'ZLEVEL=1']) + ut = gdaltest.GDALTest( + "GTiff", "byte.tif", 1, 4672, options=["COMPRESS=LERC_DEFLATE", "ZLEVEL=1"] + ) return ut.testCreateCopy() + ############################################################################### # Test LERC_ZSTD compression @@ -6935,13 +8461,13 @@ def test_tiff_write_174_lerc_deflate_with_level(): def test_tiff_write_175_lerc_zstd(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC_ZSTD') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC_ZSTD") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, - options=['COMPRESS=LERC_ZSTD']) + ut = gdaltest.GDALTest("GTiff", "byte.tif", 1, 4672, options=["COMPRESS=LERC_ZSTD"]) return ut.testCreateCopy() + ############################################################################### # Test LERC_ZSTD compression @@ -6949,13 +8475,15 @@ def test_tiff_write_175_lerc_zstd(): def test_tiff_write_175_lerc_zstd_with_level(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC_ZSTD') == -1: + 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']) + 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 @@ -6963,13 +8491,15 @@ def test_tiff_write_175_lerc_zstd_with_level(): def test_tiff_write_176_lerc_max_z_error(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4529, - options=['COMPRESS=LERC', 'MAX_Z_ERROR=1']) + 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 @@ -6977,18 +8507,22 @@ def test_tiff_write_176_lerc_max_z_error(): def test_tiff_write_177_lerc_several_bands_tiling(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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']) + 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)] + 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 @@ -6996,18 +8530,20 @@ def test_tiff_write_177_lerc_several_bands_tiling(): def test_tiff_write_178_lerc_with_alpha(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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']) + 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)] + 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 @@ -7015,18 +8551,22 @@ def test_tiff_write_178_lerc_with_alpha(): def test_tiff_write_178_lerc_with_alpha_0_and_255(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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']) + 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)] + 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 @@ -7034,14 +8574,21 @@ def test_tiff_write_178_lerc_with_alpha_0_and_255(): def test_tiff_write_179_lerc_data_types(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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']) + 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 @@ -7049,9 +8596,10 @@ def test_tiff_write_179_lerc_data_types(): 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.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() @@ -7061,10 +8609,11 @@ def test_tiff_write_179_lerc_data_types(): gdal.ErrorReset() with gdaltest.error_handler(): - gdal.Translate(filename, 'data/cfloat32.tif', creationOptions=['COMPRESS=LERC']) - assert gdal.GetLastErrorMsg() != '' + gdal.Translate(filename, "data/cfloat32.tif", creationOptions=["COMPRESS=LERC"]) + assert gdal.GetLastErrorMsg() != "" gdal.Unlink(filename) + ############################################################################### # Test LERC compression with several bands and separate @@ -7072,14 +8621,17 @@ def test_tiff_write_179_lerc_data_types(): def test_tiff_write_180_lerc_separate(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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']) + 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)] + cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] ds = None gdal.Unlink(filename) assert cs == [30111, 32302, 40026] @@ -7089,24 +8641,34 @@ def test_tiff_write_180_lerc_separate(): # Test MAX_Z_ERROR_OVERVIEW effect while creating overviews # on a newly created dataset -@pytest.mark.parametrize("external_ovr,compression", [(True, 'LERC_ZSTD'), - (False, 'LERC_ZSTD'), - (True, 'LERC_DEFLATE'), - (False, 'LERC_DEFLATE')]) + +@pytest.mark.parametrize( + "external_ovr,compression", + [ + (True, "LERC_ZSTD"), + (False, "LERC_ZSTD"), + (True, "LERC_DEFLATE"), + (False, "LERC_DEFLATE"), + ], +) def test_tiff_write_lerc_overview(external_ovr, compression): md = gdaltest.tiff_drv.GetMetadata() - if compression not in md['DMD_CREATIONOPTIONLIST']: + if compression not in md["DMD_CREATIONOPTIONLIST"]: pytest.skip() checksums = {} - errors = [0,10,10] - src_ds = gdal.Open('../gdrivers/data/utm.tif') + errors = [0, 10, 10] + src_ds = gdal.Open("../gdrivers/data/utm.tif") for i, error in enumerate(errors): - fname = '/vsimem/test_tiff_write_lerc_overview_%d' % i - - ds = gdal.GetDriverByName('GTiff').Create(fname, 256, 256, 1, - options=['COMPRESS=' + compression, - 'MAX_Z_ERROR=%f' % error]) + fname = "/vsimem/test_tiff_write_lerc_overview_%d" % i + + ds = gdal.GetDriverByName("GTiff").Create( + fname, + 256, + 256, + 1, + options=["COMPRESS=" + compression, "MAX_Z_ERROR=%f" % error], + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 256, 256) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) if i == 2: @@ -7115,18 +8677,26 @@ def test_tiff_write_lerc_overview(external_ovr, compression): if external_ovr: ds = None ds = gdal.Open(fname) - options['COMPRESS_OVERVIEW'] = compression - options['MAX_Z_ERROR_OVERVIEW'] = '%d' % error + options["COMPRESS_OVERVIEW"] = compression + options["MAX_Z_ERROR_OVERVIEW"] = "%d" % error with gdaltest.config_options(options): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) ds = None ds = gdal.Open(fname) - assert ds.GetRasterBand(1).GetOverview(0).GetDataset().GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == compression - checksums[i] = [ ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(1).GetOverview(0).Checksum(), - ds.GetRasterBand(1).GetOverview(1).Checksum() ] + assert ( + ds.GetRasterBand(1) + .GetOverview(0) + .GetDataset() + .GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") + == compression + ) + checksums[i] = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(1).GetOverview(0).Checksum(), + ds.GetRasterBand(1).GetOverview(1).Checksum(), + ] ds = None gdaltest.tiff_drv.Delete(fname) @@ -7142,113 +8712,121 @@ def test_tiff_write_lerc_overview(external_ovr, compression): assert checksums[1][1] != checksums[2][1] assert checksums[1][2] != checksums[2][2] + ############################################################################### # Test ZLEVEL_OVERVIEW effect while creating overviews # on a newly created dataset + @pytest.mark.parametrize("external_ovr", [True, False]) def test_tiff_write_lerc_zlevel(external_ovr): md = gdaltest.tiff_drv.GetMetadata() - if 'LERC_DEFLATE' not in md['DMD_CREATIONOPTIONLIST']: + if "LERC_DEFLATE" not in md["DMD_CREATIONOPTIONLIST"]: pytest.skip() filesize = {} - src_ds = gdal.Open('../gdrivers/data/utm.tif') - for level in (1,9): - fname = '/vsimem/test_tiff_write_lerc_zlevel_%d' % level - ds = gdal.GetDriverByName('GTiff').Create(fname, 256, 256, 1, - options=['COMPRESS=LERC_DEFLATE']) + src_ds = gdal.Open("../gdrivers/data/utm.tif") + for level in (1, 9): + fname = "/vsimem/test_tiff_write_lerc_zlevel_%d" % level + ds = gdal.GetDriverByName("GTiff").Create( + fname, 256, 256, 1, options=["COMPRESS=LERC_DEFLATE"] + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 256, 256) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) - options = { 'MAX_Z_ERROR_OVERVIEW' : '10' } + options = {"MAX_Z_ERROR_OVERVIEW": "10"} if external_ovr: ds = None ds = gdal.Open(fname) - options['COMPRESS_OVERVIEW'] = 'LERC_DEFLATE' - options['ZLEVEL_OVERVIEW'] = '%d' % level + options["COMPRESS_OVERVIEW"] = "LERC_DEFLATE" + options["ZLEVEL_OVERVIEW"] = "%d" % level with gdaltest.config_options(options): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) ds = None if external_ovr: - filesize[level] = gdal.VSIStatL(fname + '.ovr').size + filesize[level] = gdal.VSIStatL(fname + ".ovr").size else: filesize[level] = gdal.VSIStatL(fname).size gdaltest.tiff_drv.Delete(fname) assert filesize[1] > filesize[9] + ############################################################################### # Test ZSTD_LEVEL_OVERVIEW effect while creating overviews # on a newly created dataset + @pytest.mark.parametrize("external_ovr", [True, False]) def test_tiff_write_lerc_zstd_level(external_ovr): md = gdaltest.tiff_drv.GetMetadata() - if 'LERC_ZSTD' not in md['DMD_CREATIONOPTIONLIST']: + if "LERC_ZSTD" not in md["DMD_CREATIONOPTIONLIST"]: pytest.skip() filesize = {} - src_ds = gdal.Open('../gdrivers/data/utm.tif') - for level in (1,22): - fname = '/vsimem/test_tiff_write_lerc_zstd_level_%d' % level - ds = gdal.GetDriverByName('GTiff').Create(fname, 256, 256, 1, - options=['COMPRESS=LERC_ZSTD']) + src_ds = gdal.Open("../gdrivers/data/utm.tif") + for level in (1, 22): + fname = "/vsimem/test_tiff_write_lerc_zstd_level_%d" % level + ds = gdal.GetDriverByName("GTiff").Create( + fname, 256, 256, 1, options=["COMPRESS=LERC_ZSTD"] + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 256, 256) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) - options = { 'MAX_Z_ERROR_OVERVIEW' : '10' } + options = {"MAX_Z_ERROR_OVERVIEW": "10"} if external_ovr: ds = None ds = gdal.Open(fname) - options['COMPRESS_OVERVIEW'] = 'LERC_ZSTD' - options['ZSTD_LEVEL_OVERVIEW'] = '%d' % level + options["COMPRESS_OVERVIEW"] = "LERC_ZSTD" + options["ZSTD_LEVEL_OVERVIEW"] = "%d" % level with gdaltest.config_options(options): - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) ds = None if external_ovr: - filesize[level] = gdal.VSIStatL(fname + '.ovr').size + filesize[level] = gdal.VSIStatL(fname + ".ovr").size else: filesize[level] = gdal.VSIStatL(fname).size gdaltest.tiff_drv.Delete(fname) assert filesize[1] > filesize[22] + ############################################################################### # Test set XMP metadata def test_tiff_write_181_xmp(): - src_ds = gdal.Open('data/utmsmall.tif') + src_ds = gdal.Open("data/utmsmall.tif") - new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_181.tif', src_ds) + new_ds = gdaltest.tiff_drv.CreateCopy("tmp/test_181.tif", src_ds) src_ds = None - xmp_ds = gdal.Open('../gdrivers/data/gtiff/byte_with_xmp.tif') - xmp = xmp_ds.GetMetadata('xml:XMP') + xmp_ds = gdal.Open("../gdrivers/data/gtiff/byte_with_xmp.tif") + xmp = xmp_ds.GetMetadata("xml:XMP") xmp_ds = None - assert 'W5M0MpCehiHzreSzNTczkc9d' in xmp[0], 'Wrong input file without XMP' + assert "W5M0MpCehiHzreSzNTczkc9d" in xmp[0], "Wrong input file without XMP" - new_ds.SetMetadata(xmp, 'xml: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 = 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') + gdaltest.tiff_drv.Delete("tmp/test_181.tif") def test_tiff_write_181_xmp_copy(): - src_ds = gdal.Open('../gdrivers/data/gtiff/byte_with_xmp.tif') + src_ds = gdal.Open("../gdrivers/data/gtiff/byte_with_xmp.tif") - filename = 'tmp/test_181_copy.tif' + filename = "tmp/test_181_copy.tif" new_ds = gdaltest.tiff_drv.CreateCopy(filename, src_ds) assert new_ds is not None src_ds = None @@ -7256,11 +8834,13 @@ def test_tiff_write_181_xmp_copy(): new_ds = None new_ds = gdal.Open(filename) - assert int(new_ds.GetRasterBand(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) == 8, 'TIFF directory not at the beginning' + assert ( + int(new_ds.GetRasterBand(1).GetMetadataItem("IFD_OFFSET", "TIFF")) == 8 + ), "TIFF directory not at the beginning" - xmp = new_ds.GetMetadata('xml:XMP') + xmp = new_ds.GetMetadata("xml:XMP") new_ds = None - assert 'W5M0MpCehiHzreSzNTczkc9d' in xmp[0], 'Wrong input file without XMP' + assert "W5M0MpCehiHzreSzNTczkc9d" in xmp[0], "Wrong input file without XMP" gdaltest.tiff_drv.Delete(filename) @@ -7271,62 +8851,68 @@ def test_tiff_write_181_xmp_copy(): def test_tiff_write_182_xmp_delete(): - shutil.copyfile('../gdrivers/data/gtiff/byte_with_xmp.tif', 'tmp/test_182.tif') + shutil.copyfile("../gdrivers/data/gtiff/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 = 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 = 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') + 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']) + 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) + 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']) + 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) + 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 @@ -7335,16 +8921,16 @@ def test_tiff_write_184_create_append_subdataset(): def test_tiff_write_185_lerc_create_and_overview(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + 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()) + 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.BuildOverviews("NEAR", [2]) + assert gdal.GetLastErrorMsg() == "" ds = None ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() @@ -7352,9 +8938,11 @@ def test_tiff_write_185_lerc_create_and_overview(): gdal.Unlink(filename) assert (cs, cs_ovr) == (4672, 1087) - filename2 = '/vsimem/test_tiff_write_185_lerc_create_and_overview_copy.tif' - gdaltest.tiff_drv.CreateCopy(filename2, ds, options=['COMPRESS=LERC_DEFLATE', 'COPY_SRC_OVERVIEWS=YES']) - assert gdal.GetLastErrorMsg() == '' + filename2 = "/vsimem/test_tiff_write_185_lerc_create_and_overview_copy.tif" + gdaltest.tiff_drv.CreateCopy( + filename2, ds, options=["COMPRESS=LERC_DEFLATE", "COPY_SRC_OVERVIEWS=YES"] + ) + assert gdal.GetLastErrorMsg() == "" ds = gdal.Open(filename2) cs = ds.GetRasterBand(1).Checksum() cs_ovr = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -7364,15 +8952,16 @@ def test_tiff_write_185_lerc_create_and_overview(): ############################################################################### + def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micro): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['LIBTIFF'] == 'INTERNAL': + 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('.') + 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) @@ -7387,10 +8976,12 @@ def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micr 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): @@ -7399,39 +8990,45 @@ def test_tiff_write_deflate_4GB(): if not gdaltest.run_slow_tests(): pytest.skip() - ref_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + 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') + 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) + 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') + 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' + 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()) + 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() == '' + assert ds.GetRasterBand(1).ReadRaster(0, 1, 4096, 1) + assert gdal.GetLastErrorMsg() == "" gdal.Unlink(tmpfilename) @@ -7440,10 +9037,11 @@ def test_tiff_write_rewrite_lzw_strip(): # 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'): + 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) @@ -7451,18 +9049,26 @@ def test_tiff_write_overviews_mask_no_ovr_on_mask(): ds = gdal.Open(tmpfile) gdal.ErrorReset() with gdaltest.error_handler(): - ds.BuildOverviews('NEAR', overviewlist=[2]) - assert '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.' in gdal.GetLastErrorMsg() + ds.BuildOverviews("NEAR", overviewlist=[2]) + assert ( + "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." + in gdal.GetLastErrorMsg() + ) # 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' + 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 'Source dataset has a mask band on full resolution, overviews on the regular bands, but lacks overviews on the mask band.' in gdal.GetLastErrorMsg() + ds = gdaltest.tiff_drv.CreateCopy( + tmpfile2, src_ds, options=["COPY_SRC_OVERVIEWS=YES"] + ) + assert ( + "Source dataset has a mask band on full resolution, overviews on the regular bands, but lacks overviews on the mask band." + in gdal.GetLastErrorMsg() + ) assert ds ds = None src_ds = None @@ -7480,29 +9086,44 @@ def test_tiff_write_overviews_mask_no_ovr_on_mask(): ############################################################################### # 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: + 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' + 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.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']) + 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.GetMetadataItem("TIFFTAG_GDAL_METADATA", "_DEBUG_") is None + ), "did not expect TIFFTAG_GDAL_METADATA tag" assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand ds = None @@ -7514,12 +9135,13 @@ def test_tiff_write_no_gdal_metadata_tag_for_ycbcr_jpeg(): # 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) + 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]) + ds.SetGeoTransform([2, 0, 1, 49, 0, -1]) for i in range(10): ds.FlushCache() ds = None @@ -7528,89 +9150,136 @@ def test_tiff_write_setgeotransform_flush(): 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 "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 "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 "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'])) + 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'])) - - if 'JXL' in md['DMD_CREATIONOPTIONLIST']: - tests.append((['COMPRESS=JXL', 'JXL_LOSSLESS=YES'],['COMPRESS=JXL', 'JXL_LOSSLESS=NO'])) - tests.append((['COMPRESS=JXL', 'JXL_LOSSLESS=YES', 'JXL_EFFORT=3'],['COMPRESS=JXL', 'JXL_LOSSLESS=YES', 'JXL_EFFORT=9'])) - tests.append((['COMPRESS=JXL', 'JXL_LOSSLESS=NO', 'JXL_DISTANCE=0.1'],['COMPRESS=JXL', 'JXL_LOSSLESS=NO', 'JXL_DISTANCE=3'])) + if "WEBP" in md["DMD_CREATIONOPTIONLIST"]: + tests.append( + (["COMPRESS=WEBP", "WEBP_LEVEL=95"], ["COMPRESS=WEBP", "WEBP_LEVEL=15"]) + ) + + if "JXL" in md["DMD_CREATIONOPTIONLIST"]: + tests.append( + (["COMPRESS=JXL", "JXL_LOSSLESS=YES"], ["COMPRESS=JXL", "JXL_LOSSLESS=NO"]) + ) + tests.append( + ( + ["COMPRESS=JXL", "JXL_LOSSLESS=YES", "JXL_EFFORT=3"], + ["COMPRESS=JXL", "JXL_LOSSLESS=YES", "JXL_EFFORT=9"], + ) + ) + tests.append( + ( + ["COMPRESS=JXL", "JXL_LOSSLESS=NO", "JXL_DISTANCE=0.1"], + ["COMPRESS=JXL", "JXL_LOSSLESS=NO", "JXL_DISTANCE=3"], + ) + ) 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'])) + 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' + tmpfile = "/vsimem/test_tiff_write_compression_create.tif" - src_ds = gdal.Open('data/rgbsmall.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 = 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 = 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) + gdaltest.tiff_drv.CreateCopy(tmpfile, src_ds, options=before) size_before = gdal.VSIStatL(tmpfile).size - gdaltest.tiff_drv.CreateCopy(tmpfile, src_ds, options = after) + 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) + ############################################################################### # Attempt at creating a file with more tile arrays larger than 2 GB def test_tiff_write_too_many_tiles(): - src_ds = gdal.Open('<VRTDataset rasterXSize="40000000" rasterYSize="40000000"><VRTRasterBand dataType="Byte" band="1"/></VRTDataset>') + src_ds = gdal.Open( + '<VRTDataset rasterXSize="40000000" rasterYSize="40000000"><VRTRasterBand dataType="Byte" band="1"/></VRTDataset>' + ) with gdaltest.error_handler(): - assert not gdaltest.tiff_drv.CreateCopy('/vsimem/tmp.tif', src_ds, options = ['TILED=YES']) - assert 'File too large regarding tile size' in gdal.GetLastErrorMsg() - - with gdaltest.tempfile('/vsimem/test_tiff_write_too_many_tiles.vrt', - '<VRTDataset rasterXSize="40000000" rasterYSize="40000000"><VRTRasterBand dataType="Byte" band="1"/></VRTDataset>'): - src_ds = gdal.Open('/vsimem/test_tiff_write_too_many_tiles.vrt') + assert not gdaltest.tiff_drv.CreateCopy( + "/vsimem/tmp.tif", src_ds, options=["TILED=YES"] + ) + assert "File too large regarding tile size" in gdal.GetLastErrorMsg() + + with gdaltest.tempfile( + "/vsimem/test_tiff_write_too_many_tiles.vrt", + '<VRTDataset rasterXSize="40000000" rasterYSize="40000000"><VRTRasterBand dataType="Byte" band="1"/></VRTDataset>', + ): + src_ds = gdal.Open("/vsimem/test_tiff_write_too_many_tiles.vrt") gdal.ErrorReset() - with gdaltest.config_option('GDAL_TIFF_OVR_BLOCKSIZE', '128'): + with gdaltest.config_option("GDAL_TIFF_OVR_BLOCKSIZE", "128"): with gdaltest.error_handler(): - src_ds.BuildOverviews('NEAR', [2]) - assert 'File too large regarding tile size' in gdal.GetLastErrorMsg() + src_ds.BuildOverviews("NEAR", [2]) + assert "File too large regarding tile size" in gdal.GetLastErrorMsg() ############################################################################### @@ -7620,75 +9289,92 @@ def test_tiff_write_too_many_tiles(): def test_tiff_write_jpeg_incompatible_of_paletted(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - src_ds = gdal.Open('data/test_average_palette.tif') + src_ds = gdal.Open("data/test_average_palette.tif") with gdaltest.error_handler(): - assert not gdaltest.tiff_drv.CreateCopy('/vsimem/tmp.tif', src_ds, options = ['COMPRESS=JPEG']) - gdal.Unlink('/vsimem/tmp.tif') + assert not gdaltest.tiff_drv.CreateCopy( + "/vsimem/tmp.tif", src_ds, options=["COMPRESS=JPEG"] + ) + gdal.Unlink("/vsimem/tmp.tif") ############################################################################### # Test blocksize overriding while creating (internal) overviews # on a newly created dataset + @pytest.mark.parametrize("blockSize,numThreads", [[64, None], [256, 8]]) def test_tiff_write_internal_ovr_blocksize(blockSize, numThreads): - src_ds = gdal.Open('../gdrivers/data/utm.tif') - fname = 'tmp/tiff_write_internal_ovr_bs%d.tif' % blockSize + src_ds = gdal.Open("../gdrivers/data/utm.tif") + fname = "tmp/tiff_write_internal_ovr_bs%d.tif" % blockSize - ds = gdal.GetDriverByName('GTiff').Create(fname, 1024, 1024, 1, - options=['TILED=YES','COMPRESS=LZW', - 'BLOCKXSIZE=512', 'BLOCKYSIZE=512']) + ds = gdal.GetDriverByName("GTiff").Create( + fname, + 1024, + 1024, + 1, + options=["TILED=YES", "COMPRESS=LZW", "BLOCKXSIZE=512", "BLOCKYSIZE=512"], + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) - opts = {'GDAL_TIFF_OVR_BLOCKSIZE':'%d'%blockSize} + opts = {"GDAL_TIFF_OVR_BLOCKSIZE": "%d" % blockSize} if numThreads: - opts['GDAL_NUM_THREADS'] = str(numThreads) + opts["GDAL_NUM_THREADS"] = str(numThreads) with gdaltest.config_options(opts): - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) src_ds = None ds = None ds = gdal.Open(fname) - (bsx,bsy) = ds.GetRasterBand(1).GetOverview(0).GetBlockSize() + (bsx, bsy) = ds.GetRasterBand(1).GetOverview(0).GetBlockSize() assert bsx == blockSize assert bsy == blockSize ds = None gdaltest.tiff_drv.Delete(fname) + ############################################################################### # Test blocksize propagation while creating (internal) overviews # on a newly created dataset + @pytest.mark.parametrize("blockSize,numThreads", [[64, None], [256, 8]]) def test_tiff_write_internal_ovr_default_blocksize(blockSize, numThreads): - src_ds = gdal.Open('../gdrivers/data/utm.tif') - fname = 'tmp/tiff_write_internal_ovr_default_bs%d.tif' % blockSize - - ds = gdal.GetDriverByName('GTiff').Create(fname, 1024, 1024, 1, - options=['TILED=YES','COMPRESS=LZW', - 'BLOCKXSIZE=%d'%blockSize, - 'BLOCKYSIZE=%d'%blockSize]) + src_ds = gdal.Open("../gdrivers/data/utm.tif") + fname = "tmp/tiff_write_internal_ovr_default_bs%d.tif" % blockSize + + ds = gdal.GetDriverByName("GTiff").Create( + fname, + 1024, + 1024, + 1, + options=[ + "TILED=YES", + "COMPRESS=LZW", + "BLOCKXSIZE=%d" % blockSize, + "BLOCKYSIZE=%d" % blockSize, + ], + ) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) opts = {} if numThreads: - opts['GDAL_NUM_THREADS'] = str(numThreads) + opts["GDAL_NUM_THREADS"] = str(numThreads) with gdaltest.config_options(opts): - ds.BuildOverviews('AVERAGE', overviewlist=[2]) + ds.BuildOverviews("AVERAGE", overviewlist=[2]) src_ds = None ds = None ds = gdal.Open(fname) - (bsx,bsy) = ds.GetRasterBand(1).GetOverview(0).GetBlockSize() + (bsx, bsy) = ds.GetRasterBand(1).GetOverview(0).GetBlockSize() assert bsx == blockSize assert bsy == blockSize ds = None @@ -7699,17 +9385,21 @@ def test_tiff_write_internal_ovr_default_blocksize(blockSize, numThreads): # Test LERC compression with Float32/Float64 -@pytest.mark.parametrize("gdalDataType,structType", [[gdal.GDT_Float32,'f'],[gdal.GDT_Float64,'d']]) +@pytest.mark.parametrize( + "gdalDataType,structType", [[gdal.GDT_Float32, "f"], [gdal.GDT_Float64, "d"]] +) def test_tiff_write_lerc_float(gdalDataType, structType): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC") == -1: pytest.skip() - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 1, 1, gdalDataType) - src_ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, struct.pack(structType * 2, 0.5, 1.5)) - filename = '/vsimem/test.tif' - gdaltest.tiff_drv.CreateCopy(filename, src_ds, options = ['COMPRESS=LERC']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 1, 1, gdalDataType) + src_ds.GetRasterBand(1).WriteRaster( + 0, 0, 2, 1, struct.pack(structType * 2, 0.5, 1.5) + ) + filename = "/vsimem/test.tif" + gdaltest.tiff_drv.CreateCopy(filename, src_ds, options=["COMPRESS=LERC"]) ds = gdal.Open(filename) assert struct.unpack(structType * 2, ds.ReadRaster()) == (0.5, 1.5) ds = None @@ -7720,17 +9410,21 @@ def test_tiff_write_lerc_float(gdalDataType, structType): # Test LERC compression withFloat32/Float64 and nan -@pytest.mark.parametrize("gdalDataType,structType", [[gdal.GDT_Float32,'f'],[gdal.GDT_Float64,'d']]) +@pytest.mark.parametrize( + "gdalDataType,structType", [[gdal.GDT_Float32, "f"], [gdal.GDT_Float64, "d"]] +) def test_tiff_write_lerc_float_with_nan(gdalDataType, structType): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LERC") == -1: pytest.skip() - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 1, 1, gdalDataType) - src_ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, struct.pack(structType * 2, 0.5, float('nan'))) - filename = '/vsimem/test.tif' - gdaltest.tiff_drv.CreateCopy(filename, src_ds, options = ['COMPRESS=LERC']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 1, 1, gdalDataType) + src_ds.GetRasterBand(1).WriteRaster( + 0, 0, 2, 1, struct.pack(structType * 2, 0.5, float("nan")) + ) + filename = "/vsimem/test.tif" + gdaltest.tiff_drv.CreateCopy(filename, src_ds, options=["COMPRESS=LERC"]) ds = gdal.Open(filename) got_data = struct.unpack(structType * 2, ds.ReadRaster()) assert got_data[0] == 0.5 @@ -7738,6 +9432,7 @@ def test_tiff_write_lerc_float_with_nan(gdalDataType, structType): ds = None gdal.Unlink(filename) + ############################################################################### # Test JXL compression @@ -7745,12 +9440,13 @@ def test_tiff_write_lerc_float_with_nan(gdalDataType, structType): def test_tiff_write_jpegxl_byte_single_band(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JXL') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JXL") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=JXL']) + ut = gdaltest.GDALTest("GTiff", "byte.tif", 1, 4672, options=["COMPRESS=JXL"]) return ut.testCreateCopy() + ############################################################################### # Test JXL compression @@ -7758,12 +9454,13 @@ def test_tiff_write_jpegxl_byte_single_band(): def test_tiff_write_jpegxl_byte_three_band(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JXL') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JXL") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'rgbsmall.tif', 1, 21212, options=['COMPRESS=JXL']) + ut = gdaltest.GDALTest("GTiff", "rgbsmall.tif", 1, 21212, options=["COMPRESS=JXL"]) return ut.testCreateCopy() + ############################################################################### # Test JXL compression @@ -7771,22 +9468,25 @@ def test_tiff_write_jpegxl_byte_three_band(): def test_tiff_write_jpegxl_uint16_single_band(): md = gdaltest.tiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JXL') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JXL") == -1: pytest.skip() - ut = gdaltest.GDALTest('GTiff', 'uint16.tif', 1, 4672, options=['COMPRESS=JXL']) + ut = gdaltest.GDALTest("GTiff", "uint16.tif", 1, 4672, options=["COMPRESS=JXL"]) return ut.testCreateCopy() + ############################################################################### # Test creating overviews with NaN nodata def test_tiff_write_overviews_nan_nodata(): - filename = '/vsimem/test_tiff_write_overviews_nan_nodata.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 32, 32, 1, gdal.GDT_Float32, options=['TILED=YES', 'SPARSE_OK=YES']) - ds.GetRasterBand(1).SetNoDataValue(float('nan')) - ds.BuildOverviews('NONE', [2, 4]) + filename = "/vsimem/test_tiff_write_overviews_nan_nodata.tif" + ds = gdal.GetDriverByName("GTiff").Create( + filename, 32, 32, 1, gdal.GDT_Float32, options=["TILED=YES", "SPARSE_OK=YES"] + ) + ds.GetRasterBand(1).SetNoDataValue(float("nan")) + ds.BuildOverviews("NONE", [2, 4]) ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetOverviewCount() == 2 @@ -7800,7 +9500,9 @@ def test_tiff_write_overviews_nan_nodata(): def test_tiff_write_coordinate_epoch(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_tiff_write_coordinate_epoch.tif', 1, 1) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_tiff_write_coordinate_epoch.tif", 1, 1 + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) srs.SetCoordinateEpoch(2021.3) @@ -7808,12 +9510,12 @@ def test_tiff_write_coordinate_epoch(): ds.SetSpatialRef(srs) ds = None - ds = gdal.Open('/vsimem/test_tiff_write_coordinate_epoch.tif') + ds = gdal.Open("/vsimem/test_tiff_write_coordinate_epoch.tif") srs = ds.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.3 ds = None - gdal.Unlink('/vsimem/test_tiff_write_coordinate_epoch.tif') + gdal.Unlink("/vsimem/test_tiff_write_coordinate_epoch.tif") ############################################################################### @@ -7824,9 +9526,11 @@ def test_tiff_write_coordinate_epoch(): @pytest.mark.parametrize("reopen", [True, False]) def test_tiff_write_multiple_ifds_directory_rewriting(reopen): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 32, 32, options=['TILED=YES', 'SPARSE_OK=YES']) - ds.BuildOverviews('NONE', [2]) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create( + filename, 32, 32, options=["TILED=YES", "SPARSE_OK=YES"] + ) + ds.BuildOverviews("NONE", [2]) if reopen: ds = None ds = gdal.Open(filename, gdal.GA_Update) @@ -7847,14 +9551,15 @@ def test_tiff_write_multiple_ifds_directory_rewriting(reopen): gdal.Unlink(filename) assert mm == (2, 2) + ############################################################################### # Test SetSpatialRef() on a read-only dataset def test_tiff_write_setspatialref_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) srs = osr.SpatialReference() @@ -7862,15 +9567,16 @@ def test_tiff_write_setspatialref_read_only(): assert ds.SetSpatialRef(srs) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_srs = ds.GetSpatialRef() assert got_srs - assert got_srs.GetAuthorityCode(None) == '4326' + assert got_srs.GetAuthorityCode(None) == "4326" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetSpatialRef() on a read-only dataset, overriding TIFF tags @@ -7878,8 +9584,8 @@ def test_tiff_write_setspatialref_read_only(): def test_tiff_write_setspatialref_read_only_override_tifftags(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) assert ds.SetSpatialRef(srs) == gdal.CE_None @@ -7891,12 +9597,12 @@ def test_tiff_write_setspatialref_read_only_override_tifftags(): assert ds.SetSpatialRef(srs) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_srs = ds.GetSpatialRef() assert got_srs - assert got_srs.GetAuthorityCode(None) == '4326' + assert got_srs.GetAuthorityCode(None) == "4326" ds = None ds = gdal.Open(filename, gdal.GA_Update) @@ -7905,15 +9611,16 @@ def test_tiff_write_setspatialref_read_only_override_tifftags(): assert ds.SetSpatialRef(srs) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is None + assert gdal.VSIStatL(filename + ".aux.xml") is None ds = gdal.Open(filename) got_srs = ds.GetSpatialRef() assert got_srs - assert got_srs.GetAuthorityCode(None) == '32632' + assert got_srs.GetAuthorityCode(None) == "32632" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetGeoTransform() on a read-only dataset @@ -7921,22 +9628,23 @@ def test_tiff_write_setspatialref_read_only_override_tifftags(): def test_tiff_write_setgeotransform_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) - gt = [2,1,0,49,0,-1] + gt = [2, 1, 0, 49, 0, -1] assert ds.SetGeoTransform(gt) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_gt = [x for x in ds.GetGeoTransform()] assert got_gt == gt ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetGeoTransform() on a read-only dataset, overriding TIFF tags @@ -7944,17 +9652,17 @@ def test_tiff_write_setgeotransform_read_only(): def test_tiff_write_setgeotransform_read_only_override_tifftags(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) - assert ds.SetGeoTransform([3,1,0,50,0,-1]) == gdal.CE_None + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) + assert ds.SetGeoTransform([3, 1, 0, 50, 0, -1]) == gdal.CE_None ds = None ds = gdal.Open(filename) - gt = [2,1,0,49,0,-1] + gt = [2, 1, 0, 49, 0, -1] assert ds.SetGeoTransform(gt) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_gt = [x for x in ds.GetGeoTransform()] @@ -7962,18 +9670,19 @@ def test_tiff_write_setgeotransform_read_only_override_tifftags(): ds = None ds = gdal.Open(filename, gdal.GA_Update) - gt = [4,1,0,51,0,-1] + gt = [4, 1, 0, 51, 0, -1] assert ds.SetGeoTransform(gt) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is None + assert gdal.VSIStatL(filename + ".aux.xml") is None ds = gdal.Open(filename) got_gt = [x for x in ds.GetGeoTransform()] assert got_gt == gt ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetGCPs() on a read-only dataset @@ -7981,8 +9690,8 @@ def test_tiff_write_setgeotransform_read_only_override_tifftags(): def test_tiff_write_setgcps_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) gcps = [gdal.GCP(0, 1, 2, 3, 4)] @@ -7991,7 +9700,7 @@ def test_tiff_write_setgcps_read_only(): assert ds.SetGCPs(gcps, srs) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_gcps = ds.GetGCPs() @@ -8002,10 +9711,11 @@ def test_tiff_write_setgcps_read_only(): assert got_gcps[0].GCPY == gcps[0].GCPY got_srs = ds.GetGCPSpatialRef() assert got_srs - assert got_srs.GetAuthorityCode(None) == '4326' + assert got_srs.GetAuthorityCode(None) == "4326" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetGCPs() on a read-only dataset, overriding TIFF tags @@ -8013,8 +9723,8 @@ def test_tiff_write_setgcps_read_only(): def test_tiff_write_setgcps_read_only_override_tifftags(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) gcps = [gdal.GCP(5, 6, 7, 8, 9)] assert ds.SetGCPs(gcps, None) == gdal.CE_None ds = None @@ -8026,7 +9736,7 @@ def test_tiff_write_setgcps_read_only_override_tifftags(): assert ds.SetGCPs(gcps, srs) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) got_gcps = ds.GetGCPs() @@ -8037,7 +9747,7 @@ def test_tiff_write_setgcps_read_only_override_tifftags(): assert got_gcps[0].GCPY == gcps[0].GCPY got_srs = ds.GetGCPSpatialRef() assert got_srs - assert got_srs.GetAuthorityCode(None) == '4326' + assert got_srs.GetAuthorityCode(None) == "4326" ds = None ds = gdal.Open(filename, gdal.GA_Update) @@ -8045,7 +9755,7 @@ def test_tiff_write_setgcps_read_only_override_tifftags(): assert ds.SetGCPs(gcps, None) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is None + assert gdal.VSIStatL(filename + ".aux.xml") is None ds = gdal.Open(filename) got_gcps = ds.GetGCPs() @@ -8057,7 +9767,8 @@ def test_tiff_write_setgcps_read_only_override_tifftags(): assert ds.GetGCPSpatialRef() is None ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetNoDataValue() and DeleteNoDataValue() on a read-only dataset @@ -8065,14 +9776,14 @@ def test_tiff_write_setgcps_read_only_override_tifftags(): def test_tiff_write_nodata_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) assert ds.GetRasterBand(1).SetNoDataValue(123) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 @@ -8083,7 +9794,8 @@ def test_tiff_write_nodata_read_only(): assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetNoDataValue() on a read-only dataset, overriding TIFF tags @@ -8091,17 +9803,16 @@ def test_tiff_write_nodata_read_only(): def test_tiff_write_nodata_read_only_overriding_tifftags(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) assert ds.GetRasterBand(1).SetNoDataValue(0) == gdal.CE_None ds = None - ds = gdal.Open(filename) assert ds.GetRasterBand(1).SetNoDataValue(123) == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 @@ -8115,7 +9826,8 @@ def test_tiff_write_nodata_read_only_overriding_tifftags(): assert ds.GetRasterBand(1).GetNoDataValue() == 1 ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test Dataset SetMetadataItem() on a read-only dataset @@ -8123,20 +9835,21 @@ def test_tiff_write_nodata_read_only_overriding_tifftags(): def test_tiff_write_dataset_setmetadataitem_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) - assert ds.SetMetadataItem('FOO', 'BAR', 'BAZ') == gdal.CE_None + assert ds.SetMetadataItem("FOO", "BAR", "BAZ") == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) - assert ds.GetMetadataItem('FOO', 'BAZ') == 'BAR' + assert ds.GetMetadataItem("FOO", "BAZ") == "BAR" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test Dataset SetMetadata() on a read-only dataset @@ -8144,20 +9857,21 @@ def test_tiff_write_dataset_setmetadataitem_read_only(): def test_tiff_write_dataset_setmetadata_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) - assert ds.SetMetadata({'FOO': 'BAR'}, 'BAZ') == gdal.CE_None + assert ds.SetMetadata({"FOO": "BAR"}, "BAZ") == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) - assert ds.GetMetadataItem('FOO', 'BAZ') == 'BAR' + assert ds.GetMetadataItem("FOO", "BAZ") == "BAR" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test Band SetMetadataItem() on a read-only dataset @@ -8165,20 +9879,21 @@ def test_tiff_write_dataset_setmetadata_read_only(): def test_tiff_write_band_setmetadataitem_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) - assert ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAR', 'BAZ') == gdal.CE_None + assert ds.GetRasterBand(1).SetMetadataItem("FOO", "BAR", "BAZ") == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('FOO', 'BAZ') == 'BAR' + assert ds.GetRasterBand(1).GetMetadataItem("FOO", "BAZ") == "BAR" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test Band SetMetadata() on a read-only dataset @@ -8186,20 +9901,21 @@ def test_tiff_write_band_setmetadataitem_read_only(): def test_tiff_write_band_setmetadata_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) - assert ds.GetRasterBand(1).SetMetadata({'FOO': 'BAR'}, 'BAZ') == gdal.CE_None + assert ds.GetRasterBand(1).SetMetadata({"FOO": "BAR"}, "BAZ") == gdal.CE_None ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetMetadataItem('FOO', 'BAZ') == 'BAR' + assert ds.GetRasterBand(1).GetMetadataItem("FOO", "BAZ") == "BAR" ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) + ############################################################################### # Test SetColorTable() on a read-only dataset @@ -8207,8 +9923,8 @@ def test_tiff_write_band_setmetadata_read_only(): def test_tiff_write_setcolortable_read_only(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ds = gdal.Open(filename) ct = gdal.ColorTable() @@ -8217,7 +9933,7 @@ def test_tiff_write_setcolortable_read_only(): assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) ct = ds.GetRasterBand(1).GetRasterColorTable() @@ -8226,7 +9942,7 @@ def test_tiff_write_setcolortable_read_only(): assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -8235,8 +9951,8 @@ def test_tiff_write_setcolortable_read_only(): def test_tiff_write_setcolortable_read_only_overriding_tifftags(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (1, 2, 3, 255)) assert ds.GetRasterBand(1).SetRasterColorTable(ct) == gdal.CE_None @@ -8250,7 +9966,7 @@ def test_tiff_write_setcolortable_read_only_overriding_tifftags(): assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) assert ct is not None @@ -8265,7 +9981,7 @@ def test_tiff_write_setcolortable_read_only_overriding_tifftags(): assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is None + assert gdal.VSIStatL(filename + ".aux.xml") is None ds = gdal.Open(filename) assert ct is not None @@ -8273,51 +9989,63 @@ def test_tiff_write_setcolortable_read_only_overriding_tifftags(): assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### # Test setting incompatible settings for PREDICTOR -@pytest.mark.parametrize("dt, options", - [(gdal.GDT_UInt16, ['PREDICTOR=2', 'NBITS=12']), - (gdal.GDT_UInt32, ['PREDICTOR=3']), - (gdal.GDT_UInt16, ['PREDICTOR=invalid']) - ]) +@pytest.mark.parametrize( + "dt, options", + [ + (gdal.GDT_UInt16, ["PREDICTOR=2", "NBITS=12"]), + (gdal.GDT_UInt32, ["PREDICTOR=3"]), + (gdal.GDT_UInt16, ["PREDICTOR=invalid"]), + ], +) def test_tiff_write_incompatible_predictor(dt, options): - filename = '/vsimem/out.tif' + filename = "/vsimem/out.tif" with gdaltest.error_handler(): - assert gdal.GetDriverByName('GTiff').Create(filename, 1, 1, 1, dt, options + ['COMPRESS=LZW']) is None + assert ( + gdal.GetDriverByName("GTiff").Create( + filename, 1, 1, 1, dt, options + ["COMPRESS=LZW"] + ) + is None + ) ############################################################################### # Test PREDICTOR=2 with 64 bit samples + def test_tiff_write_predictor_2_float64(): - md = gdal.GetDriverByName('GTiff').GetMetadata() - if md['LIBTIFF'] != 'INTERNAL': - pytest.skip('libtiff > 4.3.0 or internal libtiff needed') + md = gdal.GetDriverByName("GTiff").GetMetadata() + if md["LIBTIFF"] != "INTERNAL": + pytest.skip("libtiff > 4.3.0 or internal libtiff needed") - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 2, 1, 1, gdal.GDT_Float64, ['COMPRESS=LZW', 'PREDICTOR=2']) - data = struct.pack('d' * 2, 1, 2) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create( + filename, 2, 1, 1, gdal.GDT_Float64, ["COMPRESS=LZW", "PREDICTOR=2"] + ) + data = struct.pack("d" * 2, 1, 2) ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, data) ds = None ds = gdal.Open(filename) - assert ds.GetMetadataItem('PREDICTOR', 'IMAGE_STRUCTURE') == '2' + assert ds.GetMetadataItem("PREDICTOR", "IMAGE_STRUCTURE") == "2" assert ds.ReadRaster() == data ds = None gdal.Unlink(filename) + ############################################################################### def test_tiff_write_uint64(): - ut = gdaltest.GDALTest('GTiff', 'gtiff/uint64_full_range.tif', 1, 1) + ut = gdaltest.GDALTest("GTiff", "gtiff/uint64_full_range.tif", 1, 1) return ut.testCreateCopy() @@ -8326,24 +10054,24 @@ def test_tiff_write_uint64(): def test_tiff_write_uint64_nodata(): - filename = '/vsimem/test_tiff_write_uint64_nodata.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1, 1, gdal.GDT_UInt64) - val = (1 << 64)-1 + filename = "/vsimem/test_tiff_write_uint64_nodata.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1, 1, gdal.GDT_UInt64) + val = (1 << 64) - 1 assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None ds = None - filename_copy = '/vsimem/test_tiff_write_uint64_nodata_filename_copy.tif' + filename_copy = "/vsimem/test_tiff_write_uint64_nodata_filename_copy.tif" ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == val - ds = gdal.GetDriverByName('GTiff').CreateCopy(filename_copy, ds) + ds = gdal.GetDriverByName("GTiff").CreateCopy(filename_copy, ds) ds = None ds = gdal.Open(filename_copy) assert ds.GetRasterBand(1).GetNoDataValue() == val ds = None - gdal.GetDriverByName('GTiff').Delete(filename) - gdal.GetDriverByName('GTiff').Delete(filename_copy) + gdal.GetDriverByName("GTiff").Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename_copy) ############################################################################### @@ -8351,7 +10079,7 @@ def test_tiff_write_uint64_nodata(): def test_tiff_write_int64(): - ut = gdaltest.GDALTest('GTiff', 'gtiff/int64_full_range.tif', 1, 65535) + ut = gdaltest.GDALTest("GTiff", "gtiff/int64_full_range.tif", 1, 65535) return ut.testCreateCopy() @@ -8360,24 +10088,24 @@ def test_tiff_write_int64(): def test_tiff_write_int64_nodata(): - filename = '/vsimem/test_tiff_write_int64_nodata.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1, 1, gdal.GDT_Int64) + filename = "/vsimem/test_tiff_write_int64_nodata.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1, 1, gdal.GDT_Int64) val = -(1 << 63) assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None ds = None - filename_copy = '/vsimem/test_tiff_write_int64_nodata_filename_copy.tif' + filename_copy = "/vsimem/test_tiff_write_int64_nodata_filename_copy.tif" ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == val - ds = gdal.GetDriverByName('GTiff').CreateCopy(filename_copy, ds) + ds = gdal.GetDriverByName("GTiff").CreateCopy(filename_copy, ds) ds = None ds = gdal.Open(filename_copy) assert ds.GetRasterBand(1).GetNoDataValue() == val ds = None - gdal.GetDriverByName('GTiff').Delete(filename) - gdal.GetDriverByName('GTiff').Delete(filename_copy) + gdal.GetDriverByName("GTiff").Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename_copy) ############################################################################### @@ -8386,15 +10114,14 @@ def test_tiff_write_int64_nodata(): def test_tiff_write_alpha_ismaskband(): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1, 2) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1, 2) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) assert not ds.GetRasterBand(1).IsMaskBand() assert ds.GetRasterBand(2).IsMaskBand() ds = None - gdal.GetDriverByName('GTiff').Delete(filename) - + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -8403,15 +10130,14 @@ def test_tiff_write_alpha_ismaskband(): def test_tiff_write_overview_building_and_approx_stats(): - filename = '/vsimem/out.tif' - gdal.GetDriverByName('GTiff').Create(filename, 512, 512) + filename = "/vsimem/out.tif" + gdal.GetDriverByName("GTiff").Create(filename, 512, 512) ds = gdal.Open(filename) ds.BuildOverviews("NEAREST", [2, 4, 8]) ds.GetRasterBand(1).ComputeStatistics(1) ds = None - gdal.GetDriverByName('GTiff').Delete(filename) - + gdal.GetDriverByName("GTiff").Delete(filename) ############################################################################### @@ -8421,44 +10147,43 @@ def test_tiff_write_overview_building_and_approx_stats(): @pytest.mark.parametrize("setmetadata_before", [True, False]) def test_tiff_write_setgeotransform_and_setmetadata(setmetadata_before): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) - ds.SetGeoTransform([1,2,3,4,5,-6]) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) + ds.SetGeoTransform([1, 2, 3, 4, 5, -6]) ds = None ds = gdal.Open(filename, gdal.GA_Update) if setmetadata_before: ds.SetMetadata([]) - ds.SetGeoTransform([10,20,30,40,50,-60]) + ds.SetGeoTransform([10, 20, 30, 40, 50, -60]) if not setmetadata_before: ds.SetMetadata([]) ds = None ds = gdal.Open(filename) - assert ds.GetGeoTransform() == (10,20,30,40,50,-60) + assert ds.GetGeoTransform() == (10, 20, 30, 40, 50, -60) ds = None - gdal.GetDriverByName('GTiff').Delete(filename) + gdal.GetDriverByName("GTiff").Delete(filename) @pytest.mark.parametrize("getspatialref_before", [True, False]) def test_tiff_write_setgeotransform_and_getspatialref(getspatialref_before): - filename = '/vsimem/out.tif' - ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) - ds.SetGeoTransform([1,2,3,4,5,-6]) + filename = "/vsimem/out.tif" + ds = gdal.GetDriverByName("GTiff").Create(filename, 1, 1) + ds.SetGeoTransform([1, 2, 3, 4, 5, -6]) ds = None ds = gdal.Open(filename, gdal.GA_Update) if getspatialref_before: ds.GetSpatialRef() - ds.SetGeoTransform([10,20,30,40,50,-60]) + ds.SetGeoTransform([10, 20, 30, 40, 50, -60]) if not getspatialref_before: ds.GetSpatialRef() ds = None ds = gdal.Open(filename) - assert ds.GetGeoTransform() == (10,20,30,40,50,-60) + assert ds.GetGeoTransform() == (10, 20, 30, 40, 50, -60) ds = None - gdal.GetDriverByName('GTiff').Delete(filename) - + gdal.GetDriverByName("GTiff").Delete(filename) def test_tiff_write_cleanup(): diff --git a/autotest/gcore/transformer.py b/autotest/gcore/transformer.py index a530fa9b22ed..279ab956d80d 100644 --- a/autotest/gcore/transformer.py +++ b/autotest/gcore/transformer.py @@ -31,12 +31,12 @@ ############################################################################### +import math import gdaltest -from osgeo import gdal -from osgeo import osr import pytest -import math + +from osgeo import gdal, osr ############################################################################### # Test simple Geotransform based transformer. @@ -44,18 +44,27 @@ def test_transformer_1(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") tr = gdal.Transformer(ds, None, []) (success, pnt) = tr.TransformPoint(0, 20, 10) - assert success and pnt[0] == pytest.approx(441920, abs=0.00000001) and pnt[1] == pytest.approx(3750720, abs=0.00000001) and pnt[2] == 0.0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(441920, abs=0.00000001) + and pnt[1] == pytest.approx(3750720, abs=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 pnt[0] == pytest.approx(20, abs=0.00000001) and pnt[1] == pytest.approx(10, abs=0.00000001) and pnt[2] == 0.0, \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(20, abs=0.00000001) + and pnt[1] == pytest.approx(10, abs=0.00000001) + and pnt[2] == 0.0 + ), "got wrong reverse transform result." + ############################################################################### # Test GCP based transformer with polynomials. @@ -63,36 +72,55 @@ def test_transformer_1(): def test_transformer_2(): - ds = gdal.Open('data/gcps.vrt') - tr = gdal.Transformer(ds, None, ['METHOD=GCP_POLYNOMIAL']) + ds = gdal.Open("data/gcps.vrt") + tr = gdal.Transformer(ds, None, ["METHOD=GCP_POLYNOMIAL"]) (success, pnt) = tr.TransformPoint(0, 20, 10) - assert success and pnt[0] == pytest.approx(441920, abs=0.001) and pnt[1] == pytest.approx(3750720, abs=0.001) and pnt[2] == 0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(441920, abs=0.001) + and pnt[1] == pytest.approx(3750720, abs=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 pnt[0] == pytest.approx(20, abs=0.001) and pnt[1] == pytest.approx(10, abs=0.001) and pnt[2] == 0, \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(20, abs=0.001) + and pnt[1] == pytest.approx(10, abs=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']) + ds = gdal.Open("data/gcps.vrt") + tr = gdal.Transformer(ds, None, ["METHOD=GCP_TPS"]) (success, pnt) = tr.TransformPoint(0, 20, 10) - assert success and pnt[0] == pytest.approx(441920, abs=0.001) and pnt[1] == pytest.approx(3750720, abs=0.001) and pnt[2] == 0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(441920, abs=0.001) + and pnt[1] == pytest.approx(3750720, abs=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 pnt[0] == pytest.approx(20, abs=0.001) and pnt[1] == pytest.approx(10, abs=0.001) and pnt[2] == 0, \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(20, abs=0.001) + and pnt[1] == pytest.approx(10, abs=0.001) + and pnt[2] == 0 + ), "got wrong reverse transform result." + ############################################################################### # Test geolocation based transformer. @@ -100,18 +128,27 @@ def test_transformer_3(): def test_transformer_4(): - ds = gdal.Open('data/sstgeo.vrt') - tr = gdal.Transformer(ds, None, ['METHOD=GEOLOC_ARRAY']) + ds = gdal.Open("data/sstgeo.vrt") + tr = gdal.Transformer(ds, None, ["METHOD=GEOLOC_ARRAY"]) (success, pnt) = tr.TransformPoint(0, 20, 10) - assert success and pnt[0] == pytest.approx(-81.961341857910156, abs=0.000001) and pnt[1] == pytest.approx(29.612689971923828, abs=0.000001) and pnt[2] == 0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(-81.961341857910156, abs=0.000001) + and pnt[1] == pytest.approx(29.612689971923828, abs=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 pnt[0] == pytest.approx(20, abs=0.000001) and pnt[1] == pytest.approx(10, abs=0.000001) and pnt[2] == 0, \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(20, abs=0.000001) + and pnt[1] == pytest.approx(10, abs=0.000001) + and pnt[2] == 0 + ), "got wrong reverse transform result." + ############################################################################### # Test RPC based transformer. @@ -119,46 +156,68 @@ def test_transformer_4(): def test_transformer_5(): - ds = gdal.Open('data/rpc.vrt') - tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_PIXEL_ERROR_THRESHOLD=0.05']) + 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 pnt[0] == pytest.approx(125.64830100509131, abs=0.000001) and pnt[1] == pytest.approx(39.869433991997553, abs=0.000001) and pnt[2] == 0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(125.64830100509131, abs=0.000001) + and pnt[1] == pytest.approx(39.869433991997553, abs=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 pnt[0] == pytest.approx(20.5, abs=0.05) and pnt[1] == pytest.approx(10.5, abs=0.05) and pnt[2] == 0, \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.05) + and pnt[1] == pytest.approx(10.5, abs=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 pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001) and pnt[2] == 30, \ - 'got wrong forward transform result.(2)' + assert ( + success + and pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) + and pnt[1] == pytest.approx(39.869345204440144, abs=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 pnt[0] == pytest.approx(20.5, abs=0.05) and pnt[1] == pytest.approx(10.5, abs=0.05) and pnt[2] == 30, \ - 'got wrong reverse transform result.(2)' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.05) + and pnt[1] == pytest.approx(10.5, abs=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']) + tr = gdal.Transformer(ds, None, ["METHOD=RPC", "RPC_HEIGHT=30"]) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5) - assert success and pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001), \ - 'got wrong forward transform result.(3)' + assert ( + success + and pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) + and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001) + ), "got wrong forward transform result.(3)" (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(20.5, abs=0.1) and pnt[1] == pytest.approx(10.5, abs=0.1), \ - 'got wrong reverse transform result.(3)' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.1) + and pnt[1] == pytest.approx(10.5, abs=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) + ds_dem = gdal.GetDriverByName("GTiff").Create("/vsimem/dem.tif", 100, 100, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32652) ds_dem.SetProjection(sr.ExportToWkt()) @@ -166,54 +225,94 @@ def test_transformer_5(): 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']) + 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 pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001), \ - 'got wrong forward transform result.(4)' + assert ( + success + and pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) + and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001) + ), "got wrong forward transform result.(4)" (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(20.5, abs=0.05) and pnt[1] == pytest.approx(10.5, abs=0.05), \ - 'got wrong reverse transform result.(4)' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.05) + and pnt[1] == pytest.approx(10.5, abs=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']) + 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 pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001), \ - 'got wrong forward transform result.(5)' + assert ( + success + and pnt[0] == pytest.approx(125.64828521533849, abs=0.000001) + and pnt[1] == pytest.approx(39.869345204440144, abs=0.000001) + ), "got wrong forward transform result.(5)" (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(20.5, abs=0.05) and pnt[1] == pytest.approx(10.5, abs=0.05), \ - 'got wrong reverse transform result.(5)' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.05) + and pnt[1] == pytest.approx(10.5, abs=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']) + 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 pnt[0] == pytest.approx(125.64828521503811, abs=0.000001) and pnt[1] == pytest.approx(39.869345204874911, abs=0.000001), \ - 'got wrong forward transform result.(6)' + assert ( + success + and pnt[0] == pytest.approx(125.64828521503811, abs=0.000001) + and pnt[1] == pytest.approx(39.869345204874911, abs=0.000001) + ), "got wrong forward transform result.(6)" (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(20.5, abs=0.05) and pnt[1] == pytest.approx(10.5, abs=0.05), \ - 'got wrong reverse transform result.(6)' + assert ( + success + and pnt[0] == pytest.approx(20.5, abs=0.05) + and pnt[1] == pytest.approx(10.5, abs=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']) + 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 @@ -224,39 +323,61 @@ def test_transformer_5(): tr = None # Test outside DEM extent with RPC_DEM_MISSING_VALUE=0 - ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1) + 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']) + 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 pnt[0] == pytest.approx(125.64746155942839, abs=0.000001) and pnt[1] == pytest.approx(39.869506789921168, abs=0.000001), \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(125.64746155942839, abs=0.000001) + and pnt[1] == pytest.approx(39.869506789921168, abs=0.000001) + ), "got wrong forward transform result." (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(-99.5, abs=0.05) and pnt[1] == pytest.approx(0.5, abs=0.05), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(-99.5, abs=0.05) + and pnt[1] == pytest.approx(0.5, abs=0.05) + ), "got wrong reverse transform result." tr = None - gdal.Unlink('/vsimem/dem.tif') + 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']) + 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 pnt[0] == pytest.approx(28.26163232, abs=0.0001) and pnt[1] == pytest.approx(-27.79853245, abs=0.0001) and pnt[2] == 0, \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(28.26163232, abs=0.0001) + and pnt[1] == pytest.approx(-27.79853245, abs=0.0001) + and pnt[2] == 0 + ), "got wrong forward transform result." + ############################################################################### # Test Transformer.TransformPoints @@ -264,13 +385,18 @@ def test_transformer_6(): def test_transformer_7(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") tr = gdal.Transformer(ds, None, []) (pnt, success) = tr.TransformPoints(0, [(20, 10)]) - assert success[0] != 0 and pnt[0][0] == pytest.approx(441920, abs=0.00000001) and pnt[0][1] == pytest.approx(3750720, abs=0.00000001) and pnt[0][2] == 0.0, \ - 'got wrong forward transform result.' + assert ( + success[0] != 0 + and pnt[0][0] == pytest.approx(441920, abs=0.00000001) + and pnt[0][1] == pytest.approx(3750720, abs=0.00000001) + and pnt[0][2] == 0.0 + ), "got wrong forward transform result." + ############################################################################### # Test handling of nodata in RPC DEM (#5680) @@ -278,10 +404,12 @@ def test_transformer_7(): def test_transformer_8(): - ds = gdal.Open('data/rpc.vrt') + 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) + 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()) @@ -290,22 +418,31 @@ def test_transformer_8(): 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]) + 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.') + 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.') + pytest.fail("got wrong reverse transform result.") + + gdal.Unlink("/vsimem/dem.tif") - gdal.Unlink('/vsimem/dem.tif') ############################################################################### # Test RPC DEM line optimization @@ -313,22 +450,42 @@ def test_transformer_8(): def test_transformer_9(): - ds = gdal.Open('data/rpc.vrt') + 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) + 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]) + 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)]) + 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]) + 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) @@ -340,7 +497,8 @@ def test_transformer_9(): assert pnt == pnt_optimized, method - gdal.Unlink('/vsimem/dem.tif') + gdal.Unlink("/vsimem/dem.tif") + ############################################################################### # Test RPC DEM transform from geoid height to ellipsoidal height @@ -349,28 +507,43 @@ def test_transformer_9(): 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 = 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') + 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]) + 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)]) + 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 = 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", + vrt_dem.SetProjection( + """COMPD_CS["WGS 84 + my_height", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, @@ -386,25 +559,39 @@ def test_transformer_10(): EXTENSION["PROJ4_GRIDS","./tmp/fake.gtx"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], - AXIS["Up",UP]]]""") + AXIS["Up",UP]]]""" + ) vrt_dem = None - ds = gdal.Open('data/rpc.vrt') + ds = gdal.Open("data/rpc.vrt") - tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/dem.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 pnt[0] == pytest.approx(27.31476045569616, abs=1e-5) and pnt[1] == pytest.approx(-53.328814757762302, abs=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']) + assert ( + success + and pnt[0] == pytest.approx(27.31476045569616, abs=1e-5) + and pnt[1] == pytest.approx(-53.328814757762302, abs=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 pnt[0] == pytest.approx(21.445626206892484, abs=1e-5) and pnt[1] == pytest.approx(1.6460100520871492, abs=1e-5) and pnt[2] == 0, \ - 'got wrong result.' + assert ( + success + and pnt[0] == pytest.approx(21.445626206892484, abs=1e-5) + and pnt[1] == pytest.approx(1.6460100520871492, abs=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") - gdal.GetDriverByName('GTX').Delete('tmp/fake.gtx') - gdal.Unlink('/vsimem/dem.tif') - gdal.Unlink('/vsimem/dem.vrt') ############################################################################### # Test failed inverse RPC transform (#6162) @@ -412,33 +599,38 @@ def test_transformer_10(): def test_transformer_11(): - ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) + 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' + "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') + ds.SetMetadata(rpc, "RPC") - tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT=4000']) + 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']) + tr = gdal.Transformer(ds, None, ["METHOD=RPC", "RPC_HEIGHT=1150"]) (success, pnt) = tr.TransformPoint(0, 0, 0, 0) - assert success and pnt[0] == pytest.approx(77.350939956024618, abs=1e-7) and pnt[1] == pytest.approx(38.739703990877814, abs=1e-7) + assert ( + success + and pnt[0] == pytest.approx(77.350939956024618, abs=1e-7) + and pnt[1] == pytest.approx(38.739703990877814, abs=1e-7) + ) + ############################################################################### # Test degenerate cases of TPS transformer @@ -446,7 +638,8 @@ def test_transformer_11(): def test_transformer_12(): - ds = gdal.Open(""" + ds = gdal.Open( + """ <VRTDataset rasterXSize="20" rasterYSize="20"> <GCPList Projection="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"]]"> <GCP Id="" Pixel="0" Line="0" X="0" Y="0"/> @@ -461,14 +654,20 @@ def test_transformer_12(): <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) - tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) + tr = gdal.Transformer(ds, None, ["METHOD=GCP_TPS"]) assert tr is not None (success, pnt) = tr.TransformPoint(0, 0, 0) - assert success and pnt[0] == pytest.approx(0, abs=1e-7) and pnt[1] == pytest.approx(0, abs=1e-7) - - ds = gdal.Open(""" + assert ( + success + and pnt[0] == pytest.approx(0, abs=1e-7) + and pnt[1] == pytest.approx(0, abs=1e-7) + ) + + ds = gdal.Open( + """ <VRTDataset rasterXSize="20" rasterYSize="20"> <GCPList Projection="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"]]"> <GCP Id="" Pixel="0" Line="0" X="0" Y="0"/> @@ -483,14 +682,16 @@ def test_transformer_12(): <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) gdal.ErrorReset() with gdaltest.error_handler(): - tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) - assert gdal.GetLastErrorMsg() != '' + tr = gdal.Transformer(ds, None, ["METHOD=GCP_TPS"]) + assert gdal.GetLastErrorMsg() != "" - ds = gdal.Open(""" + ds = gdal.Open( + """ <VRTDataset rasterXSize="20" rasterYSize="20"> <GCPList Projection="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"]]"> <GCP Id="" Pixel="0" Line="0" X="0" Y="0"/> @@ -505,12 +706,14 @@ def test_transformer_12(): <SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) gdal.ErrorReset() with gdaltest.error_handler(): - tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) - assert gdal.GetLastErrorMsg() != '' + tr = gdal.Transformer(ds, None, ["METHOD=GCP_TPS"]) + assert gdal.GetLastErrorMsg() != "" + ############################################################################### # Test inverse RPC transform at DEM edge (#6377) @@ -518,7 +721,7 @@ def test_transformer_12(): def test_transformer_13(): - ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) + ds = gdal.GetDriverByName("MEM").Create("", 6600, 4400) rpc = [ "HEIGHT_OFF=79.895358112544", "HEIGHT_SCALE=71.8479951519956", @@ -533,66 +736,83 @@ def test_transformer_13(): "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" + "SAMP_SCALE=3297.19448149873", ] - ds.SetMetadata(rpc, 'RPC') + ds.SetMetadata(rpc, "RPC") - tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=data/transformer_13_dem.tif']) + tr = gdal.Transformer( + ds, None, ["METHOD=RPC", "RPC_DEM=data/transformer_13_dem.tif"] + ) (success, pnt) = tr.TransformPoint(0, 6600, 24) - assert success and pnt[0] == pytest.approx(-108.00066000065341, abs=1e-7) and pnt[1] == pytest.approx(39.157694013439489, abs=1e-7) + assert ( + success + and pnt[0] == pytest.approx(-108.00066000065341, abs=1e-7) + and pnt[1] == pytest.approx(39.157694013439489, abs=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) + 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 pnt[0] == pytest.approx(1.9391846640653961e-05, abs=1e-7) and pnt[1] == pytest.approx(-0.0038824752244123275, abs=1e-7) + assert ( + success + and pnt[0] == pytest.approx(1.9391846640653961e-05, abs=1e-7) + and pnt[1] == pytest.approx(-0.0038824752244123275, abs=1e-7) + ) - f = gdal.VSIFOpenL('/vsimem/transformer_14.csvt', 'rb') + f = gdal.VSIFOpenL("/vsimem/transformer_14.csvt", "rb") if f is not None: - content = gdal.VSIFReadL(1, 1000, f).decode('ASCII') + content = gdal.VSIFReadL(1, 1000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert content.startswith('Integer,Real,Real,Real,String,Real,Real') + assert content.startswith("Integer,Real,Real,Real,String,Real,Real") - f = gdal.VSIFOpenL('/vsimem/transformer_14.csv', 'rb') + f = gdal.VSIFOpenL("/vsimem/transformer_14.csv", "rb") if f is not None: - content = gdal.VSIFReadL(1, 1000, f).decode('ASCII') + 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,""") + 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") - 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 @@ -601,7 +821,7 @@ def test_transformer_14(): def test_transformer_15(): - ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) + ds = gdal.GetDriverByName("MEM").Create("", 6600, 4400) rpc = [ "HEIGHT_OFF=50", "HEIGHT_SCALE=10", @@ -618,56 +838,81 @@ def test_transformer_15(): "SAMP_OFF=3300.0420831968", "SAMP_SCALE=3295.90302088781", ] - ds.SetMetadata(rpc, 'RPC') + ds.SetMetadata(rpc, "RPC") sr = osr.SpatialReference() - sr.SetWellKnownGeogCS('WGS84') - demE179 = gdal.GetDriverByName('GTiff').Create('/vsimem/demE179.tif', 10, 10) + 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 = 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]) + 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']) + tr = gdal.Transformer( + ds, None, ["METHOD=RPC", "RPC_DEM=/vsimem/transformer_15_dem.vrt"] + ) (success, pnt) = tr.TransformPoint(0, 0, 0) - assert success and pnt[0] == pytest.approx(180.02280735469199, abs=1e-7) and pnt[1] == pytest.approx(0.061069145746997976, abs=1e-7) + assert ( + success + and pnt[0] == pytest.approx(180.02280735469199, abs=1e-7) + and pnt[1] == pytest.approx(0.061069145746997976, abs=1e-7) + ) (success, pnt_forward) = tr.TransformPoint(1, pnt[0], pnt[1], 0) - assert success and pnt_forward[0] == pytest.approx(0, abs=0.1) and pnt_forward[1] == pytest.approx(0, abs=0.1), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt_forward[0] == pytest.approx(0, abs=0.1) + and pnt_forward[1] == pytest.approx(0, abs=0.1) + ), "got wrong reverse transform result." (success, pnt_forward) = tr.TransformPoint(1, pnt[0] - 360, pnt[1], 0) - assert success and pnt_forward[0] == pytest.approx(0, abs=0.1) and pnt_forward[1] == pytest.approx(0, abs=0.1), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt_forward[0] == pytest.approx(0, abs=0.1) + and pnt_forward[1] == pytest.approx(0, abs=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']) + 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 pnt[0] == pytest.approx(-180.02313813793387, abs=1e-7) and pnt[1] == pytest.approx(-0.061398913932229765, abs=1e-7) + assert ( + success + and pnt[0] == pytest.approx(-180.02313813793387, abs=1e-7) + and pnt[1] == pytest.approx(-0.061398913932229765, abs=1e-7) + ) (success, pnt_forward) = tr.TransformPoint(1, pnt[0], pnt[1], 0) - assert success and pnt_forward[0] == pytest.approx(6600, abs=0.1) and pnt_forward[1] == pytest.approx(4400, abs=0.1), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt_forward[0] == pytest.approx(6600, abs=0.1) + and pnt_forward[1] == pytest.approx(4400, abs=0.1) + ), "got wrong reverse transform result." (success, pnt_forward) = tr.TransformPoint(1, pnt[0] + 360, pnt[1], 0) - assert success and pnt_forward[0] == pytest.approx(6600, abs=0.1) and pnt_forward[1] == pytest.approx(4400, abs=0.1), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt_forward[0] == pytest.approx(6600, abs=0.1) + and pnt_forward[1] == pytest.approx(4400, abs=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") - 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 @@ -676,37 +921,50 @@ def test_transformer_15(): 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') + 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') + content = gdal.VSIFReadL(1, 10000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert ('<MaxErrorForward>6.05</MaxErrorForward>' in content and \ - '<MaxErrorReverse>0.1</MaxErrorReverse>' in content and \ - '<MaxErrorForward>0.0001</MaxErrorForward>' in content and \ - '<MaxErrorReverse>6.1</MaxErrorReverse>' in content) - ds = gdal.Translate('', '/vsimem/transformer_16.vrt', format='MEM') + assert ( + "<MaxErrorForward>6.05</MaxErrorForward>" in content + and "<MaxErrorReverse>0.1</MaxErrorReverse>" in content + and "<MaxErrorForward>0.0001</MaxErrorForward>" in content + and "<MaxErrorReverse>6.1</MaxErrorReverse>" 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') + 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') + 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']) + 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) + ds = gdal.GetDriverByName("MEM").Create("", 360, 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) @@ -719,14 +977,18 @@ def test_transformer_longlat_wrap_outside_180(): assert pnt[1] == pytest.approx(0.5, abs=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']) + 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) @@ -738,58 +1000,81 @@ def test_transformer_no_reverse_method(): (success, pnt) = tr.TransformPoint(1, 2, 49) assert not success + ############################################################################### # Test precision of GCP based transformer with thin plate splines and lots of GCPs (2115). + def test_transformer_tps_precision(): - ds = gdal.Open('data/gcps_2115.vrt') - tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) - assert tr, 'tps transformation could not be computed' + ds = gdal.Open("data/gcps_2115.vrt") + tr = gdal.Transformer(ds, None, ["METHOD=GCP_TPS"]) + assert tr, "tps transformation could not be computed" success = True maxDiffResult = 0.0 for gcp in ds.GetGCPs(): (s, result) = tr.TransformPoint(0, gcp.GCPPixel, gcp.GCPLine) success &= s - diffResult = math.sqrt((gcp.GCPX - result[0])**2 + (gcp.GCPY -result[1])**2) + diffResult = math.sqrt( + (gcp.GCPX - result[0]) ** 2 + (gcp.GCPY - result[1]) ** 2 + ) maxDiffResult = max(maxDiffResult, diffResult) - assert success, 'at least one point could not be transformed' - assert maxDiffResult < 1e-3, 'at least one transformation exceeds the error bound' + assert success, "at least one point could not be transformed" + assert maxDiffResult < 1e-3, "at least one transformation exceeds the error bound" ############################################################################### def test_transformer_image_no_srs(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) - tr = gdal.Transformer(ds, None, ['COORDINATE_OPERATION=+proj=unitconvert +xy_in=1 +xy_out=2']) + tr = gdal.Transformer( + ds, None, ["COORDINATE_OPERATION=+proj=unitconvert +xy_in=1 +xy_out=2"] + ) assert tr (success, pnt) = tr.TransformPoint(0, 10, 20, 0) assert success assert pnt[0] == pytest.approx(50), pnt assert pnt[1] == pytest.approx(-100), pnt + ############################################################################### # Test RPC_DEM_SRS by adding vertical component egm 96 geoid + def test_transformer_dem_overrride_srs(): - ds = gdal.Open('data/rpc.vrt') - ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1) + ds = gdal.Open("data/rpc.vrt") + 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', 'RPC_DEM_SRS=EPSG:32652+5773']) + tr = gdal.Transformer( + ds, + None, + [ + "METHOD=RPC", + "RPC_HEIGHT_SCALE=2", + "RPC_DEM=/vsimem/dem.tif", + "RPC_DEM_SRS=EPSG:32652+5773", + ], + ) (success, pnt) = tr.TransformPoint(0, 0.5, 0.5, 0) - assert success and pnt[0] == pytest.approx(125.64813723085801, abs=1e-4) and pnt[1] == pytest.approx(39.869345977927146, abs=1e-4), \ - 'got wrong forward transform result.' + assert ( + success + and pnt[0] == pytest.approx(125.64813723085801, abs=1e-4) + and pnt[1] == pytest.approx(39.869345977927146, abs=1e-4) + ), "got wrong forward transform result." (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) - assert success and pnt[0] == pytest.approx(0.5, abs=0.05) and pnt[1] == pytest.approx(0.5, abs=0.05), \ - 'got wrong reverse transform result.' + assert ( + success + and pnt[0] == pytest.approx(0.5, abs=0.05) + and pnt[1] == pytest.approx(0.5, abs=0.05) + ), "got wrong reverse transform result." - gdal.Unlink('/vsimem/dem.tif') + gdal.Unlink("/vsimem/dem.tif") diff --git a/autotest/gcore/virtualmem.py b/autotest/gcore/virtualmem.py index 6261fcf4f5c9..6946377159b9 100755 --- a/autotest/gcore/virtualmem.py +++ b/autotest/gcore/virtualmem.py @@ -31,20 +31,22 @@ import sys -from osgeo import gdal import pytest +from osgeo import gdal + # All tests will be skipped if numpy unavailable or SKIP_VIRTUALMEM is set. -numpy = pytest.importorskip('numpy') -pytestmark = pytest.mark.skipif(gdal.GetConfigOption('SKIP_VIRTUALMEM'), - reason='SKIP_VIRTUALMEM is set in config') +numpy = pytest.importorskip("numpy") +pytestmark = pytest.mark.skipif( + gdal.GetConfigOption("SKIP_VIRTUALMEM"), reason="SKIP_VIRTUALMEM is set in config" +) ############################################################################### # Test linear and tiled virtual mem interfaces in read-only mode def test_virtualmem_1(): - ds = gdal.Open('../gdrivers/data/small_world.tif') + ds = gdal.Open("../gdrivers/data/small_world.tif") bufxsize = 400 bufysize = 128 tilexsize = 128 @@ -53,22 +55,115 @@ def test_virtualmem_1(): 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) + 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'): + 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) + 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) + 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) @@ -83,14 +178,45 @@ def test_virtualmem_1(): 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] + 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] + 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 @@ -104,9 +230,9 @@ def test_virtualmem_1(): ############################################################################### # Test write mode -@pytest.mark.skipif(sys.platform != 'linux', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "linux", reason="Incorrect platform") def test_virtualmem_2(): - ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 1) + ds = gdal.GetDriverByName("MEM").Create("", 100, 100, 1) ar = ds.GetVirtualMemArray(gdal.GF_Write) ar.fill(255) ar = None @@ -120,10 +246,10 @@ def test_virtualmem_2(): ############################################################################### # Test virtual mem auto with a raw driver -@pytest.mark.skipif(sys.platform != 'linux', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "linux", reason="Incorrect platform") def test_virtualmem_3(): - for tmpfile in ['tmp/virtualmem_3.img', '/vsimem/virtualmem_3.img']: - ds = gdal.GetDriverByName('EHdr').Create(tmpfile, 400, 300, 2) + 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): @@ -149,19 +275,21 @@ def test_virtualmem_3(): ar2 = None ds = None - gdal.GetDriverByName('EHdr').Delete(tmpfile) + gdal.GetDriverByName("EHdr").Delete(tmpfile) ############################################################################### # Test virtual mem auto with GTiff -@pytest.mark.skipif(sys.platform != 'linux', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "linux", reason="Incorrect platform") def test_virtualmem_4(): - tmpfile = 'tmp/virtualmem_4.tif' - for option in ['INTERLEAVE=PIXEL', 'INTERLEAVE=BAND']: + 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]) + 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: + if gdal.GetLastErrorMsg().find("mmap() failed") >= 0: ar1 = None ds = None pytest.skip() @@ -204,4 +332,4 @@ def test_virtualmem_4(): ar2 = None ds = None - gdal.GetDriverByName('GTiff').Delete(tmpfile) + gdal.GetDriverByName("GTiff").Delete(tmpfile) diff --git a/autotest/gcore/vrt_read.py b/autotest/gcore/vrt_read.py index 9291023effeb..e69e85abbaf7 100755 --- a/autotest/gcore/vrt_read.py +++ b/autotest/gcore/vrt_read.py @@ -34,52 +34,53 @@ import shutil import struct +import gdaltest import pytest +import test_cli_utilities -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) + ("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', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('VRT') +@pytest.mark.require_driver("VRT") def test_vrt_open(filename, checksum): - ut = gdaltest.GDALTest('VRT', filename, 1, checksum) + ut = gdaltest.GDALTest("VRT", filename, 1, checksum) ut.testOpen() ############################################################################### # The VRT references a non existing TIF file -@pytest.mark.parametrize('filename', ['data/idontexist.vrt', 'data/idontexist2.vrt']) + +@pytest.mark.parametrize("filename", ["data/idontexist.vrt", "data/idontexist2.vrt"]) def test_vrt_read_non_existing_source(filename): ds = gdal.Open(filename) @@ -94,6 +95,7 @@ def test_vrt_read_non_existing_source(filename): ds.GetRasterBand(1).GetMetadata() ds.GetGCPs() + ############################################################################### # Test init of band data in case of cascaded VRT (ticket #2867) @@ -102,43 +104,44 @@ 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 = 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 = 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') + 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) + 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) + 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') + 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(): - np = pytest.importorskip('numpy') + np = pytest.importorskip("numpy") data = np.zeros((1, 1), np.complex64) - data[0, 0] = 1. + 3.j + data[0, 0] = 1.0 + 3.0j - drv = gdal.GetDriverByName('GTiff') + 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"> + complex_xml = """<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="CFloat32" band="1"> <ComplexSource> <SourceFilename relativeToVRT="1">/vsimem/test.tif</SourceFilename> @@ -148,7 +151,7 @@ def test_vrt_read_4(): </ComplexSource> </VRTRasterBand> </VRTDataset> -''' +""" ds = gdal.Open(complex_xml) scaleddata = ds.GetRasterBand(1).ReadAsArray() @@ -157,8 +160,10 @@ def test_vrt_read_4(): 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') + print( + "scaleddata[0, 0]: %f %f" % (scaleddata[0, 0].real, scaleddata[0, 0].imag) + ) + pytest.fail("did not get expected value") ############################################################################### @@ -167,12 +172,12 @@ def test_vrt_read_4(): 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 = 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') + ds = gdal.Open("/vsimem/vrt_read_5.vrt") gcps = ds.GetGCPs() assert len(gcps) == 2 and ds.GetGCPCount() == 2 @@ -187,9 +192,9 @@ def test_vrt_read_5(): assert ds.GetGCPProjection().find("WGS 84") != -1 band = ds.GetRasterBand(1) - assert band.GetDescription() == 'MyDescription' + assert band.GetDescription() == "MyDescription" - assert band.GetUnitType() == 'MyUnit' + assert band.GetUnitType() == "MyUnit" assert band.GetOffset() == 1 @@ -197,7 +202,7 @@ def test_vrt_read_5(): assert band.GetRasterColorInterpretation() == gdal.GCI_PaletteIndex - assert band.GetCategoryNames() == ['Cat1', 'Cat2'] + assert band.GetCategoryNames() == ["Cat1", "Cat2"] ct = band.GetColorTable() assert ct.GetColorEntry(0) == (0, 0, 0, 255) @@ -207,11 +212,17 @@ def test_vrt_read_5(): assert band.GetMinimum() == 2 - assert band.GetMetadata() == {'STATISTICS_MEAN': '1', 'STATISTICS_MINIMUM': '2', 'STATISTICS_MAXIMUM': '0', 'STATISTICS_STDDEV': '3'} + assert band.GetMetadata() == { + "STATISTICS_MEAN": "1", + "STATISTICS_MINIMUM": "2", + "STATISTICS_MAXIMUM": "0", + "STATISTICS_STDDEV": "3", + } ds = None - gdal.Unlink('/vsimem/vrt_read_5.vrt') + gdal.Unlink("/vsimem/vrt_read_5.vrt") + ############################################################################### # Test GetMinimum() and GetMaximum() @@ -219,25 +230,26 @@ def test_vrt_read_5(): 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) + 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' + 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' + 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') + gdal.GetDriverByName("GTiff").Delete("/vsimem/vrt_read_6.tif") + gdal.GetDriverByName("VRT").Delete("/vsimem/vrt_read_6.vrt") + ############################################################################### # Test GDALOpen() anti-recursion mechanism @@ -247,7 +259,8 @@ def test_vrt_read_7(): filename = "/vsimem/vrt_read_7.vrt" - content = """<VRTDataset rasterXSize="20" rasterYSize="20"> + content = ( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">%s</SourceFilename> @@ -256,7 +269,9 @@ def test_vrt_read_7(): <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""" % filename +</VRTDataset>""" + % filename + ) gdal.FileFromMemBuffer(filename, content) ds = gdal.Open(filename) @@ -264,15 +279,16 @@ def test_vrt_read_7(): assert ds.GetRasterBand(1).Checksum() == 0 gdal.Unlink(filename) + ############################################################################### # 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) + 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() @@ -280,20 +296,21 @@ def test_vrt_read_8(): mem_ds = None vrt_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_8.tif') - gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_8.vrt') + 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) + 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) @@ -301,20 +318,21 @@ def test_vrt_read_9(): mem_ds = None vrt_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_9.tif') - gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_9.vrt') + 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) + 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() @@ -322,42 +340,45 @@ def test_vrt_read_10(): mem_ds = None vrt_ds = None - f = gdal.VSIFOpenL('/vsimem/vrt_read_10.vrt', 'rb') - content = gdal.VSIFReadL(1, 10000, f).decode('ascii') + 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 + assert "<Histograms>" in content # Single source optimization for i in range(2): - gdal.FileFromMemBuffer('/vsimem/vrt_read_10.vrt', - """<VRTDataset rasterXSize="20" rasterYSize="20"> + 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>""") + </VRTDataset>""", + ) - ds = gdal.Open('/vsimem/vrt_read_10.vrt') + 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') + f = gdal.VSIFOpenL("/vsimem/vrt_read_10.vrt", "rb") + content = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert '<Histograms>' in content + 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"> + 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> @@ -366,23 +387,25 @@ def test_vrt_read_10(): <SourceFilename relativeToVRT="1">vrt_read_10.tif</SourceFilename> </SimpleSource> </VRTRasterBand> - </VRTDataset>""") + </VRTDataset>""", + ) - ds = gdal.Open('/vsimem/vrt_read_10.vrt') + 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') + f = gdal.VSIFOpenL("/vsimem/vrt_read_10.vrt", "rb") + content = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert '<Histograms>' in content + assert "<Histograms>" in content + + gdal.GetDriverByName("GTiff").Delete("/vsimem/vrt_read_10.tif") + gdal.GetDriverByName("VRT").Delete("/vsimem/vrt_read_10.vrt") - 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 @@ -394,19 +417,20 @@ def test_vrt_read_11(): pytest.skip() try: - os.remove('tmp/byte.vrt') - print('Removed tmp/byte.vrt. Was not supposed to exist...') + 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') + os.symlink(os.path.join(os.getcwd(), "data/byte.vrt"), "tmp/byte.vrt") - ds = gdal.Open('tmp/byte.vrt') + ds = gdal.Open("tmp/byte.vrt") - os.remove('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 @@ -418,19 +442,20 @@ def test_vrt_read_12(): pytest.skip() try: - os.remove('tmp/byte.vrt') - print('Removed tmp/byte.vrt. Was not supposed to exist...') + 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') + os.symlink("../data/byte.vrt", "tmp/byte.vrt") - ds = gdal.Open('tmp/byte.vrt') + ds = gdal.Open("tmp/byte.vrt") - os.remove('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 @@ -441,36 +466,38 @@ def test_vrt_read_13(): pytest.skip() try: - os.remove('tmp/byte.vrt') - print('Removed tmp/byte.vrt. Was not supposed to exist...') + 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...') + 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') + os.symlink("../data/byte.vrt", "tmp/byte.vrt") + os.symlink("../tmp/byte.vrt", "tmp/other_byte.vrt") - ds = gdal.Open('tmp/other_byte.vrt') + ds = gdal.Open("tmp/other_byte.vrt") - os.remove('tmp/other_byte.vrt') - os.remove('tmp/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) + 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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="4" rasterYSize="4"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">/vsimem/vrt_read_14.tif</SourceFilename> @@ -480,24 +507,27 @@ def test_vrt_read_14(): <DstRect xOff="0" yOff="0" xSize="4" ySize="4" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) vrt_stats = vrt_ds.GetRasterBand(1).ComputeStatistics(False) mem_ds = None vrt_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_14.tif') + 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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -514,18 +544,21 @@ def test_vrt_read_15(): <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <ComplexSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -542,18 +575,21 @@ def test_vrt_read_16(): <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <AveragedSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -563,30 +599,34 @@ def test_vrt_read_17(): <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </AveragedSource> </VRTRasterBand> -</VRTDataset>""") +</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') + 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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <AveragedSource> <SourceFilename relativeToVRT="0" shared="0">data/byte.tif</SourceFilename> @@ -594,16 +634,19 @@ def test_vrt_read_19(): <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> </AveragedSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) - vrt2_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + 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>""") +</VRTDataset>""" + ) cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 4672 @@ -615,14 +658,16 @@ def test_vrt_read_19(): ############################################################################### # 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') + 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"> + 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> @@ -632,8 +677,10 @@ def test_vrt_read_20(): <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> - </VRTDataset>""") - open('tmp/byte2.vrt', 'wt').write("""<VRTDataset rasterXSize="20" rasterYSize="20"> + </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> @@ -657,11 +704,21 @@ def test_vrt_read_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']: +</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) @@ -671,15 +728,17 @@ def test_vrt_read_20(): def test_vrt_read_21(): - ds = gdal.Open('data/byte.tif') + 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 = gdal.GetDriverByName("GTiff").Create("/vsimem/byte.tif", 400, 400) ds.WriteRaster(0, 0, 400, 400, data) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) ds = None - gdal.FileFromMemBuffer('/vsimem/vrt_read_21.vrt', """<VRTDataset rasterXSize="800" rasterYSize="800"> + gdal.FileFromMemBuffer( + "/vsimem/vrt_read_21.vrt", + """<VRTDataset rasterXSize="800" rasterYSize="800"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> @@ -689,13 +748,16 @@ def test_vrt_read_21(): <DstRect xOff="300" yOff="400" xSize="200" ySize="250" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") - ds = gdal.Open('/vsimem/vrt_read_21.vrt') +</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"> + gdal.FileFromMemBuffer( + "/vsimem/vrt_read_21.vrt", + """<VRTDataset rasterXSize="800" rasterYSize="800"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> @@ -715,11 +777,12 @@ def test_vrt_read_21(): <ScaleOffset>10</ScaleOffset> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") - ds = gdal.Open('/vsimem/vrt_read_21.vrt') +</VRTDataset>""", + ) + ds = gdal.Open("/vsimem/vrt_read_21.vrt") assert ds.GetRasterBand(1).GetOverviewCount() == 1 - ds = gdal.Open('/vsimem/vrt_read_21.vrt') + 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) @@ -731,9 +794,11 @@ def test_vrt_read_21(): 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) + 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 = 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() @@ -741,7 +806,7 @@ def test_vrt_read_21(): assert cs == ref_cs assert cs2 == ref_cs2 - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) expected_cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs2 = ds.GetRasterBand(2).GetOverview(0).Checksum() ds = None @@ -749,9 +814,10 @@ def test_vrt_read_21(): 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') + 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 @@ -759,15 +825,16 @@ def test_vrt_read_21(): def test_vrt_read_22(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") data = ds.ReadRaster() ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/byte.tif', 20, 20) + 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"> + ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> @@ -777,7 +844,8 @@ def test_vrt_read_22(): <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) assert ds.GetRasterBand(1).GetMinimum() == 63 assert ds.GetRasterBand(1).GetMaximum() == 63 @@ -787,10 +855,11 @@ def test_vrt_read_22(): assert ds.GetRasterBand(1).ComputeStatistics(False) == [63.0, 63.0, 63.0, 0.0] data = ds.ReadRaster() - got = struct.unpack('B' * 20 * 20, data) + got = struct.unpack("B" * 20 * 20, data) assert got[0] == 63 - ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> @@ -800,7 +869,8 @@ def test_vrt_read_22(): <SourceBand>1</SourceBand> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) assert ds.GetRasterBand(1).GetMinimum() == 63 assert ds.GetRasterBand(1).GetMaximum() == 63 @@ -809,7 +879,8 @@ def test_vrt_read_22(): assert ds.GetRasterBand(1).ComputeStatistics(False) == [63.0, 63.0, 63.0, 0.0] - ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> @@ -820,7 +891,8 @@ def test_vrt_read_22(): <ScaleOffset>10</ScaleOffset> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) assert ds.GetRasterBand(1).GetMinimum() is None assert ds.GetRasterBand(1).GetMaximum() is None @@ -829,8 +901,9 @@ def test_vrt_read_22(): 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') + 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 @@ -839,45 +912,62 @@ def test_vrt_read_22(): def test_vrt_read_23(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrt_read_23.tif', 2, 1) + 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"> + 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) +</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) + 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') + 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 = 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"> + 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) +</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) + 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') + gdal.Unlink("/vsimem/vrt_read_23.tif") + ############################################################################### # Test floating point rounding issues when the VRT does a zoom-in @@ -885,11 +975,11 @@ def test_vrt_read_23(): def test_vrt_read_24(): - ds = gdal.Open('data/zoom_in.vrt') + ds = gdal.Open("data/zoom_in.vrt") data = ds.ReadRaster(34, 5, 66, 87) ds = None - ds = gdal.GetDriverByName('MEM').Create('', 66, 87) + ds = gdal.GetDriverByName("MEM").Create("", 66, 87) ds.WriteRaster(0, 0, 66, 87, data) cs = ds.GetRasterBand(1).Checksum() ds = None @@ -899,6 +989,7 @@ def test_vrt_read_24(): assert cs == 46612 ds = None + ############################################################################### # Test GetDataCoverageStatus() @@ -906,10 +997,12 @@ def test_vrt_read_24(): def test_vrt_read_25(): import ogrtest + if not ogrtest.have_geos(): pytest.skip() - ds = gdal.Open("""<VRTDataset rasterXSize="2000" rasterYSize="200"> + ds = gdal.Open( + """<VRTDataset rasterXSize="2000" rasterYSize="200"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -930,7 +1023,8 @@ def test_vrt_read_25(): <DstRect xOff="1010" yOff="30" xSize="10" ySize="20" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(0, 0, 20, 20) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA and pct == 100.0 @@ -942,16 +1036,22 @@ def test_vrt_read_25(): 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 + 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"> + vrt_ds = gdal.Open( + """<VRTDataset rasterXSize="22" rasterYSize="22"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -961,23 +1061,26 @@ def test_vrt_read_26(): <DstRect xOff="0" yOff="0" xSize="22" ySize="22" /> </SimpleSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) full_data = vrt_ds.GetRasterBand(1).ReadRaster(0, 0, 22, 22) - full_data = struct.unpack('B' * 22 * 22, full_data) + 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) + 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') + gdal.Open("data/empty_gcplist.vrt") + ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1551 @@ -986,22 +1089,25 @@ def test_vrt_read_27(): def test_vrt_read_28(): with gdaltest.error_handler(): - ds = gdal.Open('<VRTDataset rasterXSize="1 "rasterYSize="1"><VRTRasterBand band="-2147483648"><SimpleSource></SimpleSource></VRTRasterBand></VRTDataset>') + 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 (#6939) + def test_vrt_read_29(): - f = open('data/byte.tif') + 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') + gdal.Translate("tmp/vrt_read_29.tif", "data/byte.tif") vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> @@ -1053,7 +1159,8 @@ def test_vrt_read_29(): lst = sorted(gdaltest.get_opened_files()) assert len(lst) == len(lst_before) + 1 - gdal.Unlink('tmp/vrt_read_29.tif') + gdal.Unlink("tmp/vrt_read_29.tif") + ############################################################################### # Check VRT reading with DatasetRasterIO @@ -1061,90 +1168,102 @@ def test_vrt_read_29(): def test_vrt_read_30(): - ds = gdal.Open("""<VRTDataset rasterXSize="2" rasterYSize="2"> + 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>""") +</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) + 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 + gdal.FileFromMemBuffer( + "/vsimem/in.asc", + """ncols 2 nrows 2 xllcorner 0 yllcorner 0 dx 1 dy 1 -255 1 -254 256""") +254 256""", + ) - ds = gdal.Translate('', '/vsimem/in.asc', outputType=gdal.GDT_Byte, format='VRT') + 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) + 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) + got = struct.unpack("f" * 2 * 2, data) assert got == (0, 1, 254, 255) ds = None - gdal.Unlink('/vsimem/in.asc') + 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') + 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') + 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() + 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') + 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' + assert ( + "-3.402823466385289" not in vrt_content + ), "did not get expected nodata in rewritten VRT" - if nodata != -3.4028234663852886e+38: + if nodata != -3.4028234663852886e38: print("%.18g" % nodata) - pytest.fail('did not get expected nodata') + pytest.fail("did not get expected nodata") - assert stats == [-3.0, 5.0, 1.0, 4.0], 'did not get expected stats' + 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') + ds = gdal.Open("data/vrt_subpixel_offset.vrt") cs = ds.GetRasterBand(1).Checksum() assert cs == 4849 @@ -1153,9 +1272,10 @@ def test_vrt_subpixel_offset(): # 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') + ds = gdal.Open("data/dstsize_larger_than_source.vrt") cs = ds.GetRasterBand(1).Checksum() assert cs == 33273 @@ -1207,7 +1327,7 @@ def test_vrt_no_explicit_dataAxisToSRSAxisMapping(): </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) - assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2,1] + assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] ds = None @@ -1226,7 +1346,7 @@ def test_vrt_explicit_dataAxisToSRSAxisMapping_1_2(): </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) - assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1,2] + assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1, 2] ds = None @@ -1265,8 +1385,12 @@ def test_vrt_shared_no_proxy_pool(): after = gdaltest.get_opened_files() - if len(before) != len(after) and (gdaltest.is_travis_branch('trusty_clang') or gdaltest.is_travis_branch('trusty_32bit') or gdaltest.is_travis_branch('ubuntu_1604')): - pytest.xfail('Mysterious failure') + if len(before) != len(after) and ( + gdaltest.is_travis_branch("trusty_clang") + or gdaltest.is_travis_branch("trusty_32bit") + or gdaltest.is_travis_branch("ubuntu_1604") + ): + pytest.xfail("Mysterious failure") assert len(before) == len(after) @@ -1289,21 +1413,21 @@ def test_vrt_invalid_source_band(): def test_vrt_protocol(): with gdaltest.error_handler(): - assert not gdal.Open('vrt://') - assert not gdal.Open('vrt://i_do_not_exist') - assert not gdal.Open('vrt://i_do_not_exist?') + assert not gdal.Open("vrt://") + assert not gdal.Open("vrt://i_do_not_exist") + assert not gdal.Open("vrt://i_do_not_exist?") - ds = gdal.Open('vrt://data/byte.tif') + ds = gdal.Open("vrt://data/byte.tif") assert ds.RasterCount == 1 assert ds.GetRasterBand(1).Checksum() == 4672 with gdaltest.error_handler(): - assert not gdal.Open('vrt://data/byte.tif?foo=bar') - assert not gdal.Open('vrt://data/byte.tif?bands=foo') - assert not gdal.Open('vrt://data/byte.tif?bands=0') - assert not gdal.Open('vrt://data/byte.tif?bands=2') + assert not gdal.Open("vrt://data/byte.tif?foo=bar") + assert not gdal.Open("vrt://data/byte.tif?bands=foo") + assert not gdal.Open("vrt://data/byte.tif?bands=0") + assert not gdal.Open("vrt://data/byte.tif?bands=2") - ds = gdal.Open('vrt://data/byte.tif?bands=1,mask,1') + ds = gdal.Open("vrt://data/byte.tif?bands=1,mask,1") assert ds.RasterCount == 3 assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(2).Checksum() == 4873 @@ -1320,7 +1444,7 @@ def test_vrt_source_no_dstrect(): </VRTRasterBand> </VRTDataset> """ - filename = '/vsimem/out.tif' + filename = "/vsimem/out.tif" ds = gdal.Translate(filename, vrt_text) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None @@ -1329,7 +1453,9 @@ def test_vrt_source_no_dstrect(): def test_vrt_dataset_rasterio_recursion_detection(): - gdal.FileFromMemBuffer('/vsimem/test.vrt', """<VRTDataset rasterXSize="20" rasterYSize="20"> + gdal.FileFromMemBuffer( + "/vsimem/test.vrt", + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -1343,12 +1469,14 @@ def test_vrt_dataset_rasterio_recursion_detection(): <SourceBand>1</SourceBand> </Overview> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""", + ) - ds = gdal.Open('/vsimem/test.vrt') + ds = gdal.Open("/vsimem/test.vrt") with gdaltest.error_handler(): - ds.ReadRaster(0,0,20,20,10,10) - gdal.Unlink('/vsimem/test.vrt') + ds.ReadRaster(0, 0, 20, 20, 10, 10) + gdal.Unlink("/vsimem/test.vrt") + def test_vrt_dataset_rasterio_recursion_detection_does_not_trigger(): @@ -1376,17 +1504,17 @@ def test_vrt_dataset_rasterio_recursion_detection_does_not_trigger(): </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) - got_data = ds.ReadRaster(0,0,50,50,25,25,resample_alg=gdal.GRIORA_Cubic) - ds = gdal.Open('data/rgbsmall.tif') - ref_data = ds.ReadRaster(0,0,50,50,25,25,resample_alg=gdal.GRIORA_Cubic) + got_data = ds.ReadRaster(0, 0, 50, 50, 25, 25, resample_alg=gdal.GRIORA_Cubic) + ds = gdal.Open("data/rgbsmall.tif") + ref_data = ds.ReadRaster(0, 0, 50, 50, 25, 25, resample_alg=gdal.GRIORA_Cubic) assert got_data == ref_data def test_vrt_dataset_rasterio_non_nearest_resampling_source_with_ovr(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src.tif', 10, 10, 3) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src.tif", 10, 10, 3) ds.GetRasterBand(1).Fill(255) - ds.BuildOverviews('NONE', [2]) + ds.BuildOverviews("NONE", [2]) ds.GetRasterBand(1).GetOverview(0).Fill(10) ds = None @@ -1424,22 +1552,22 @@ def test_vrt_dataset_rasterio_non_nearest_resampling_source_with_ovr(): </VRTDataset>""" ds = gdal.Open(vrt_text) - got_data = ds.ReadRaster(0,0,10,10,4,4) - got_data = struct.unpack('B' * 4 * 4 * 3, got_data) + got_data = ds.ReadRaster(0, 0, 10, 10, 4, 4) + got_data = struct.unpack("B" * 4 * 4 * 3, got_data) assert got_data[0] == 10 - got_data = ds.ReadRaster(0,0,10,10,4,4,resample_alg=gdal.GRIORA_Cubic) - got_data = struct.unpack('B' * 4 * 4 * 3, got_data) + got_data = ds.ReadRaster(0, 0, 10, 10, 4, 4, resample_alg=gdal.GRIORA_Cubic) + got_data = struct.unpack("B" * 4 * 4 * 3, got_data) assert got_data[0] == 10 - gdal.Unlink('/vsimem/src.tif') + gdal.Unlink("/vsimem/src.tif") def test_vrt_implicit_ovr_with_hidenodatavalue(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src.tif', 256, 256, 3) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src.tif", 256, 256, 3) ds.GetRasterBand(1).Fill(255) - ds.BuildOverviews('NONE', [2]) + ds.BuildOverviews("NONE", [2]) ds.GetRasterBand(1).GetOverview(0).Fill(10) ds = None @@ -1481,31 +1609,31 @@ def test_vrt_implicit_ovr_with_hidenodatavalue(): ds = gdal.Open(vrt_text) assert ds.GetRasterBand(1).GetOverviewCount() == 1 - got_data = ds.ReadRaster(0,0,256,256,64,64) - got_data = struct.unpack('B' * 64 * 64 * 3, got_data) + got_data = ds.ReadRaster(0, 0, 256, 256, 64, 64) + got_data = struct.unpack("B" * 64 * 64 * 3, got_data) assert got_data[0] == 5 - assert got_data[32*64+32] == 10 + assert got_data[32 * 64 + 32] == 10 - got_data = ds.GetRasterBand(1).ReadRaster(0,0,256,256,64,64) - got_data = struct.unpack('B' * 64 * 64, got_data) + got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256, 64, 64) + got_data = struct.unpack("B" * 64 * 64, got_data) assert got_data[0] == 5 - assert got_data[32*64+32] == 10 + assert got_data[32 * 64 + 32] == 10 - gdal.Unlink('/vsimem/src.tif') + gdal.Unlink("/vsimem/src.tif") def test_vrt_usemaskband(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src1.tif', 3, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src1.tif", 3, 1) ds.GetRasterBand(1).Fill(255) ds.CreateMaskBand(0) - ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1, 1, b'\xff') + ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1, 1, b"\xff") ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src2.tif', 3, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src2.tif", 3, 1) ds.GetRasterBand(1).Fill(127) ds.CreateMaskBand(0) - ds.GetRasterBand(1).GetMaskBand().WriteRaster(1, 0, 1, 1, b'\xff') + ds.GetRasterBand(1).GetMaskBand().WriteRaster(1, 0, 1, 1, b"\xff") ds = None vrt_text = """<VRTDataset rasterXSize="3" rasterYSize="1"> @@ -1545,25 +1673,29 @@ def test_vrt_usemaskband(): </MaskBand> </VRTDataset>""" ds = gdal.Open(vrt_text) - assert struct.unpack('B' * 3, ds.ReadRaster()) == (255, 127, 0) - assert struct.unpack('B' * 3, ds.GetRasterBand(1).GetMaskBand().ReadRaster()) == (255, 255, 0) + assert struct.unpack("B" * 3, ds.ReadRaster()) == (255, 127, 0) + assert struct.unpack("B" * 3, ds.GetRasterBand(1).GetMaskBand().ReadRaster()) == ( + 255, + 255, + 0, + ) - gdal.GetDriverByName('GTiff').Delete('/vsimem/src1.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/src2.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/src1.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/src2.tif") def test_vrt_usemaskband_alpha(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src1.tif', 3, 1, 2) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src1.tif", 3, 1, 2) ds.GetRasterBand(1).Fill(255) - ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1, 1, b'\xff') + ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1, 1, b"\xff") ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) - ds.GetRasterBand(2).WriteRaster(0, 0, 1, 1, b'\xff') + ds.GetRasterBand(2).WriteRaster(0, 0, 1, 1, b"\xff") - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src2.tif', 3, 1, 2) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/src2.tif", 3, 1, 2) ds.GetRasterBand(1).Fill(127) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) - ds.GetRasterBand(2).WriteRaster(1, 0, 1, 1, b'\xff') + ds.GetRasterBand(2).WriteRaster(1, 0, 1, 1, b"\xff") ds = None vrt_text = """<VRTDataset rasterXSize="3" rasterYSize="1"> @@ -1602,11 +1734,11 @@ def test_vrt_usemaskband_alpha(): </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) - assert struct.unpack('B' * 3, ds.GetRasterBand(1).ReadRaster()) == (255, 127, 0) - assert struct.unpack('B' * 3, ds.GetRasterBand(2).ReadRaster()) == (255, 255, 0) + assert struct.unpack("B" * 3, ds.GetRasterBand(1).ReadRaster()) == (255, 127, 0) + assert struct.unpack("B" * 3, ds.GetRasterBand(2).ReadRaster()) == (255, 255, 0) - gdal.GetDriverByName('GTiff').Delete('/vsimem/src1.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/src2.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/src1.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/src2.tif") def test_vrt_check_dont_open_unneeded_source(): @@ -1629,14 +1761,16 @@ def test_vrt_check_dont_open_unneeded_source(): </VRTRasterBand> </VRTDataset>""" - tmpfilename = '/vsimem/tmp.vrt' + tmpfilename = "/vsimem/tmp.vrt" gdal.FileFromMemBuffer(tmpfilename, vrt) try: - ds = gdal.Translate('', tmpfilename, options = '-of MEM -srcwin 0 0 10 10') + ds = gdal.Translate("", tmpfilename, options="-of MEM -srcwin 0 0 10 10") assert ds is not None with gdaltest.error_handler(): - ds = gdal.Translate('', tmpfilename, options = '-of MEM -srcwin 0 0 10.1 10.1') + ds = gdal.Translate( + "", tmpfilename, options="-of MEM -srcwin 0 0 10.1 10.1" + ) assert ds is None finally: gdal.Unlink(tmpfilename) @@ -1664,14 +1798,16 @@ def test_vrt_check_dont_open_unneeded_source_with_complex_source_nodata(): </VRTRasterBand> </VRTDataset>""" - tmpfilename = '/vsimem/tmp.vrt' + tmpfilename = "/vsimem/tmp.vrt" gdal.FileFromMemBuffer(tmpfilename, vrt) try: - ds = gdal.Translate('', tmpfilename, options = '-of MEM -srcwin 0 0 10 10') + ds = gdal.Translate("", tmpfilename, options="-of MEM -srcwin 0 0 10 10") assert ds is not None with gdaltest.error_handler(): - ds = gdal.Translate('', tmpfilename, options = '-of MEM -srcwin 0 0 10.1 10.1') + ds = gdal.Translate( + "", tmpfilename, options="-of MEM -srcwin 0 0 10.1 10.1" + ) assert ds is None finally: gdal.Unlink(tmpfilename) @@ -1679,7 +1815,7 @@ def test_vrt_check_dont_open_unneeded_source_with_complex_source_nodata(): def test_vrt_nodata_and_implicit_ovr_recursion_issue(): - """ Tests scenario https://github.com/OSGeo/gdal/issues/4620#issuecomment-938636360 """ + """Tests scenario https://github.com/OSGeo/gdal/issues/4620#issuecomment-938636360""" vrt = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> @@ -1693,7 +1829,7 @@ def test_vrt_nodata_and_implicit_ovr_recursion_issue(): <OverviewList resampling="average">2</OverviewList> </VRTDataset>""" - tmpfilename = '/vsimem/tmp.vrt' + tmpfilename = "/vsimem/tmp.vrt" with gdaltest.tempfile(tmpfilename, vrt): ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1152 @@ -1701,23 +1837,23 @@ def test_vrt_nodata_and_implicit_ovr_recursion_issue(): def test_vrt_statistics_and_implicit_ovr_recursion_issue(): - """ Tests scenario https://github.com/OSGeo/gdal/issues/4661 """ + """Tests scenario https://github.com/OSGeo/gdal/issues/4661""" - gdal.Translate('/vsimem/test.tif', 'data/uint16.tif', width = 2048) - vrt_ds = gdal.Translate('', '/vsimem/test.tif', format='VRT') - with gdaltest.config_option('VRT_VIRTUAL_OVERVIEWS', 'YES'): - vrt_ds.BuildOverviews('NEAR', [2, 4]) + gdal.Translate("/vsimem/test.tif", "data/uint16.tif", width=2048) + vrt_ds = gdal.Translate("", "/vsimem/test.tif", format="VRT") + with gdaltest.config_option("VRT_VIRTUAL_OVERVIEWS", "YES"): + vrt_ds.BuildOverviews("NEAR", [2, 4]) - stats = vrt_ds.GetRasterBand(1).ComputeStatistics(True) # approx stats - assert gdal.GetLastErrorMsg() == '' + stats = vrt_ds.GetRasterBand(1).ComputeStatistics(True) # approx stats + assert gdal.GetLastErrorMsg() == "" assert stats[0] >= 74 and stats[0] <= 90 - min_max = vrt_ds.GetRasterBand(1).ComputeRasterMinMax(True) # approx stats - assert gdal.GetLastErrorMsg() == '' + min_max = vrt_ds.GetRasterBand(1).ComputeRasterMinMax(True) # approx stats + assert gdal.GetLastErrorMsg() == "" assert min_max[0] >= 74 and min_max[0] <= 90 - hist = vrt_ds.GetRasterBand(1).GetHistogram(True) # approx stats - assert gdal.GetLastErrorMsg() == '' + hist = vrt_ds.GetRasterBand(1).GetHistogram(True) # approx stats + assert gdal.GetLastErrorMsg() == "" assert hist is not None - gdal.GetDriverByName('GTiff').Delete('/vsimem/test.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/test.tif") diff --git a/autotest/gcore/vrtmisc.py b/autotest/gcore/vrtmisc.py index 34bcf766b06f..40a4bd87973e 100755 --- a/autotest/gcore/vrtmisc.py +++ b/autotest/gcore/vrtmisc.py @@ -29,13 +29,13 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import gdaltest import os import shutil import sys -from osgeo import gdal -from osgeo import osr +import gdaltest + +from osgeo import gdal, osr ############################################################################### # Test linear scaling @@ -43,11 +43,12 @@ def test_vrtmisc_1(): - ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255') + 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' + assert cs == 4323, "did not get expected checksum" + ############################################################################### # Test power scaling @@ -55,11 +56,14 @@ def test_vrtmisc_1(): def test_vrtmisc_2(): - ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255 -exponent 2.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' + assert cs == 4159, "did not get expected checksum" + ############################################################################### # Test power scaling (not <SrcMin> <SrcMax> in VRT file) @@ -67,7 +71,8 @@ def test_vrtmisc_2(): def test_vrtmisc_3(): - ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> + ds = gdal.Open( + """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <ComplexSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> @@ -77,11 +82,13 @@ def test_vrtmisc_3(): <DstMax>255</DstMax> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") +</VRTDataset>""" + ) cs = ds.GetRasterBand(1).Checksum() ds = None - assert cs == 4159, 'did not get expected checksum' + assert cs == 4159, "did not get expected checksum" + ############################################################################### # Test multi-band linear scaling with a single -scale occurrence. @@ -90,13 +97,16 @@ def test_vrtmisc_3(): 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') + 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' + 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 @@ -105,13 +115,16 @@ def test_vrtmisc_4(): 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') + 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' + 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 @@ -120,13 +133,18 @@ def test_vrtmisc_5(): 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') + 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' + 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. @@ -135,13 +153,18 @@ def test_vrtmisc_6(): 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') + 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' + 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 @@ -150,13 +173,18 @@ def test_vrtmisc_7(): 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') + 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' + 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 @@ -165,13 +193,18 @@ def test_vrtmisc_8(): 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') + 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' + assert cs1 == 4672, "did not get expected checksum" + assert cs2 == 4159, "did not get expected checksum" + ############################################################################### # Test metadata serialization (#5944) @@ -179,8 +212,9 @@ def test_vrtmisc_9(): def test_vrtmisc_10(): - gdal.FileFromMemBuffer("/vsimem/vrtmisc_10.vrt", - """<VRTDataset rasterXSize="1" rasterYSize="1"> + gdal.FileFromMemBuffer( + "/vsimem/vrtmisc_10.vrt", + """<VRTDataset rasterXSize="1" rasterYSize="1"> <Metadata> <MDI key="foo">bar</MDI> </Metadata> @@ -200,7 +234,8 @@ def test_vrtmisc_10(): </SimpleSource> </VRTRasterBand> </VRTDataset> -""") +""", + ) ds = gdal.Open("/vsimem/vrtmisc_10.vrt", gdal.GA_Update) # to trigger a flush @@ -208,28 +243,29 @@ def test_vrtmisc_10(): 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] == '<some_xml />\n' + assert ds.GetMetadata() == {"foo": "bar"} + assert ds.GetMetadata("some_domain") == {"bar": "baz"} + assert ds.GetMetadata_List("xml:a_xml_domain")[0] == "<some_xml />\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] == '<some_xml />\n' + assert ds.GetMetadata("some_domain") == {"bar": "baz"} + assert ds.GetMetadata_List("xml:a_xml_domain")[0] == "<some_xml />\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 = open("tmp/vrtmisc_11.vrt", "wt") f.write( """<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="Byte" band="1"> @@ -242,7 +278,8 @@ def test_vrtmisc_11(): </SimpleSource> </VRTRasterBand> </VRTDataset> -""") +""" + ) f.close() ds = gdal.Open("tmp/vrtmisc_11.vrt", gdal.GA_Update) @@ -250,20 +287,22 @@ def test_vrtmisc_11(): ds.SetMetadata(ds.GetMetadata()) ds = None - data = open('tmp/vrtmisc_11.vrt', 'rt').read() + data = open("tmp/vrtmisc_11.vrt", "rt").read() gdal.Unlink("tmp/vrtmisc_11.vrt") assert '<SourceFilename relativeToVRT="1">../data/byte.tif</SourceFilename>' in data + ############################################################################### # Test set/delete nodata def test_vrtmisc_12(): - gdal.FileFromMemBuffer("/vsimem/vrtmisc_12.vrt", - """<VRTDataset rasterXSize="1" rasterYSize="1"> + gdal.FileFromMemBuffer( + "/vsimem/vrtmisc_12.vrt", + """<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">foo.tif</SourceFilename> @@ -274,7 +313,8 @@ def test_vrtmisc_12(): </SimpleSource> </VRTRasterBand> </VRTDataset> -""") +""", + ) ds = gdal.Open("/vsimem/vrtmisc_12.vrt", gdal.GA_Update) ds.GetRasterBand(1).SetNoDataValue(123) @@ -291,15 +331,17 @@ def test_vrtmisc_12(): 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' + 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 @@ -307,31 +349,46 @@ def test_vrtmisc_13(): 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 = 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') + 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 ('<SrcRect xOff="0" yOff="0" xSize="123456789" ySize="1"' in content and \ - '<DstRect xOff="0" yOff="0" xSize="123456789" ySize="1"' in content) - - src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtmisc_14_src.tif', 1, 123456789, options=['SPARSE_OK=YES', 'TILED=YES']) - gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtmisc_14.vrt', src_ds) + assert ( + '<SrcRect xOff="0" yOff="0" xSize="123456789" ySize="1"' in content + and '<DstRect xOff="0" yOff="0" xSize="123456789" ySize="1"' in content + ) + + src_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/vrtmisc_14_src.tif", + 1, + 123456789, + 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') + 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 ('<SrcRect xOff="0" yOff="0" xSize="1" ySize="123456789"' in content and \ - '<DstRect xOff="0" yOff="0" xSize="1" ySize="123456789"' in content) + assert ( + '<SrcRect xOff="0" yOff="0" xSize="1" ySize="123456789"' in content + and '<DstRect xOff="0" yOff="0" xSize="1" ySize="123456789"' in content + ) + ############################################################################### # Test CreateCopy() preserve SIGNEDBYTE @@ -339,11 +396,17 @@ def test_vrtmisc_14(): def test_vrtmisc_15(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtmisc_15.tif', 1, 1, options=['PIXELTYPE=SIGNEDBYTE']) - out_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) - assert out_ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE' + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/vrtmisc_15.tif", 1, 1, options=["PIXELTYPE=SIGNEDBYTE"] + ) + out_ds = gdal.GetDriverByName("VRT").CreateCopy("", ds) + assert ( + out_ds.GetRasterBand(1).GetMetadataItem("PIXELTYPE", "IMAGE_STRUCTURE") + == "SIGNEDBYTE" + ) ds = None - gdal.Unlink('/vsimem/vrtmisc_15.tif') + gdal.Unlink("/vsimem/vrtmisc_15.tif") + ############################################################################### # Test rounding to closest int for coordinates @@ -351,9 +414,12 @@ def test_vrtmisc_15(): def test_vrtmisc_16(): - gdal.BuildVRT('/vsimem/vrtmisc_16.vrt', ['data/vrtmisc16_tile1.tif', 'data/vrtmisc16_tile2.tif']) - fp = gdal.VSIFOpenL('/vsimem/vrtmisc_16.vrt', 'rb') - content = gdal.VSIFReadL(1, 100000, fp).decode('latin1') + gdal.BuildVRT( + "/vsimem/vrtmisc_16.vrt", + ["data/vrtmisc16_tile1.tif", "data/vrtmisc16_tile2.tif"], + ) + fp = gdal.VSIFOpenL("/vsimem/vrtmisc_16.vrt", "rb") + content = gdal.VSIFReadL(1, 100000, fp).decode("latin1") gdal.VSIFCloseL(fp) assert '<SrcRect xOff="0" yOff="0" xSize="952" ySize="1189"' in content @@ -361,14 +427,18 @@ def test_vrtmisc_16(): assert '<SrcRect xOff="0" yOff="0" xSize="494" ySize="893"' in content assert '<DstRect xOff="1680" yOff="5922" xSize="494" ySize="893"' in content - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrtmisc_16.tif', gdal.Open('/vsimem/vrtmisc_16.vrt')) - ds = gdal.Open('/vsimem/vrtmisc_16.tif') + 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') + gdal.Unlink("/vsimem/vrtmisc_16.tif") + gdal.Unlink("/vsimem/vrtmisc_16.vrt") - gdal.FileFromMemBuffer('/vsimem/vrtmisc_16.vrt', """<VRTDataset rasterXSize="2174" rasterYSize="6815"> + gdal.FileFromMemBuffer( + "/vsimem/vrtmisc_16.vrt", + """<VRTDataset rasterXSize="2174" rasterYSize="6815"> <VRTRasterBand dataType="Byte" band="1"> <NoDataValue>0</NoDataValue> <ComplexSource> @@ -388,13 +458,17 @@ def test_vrtmisc_16(): <NODATA>0</NODATA> </ComplexSource> </VRTRasterBand> -</VRTDataset>""") - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrtmisc_16.tif', gdal.Open('/vsimem/vrtmisc_16.vrt')) - ds = gdal.Open('/vsimem/vrtmisc_16.tif') +</VRTDataset>""", + ) + 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') + gdal.Unlink("/vsimem/vrtmisc_16.tif") + gdal.Unlink("/vsimem/vrtmisc_16.vrt") + ############################################################################### # Check that the serialized xml:VRT doesn't include itself (#6767) @@ -402,14 +476,15 @@ def test_vrtmisc_16(): 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] + 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') + gdal.Unlink("/vsimem/vrtmisc_17.vrt") + + assert "xml:VRT" not in xml_vrt - assert 'xml:VRT' not in xml_vrt ############################################################################### # Check GetMetadata('xml:VRT') behaviour on a in-memory VRT copied from a VRT @@ -417,14 +492,18 @@ def test_vrtmisc_17(): 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() == '' + 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 ('<SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename>' in xml_vrt or \ - '<SourceFilename relativeToVRT="1">data\\byte.tif</SourceFilename>' in xml_vrt) + assert ( + '<SourceFilename relativeToVRT="1">data/byte.tif</SourceFilename>' in xml_vrt + or '<SourceFilename relativeToVRT="1">data\\byte.tif</SourceFilename>' + in xml_vrt + ) + ############################################################################### # Check RAT support @@ -432,30 +511,32 @@ def test_vrtmisc_18(): def test_vrtmisc_rat(): - ds = gdal.Translate('/vsimem/vrtmisc_rat.tif', 'data/byte.tif', format='MEM') + 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) + vrt_ds = gdal.GetDriverByName("VRT").CreateCopy("/vsimem/vrtmisc_rat.vrt", ds) - xml_vrt = vrt_ds.GetMetadata('xml:VRT')[0] - assert gdal.GetLastErrorMsg() == '' + xml_vrt = vrt_ds.GetMetadata("xml:VRT")[0] + assert gdal.GetLastErrorMsg() == "" vrt_ds = None assert '<GDALRasterAttributeTable tableType="thematic">' in xml_vrt - vrt_ds = gdal.Translate('/vsimem/vrtmisc_rat.vrt', ds, format='VRT', srcWin=[0, 0, 1, 1]) + 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() == '' + xml_vrt = vrt_ds.GetMetadata("xml:VRT")[0] + assert gdal.GetLastErrorMsg() == "" vrt_ds = None assert '<GDALRasterAttributeTable tableType="thematic">' in xml_vrt ds = None - vrt_ds = gdal.Open('/vsimem/vrtmisc_rat.vrt', gdal.GA_Update) + 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) @@ -464,8 +545,9 @@ def test_vrtmisc_rat(): ds = None - gdal.Unlink('/vsimem/vrtmisc_rat.vrt') - gdal.Unlink('/vsimem/vrtmisc_rat.tif') + gdal.Unlink("/vsimem/vrtmisc_rat.vrt") + gdal.Unlink("/vsimem/vrtmisc_rat.tif") + ############################################################################### # Check ColorTable support @@ -473,7 +555,7 @@ def test_vrtmisc_rat(): def test_vrtmisc_colortable(): - ds = gdal.Translate('', 'data/byte.tif', format='VRT') + ds = gdal.Translate("", "data/byte.tif", format="VRT") ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ds.GetRasterBand(1).SetColorTable(ct) @@ -481,14 +563,15 @@ def test_vrtmisc_colortable(): 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') + tmpfile = "/vsimem/vrtmisc_histogram.vrt" + ds = gdal.Translate(tmpfile, "data/byte.tif", format="VRT") ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [3000000000, 4]) ds = None @@ -500,14 +583,15 @@ def test_vrtmisc_histogram(): 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') + tmpfile = "/vsimem/test_vrtmisc_write_srs.vrt" + ds = gdal.Translate(tmpfile, "data/byte.tif", format="VRT") sr = osr.SpatialReference() sr.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) sr.ImportFromEPSG(4326) @@ -515,37 +599,45 @@ def test_vrtmisc_write_srs(): ds = None ds = gdal.Open(tmpfile) - assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1,2] + 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]) + 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') - ds = gdal.Open('/vsimem/cog.vrt') + gdal.Translate("/vsimem/cog.vrt", "/vsimem/cog.tif") + ds = gdal.Open("/vsimem/cog.vrt") assert ds.GetRasterBand(1).GetOverview(0).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetMaskBand().IsMaskBand() assert ds.GetRasterBand(1).GetOverview(0).GetMaskBand().IsMaskBand() ds = None - 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') + 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') + gdal.Unlink("/vsimem/out.tif") ############################################################################### @@ -553,13 +645,9 @@ def test_vrtmisc_mask_implicit_overviews(): def test_vrtmisc_blocksize(): - filename = '/vsimem/test_vrtmisc_blocksize.vrt' - vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) - options = [ - 'subClass=VRTSourcedRasterBand', - 'blockXSize=32', - 'blockYSize=48' - ] + filename = "/vsimem/test_vrtmisc_blocksize.vrt" + vrt_ds = gdal.GetDriverByName("VRT").Create(filename, 50, 50, 0) + options = ["subClass=VRTSourcedRasterBand", "blockXSize=32", "blockYSize=48"] vrt_ds.AddBand(gdal.GDT_Byte, options) vrt_ds = None @@ -578,8 +666,8 @@ def test_vrtmisc_blocksize(): def test_vrtmisc_coordinate_epoch(): - filename = '/vsimem/temp.vrt' - gdal.Translate(filename, 'data/byte.tif', options='-a_coord_epoch 2021.3') + filename = "/vsimem/temp.vrt" + gdal.Translate(filename, "data/byte.tif", options="-a_coord_epoch 2021.3") ds = gdal.Open(filename) srs = ds.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.3 @@ -591,79 +679,96 @@ def test_vrtmisc_coordinate_epoch(): ############################################################################### # Test the relativeToVRT attribute of SourceFilename + def test_vrtmisc_sourcefilename_all_relatives(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join('tmp', 'byte.tif')) - ds = gdal.GetDriverByName('VRT').CreateCopy('', src_ds) - ds.SetDescription(os.path.join('tmp', 'byte.vrt')) + src_ds = gdal.Open(os.path.join("tmp", "byte.tif")) + ds = gdal.GetDriverByName("VRT").CreateCopy("", src_ds) + ds.SetDescription(os.path.join("tmp", "byte.vrt")) ds = None - assert '<SourceFilename relativeToVRT="1">byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + '<SourceFilename relativeToVRT="1">byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceFilename + def test_vrtmisc_sourcefilename_source_relative_dest_absolute(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join('tmp', 'byte.tif')) - ds = gdal.GetDriverByName('VRT').CreateCopy('', src_ds) - path = os.path.join(os.getcwd(), 'tmp', 'byte.vrt') - if sys.platform == 'win32': - path = path.replace('/', '\\') + src_ds = gdal.Open(os.path.join("tmp", "byte.tif")) + ds = gdal.GetDriverByName("VRT").CreateCopy("", src_ds) + path = os.path.join(os.getcwd(), "tmp", "byte.vrt") + if sys.platform == "win32": + path = path.replace("/", "\\") ds.SetDescription(path) ds = None - assert '<SourceFilename relativeToVRT="1">byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + '<SourceFilename relativeToVRT="1">byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceFilename + def test_vrtmisc_sourcefilename_source_absolute_dest_absolute(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join(os.getcwd(), 'tmp', 'byte.tif')) - ds = gdal.GetDriverByName('VRT').CreateCopy('', src_ds) - ds.SetDescription(os.path.join(os.getcwd(), 'tmp', 'byte.vrt')) + src_ds = gdal.Open(os.path.join(os.getcwd(), "tmp", "byte.tif")) + ds = gdal.GetDriverByName("VRT").CreateCopy("", src_ds) + ds.SetDescription(os.path.join(os.getcwd(), "tmp", "byte.vrt")) ds = None - assert '<SourceFilename relativeToVRT="1">byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + '<SourceFilename relativeToVRT="1">byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceFilename + def test_vrtmisc_sourcefilename_source_absolute_dest_relative(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - path = os.path.join(os.getcwd(), 'tmp', 'byte.tif') - if sys.platform == 'win32': - path = path.replace('/', '\\') + path = os.path.join(os.getcwd(), "tmp", "byte.tif") + if sys.platform == "win32": + path = path.replace("/", "\\") src_ds = gdal.Open(path) - ds = gdal.GetDriverByName('VRT').CreateCopy('', src_ds) - ds.SetDescription(os.path.join('tmp', 'byte.vrt')) + ds = gdal.GetDriverByName("VRT").CreateCopy("", src_ds) + ds.SetDescription(os.path.join("tmp", "byte.vrt")) ds = None - assert '<SourceFilename relativeToVRT="1">byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + '<SourceFilename relativeToVRT="1">byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") + ############################################################################### # Test Int64 nodata @@ -671,8 +776,10 @@ def test_vrtmisc_sourcefilename_source_absolute_dest_relative(): def test_vrtmisc_nodata_int64(): - filename = '/vsimem/temp.vrt' - ds = gdal.Translate(filename, 'data/byte.tif', format = 'VRT', outputType = gdal.GDT_Int64) + filename = "/vsimem/temp.vrt" + ds = gdal.Translate( + filename, "data/byte.tif", format="VRT", outputType=gdal.GDT_Int64 + ) val = -(1 << 63) assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None assert ds.GetRasterBand(1).GetNoDataValue() == val @@ -691,8 +798,10 @@ def test_vrtmisc_nodata_int64(): def test_vrtmisc_nodata_uint64(): - filename = '/vsimem/temp.vrt' - ds = gdal.Translate(filename, 'data/byte.tif', format = 'VRT', outputType = gdal.GDT_UInt64) + filename = "/vsimem/temp.vrt" + ds = gdal.Translate( + filename, "data/byte.tif", format="VRT", outputType=gdal.GDT_UInt64 + ) val = (1 << 64) - 1 assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None assert ds.GetRasterBand(1).GetNoDataValue() == val @@ -711,8 +820,8 @@ def test_vrtmisc_nodata_uint64(): def test_vrtmisc_alpha_ismaskband(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) - ds = gdal.GetDriverByName('VRT').CreateCopy('', src_ds) + ds = gdal.GetDriverByName("VRT").CreateCopy("", src_ds) assert not ds.GetRasterBand(1).IsMaskBand() assert ds.GetRasterBand(2).IsMaskBand() diff --git a/autotest/gcore/vsiadls.py b/autotest/gcore/vsiadls.py index afcd0e1c5e06..78ab3bba3f12 100755 --- a/autotest/gcore/vsiadls.py +++ b/autotest/gcore/vsiadls.py @@ -29,42 +29,45 @@ ############################################################################### import sys -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver -pytestmark = pytest.mark.skipif(not gdaltest.built_against_curl(), reason="GDAL not built against curl") +from osgeo import gdal + +pytestmark = pytest.mark.skipif( + not gdaltest.built_against_curl(), reason="GDAL not built against curl" +) def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): # Unset all env vars that could influence the tests az_vars = {} for var, reset_val in ( - ('AZURE_STORAGE_CONNECTION_STRING', None), - ('AZURE_STORAGE_ACCOUNT', None), - ('AZURE_STORAGE_ACCESS_KEY', None), - ('AZURE_STORAGE_SAS_TOKEN', None), - ('AZURE_NO_SIGN_REQUEST', None), - ('AZURE_CONFIG_DIR', ''), - ('AZURE_STORAGE_ACCESS_TOKEN', '')): + ("AZURE_STORAGE_CONNECTION_STRING", None), + ("AZURE_STORAGE_ACCOUNT", None), + ("AZURE_STORAGE_ACCESS_KEY", None), + ("AZURE_STORAGE_SAS_TOKEN", None), + ("AZURE_NO_SIGN_REQUEST", None), + ("AZURE_CONFIG_DIR", ""), + ("AZURE_STORAGE_ACCESS_TOKEN", ""), + ): az_vars[var] = gdal.GetConfigOption(var) gdal.SetConfigOption(var, reset_val) - with gdaltest.config_option('CPL_AZURE_VM_API_ROOT_URL', 'disabled'): - assert gdal.GetSignedURL('/vsiadls/foo/bar') is None + with gdaltest.config_option("CPL_AZURE_VM_API_ROOT_URL", "disabled"): + assert gdal.GetSignedURL("/vsiadls/foo/bar") is None gdaltest.webserver_process = None gdaltest.webserver_port = 0 @@ -72,15 +75,20 @@ def startup_and_cleanup(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (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;BlobEndpoint=http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port) - gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', '') - gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', '') - gdal.SetConfigOption('CPL_AZURE_TIMESTAMP', 'my_timestamp') + gdal.SetConfigOption( + "AZURE_STORAGE_CONNECTION_STRING", + "DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=MY_ACCOUNT_KEY;BlobEndpoint=http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + ) + gdal.SetConfigOption("AZURE_STORAGE_ACCOUNT", "") + gdal.SetConfigOption("AZURE_STORAGE_ACCESS_KEY", "") + gdal.SetConfigOption("CPL_AZURE_TIMESTAMP", "my_timestamp") yield @@ -97,6 +105,7 @@ def startup_and_cleanup(): ############################################################################### # Basic authentication tests + def test_vsiadls_fake_basic(): if gdaltest.webserver_port == 0: @@ -104,42 +113,56 @@ def test_vsiadls_fake_basic(): gdal.VSICurlClearCache() - signed_url = gdal.GetSignedURL('/vsiadls/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')) + signed_url = gdal.GetSignedURL( + "/vsiadls/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' + request.protocol_version = "HTTP/1.1" h = request.headers - if 'Authorization' not in h or \ - h['Authorization'] != 'SharedKey myaccount:+n9wC1twBBP4T84fioDIGi9bz/CrbwRaQL0LV4sACnw=' or \ - 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if ( + "Authorization" not in h + or h["Authorization"] + != "SharedKey myaccount:+n9wC1twBBP4T84fioDIGi9bz/CrbwRaQL0LV4sACnw=" + 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.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')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', custom_method=method) + handler.add( + "GET", "/azure/blob/myaccount/az_fake_bucket/resource", custom_method=method + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiadls/az_fake_bucket/resource') + f = open_for_read("/vsiadls/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/resource2.bin', 200, - {'Content-Length': '1000000'}) + 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('/vsiadls/az_fake_bucket/resource2.bin') + stat_res = gdal.VSIStatL("/vsiadls/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) @@ -160,60 +183,104 @@ def test_vsiadls_fake_readdir(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?directory=a_dir%20with_space&recursive=false&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8', 'x-ms-continuation': 'contmarker'}, - """ + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket2?directory=a_dir%20with_space&recursive=false&resource=filesystem", + 200, + { + "Content-type": "application/json;charset=utf-8", + "x-ms-continuation": "contmarker", + }, + """ {"paths":[{"name":"a_dir with_space/resource3 with_space.bin","contentLength":"123456","lastModified": "Mon, 01 Jan 1970 00:00:01"}]} - """) - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?continuation=contmarker&directory=a_dir%20with_space&recursive=false&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8'}, - """ + """, + ) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket2?continuation=contmarker&directory=a_dir%20with_space&recursive=false&resource=filesystem", + 200, + {"Content-type": "application/json;charset=utf-8"}, + """ {"paths":[{"name":"a_dir with_space/resource4.bin","contentLength":"456789","lastModified": "16 Oct 2016 12:34:56"}, {"name":"a_dir with_space/subdir","isDirectory":"true"}]} - """ - ) + """, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin') + f = open_for_read( + "/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ) if f is None: pytest.fail() gdal.VSIFCloseL(f) - dir_contents = gdal.ReadDir('/vsiadls/az_fake_bucket2/a_dir with_space') - assert dir_contents == ['resource3 with_space.bin', 'resource4.bin', 'subdir'] - assert gdal.VSIStatL('/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin').size == 123456 - assert gdal.VSIStatL('/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin').mtime == 1 + dir_contents = gdal.ReadDir("/vsiadls/az_fake_bucket2/a_dir with_space") + assert dir_contents == ["resource3 with_space.bin", "resource4.bin", "subdir"] + assert ( + gdal.VSIStatL( + "/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).size + == 123456 + ) + assert ( + gdal.VSIStatL( + "/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).mtime + == 1 + ) # ReadDir on something known to be a file shouldn't cause network access - dir_contents = gdal.ReadDir('/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin') + dir_contents = gdal.ReadDir( + "/vsiadls/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ) assert dir_contents is None # Test error on ReadDir() handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?directory=error_test&recursive=false&resource=filesystem', 500) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket2?directory=error_test&recursive=false&resource=filesystem", + 500, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsiadls/az_fake_bucket2/error_test/') + dir_contents = gdal.ReadDir("/vsiadls/az_fake_bucket2/error_test/") assert dir_contents is None # List containers (empty result) handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?resource=account', 200, {'Content-type': 'application/json'}, - """{ "filesystems": [] }""") + handler.add( + "GET", + "/azure/blob/myaccount/?resource=account", + 200, + {"Content-type": "application/json"}, + """{ "filesystems": [] }""", + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsiadls/') - assert dir_contents == ['.'] + dir_contents = gdal.ReadDir("/vsiadls/") + assert dir_contents == ["."] gdal.VSICurlClearCache() # List containers handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?resource=account', 200, {'Content-type': 'application/json', 'x-ms-continuation': 'contmarker'}, - """{ "filesystems": [{ "name": "mycontainer1"}] }""") - handler.add('GET', '/azure/blob/myaccount/?continuation=contmarker&resource=account', 200, {'Content-type': 'application/json'}, - """{ "filesystems": [{ "name": "mycontainer2"}] }""") - with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsiadls/') - assert dir_contents == ['mycontainer1', 'mycontainer2'] + handler.add( + "GET", + "/azure/blob/myaccount/?resource=account", + 200, + {"Content-type": "application/json", "x-ms-continuation": "contmarker"}, + """{ "filesystems": [{ "name": "mycontainer1"}] }""", + ) + handler.add( + "GET", + "/azure/blob/myaccount/?continuation=contmarker&resource=account", + 200, + {"Content-type": "application/json"}, + """{ "filesystems": [{ "name": "mycontainer2"}] }""", + ) + with webserver.install_http_handler(handler): + dir_contents = gdal.ReadDir("/vsiadls/") + assert dir_contents == ["mycontainer1", "mycontainer2"] + ############################################################################### # Test OpenDir() with a fake server @@ -228,64 +295,93 @@ def test_vsiadls_opendir(): # Unlimited depth from root handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?resource=account', 200, {'Content-type': 'application/json', 'x-ms-continuation': 'contmarker_root'}, - """{ "filesystems": [{ "name": "fs1"}, { "name": "fs2"} ]}""") + handler.add( + "GET", + "/azure/blob/myaccount/?resource=account", + 200, + {"Content-type": "application/json", "x-ms-continuation": "contmarker_root"}, + """{ "filesystems": [{ "name": "fs1"}, { "name": "fs2"} ]}""", + ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsiadls/') + d = gdal.OpenDir("/vsiadls/") assert d is not None handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/fs1?recursive=true&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8', 'x-ms-continuation': 'contmarker_within_fs'}, - """ + handler.add( + "GET", + "/azure/blob/myaccount/fs1?recursive=true&resource=filesystem", + 200, + { + "Content-type": "application/json;charset=utf-8", + "x-ms-continuation": "contmarker_within_fs", + }, + """ {"paths":[{"name":"foo.txt","contentLength":"123456","lastModified": "Mon, 01 Jan 1970 00:00:01"}]} - """) + """, + ) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs1' + assert entry.name == "fs1" assert entry.mode == 16384 handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs1/foo.txt' + assert entry.name == "fs1/foo.txt" handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/fs1?continuation=contmarker_within_fs&recursive=true&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8', 'x-ms-continuation': ''}, - """ + handler.add( + "GET", + "/azure/blob/myaccount/fs1?continuation=contmarker_within_fs&recursive=true&resource=filesystem", + 200, + {"Content-type": "application/json;charset=utf-8", "x-ms-continuation": ""}, + """ {"paths":[{"name":"bar.txt","contentLength":"123456","lastModified": "Mon, 01 Jan 1970 00:00:01"}]} - """) + """, + ) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs1/bar.txt' + assert entry.name == "fs1/bar.txt" handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/fs2?recursive=true&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8', 'x-ms-continuation': ''}, - """ + handler.add( + "GET", + "/azure/blob/myaccount/fs2?recursive=true&resource=filesystem", + 200, + {"Content-type": "application/json;charset=utf-8", "x-ms-continuation": ""}, + """ {"paths":[]} - """) + """, + ) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs2' - - handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?continuation=contmarker_root&resource=account', 200, {'Content-type': 'application/json'}, - """{ "filesystems": [{ "name": "fs3"}] }""") - handler.add('GET', '/azure/blob/myaccount/fs3?recursive=true&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8', 'x-ms-continuation': ''}, - """ + assert entry.name == "fs2" + + handler = webserver.SequentialHandler() + handler.add( + "GET", + "/azure/blob/myaccount/?continuation=contmarker_root&resource=account", + 200, + {"Content-type": "application/json"}, + """{ "filesystems": [{ "name": "fs3"}] }""", + ) + handler.add( + "GET", + "/azure/blob/myaccount/fs3?recursive=true&resource=filesystem", + 200, + {"Content-type": "application/json;charset=utf-8", "x-ms-continuation": ""}, + """ {"paths":[{"name":"baz.txt","contentLength":"123456","lastModified": "Mon, 01 Jan 1970 00:00:01"}]} - """) + """, + ) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs3' + assert entry.name == "fs3" handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'fs3/baz.txt' + assert entry.name == "fs3/baz.txt" entry = gdal.GetNextDirEntry(d) assert entry is None @@ -294,20 +390,24 @@ def test_vsiadls_opendir(): # Prefix filtering on subdir handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/fs1?directory=sub_dir&recursive=true&resource=filesystem', 200, - {'Content-type': 'application/json;charset=utf-8'}, - """ + handler.add( + "GET", + "/azure/blob/myaccount/fs1?directory=sub_dir&recursive=true&resource=filesystem", + 200, + {"Content-type": "application/json;charset=utf-8"}, + """ {"paths":[{"name":"sub_dir/foo.txt","contentLength":"123456","lastModified": "Mon, 01 Jan 1970 00:00:01"}, {"name":"sub_dir/my_prefix_test.txt","contentLength":"40","lastModified": "Mon, 01 Jan 1970 00:00:01"}]} - """) + """, + ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsiadls/fs1/sub_dir', -1, ['PREFIX=my_prefix']) + d = gdal.OpenDir("/vsiadls/fs1/sub_dir", -1, ["PREFIX=my_prefix"]) assert d is not None handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'my_prefix_test.txt' + assert entry.name == "my_prefix_test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 @@ -318,16 +418,30 @@ def test_vsiadls_opendir(): gdal.CloseDir(d) # No network access done - s = gdal.VSIStatL('/vsiadls/fs1/sub_dir/my_prefix_test.txt', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG |gdal.VSI_STAT_CACHE_ONLY) + s = gdal.VSIStatL( + "/vsiadls/fs1/sub_dir/my_prefix_test.txt", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) assert s assert (s.mode & 32768) != 0 assert s.size == 40 assert s.mtime == 1 # No network access done - assert gdal.VSIStatL('/vsiadls/fs1/sub_dir/i_do_not_exist.txt', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG | gdal.VSI_STAT_CACHE_ONLY) is None + assert ( + gdal.VSIStatL( + "/vsiadls/fs1/sub_dir/i_do_not_exist.txt", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) + is None + ) + ############################################################################### # Test write @@ -342,79 +456,148 @@ def test_vsiadls_fake_write(): # Error case in initial PUT handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 400) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 400) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is None # Empty file handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=0', 200) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 201) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=0", + 200, + ) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is not None assert gdal.VSIFCloseL(f) == 0 # Small file handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201, - expected_headers = {'x-ms-client-request-id': 'REQUEST_ID'}) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=0', 202, expected_body = b'foo') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=3', 200) - with webserver.install_http_handler(handler): - f = gdal.VSIFOpenExL('/vsiadls/test_copy/file.bin', 'wb', 0, ['x-ms-client-request-id=REQUEST_ID']) + handler.add( + "PUT", + "/azure/blob/myaccount/test_copy/file.bin?resource=file", + 201, + expected_headers={"x-ms-client-request-id": "REQUEST_ID"}, + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=0", + 202, + expected_body=b"foo", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=3", + 200, + ) + with webserver.install_http_handler(handler): + f = gdal.VSIFOpenExL( + "/vsiadls/test_copy/file.bin", + "wb", + 0, + ["x-ms-client-request-id=REQUEST_ID"], + ) assert f is not None - assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 + assert gdal.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFCloseL(f) == 0 # Error case in PATCH append handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=0', 400, expected_body = b'foo') + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 201) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=0", + 400, + expected_body=b"foo", + ) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is not None - assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 + assert gdal.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFCloseL(f) != 0 # Error case in PATCH close handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=0', 202, expected_body = b'foo') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=3', 400) - with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 201) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=0", + 202, + expected_body=b"foo", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=3", + 400, + ) + with webserver.install_http_handler(handler): + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is not None - assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 + assert gdal.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFCloseL(f) != 0 # Chunked output - with gdaltest.config_option('VSIAZ_CHUNK_SIZE_BYTES', '10'): + with gdaltest.config_option("VSIAZ_CHUNK_SIZE_BYTES", "10"): handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=0', 202, expected_body = b'0123456789') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=10', 202, expected_body = b'abcd') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=14', 200) + handler.add( + "PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 201 + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=0", + 202, + expected_body=b"0123456789", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=10", + 202, + expected_body=b"abcd", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=14", + 200, + ) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is not None - assert gdal.VSIFWriteL('0123456789abcd', 1, 14, f) == 14 + assert gdal.VSIFWriteL("0123456789abcd", 1, 14, f) == 14 assert gdal.VSIFCloseL(f) == 0 # Chunked output with last chunk being the chunk size - with gdaltest.config_option('VSIAZ_CHUNK_SIZE_BYTES', '5'): + with gdaltest.config_option("VSIAZ_CHUNK_SIZE_BYTES", "5"): handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=0', 202, expected_body = b'01234') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=append&position=5', 202, expected_body = b'56789') - handler.add('PATCH', '/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=10', 200) + handler.add( + "PUT", "/azure/blob/myaccount/test_copy/file.bin?resource=file", 201 + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=0", + 202, + expected_body=b"01234", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=append&position=5", + 202, + expected_body=b"56789", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_copy/file.bin?action=flush&close=true&position=10", + 200, + ) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsiadls/test_copy/file.bin', 'wb') + f = gdal.VSIFOpenL("/vsiadls/test_copy/file.bin", "wb") assert f is not None - assert gdal.VSIFWriteL('0123456789', 1, 10, f) == 10 + assert gdal.VSIFWriteL("0123456789", 1, 10, f) == 10 assert gdal.VSIFCloseL(f) == 0 + ############################################################################### # Test Unlink() @@ -428,21 +611,42 @@ def test_vsiadls_fake_unlink(): # 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', 200, {'Connection': 'close'}) - with webserver.install_http_handler(handler): - ret = gdal.Unlink('/vsiadls/az_bucket_test_unlink/myfile') + 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", + 200, + {"Connection": "close"}, + ) + with webserver.install_http_handler(handler): + ret = gdal.Unlink("/vsiadls/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'}) + 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('/vsiadls/az_bucket_test_unlink/myfile') + ret = gdal.Unlink("/vsiadls/az_bucket_test_unlink/myfile") assert ret == -1 + ############################################################################### # Test Mkdir() / Rmdir() / RmdirRecursive() @@ -455,59 +659,89 @@ def test_vsiadls_fake_mkdir_rmdir(): gdal.VSICurlClearCache() # Invalid name - ret = gdal.Mkdir('/vsiadls', 0) + ret = gdal.Mkdir("/vsiadls", 0) assert ret != 0 handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir', 404, {'Connection': 'close'}) - handler.add('PUT', '/azure/blob/myaccount/az_bucket_test_mkdir/dir?resource=directory', 201) + handler.add( + "HEAD", + "/azure/blob/myaccount/az_bucket_test_mkdir/dir", + 404, + {"Connection": "close"}, + ) + handler.add( + "PUT", "/azure/blob/myaccount/az_bucket_test_mkdir/dir?resource=directory", 201 + ) with webserver.install_http_handler(handler): - ret = gdal.Mkdir('/vsiadls/az_bucket_test_mkdir/dir', 0) + ret = gdal.Mkdir("/vsiadls/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', 200, {'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'directory' } ) + handler.add( + "HEAD", + "/azure/blob/myaccount/az_bucket_test_mkdir/dir", + 200, + {"x-ms-permissions": "rwxrwxrwx", "x-ms-resource-type": "directory"}, + ) with webserver.install_http_handler(handler): - ret = gdal.Mkdir('/vsiadls/az_bucket_test_mkdir/dir', 0) + ret = gdal.Mkdir("/vsiadls/az_bucket_test_mkdir/dir", 0) assert ret != 0 # Invalid name - ret = gdal.Rmdir('/vsiadls') + ret = gdal.Rmdir("/vsiadls") assert ret != 0 # Not a directory handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/it_is_a_file', 200, {'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'file' } ) + handler.add( + "HEAD", + "/azure/blob/myaccount/az_bucket_test_mkdir/it_is_a_file", + 200, + {"x-ms-permissions": "rwxrwxrwx", "x-ms-resource-type": "file"}, + ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiadls/az_bucket_test_mkdir/it_is_a_file') + ret = gdal.Rmdir("/vsiadls/az_bucket_test_mkdir/it_is_a_file") assert ret != 0 # Valid handler = webserver.SequentialHandler() - handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_mkdir/dir?recursive=false', 200) + handler.add( + "DELETE", "/azure/blob/myaccount/az_bucket_test_mkdir/dir?recursive=false", 200 + ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiadls/az_bucket_test_mkdir/dir') + ret = gdal.Rmdir("/vsiadls/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("HEAD", "/azure/blob/myaccount/az_bucket_test_mkdir/dir", 404) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiadls/az_bucket_test_mkdir/dir') + ret = gdal.Rmdir("/vsiadls/az_bucket_test_mkdir/dir") assert ret != 0 # RmdirRecursive handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir_rec', 200, {'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'directory' } ) - handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_mkdir/dir_rec?recursive=true', 200) - with webserver.install_http_handler(handler): - ret = gdal.RmdirRecursive('/vsiadls/az_bucket_test_mkdir/dir_rec') + handler.add( + "HEAD", + "/azure/blob/myaccount/az_bucket_test_mkdir/dir_rec", + 200, + {"x-ms-permissions": "rwxrwxrwx", "x-ms-resource-type": "directory"}, + ) + handler.add( + "DELETE", + "/azure/blob/myaccount/az_bucket_test_mkdir/dir_rec?recursive=true", + 200, + ) + with webserver.install_http_handler(handler): + ret = gdal.RmdirRecursive("/vsiadls/az_bucket_test_mkdir/dir_rec") assert ret == 0 + ############################################################################### # Test rename + def test_vsiadls_fake_rename(): if gdaltest.webserver_port == 0: @@ -515,18 +749,33 @@ def test_vsiadls_fake_rename(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/source.txt', 200, {'Content-Length': '3', 'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'file'}) - handler.add('PUT', '/azure/blob/myaccount/test/target.txt', 201, expected_headers = {'x-ms-rename-source' : '/test/source.txt'}) - handler.add('HEAD', '/azure/blob/myaccount/test/source.txt', 404) - with webserver.install_http_handler(handler): - assert gdal.Rename( '/vsiadls/test/source.txt', '/vsiadls/test/target.txt') == 0 - assert gdal.VSIStatL('/vsiadls/test/source.txt') is None + handler.add( + "HEAD", + "/azure/blob/myaccount/test/source.txt", + 200, + { + "Content-Length": "3", + "x-ms-permissions": "rwxrwxrwx", + "x-ms-resource-type": "file", + }, + ) + handler.add( + "PUT", + "/azure/blob/myaccount/test/target.txt", + 201, + expected_headers={"x-ms-rename-source": "/test/source.txt"}, + ) + handler.add("HEAD", "/azure/blob/myaccount/test/source.txt", 404) + with webserver.install_http_handler(handler): + assert gdal.Rename("/vsiadls/test/source.txt", "/vsiadls/test/target.txt") == 0 + assert gdal.VSIStatL("/vsiadls/test/source.txt") is None ############################################################################### # Test Sync() with source and target on /vsiadls/ # Note: this is using Azure blob object copying since ADLS has no equivalent + def test_vsiadls_fake_sync_copyobject(): if gdaltest.webserver_port == 0: @@ -535,25 +784,50 @@ def test_vsiadls_fake_sync_copyobject(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/src.txt', 200, {'Content-Length': '3', 'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'file'}) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/dst.txt', 404) - handler.add('PUT', '/azure/blob/myaccount/test_bucket/dst.txt', 202, - expected_headers={'x-ms-copy-source': 'http://127.0.0.1:%d/azure/blob/myaccount/test_bucket/src.txt' % gdaltest.webserver_port}) - with webserver.install_http_handler(handler): - assert gdal.Sync('/vsiadls/test_bucket/src.txt', - '/vsiadls/test_bucket/dst.txt') + handler.add( + "HEAD", + "/azure/blob/myaccount/test_bucket/src.txt", + 200, + { + "Content-Length": "3", + "x-ms-permissions": "rwxrwxrwx", + "x-ms-resource-type": "file", + }, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/dst.txt", 404) + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/dst.txt", + 202, + expected_headers={ + "x-ms-copy-source": "http://127.0.0.1:%d/azure/blob/myaccount/test_bucket/src.txt" + % gdaltest.webserver_port + }, + ) + with webserver.install_http_handler(handler): + assert gdal.Sync("/vsiadls/test_bucket/src.txt", "/vsiadls/test_bucket/dst.txt") gdal.VSICurlClearCache() # Error case handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/src.txt', 200, {'Content-Length': '3', 'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'file'}) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/dst.txt', 404) - handler.add('PUT', '/azure/blob/myaccount/test_bucket/dst.txt', 400) + handler.add( + "HEAD", + "/azure/blob/myaccount/test_bucket/src.txt", + 200, + { + "Content-Length": "3", + "x-ms-permissions": "rwxrwxrwx", + "x-ms-resource-type": "file", + }, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/dst.txt", 404) + handler.add("PUT", "/azure/blob/myaccount/test_bucket/dst.txt", 400) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - assert not gdal.Sync('/vsiadls/test_bucket/src.txt', - '/vsiadls/test_bucket/dst.txt') + assert not gdal.Sync( + "/vsiadls/test_bucket/src.txt", "/vsiadls/test_bucket/dst.txt" + ) ############################################################################### @@ -567,24 +841,40 @@ def test_vsiadls_fake_sync_multithreaded_upload_single_file(): gdal.VSICurlClearCache() - gdal.Mkdir('/vsimem/test', 0) - gdal.FileFromMemBuffer('/vsimem/test/foo', 'foo\n') - - handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test_bucket?resource=filesystem', 200) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/foo', 404) - handler.add('PUT', '/azure/blob/myaccount/test_bucket/foo?resource=file', 201) - handler.add('PATCH', '/azure/blob/myaccount/test_bucket/foo?action=append&position=0', 202, expected_body = b'foo') - handler.add('PATCH', '/azure/blob/myaccount/test_bucket/foo?action=append&position=3', 202, expected_body = b'\n') - handler.add('PATCH', '/azure/blob/myaccount/test_bucket/foo?action=flush&close=true&position=4', 200) - - with gdaltest.config_option('VSIS3_SIMULATE_THREADING', 'YES'): + gdal.Mkdir("/vsimem/test", 0) + gdal.FileFromMemBuffer("/vsimem/test/foo", "foo\n") + + handler = webserver.SequentialHandler() + handler.add("HEAD", "/azure/blob/myaccount/test_bucket?resource=filesystem", 200) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/foo", 404) + handler.add("PUT", "/azure/blob/myaccount/test_bucket/foo?resource=file", 201) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_bucket/foo?action=append&position=0", + 202, + expected_body=b"foo", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_bucket/foo?action=append&position=3", + 202, + expected_body=b"\n", + ) + handler.add( + "PATCH", + "/azure/blob/myaccount/test_bucket/foo?action=flush&close=true&position=4", + 200, + ) + + with gdaltest.config_option("VSIS3_SIMULATE_THREADING", "YES"): with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/test/foo', - '/vsiadls/test_bucket', - options=['NUM_THREADS=1', 'CHUNK_SIZE=3']) + assert gdal.Sync( + "/vsimem/test/foo", + "/vsiadls/test_bucket", + options=["NUM_THREADS=1", "CHUNK_SIZE=3"], + ) - gdal.RmdirRecursive('/vsimem/test') + gdal.RmdirRecursive("/vsimem/test") ############################################################################### @@ -599,47 +889,90 @@ def test_vsiadls_fake_metadata(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/foo.bin', 200, {'Content-Length': '3', 'x-ms-permissions': 'rwxrwxrwx', 'x-ms-resource-type': 'file'}) + handler.add( + "HEAD", + "/azure/blob/myaccount/test/foo.bin", + 200, + { + "Content-Length": "3", + "x-ms-permissions": "rwxrwxrwx", + "x-ms-resource-type": "file", + }, + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiadls/test/foo.bin', 'HEADERS') - assert 'x-ms-permissions' in md + md = gdal.GetFileMetadata("/vsiadls/test/foo.bin", "HEADERS") + assert "x-ms-permissions" in md handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/foo.bin?action=getStatus', 200, {'foo': 'bar'}) + handler.add( + "HEAD", + "/azure/blob/myaccount/test/foo.bin?action=getStatus", + 200, + {"foo": "bar"}, + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiadls/test/foo.bin', 'STATUS') - assert 'foo' in md + md = gdal.GetFileMetadata("/vsiadls/test/foo.bin", "STATUS") + assert "foo" in md handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/foo.bin?action=getAccessControl', 200, {'x-ms-acl': 'some_acl'}) + handler.add( + "HEAD", + "/azure/blob/myaccount/test/foo.bin?action=getAccessControl", + 200, + {"x-ms-acl": "some_acl"}, + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiadls/test/foo.bin', 'ACL') - assert 'x-ms-acl' in md + md = gdal.GetFileMetadata("/vsiadls/test/foo.bin", "ACL") + assert "x-ms-acl" in md # Error case handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/foo.bin?action=getStatus', 404) + handler.add("HEAD", "/azure/blob/myaccount/test/foo.bin?action=getStatus", 404) with webserver.install_http_handler(handler): - assert gdal.GetFileMetadata('/vsiadls/test/foo.bin', 'STATUS') == {} + assert gdal.GetFileMetadata("/vsiadls/test/foo.bin", "STATUS") == {} # SetMetadata() handler = webserver.SequentialHandler() - handler.add('PATCH', '/azure/blob/myaccount/test/foo.bin?action=setProperties', 200, expected_headers={'x-ms-properties': 'foo=bar'}) + handler.add( + "PATCH", + "/azure/blob/myaccount/test/foo.bin?action=setProperties", + 200, + expected_headers={"x-ms-properties": "foo=bar"}, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiadls/test/foo.bin', {'x-ms-properties': 'foo=bar'}, 'PROPERTIES') + assert gdal.SetFileMetadata( + "/vsiadls/test/foo.bin", {"x-ms-properties": "foo=bar"}, "PROPERTIES" + ) handler = webserver.SequentialHandler() - handler.add('PATCH', '/azure/blob/myaccount/test/foo.bin?action=setAccessControl', 200, expected_headers={'x-ms-acl': 'foo'}) + handler.add( + "PATCH", + "/azure/blob/myaccount/test/foo.bin?action=setAccessControl", + 200, + expected_headers={"x-ms-acl": "foo"}, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiadls/test/foo.bin', {'x-ms-acl': 'foo'}, 'ACL') + assert gdal.SetFileMetadata("/vsiadls/test/foo.bin", {"x-ms-acl": "foo"}, "ACL") handler = webserver.SequentialHandler() - handler.add('PATCH', '/azure/blob/myaccount/test/foo.bin?action=setAccessControlRecursive&mode=set', 200, expected_headers={'x-ms-acl': 'foo'}) + handler.add( + "PATCH", + "/azure/blob/myaccount/test/foo.bin?action=setAccessControlRecursive&mode=set", + 200, + expected_headers={"x-ms-acl": "foo"}, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiadls/test/foo.bin', {'x-ms-acl': 'foo'}, 'ACL', ['RECURSIVE=TRUE', 'MODE=set']) + assert gdal.SetFileMetadata( + "/vsiadls/test/foo.bin", + {"x-ms-acl": "foo"}, + "ACL", + ["RECURSIVE=TRUE", "MODE=set"], + ) # Error case handler = webserver.SequentialHandler() - handler.add('PATCH', '/azure/blob/myaccount/test/foo.bin?action=setProperties', 404) + handler.add("PATCH", "/azure/blob/myaccount/test/foo.bin?action=setProperties", 404) with webserver.install_http_handler(handler): - assert not gdal.SetFileMetadata('/vsiadls/test/foo.bin', {'x-ms-properties': 'foo=bar'}, 'PROPERTIES') + assert not gdal.SetFileMetadata( + "/vsiadls/test/foo.bin", {"x-ms-properties": "foo=bar"}, "PROPERTIES" + ) diff --git a/autotest/gcore/vsiadls_real_instance.py b/autotest/gcore/vsiadls_real_instance.py index bfddabaf42fa..66019c029109 100755 --- a/autotest/gcore/vsiadls_real_instance.py +++ b/autotest/gcore/vsiadls_real_instance.py @@ -30,20 +30,22 @@ import base64 import stat -from osgeo import gdal - import gdaltest import pytest -pytestmark = pytest.mark.skipif(not gdaltest.built_against_curl(), reason="GDAL not built against curl") +from osgeo import gdal + +pytestmark = pytest.mark.skipif( + not gdaltest.built_against_curl(), reason="GDAL not built against curl" +) def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) ############################################################################### @@ -52,132 +54,152 @@ def open_for_read(uri): def test_vsiadls_real_instance_tests(): - adls_resource = gdal.GetConfigOption('ADLS_RESOURCE') + adls_resource = gdal.GetConfigOption("ADLS_RESOURCE") if adls_resource is None: - pytest.skip('Missing ADLS_RESOURCE') + pytest.skip("Missing ADLS_RESOURCE") - if '/' not in adls_resource: - path = '/vsiadls/' + adls_resource + if "/" not in adls_resource: + path = "/vsiadls/" + adls_resource try: statres = gdal.VSIStatL(path) - assert statres is not None and stat.S_ISDIR(statres.mode), \ - ('%s is not a valid bucket' % 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' + 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 = 'vsiadls_test' - subpath = path + '/' + unique_id + if filename != ".": + subpath = path + "/" + filename + assert gdal.VSIStatL(subpath) is not None, ( + "Stat(%s) should not return an error" % subpath + ) + + unique_id = "vsiadls_test" + subpath = path + "/" + unique_id ret = gdal.Mkdir(subpath, 0) - assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) + 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)) + 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) + 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "wb") assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + 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) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - assert gdal.VSIStatL(subpath + '/test.txt') is not None + assert gdal.VSIStatL(subpath + "/test.txt") is not None - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') - assert 'x-ms-properties' in md + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") + assert "x-ms-properties" in md - md = gdal.GetFileMetadata(subpath + '/test.txt', 'STATUS') - assert 'x-ms-resource-type' in md - assert 'x-ms-properties' not in md + md = gdal.GetFileMetadata(subpath + "/test.txt", "STATUS") + assert "x-ms-resource-type" in md + assert "x-ms-properties" not in md - md = gdal.GetFileMetadata(subpath + '/test.txt', 'ACL') - assert 'x-ms-acl' in md - assert 'x-ms-permissions' in md + md = gdal.GetFileMetadata(subpath + "/test.txt", "ACL") + assert "x-ms-acl" in md + assert "x-ms-permissions" in md # Change properties - properties_foo_bar = 'foo=' + base64.b64encode('bar') - assert gdal.SetFileMetadata(subpath + '/test.txt', {'x-ms-properties': properties_foo_bar}, 'PROPERTIES') + properties_foo_bar = "foo=" + base64.b64encode("bar") + assert gdal.SetFileMetadata( + subpath + "/test.txt", + {"x-ms-properties": properties_foo_bar}, + "PROPERTIES", + ) - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') - assert 'x-ms-properties' in md - assert md['x-ms-properties'] == properties_foo_bar + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") + assert "x-ms-properties" in md + assert md["x-ms-properties"] == properties_foo_bar # Change ACL - assert gdal.SetFileMetadata(subpath + '/test.txt', {'x-ms-permissions': '0777'}, 'ACL') + assert gdal.SetFileMetadata( + subpath + "/test.txt", {"x-ms-permissions": "0777"}, "ACL" + ) - md = gdal.GetFileMetadata(subpath + '/test.txt', 'ACL') - assert 'x-ms-permissions' in md - assert md['x-ms-permissions'] == 'rwxrwxrwx' + md = gdal.GetFileMetadata(subpath + "/test.txt", "ACL") + assert "x-ms-permissions" in md + assert md["x-ms-permissions"] == "rwxrwxrwx" # Change ACL recursively - md = gdal.GetFileMetadata(subpath, 'ACL') - assert 'x-ms-acl' in md - assert gdal.SetFileMetadata(subpath + '/test.txt', {'x-ms-acl': md['x-ms-acl']}, 'ACL', ['RECURSIVE=YES', 'MODE=set']) - + md = gdal.GetFileMetadata(subpath, "ACL") + assert "x-ms-acl" in md + assert gdal.SetFileMetadata( + subpath + "/test.txt", + {"x-ms-acl": md["x-ms-acl"]}, + "ACL", + ["RECURSIVE=YES", "MODE=set"], + ) - assert gdal.Rename(subpath + '/test.txt', subpath + '/test2.txt') == 0 + assert gdal.Rename(subpath + "/test.txt", subpath + "/test2.txt") == 0 - assert gdal.VSIStatL(subpath + '/test.txt') is None + assert gdal.VSIStatL(subpath + "/test.txt") is None - assert gdal.VSIStatL(subpath + '/test2.txt') is not None + assert gdal.VSIStatL(subpath + "/test2.txt") is not None - f = gdal.VSIFOpenL(subpath + '/test2.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test2.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - ret = gdal.Unlink(subpath + '/test2.txt') - assert ret >= 0, \ - ('Unlink(%s) should not return an error' % (subpath + '/test2.txt')) + ret = gdal.Unlink(subpath + "/test2.txt") + assert ret >= 0, "Unlink(%s) should not return an error" % ( + subpath + "/test2.txt" + ) - assert gdal.VSIStatL(subpath + '/test2.txt') is None + assert gdal.VSIStatL(subpath + "/test2.txt") is None - assert gdal.Unlink(subpath + '/test2.txt') != 0, "Unlink on a deleted file should return an error" + assert ( + gdal.Unlink(subpath + "/test2.txt") != 0 + ), "Unlink on a deleted file should return an error" - f = gdal.VSIFOpenL(subpath + '/test2.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test2.txt", "wb") assert f is not None gdal.VSIFCloseL(f) - assert gdal.VSIStatL(subpath + '/test2.txt') is not None + assert gdal.VSIStatL(subpath + "/test2.txt") is not None finally: assert gdal.RmdirRecursive(subpath) == 0 return - f = open_for_read('/vsiadls/' + adls_resource) + f = open_for_read("/vsiadls/" + adls_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -185,25 +207,27 @@ def test_vsiadls_real_instance_tests(): assert len(ret) == 1 # Test GetSignedURL() - signed_url = gdal.GetSignedURL('/vsiadls/' + adls_resource) - f = open_for_read('/vsicurl_streaming/' + signed_url) + signed_url = gdal.GetSignedURL("/vsiadls/" + adls_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 + ############################################################################### # Nominal cases (require valid credentials) # Note: that test must be run with a delay > 30 seconds due to such a delay # for re-creating a filesystem of the same name of one that has been destroyed + def test_vsiadls_real_instance_filesystem_tests(): - if gdal.GetConfigOption('ADLS_ALLOW_FILESYSTEM_TESTS') is None: - pytest.skip('Missing ADLS_ALLOW_FILESYSTEM_TESTS') + if gdal.GetConfigOption("ADLS_ALLOW_FILESYSTEM_TESTS") is None: + pytest.skip("Missing ADLS_ALLOW_FILESYSTEM_TESTS") - fspath = '/vsiadls/test-vsiadls-filesystem-tests' + fspath = "/vsiadls/test-vsiadls-filesystem-tests" try: assert gdal.VSIStatL(fspath) is None @@ -213,13 +237,13 @@ def test_vsiadls_real_instance_filesystem_tests(): statres = gdal.VSIStatL(fspath) assert statres is not None and stat.S_ISDIR(statres.mode) - assert gdal.ReadDir(fspath) == [ "." ] + assert gdal.ReadDir(fspath) == ["."] assert gdal.Mkdir(fspath, 0) != 0 - assert gdal.Mkdir(fspath + '/subdir', 0) == 0 + assert gdal.Mkdir(fspath + "/subdir", 0) == 0 - statres = gdal.VSIStatL(fspath + '/subdir') + statres = gdal.VSIStatL(fspath + "/subdir") assert statres is not None and stat.S_ISDIR(statres.mode) assert gdal.Rmdir(fspath) != 0 diff --git a/autotest/gcore/vsiaz.py b/autotest/gcore/vsiaz.py index aacc6f98a863..3d7020d5d94d 100755 --- a/autotest/gcore/vsiaz.py +++ b/autotest/gcore/vsiaz.py @@ -29,38 +29,43 @@ ############################################################################### import sys -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal + +pytestmark = pytest.mark.skipif( + not gdaltest.built_against_curl(), reason="GDAL not built against curl" +) -pytestmark = pytest.mark.skipif(not gdaltest.built_against_curl(), reason="GDAL not built against curl") def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): az_vars = {} for var, reset_val in ( - ('AZURE_STORAGE_CONNECTION_STRING', None), - ('AZURE_STORAGE_ACCOUNT', None), - ('AZURE_STORAGE_ACCESS_KEY', None), - ('AZURE_STORAGE_SAS_TOKEN', None), - ('AZURE_NO_SIGN_REQUEST', None), - ('AZURE_CONFIG_DIR', ''), - ('AZURE_STORAGE_ACCESS_TOKEN', '')): + ("AZURE_STORAGE_CONNECTION_STRING", None), + ("AZURE_STORAGE_ACCOUNT", None), + ("AZURE_STORAGE_ACCESS_KEY", None), + ("AZURE_STORAGE_SAS_TOKEN", None), + ("AZURE_NO_SIGN_REQUEST", None), + ("AZURE_CONFIG_DIR", ""), + ("AZURE_STORAGE_ACCESS_TOKEN", ""), + ): az_vars[var] = gdal.GetConfigOption(var) gdal.SetConfigOption(var, reset_val) - assert gdal.GetSignedURL('/vsiaz/foo/bar') is None + assert gdal.GetSignedURL("/vsiaz/foo/bar") is None gdaltest.webserver_process = None gdaltest.webserver_port = 0 @@ -68,13 +73,18 @@ def startup_and_cleanup(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (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;BlobEndpoint=http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port) - gdal.SetConfigOption('CPL_AZURE_TIMESTAMP', 'my_timestamp') + gdal.SetConfigOption( + "AZURE_STORAGE_CONNECTION_STRING", + "DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=MY_ACCOUNT_KEY;BlobEndpoint=http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + ) + gdal.SetConfigOption("CPL_AZURE_TIMESTAMP", "my_timestamp") yield @@ -87,6 +97,7 @@ def startup_and_cleanup(): for var in az_vars: gdal.SetConfigOption(var, az_vars[var]) + ############################################################################### # Test with a fake Azure Blob server @@ -98,70 +109,91 @@ def test_vsiaz_fake_basic(): gdal.VSICurlClearCache() - 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')) + 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' + request.protocol_version = "HTTP/1.1" h = request.headers - if 'Authorization' not in h or \ - h['Authorization'] != 'SharedKey myaccount:+n9wC1twBBP4T84fioDIGi9bz/CrbwRaQL0LV4sACnw=' or \ - 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if ( + "Authorization" not in h + or h["Authorization"] + != "SharedKey myaccount:+n9wC1twBBP4T84fioDIGi9bz/CrbwRaQL0LV4sACnw=" + 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.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')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" h = request.headers - if 'Authorization' not in h or \ - h['Authorization'] != 'SharedKey myaccount:EbxgYgvs7jUPNq14XrbmFBAj4eLE3ymYAHIGfMhUI9A=' 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)) + if ( + "Authorization" not in h + or h["Authorization"] + != "SharedKey myaccount:EbxgYgvs7jUPNq14XrbmFBAj4eLE3ymYAHIGfMhUI9A=" + 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.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')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsiaz_streaming/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/resource2.bin', 200, - {'Content-Length': '1000000'}) + 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') + 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) @@ -170,10 +202,14 @@ def method(request): pytest.fail() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/resource2.bin', 200, - {'Content-Length': 1000000}) + 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') + 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) @@ -183,12 +219,19 @@ def method(request): # Test that we don't emit a Authorization header in AZURE_NO_SIGN_REQUEST # mode, even if we have credentials - with gdaltest.config_option('AZURE_NO_SIGN_REQUEST', 'YES'): + with gdaltest.config_option("AZURE_NO_SIGN_REQUEST", "YES"): handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/test_AZURE_NO_SIGN_REQUEST.bin', 200, - {'Content-Length': 1000000}, unexpected_headers = ['Authorization']) + handler.add( + "HEAD", + "/azure/blob/myaccount/az_fake_bucket/test_AZURE_NO_SIGN_REQUEST.bin", + 200, + {"Content-Length": 1000000}, + unexpected_headers=["Authorization"], + ) with webserver.install_http_handler(handler): - stat_res = gdal.VSIStatL('/vsiaz_streaming/az_fake_bucket/test_AZURE_NO_SIGN_REQUEST.bin') + stat_res = gdal.VSIStatL( + "/vsiaz_streaming/az_fake_bucket/test_AZURE_NO_SIGN_REQUEST.bin" + ) assert stat_res is not None @@ -202,9 +245,12 @@ def test_vsiaz_fake_readdir(): pytest.skip() handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&prefix=a_dir%20with_space%2F&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&prefix=a_dir%20with_space%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>a_dir with_space/</Prefix> <NextMarker>bla</NextMarker> @@ -218,10 +264,14 @@ def test_vsiaz_fake_readdir(): </Blob> </Blobs> </EnumerationResults> - """) - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&marker=bla&prefix=a_dir%20with_space%2F&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&marker=bla&prefix=a_dir%20with_space%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>a_dir with_space/</Prefix> <Blobs> @@ -237,52 +287,80 @@ def test_vsiaz_fake_readdir(): </BlobPrefix> </Blobs> </EnumerationResults> - """) + """, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.bin') + f = open_for_read( + "/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ) if f is None: - if gdaltest.is_travis_branch('trusty'): - pytest.skip('Skipped on trusty branch, but should be investigated') + 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 with_space') - assert dir_contents == ['resource3 with_space.bin', 'resource4.bin', 'subdir'] - assert gdal.VSIStatL('/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.bin').size == 123456 - assert gdal.VSIStatL('/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.bin').mtime == 1 + dir_contents = gdal.ReadDir("/vsiaz/az_fake_bucket2/a_dir with_space") + assert dir_contents == ["resource3 with_space.bin", "resource4.bin", "subdir"] + assert ( + gdal.VSIStatL( + "/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).size + == 123456 + ) + assert ( + gdal.VSIStatL( + "/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.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 with_space/resource3 with_space.bin') + dir_contents = gdal.ReadDir( + "/vsiaz/az_fake_bucket2/a_dir with_space/resource3 with_space.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) + 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/') + 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"?> + 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 == ['.'] + 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"?> + handler.add( + "GET", + "/azure/blob/myaccount/?comp=list", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Containers> <Container> @@ -291,9 +369,14 @@ def test_vsiaz_fake_readdir(): </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"?> + """, + ) + 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> @@ -301,10 +384,12 @@ def test_vsiaz_fake_readdir(): </Container> </Containers> </EnumerationResults> - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsiaz/') - assert dir_contents == ['mycontainer1', 'mycontainer2'] + dir_contents = gdal.ReadDir("/vsiaz/") + assert dir_contents == ["mycontainer1", "mycontainer2"] + ############################################################################### # Test AZURE_STORAGE_SAS_TOKEN option with fake server @@ -317,17 +402,25 @@ def test_vsiaz_sas_fake(): gdal.VSICurlClearCache() - with gdaltest.config_options({'AZURE_STORAGE_ACCOUNT': 'test', - 'AZURE_STORAGE_SAS_TOKEN': 'sig=sas', - 'CPL_AZURE_ENDPOINT' : 'http://127.0.0.1:%d/azure/blob/test' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'AZURE_STORAGE_CONNECTION_STRING': ''}): + with gdaltest.config_options( + { + "AZURE_STORAGE_ACCOUNT": "test", + "AZURE_STORAGE_SAS_TOKEN": "sig=sas", + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/test" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "AZURE_STORAGE_CONNECTION_STRING": "", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/test/test?comp=list&delimiter=%2F&restype=container&sig=sas', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/test/test?comp=list&delimiter=%2F&restype=container&sig=sas", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Blobs> @@ -340,12 +433,14 @@ def test_vsiaz_sas_fake(): </Blob> </Blobs> </EnumerationResults> - """) + """, + ) with webserver.install_http_handler(handler): - assert 'foo.bin' in gdal.ReadDir('/vsiaz/test') + assert "foo.bin" in gdal.ReadDir("/vsiaz/test") + + assert gdal.VSIStatL("/vsiaz/test/foo.bin").size == 456789 - assert gdal.VSIStatL('/vsiaz/test/foo.bin').size == 456789 ############################################################################### # Test write @@ -359,50 +454,65 @@ def test_vsiaz_fake_write(): gdal.VSICurlClearCache() # Test creation of BlockBob - f = gdal.VSIFOpenExL('/vsiaz/test_copy/file.tif', 'wb', 0, ['Content-Encoding=bar', 'x-ms-client-request-id=REQUEST_ID']) + f = gdal.VSIFOpenExL( + "/vsiaz/test_copy/file.tif", + "wb", + 0, + ["Content-Encoding=bar", "x-ms-client-request-id=REQUEST_ID"], + ) assert f is not None handler = webserver.SequentialHandler() def method(request): h = request.headers - if 'Authorization' not in h or \ - h['Authorization'] != 'SharedKey myaccount:QQv1veT5YQPRSJz8rymEvH2VBNNXnlGnqQhRLAu+MII=' 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' or \ - 'Content-Type' not in h or h['Content-Type'] != 'image/tiff' or \ - 'Content-Encoding' not in h or h['Content-Encoding'] != 'bar' or \ - 'x-ms-client-request-id' not in h or h['x-ms-client-request-id'] != 'REQUEST_ID': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if ( + "Authorization" not in h + or h["Authorization"] + != "SharedKey myaccount:QQv1veT5YQPRSJz8rymEvH2VBNNXnlGnqQhRLAu+MII=" + 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" + or "Content-Type" not in h + or h["Content-Type"] != "image/tiff" + or "Content-Encoding" not in h + or h["Content-Encoding"] != "bar" + or "x-ms-client-request-id" not in h + or h["x-ms-client-request-id"] != "REQUEST_ID" + ): + 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') + 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)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', custom_method=method) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", 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) + 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.tif', 'wb') + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "wb") assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFReadL(1, 1, f) @@ -410,7 +520,7 @@ def method(request): gdal.VSIFCloseL(f) # Simulate illegal seek - f = gdal.VSIFOpenL('/vsiaz/test_copy/file.tif', 'wb') + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "wb") assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFSeekL(f, 1, 0) @@ -418,24 +528,24 @@ def method(request): gdal.VSIFCloseL(f) # Simulate failure when putting BlockBob - f = gdal.VSIFOpenL('/vsiaz/test_copy/file.tif', 'wb') + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "wb") assert f is not None handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', custom_method=method) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", custom_method=method) if gdal.VSIFSeekL(f, 0, 0) != 0: gdal.VSIFCloseL(f) pytest.fail() - gdal.VSIFWriteL('x' * 35000, 1, 35000, f) + gdal.VSIFWriteL("x" * 35000, 1, 35000, f) if gdal.VSIFTellL(f) != 35000: gdal.VSIFCloseL(f) @@ -464,139 +574,169 @@ def method(request): pytest.fail(ret) # Simulate creation of BlockBob over an existing blob of incompatible type - f = gdal.VSIFOpenL('/vsiaz/test_copy/file.tif', 'wb') + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "wb") assert f is not None handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', 409) - handler.add('DELETE', '/azure/blob/myaccount/test_copy/file.tif', 202) - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', 201) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", 409) + handler.add("DELETE", "/azure/blob/myaccount/test_copy/file.tif", 202) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", 201) with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) # Test creation of AppendBlob - gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', '10') - f = gdal.VSIFOpenExL('/vsiaz/test_copy/file.tif', 'wb', 0, ['x-ms-client-request-id=REQUEST_ID']) - gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) + gdal.SetConfigOption("VSIAZ_CHUNK_SIZE_BYTES", "10") + f = gdal.VSIFOpenExL( + "/vsiaz/test_copy/file.tif", "wb", 0, ["x-ms-client-request-id=REQUEST_ID"] + ) + 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:DCVvJjXpnSkpAbuzpZU+ZnAiIo2Jy2oh8xyrHoU3ygw=' 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' or \ - 'x-ms-client-request-id' not in h or h['x-ms-client-request-id'] != 'REQUEST_ID': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if ( + "Authorization" not in h + or h["Authorization"] + != "SharedKey myaccount:DCVvJjXpnSkpAbuzpZU+ZnAiIo2Jy2oh8xyrHoU3ygw=" + 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" + or "x-ms-client-request-id" not in h + or h["x-ms-client-request-id"] != "REQUEST_ID" + ): + sys.stderr.write("Bad headers: %s\n" % str(h)) request.send_response(403) return - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', custom_method=method) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", 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' or \ - 'x-ms-blob-condition-appendpos' not in h or h['x-ms-blob-condition-appendpos'] != '0': - sys.stderr.write('Bad headers: %s\n' % str(h)) + 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" + or "x-ms-blob-condition-appendpos" not in h + or h["x-ms-blob-condition-appendpos"] != "0" + ): + 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.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.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif?comp=appendblock', custom_method=method) + handler.add( + "PUT", + "/azure/blob/myaccount/test_copy/file.tif?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' or \ - 'x-ms-blob-condition-appendpos' not in h or h['x-ms-blob-condition-appendpos'] != '10': - sys.stderr.write('Bad headers: %s\n' % str(h)) + 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" + or "x-ms-blob-condition-appendpos" not in h + or h["x-ms-blob-condition-appendpos"] != "10" + ): + 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.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.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif?comp=appendblock', custom_method=method) + handler.add( + "PUT", + "/azure/blob/myaccount/test_copy/file.tif?comp=appendblock", + custom_method=method, + ) with webserver.install_http_handler(handler): - ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) + 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.tif', 'wb') - gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) + gdal.SetConfigOption("VSIAZ_CHUNK_SIZE_BYTES", "10") + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "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.protocol_version = "HTTP/1.1" request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif', custom_method=method) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", custom_method=method) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) + 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.tif', 'wb') - gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) + gdal.SetConfigOption("VSIAZ_CHUNK_SIZE_BYTES", "10") + f = gdal.VSIFOpenL("/vsiaz/test_copy/file.tif", "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.tif', 201) - handler.add('PUT', '/azure/blob/myaccount/test_copy/file.tif?comp=appendblock', 403) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif", 201) + handler.add("PUT", "/azure/blob/myaccount/test_copy/file.tif?comp=appendblock", 403) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) + ret = gdal.VSIFWriteL("0123456789abcdef", 1, 16, f) if ret != 0: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) + ############################################################################### # Test write with retry @@ -609,35 +749,39 @@ def test_vsiaz_write_blockblob_retry(): gdal.VSICurlClearCache() # Test creation of BlockBob - f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') + 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'}): + 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') + 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)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + 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) + 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 gdaltest.error_handler(): with webserver.install_http_handler(handler): - assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 + assert gdal.VSIFWriteL("foo", 1, 3, f) == 3 gdal.VSIFCloseL(f) + ############################################################################### # Test write with retry @@ -649,26 +793,39 @@ def test_vsiaz_write_appendblob_retry(): gdal.VSICurlClearCache() - with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', - 'GDAL_HTTP_RETRY_DELAY': '0.01', - 'VSIAZ_CHUNK_SIZE_BYTES': '10'}): + 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') + 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) + 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 gdaltest.error_handler(): with webserver.install_http_handler(handler): - assert gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) == 16 + assert gdal.VSIFWriteL("0123456789abcdef", 1, 16, f) == 16 gdal.VSIFCloseL(f) + ############################################################################### # Test Unlink() @@ -680,21 +837,42 @@ def test_vsiaz_fake_unlink(): # 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'}) + 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') + 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'}) + 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') + ret = gdal.Unlink("/vsiaz/az_bucket_test_unlink/myfile") assert ret == -1 + ############################################################################### # Test Mkdir() / Rmdir() @@ -705,24 +883,40 @@ def test_vsiaz_fake_mkdir_rmdir(): pytest.skip() # Invalid name - ret = gdal.Mkdir('/vsiaz', 0) + 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) + 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) + 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"?> + 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> @@ -731,22 +925,25 @@ def test_vsiaz_fake_mkdir_rmdir(): </Blob> </Blobs> </EnumerationResults> - """) + """, + ) with webserver.install_http_handler(handler): - ret = gdal.Mkdir('/vsiaz/az_bucket_test_mkdir/dir', 0) + ret = gdal.Mkdir("/vsiaz/az_bucket_test_mkdir/dir", 0) assert ret != 0 # Invalid name - ret = gdal.Rmdir('/vsiaz') + 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"?> + 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>az_bucket_test_mkdir/</Prefix> <Blobs> @@ -755,18 +952,25 @@ def test_vsiaz_fake_mkdir_rmdir(): </Blob> </Blobs> </EnumerationResults> - """) - 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) + """, + ) + 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, + ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/it_is_a_file') + 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"?> + 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> @@ -775,10 +979,15 @@ def test_vsiaz_fake_mkdir_rmdir(): </Blob> </Blobs> </EnumerationResults> - """) - handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/.gdal_marker_for_dir', 202) + """, + ) + 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') + ret = gdal.Rmdir("/vsiaz/az_bucket_test_mkdir/dir") assert ret == 0 # Try deleting already deleted directory @@ -786,19 +995,25 @@ def test_vsiaz_fake_mkdir_rmdir(): # as soon as the last object in it is removed. So when directories are created # without .gdal_marker_for_dir they will disappear without explicit removal 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) + 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') + 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"?> + 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> @@ -807,11 +1022,14 @@ def test_vsiaz_fake_mkdir_rmdir(): </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"?> + """, + ) + 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> @@ -820,11 +1038,13 @@ def test_vsiaz_fake_mkdir_rmdir(): </Blob> </Blobs> </EnumerationResults> - """) + """, + ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/dir_nonempty') + ret = gdal.Rmdir("/vsiaz/az_bucket_test_mkdir/dir_nonempty") assert ret != 0 + ############################################################################### # Test Mkdir() / Rmdir() on a container @@ -837,38 +1057,54 @@ def test_vsiaz_fake_mkdir_rmdir_container(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + 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> - """) - handler.add('HEAD', "/azure/blob/myaccount/new_container", 400) - handler.add('PUT', "/azure/blob/myaccount/new_container?restype=container", 201) + """, + ) + handler.add("HEAD", "/azure/blob/myaccount/new_container", 400) + handler.add("PUT", "/azure/blob/myaccount/new_container?restype=container", 201) with webserver.install_http_handler(handler): - ret = gdal.Mkdir('/vsiaz/new_container', 0o755) + ret = gdal.Mkdir("/vsiaz/new_container", 0o755) assert ret == 0 handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + 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><Container><Name>new_container</Name></Container></Containers> </EnumerationResults> - """) - handler.add('GET', '/azure/blob/myaccount/new_container?comp=list&delimiter=%2F&maxresults=1&restype=container', 200, {'Content-type': 'application/xml'}, - """"<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add( + "GET", + "/azure/blob/myaccount/new_container?comp=list&delimiter=%2F&maxresults=1&restype=container", + 200, + {"Content-type": "application/xml"}, + """"<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Blobs> </Blobs> </EnumerationResults> - """) - handler.add('DELETE', "/azure/blob/myaccount/new_container?restype=container", 202) + """, + ) + handler.add("DELETE", "/azure/blob/myaccount/new_container?restype=container", 202) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsiaz/new_container') + ret = gdal.Rmdir("/vsiaz/new_container") assert ret == 0 + ############################################################################### @@ -877,15 +1113,24 @@ def test_vsiaz_fake_test_BlobEndpointInConnectionString(): if gdaltest.webserver_port == 0: pytest.skip() - with gdaltest.config_option('AZURE_STORAGE_CONNECTION_STRING', - 'DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=MY_ACCOUNT_KEY;BlobEndpoint=http://127.0.0.1:%d/myaccount' % gdaltest.webserver_port): + with gdaltest.config_option( + "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 + ) - 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 ############################################################################### # Test rename + def test_vsiaz_fake_rename(): if gdaltest.webserver_port == 0: @@ -893,31 +1138,43 @@ def test_vsiaz_fake_rename(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/source.txt', 200, - {'Content-Length': '3'}) - handler.add('HEAD', '/azure/blob/myaccount/test/target.txt', 404) - handler.add('GET', '/azure/blob/myaccount/test?comp=list&delimiter=%2F&maxresults=1&prefix=target.txt%2F&restype=container', 200) + handler.add( + "HEAD", "/azure/blob/myaccount/test/source.txt", 200, {"Content-Length": "3"} + ) + handler.add("HEAD", "/azure/blob/myaccount/test/target.txt", 404) + handler.add( + "GET", + "/azure/blob/myaccount/test?comp=list&delimiter=%2F&maxresults=1&prefix=target.txt%2F&restype=container", + 200, + ) def method(request): - if request.headers['Content-Length'] != '0': - sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) + if request.headers["Content-Length"] != "0": + sys.stderr.write( + "Did not get expected headers: %s\n" % str(request.headers) + ) request.send_response(400) return - expected = 'http://127.0.0.1:%d/azure/blob/myaccount/test/source.txt' % gdaltest.webserver_port - if request.headers['x-ms-copy-source'] != expected: - sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) + expected = ( + "http://127.0.0.1:%d/azure/blob/myaccount/test/source.txt" + % gdaltest.webserver_port + ) + if request.headers["x-ms-copy-source"] != expected: + sys.stderr.write( + "Did not get expected headers: %s\n" % str(request.headers) + ) request.send_response(400) return request.send_response(202) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test/target.txt', custom_method=method) - handler.add('DELETE', '/azure/blob/myaccount/test/source.txt', 202) + handler.add("PUT", "/azure/blob/myaccount/test/target.txt", custom_method=method) + handler.add("DELETE", "/azure/blob/myaccount/test/source.txt", 202) with webserver.install_http_handler(handler): - assert gdal.Rename( '/vsiaz/test/source.txt', '/vsiaz/test/target.txt') == 0 + assert gdal.Rename("/vsiaz/test/source.txt", "/vsiaz/test/target.txt") == 0 ############################################################################### @@ -931,8 +1188,12 @@ def test_vsiaz_opendir(): # Unlimited depth handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/opendir?comp=list&restype=container', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/opendir?comp=list&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Blobs> @@ -954,23 +1215,24 @@ def test_vsiaz_opendir(): </Properties> </Blob> </Blobs> - </EnumerationResults>""") + </EnumerationResults>""", + ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsiaz/opendir') + d = gdal.OpenDir("/vsiaz/opendir") assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test.txt' + 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.name == "subdir/" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/test.txt' + assert entry.name == "subdir/test.txt" assert entry.size == 4 assert entry.mode == 32768 @@ -981,8 +1243,12 @@ def test_vsiaz_opendir(): # Prefix filtering on root of bucket handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/opendir?comp=list&prefix=my_prefix&restype=container', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/opendir?comp=list&prefix=my_prefix&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>my_prefix</Prefix> <Blobs> @@ -994,13 +1260,14 @@ def test_vsiaz_opendir(): </Properties> </Blob> </Blobs> - </EnumerationResults>""") + </EnumerationResults>""", + ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsiaz/opendir', -1, ['PREFIX=my_prefix']) + d = gdal.OpenDir("/vsiaz/opendir", -1, ["PREFIX=my_prefix"]) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'my_prefix_test.txt' + assert entry.name == "my_prefix_test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 @@ -1012,8 +1279,12 @@ def test_vsiaz_opendir(): # Prefix filtering on root of subdir handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/opendir?comp=list&prefix=some_dir%2Fmy_prefix&restype=container', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/opendir?comp=list&prefix=some_dir%2Fmy_prefix&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>some_dir/my_prefix</Prefix> <Blobs> @@ -1025,13 +1296,14 @@ def test_vsiaz_opendir(): </Properties> </Blob> </Blobs> - </EnumerationResults>""") + </EnumerationResults>""", + ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsiaz/opendir/some_dir', -1, ['PREFIX=my_prefix']) + d = gdal.OpenDir("/vsiaz/opendir/some_dir", -1, ["PREFIX=my_prefix"]) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'my_prefix_test.txt' + assert entry.name == "my_prefix_test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 @@ -1042,16 +1314,29 @@ def test_vsiaz_opendir(): gdal.CloseDir(d) # No network access done - s = gdal.VSIStatL('/vsiaz/opendir/some_dir/my_prefix_test.txt', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG |gdal.VSI_STAT_CACHE_ONLY) + s = gdal.VSIStatL( + "/vsiaz/opendir/some_dir/my_prefix_test.txt", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) assert s assert (s.mode & 32768) != 0 assert s.size == 40 assert s.mtime == 1 # No network access done - assert gdal.VSIStatL('/vsiaz/opendir/some_dir/i_do_not_exist.txt', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG | gdal.VSI_STAT_CACHE_ONLY) is None + assert ( + gdal.VSIStatL( + "/vsiaz/opendir/some_dir/i_do_not_exist.txt", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) + is None + ) ############################################################################### @@ -1064,8 +1349,12 @@ def test_vsiaz_rmdirrecursive(): pytest.skip() handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/rmdirrec?comp=list&prefix=subdir%2F&restype=container', 200, {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/rmdirrec?comp=list&prefix=subdir%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>subdir/</Prefix> <Blobs> @@ -1087,15 +1376,24 @@ def test_vsiaz_rmdirrecursive(): </Properties> </Blob> </Blobs> - </EnumerationResults>""") - handler.add('DELETE', '/azure/blob/myaccount/rmdirrec/subdir/test.txt', 202) - handler.add('DELETE', '/azure/blob/myaccount/rmdirrec/subdir/subdir2/test.txt', 202) - handler.add('HEAD', '/azure/blob/myaccount/rmdirrec/subdir/subdir2/', 404) - handler.add('GET', '/azure/blob/myaccount/rmdirrec?comp=list&delimiter=%2F&maxresults=1&prefix=subdir%2Fsubdir2%2F&restype=container', 200) - handler.add('HEAD', '/azure/blob/myaccount/rmdirrec/subdir/', 404) - handler.add('GET', '/azure/blob/myaccount/rmdirrec?comp=list&delimiter=%2F&maxresults=1&prefix=subdir%2F&restype=container', 200) + </EnumerationResults>""", + ) + handler.add("DELETE", "/azure/blob/myaccount/rmdirrec/subdir/test.txt", 202) + handler.add("DELETE", "/azure/blob/myaccount/rmdirrec/subdir/subdir2/test.txt", 202) + handler.add("HEAD", "/azure/blob/myaccount/rmdirrec/subdir/subdir2/", 404) + handler.add( + "GET", + "/azure/blob/myaccount/rmdirrec?comp=list&delimiter=%2F&maxresults=1&prefix=subdir%2Fsubdir2%2F&restype=container", + 200, + ) + handler.add("HEAD", "/azure/blob/myaccount/rmdirrec/subdir/", 404) + handler.add( + "GET", + "/azure/blob/myaccount/rmdirrec?comp=list&delimiter=%2F&maxresults=1&prefix=subdir%2F&restype=container", + 200, + ) with webserver.install_http_handler(handler): - assert gdal.RmdirRecursive('/vsiaz/rmdirrec/subdir') == 0 + assert gdal.RmdirRecursive("/vsiaz/rmdirrec/subdir") == 0 ############################################################################### @@ -1105,47 +1403,64 @@ def test_vsiaz_rmdirrecursive(): def test_vsiaz_fake_sync_multithreaded_upload_chunk_size(): if gdaltest.is_github_workflow_mac(): - pytest.xfail('Failure. See https://github.com/rouault/gdal/runs/1329425333?check_suite_focus=true') + pytest.xfail( + "Failure. See https://github.com/rouault/gdal/runs/1329425333?check_suite_focus=true" + ) if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() - gdal.Mkdir('/vsimem/test', 0) - gdal.FileFromMemBuffer('/vsimem/test/foo', 'foo\n') + gdal.Mkdir("/vsimem/test", 0) + gdal.FileFromMemBuffer("/vsimem/test/foo", "foo\n") - tab = [ -1 ] + tab = [-1] handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/test_bucket?comp=list&prefix=test%2F&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/test_bucket?comp=list&prefix=test%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>test/</Prefix> <Blobs/> </EnumerationResults> - """) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/test', 404) - handler.add('GET', '/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=test%2F&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/test", 404) + handler.add( + "GET", + "/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=test%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>test/</Prefix> <Blobs/> </EnumerationResults> - """) - handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add( + "GET", + "/azure/blob/myaccount/?comp=list", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Blobs/> </EnumerationResults> - """) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket', 404) - handler.add('GET', '/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket", 404) + handler.add( + "GET", + "/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Blobs> @@ -1154,75 +1469,100 @@ def test_vsiaz_fake_sync_multithreaded_upload_chunk_size(): </BlobPrefix> </Blobs> </EnumerationResults> - """) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/test/', 404) - handler.add('GET', '/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=test%2F&restype=container', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + """, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/test/", 404) + handler.add( + "GET", + "/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=test%2F&restype=container", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>test/</Prefix> <Blobs/> </EnumerationResults> - """) - handler.add('PUT', '/azure/blob/myaccount/test_bucket/test/.gdal_marker_for_dir', 201) + """, + ) + handler.add( + "PUT", "/azure/blob/myaccount/test_bucket/test/.gdal_marker_for_dir", 201 + ) # Simulate an existing blob of another type - handler.add('PUT', '/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000001&comp=block', - 409, - expected_headers={'Content-Length': '3'}) - - handler.add('DELETE', '/azure/blob/myaccount/test_bucket/test/foo', 202) - - handler.add('PUT', '/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000001&comp=block', - 201, - expected_headers={'Content-Length': '3'}) - - handler.add('PUT', '/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000002&comp=block', - 201, - expected_headers={'Content-Length': '1'}) + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000001&comp=block", + 409, + expected_headers={"Content-Length": "3"}, + ) + + handler.add("DELETE", "/azure/blob/myaccount/test_bucket/test/foo", 202) + + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000001&comp=block", + 201, + expected_headers={"Content-Length": "3"}, + ) + + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/test/foo?blockid=000000000002&comp=block", + 201, + expected_headers={"Content-Length": "1"}, + ) def method(request): h = request.headers - if 'Content-Length' not in h or h['Content-Length'] != '124': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if "Content-Length" not in h or h["Content-Length"] != "124": + 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(124).decode('ascii') - if content != """<?xml version="1.0" encoding="utf-8"?> + request.protocol_version = "HTTP/1.1" + request.wfile.write("HTTP/1.1 100 Continue\r\n\r\n".encode("ascii")) + content = request.rfile.read(124).decode("ascii") + if ( + content + != """<?xml version="1.0" encoding="utf-8"?> <BlockList> <Latest>000000000001</Latest> <Latest>000000000002</Latest> </BlockList> -""": - sys.stderr.write('Bad content: %s\n' % str(content)) +""" + ): + sys.stderr.write("Bad content: %s\n" % str(content)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_bucket/test/foo?comp=blocklist', - custom_method = method) + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/test/foo?comp=blocklist", + custom_method=method, + ) def cbk(pct, _, tab): assert pct >= tab[0] tab[0] = pct return True - with gdaltest.config_option('VSIS3_SIMULATE_THREADING', 'YES'): + with gdaltest.config_option("VSIS3_SIMULATE_THREADING", "YES"): with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/test', - '/vsiaz/test_bucket', - options=['NUM_THREADS=1', 'CHUNK_SIZE=3'], - callback=cbk, callback_data=tab) + assert gdal.Sync( + "/vsimem/test", + "/vsiaz/test_bucket", + options=["NUM_THREADS=1", "CHUNK_SIZE=3"], + callback=cbk, + callback_data=tab, + ) assert tab[0] == 1.0 - gdal.RmdirRecursive('/vsimem/test') + gdal.RmdirRecursive("/vsimem/test") ############################################################################### @@ -1236,13 +1576,16 @@ def test_vsiaz_fake_sync_multithreaded_upload_single_file(): gdal.VSICurlClearCache() - gdal.Mkdir('/vsimem/test', 0) - gdal.FileFromMemBuffer('/vsimem/test/foo', 'foo\n') + gdal.Mkdir("/vsimem/test", 0) + gdal.FileFromMemBuffer("/vsimem/test/foo", "foo\n") handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, - {'Content-type': 'application/xml'}, - """<?xml version="1.0" encoding="UTF-8"?> + handler.add( + "GET", + "/azure/blob/myaccount/?comp=list", + 200, + {"Content-type": "application/xml"}, + """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix></Prefix> <Containers> @@ -1251,53 +1594,73 @@ def test_vsiaz_fake_sync_multithreaded_upload_single_file(): </Container> </Containers> </EnumerationResults> - """) - handler.add('HEAD', '/azure/blob/myaccount/test_bucket/foo', 404) - handler.add('GET', '/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=foo%2F&restype=container', 200) - - handler.add('PUT', '/azure/blob/myaccount/test_bucket/foo?blockid=000000000001&comp=block', - 201, - expected_headers={'Content-Length': '3'}) - - handler.add('PUT', '/azure/blob/myaccount/test_bucket/foo?blockid=000000000002&comp=block', - 201, - expected_headers={'Content-Length': '1'}) + """, + ) + handler.add("HEAD", "/azure/blob/myaccount/test_bucket/foo", 404) + handler.add( + "GET", + "/azure/blob/myaccount/test_bucket?comp=list&delimiter=%2F&maxresults=1&prefix=foo%2F&restype=container", + 200, + ) + + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/foo?blockid=000000000001&comp=block", + 201, + expected_headers={"Content-Length": "3"}, + ) + + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/foo?blockid=000000000002&comp=block", + 201, + expected_headers={"Content-Length": "1"}, + ) def method(request): h = request.headers - if 'Content-Length' not in h or h['Content-Length'] != '124': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if "Content-Length" not in h or h["Content-Length"] != "124": + 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(124).decode('ascii') - if content != """<?xml version="1.0" encoding="utf-8"?> + request.protocol_version = "HTTP/1.1" + request.wfile.write("HTTP/1.1 100 Continue\r\n\r\n".encode("ascii")) + content = request.rfile.read(124).decode("ascii") + if ( + content + != """<?xml version="1.0" encoding="utf-8"?> <BlockList> <Latest>000000000001</Latest> <Latest>000000000002</Latest> </BlockList> -""": - sys.stderr.write('Bad content: %s\n' % str(content)) +""" + ): + sys.stderr.write("Bad content: %s\n" % str(content)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(201) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/azure/blob/myaccount/test_bucket/foo?comp=blocklist', - custom_method = method) + handler.add( + "PUT", + "/azure/blob/myaccount/test_bucket/foo?comp=blocklist", + custom_method=method, + ) - with gdaltest.config_option('VSIS3_SIMULATE_THREADING', 'YES'): + with gdaltest.config_option("VSIS3_SIMULATE_THREADING", "YES"): with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/test/foo', - '/vsiaz/test_bucket', - options=['NUM_THREADS=1', 'CHUNK_SIZE=3']) + assert gdal.Sync( + "/vsimem/test/foo", + "/vsiaz/test_bucket", + options=["NUM_THREADS=1", "CHUNK_SIZE=3"], + ) + + gdal.RmdirRecursive("/vsimem/test") - gdal.RmdirRecursive('/vsimem/test') ############################################################################### # Read credentials from simulated Azure VM @@ -1310,51 +1673,82 @@ def test_vsiaz_read_credentials_simulated_azure_vm(): gdal.VSICurlClearCache() - with gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING' : '', - 'AZURE_STORAGE_ACCOUNT': 'myaccount', - 'CPL_AZURE_ENDPOINT' : 'http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'CPL_AZURE_VM_API_ROOT_URL': 'http://localhost:%d' % gdaltest.webserver_port}): + with gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": "", + "AZURE_STORAGE_ACCOUNT": "myaccount", + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "CPL_AZURE_VM_API_ROOT_URL": "http://localhost:%d" + % gdaltest.webserver_port, + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F', 200, {}, - """{ + handler.add( + "GET", + "/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F", + 200, + {}, + """{ "access_token": "my_bearer", "expires_on": "99999999999", }""", - expected_headers={'Metadata': 'true'}) - - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', 200, - {'Content-Length': 3}, - 'foo', - expected_headers={'Authorization': 'Bearer my_bearer', 'x-ms-version': '2019-12-12'}) + expected_headers={"Metadata": "true"}, + ) + + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket/resource", + 200, + {"Content-Length": 3}, + "foo", + expected_headers={ + "Authorization": "Bearer my_bearer", + "x-ms-version": "2019-12-12", + }, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Set a fake URL to check that credentials re-use works - with gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING' : '', - 'AZURE_STORAGE_ACCOUNT': 'myaccount', - 'CPL_AZURE_ENDPOINT' : 'http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'CPL_AZURE_VM_API_ROOT_URL': 'invalid'}): + with gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": "", + "AZURE_STORAGE_ACCOUNT": "myaccount", + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "CPL_AZURE_VM_API_ROOT_URL": "invalid", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/bar', 200, - {'Content-Length': 3}, - 'bar', - expected_headers={'Authorization': 'Bearer my_bearer', 'x-ms-version': '2019-12-12'}) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket/bar", + 200, + {"Content-Length": 3}, + "bar", + expected_headers={ + "Authorization": "Bearer my_bearer", + "x-ms-version": "2019-12-12", + }, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/bar') + f = open_for_read("/vsiaz/az_fake_bucket/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" + ############################################################################### # Read credentials from simulated Azure VM with expiration @@ -1367,37 +1761,60 @@ def test_vsiaz_read_credentials_simulated_azure_vm_expiration(): gdal.VSICurlClearCache() - with gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING' : '', - 'AZURE_STORAGE_ACCOUNT': 'myaccount', - 'CPL_AZURE_ENDPOINT' : 'http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'CPL_AZURE_VM_API_ROOT_URL': 'http://localhost:%d' % gdaltest.webserver_port}): + with gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": "", + "AZURE_STORAGE_ACCOUNT": "myaccount", + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "CPL_AZURE_VM_API_ROOT_URL": "http://localhost:%d" + % gdaltest.webserver_port, + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F', 200, {}, - """{ + handler.add( + "GET", + "/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F", + 200, + {}, + """{ "access_token": "my_bearer", "expires_on": "1000", }""", - expected_headers={'Metadata': 'true'}) + expected_headers={"Metadata": "true"}, + ) # Credentials requested again since they are expired - handler.add('GET', '/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F', 200, {}, - """{ + handler.add( + "GET", + "/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F", + 200, + {}, + """{ "access_token": "my_bearer", "expires_on": "1000", }""", - expected_headers={'Metadata': 'true'}) - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', 200, - {'Content-Length': 3}, - 'foo', - expected_headers={'Authorization': 'Bearer my_bearer', 'x-ms-version': '2019-12-12'}) + expected_headers={"Metadata": "true"}, + ) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket/resource", + 200, + {"Content-Length": 3}, + "foo", + expected_headers={ + "Authorization": "Bearer my_bearer", + "x-ms-version": "2019-12-12", + }, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" ############################################################################### @@ -1412,54 +1829,87 @@ def test_vsiaz_fake_metadata(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('HEAD', '/azure/blob/myaccount/test/foo.bin', 200, {'Content-Length': '3', 'x-ms-foo': 'bar'}) + handler.add( + "HEAD", + "/azure/blob/myaccount/test/foo.bin", + 200, + {"Content-Length": "3", "x-ms-foo": "bar"}, + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiaz/test/foo.bin', 'HEADERS') - assert 'x-ms-foo' in md - assert md['x-ms-foo'] == 'bar' + md = gdal.GetFileMetadata("/vsiaz/test/foo.bin", "HEADERS") + assert "x-ms-foo" in md + assert md["x-ms-foo"] == "bar" handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/test/foo.bin?comp=metadata', 200, {'x-ms-meta-foo': 'bar'}) + handler.add( + "GET", + "/azure/blob/myaccount/test/foo.bin?comp=metadata", + 200, + {"x-ms-meta-foo": "bar"}, + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiaz/test/foo.bin', 'METADATA') - assert 'x-ms-meta-foo' in md - assert md['x-ms-meta-foo'] == 'bar' + md = gdal.GetFileMetadata("/vsiaz/test/foo.bin", "METADATA") + assert "x-ms-meta-foo" in md + assert md["x-ms-meta-foo"] == "bar" handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/test/foo.bin?comp=tags', 200, {}, - """<Tags><TagSet><Tag><Key>foo</Key><Value>bar</Value></Tag></TagSet></Tags>""") + handler.add( + "GET", + "/azure/blob/myaccount/test/foo.bin?comp=tags", + 200, + {}, + """<Tags><TagSet><Tag><Key>foo</Key><Value>bar</Value></Tag></TagSet></Tags>""", + ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsiaz/test/foo.bin', 'TAGS') - assert 'foo' in md - assert md['foo'] == 'bar' + md = gdal.GetFileMetadata("/vsiaz/test/foo.bin", "TAGS") + assert "foo" in md + assert md["foo"] == "bar" # Error case handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/test/foo.bin?comp=metadata', 404) + handler.add("GET", "/azure/blob/myaccount/test/foo.bin?comp=metadata", 404) with webserver.install_http_handler(handler): - assert gdal.GetFileMetadata('/vsiaz/test/foo.bin', 'METADATA') == {} + assert gdal.GetFileMetadata("/vsiaz/test/foo.bin", "METADATA") == {} # SetMetadata() handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test/foo.bin?comp=properties', 200, expected_headers={'x-ms-foo': 'bar'}) + handler.add( + "PUT", + "/azure/blob/myaccount/test/foo.bin?comp=properties", + 200, + expected_headers={"x-ms-foo": "bar"}, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiaz/test/foo.bin', {'x-ms-foo': 'bar'}, 'PROPERTIES') + assert gdal.SetFileMetadata( + "/vsiaz/test/foo.bin", {"x-ms-foo": "bar"}, "PROPERTIES" + ) handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test/foo.bin?comp=metadata', 200, expected_headers={'x-ms-meta-foo': 'bar'}) + handler.add( + "PUT", + "/azure/blob/myaccount/test/foo.bin?comp=metadata", + 200, + expected_headers={"x-ms-meta-foo": "bar"}, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiaz/test/foo.bin', {'x-ms-meta-foo': 'bar'}, 'METADATA') + assert gdal.SetFileMetadata( + "/vsiaz/test/foo.bin", {"x-ms-meta-foo": "bar"}, "METADATA" + ) handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test/foo.bin?comp=tags', 204, expected_body=b'') + handler.add( + "PUT", "/azure/blob/myaccount/test/foo.bin?comp=tags", 204, expected_body=b"" + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsiaz/test/foo.bin', {'FOO': 'BAR'}, 'TAGS') + assert gdal.SetFileMetadata("/vsiaz/test/foo.bin", {"FOO": "BAR"}, "TAGS") # Error case handler = webserver.SequentialHandler() - handler.add('PUT', '/azure/blob/myaccount/test/foo.bin?comp=metadata', 404) + handler.add("PUT", "/azure/blob/myaccount/test/foo.bin?comp=metadata", 404) with webserver.install_http_handler(handler): - assert not gdal.SetFileMetadata('/vsiaz/test/foo.bin', {'x-ms-meta-foo': 'bar'}, 'METADATA') + assert not gdal.SetFileMetadata( + "/vsiaz/test/foo.bin", {"x-ms-meta-foo": "bar"}, "METADATA" + ) ############################################################################### @@ -1473,28 +1923,42 @@ def test_vsiaz_read_credentials_config_file_connection_string(): gdal.VSICurlClearCache() - config_content = """ + config_content = ( + """ [unrelated] account=foo [storage] connection_string = DefaultEndpointsProtocol=http;AccountName=myaccount2;AccountKey=MY_ACCOUNT_KEY;BlobEndpoint=http://127.0.0.1:%d/azure/blob/myaccount2 -""" % gdaltest.webserver_port - - with gdaltest.tempfile('/vsimem/azure_config_dir/config', config_content), \ - gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING': None, - 'AZURE_CONFIG_DIR': '/vsimem/azure_config_dir'}): +""" + % gdaltest.webserver_port + ) + + with gdaltest.tempfile( + "/vsimem/azure_config_dir/config", config_content + ), gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": None, + "AZURE_CONFIG_DIR": "/vsimem/azure_config_dir", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount2/az_fake_bucket/resource', 200, - {'Content-Length': 3}, - 'foo', - expected_headers={'Authorization': 'SharedKey myaccount2:Cm8BtA8Wkst7zAdGmcoKoR0tWuj2rzO+WpfBwWQ4RrY='}) + handler.add( + "GET", + "/azure/blob/myaccount2/az_fake_bucket/resource", + 200, + {"Content-Length": 3}, + "foo", + expected_headers={ + "Authorization": "SharedKey myaccount2:Cm8BtA8Wkst7zAdGmcoKoR0tWuj2rzO+WpfBwWQ4RrY=" + }, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" ############################################################################### @@ -1516,23 +1980,35 @@ def test_vsiaz_read_credentials_config_file_account_and_key(): key = MY_ACCOUNT_KEY """ - with gdaltest.tempfile('/vsimem/azure_config_dir/config', config_content), \ - gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING': None, - 'CPL_AZURE_ENDPOINT': 'http://127.0.0.1:%d/azure/blob/myaccount2' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'AZURE_CONFIG_DIR': '/vsimem/azure_config_dir'}): + with gdaltest.tempfile( + "/vsimem/azure_config_dir/config", config_content + ), gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": None, + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount2" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "AZURE_CONFIG_DIR": "/vsimem/azure_config_dir", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount2/az_fake_bucket/resource', 200, - {'Content-Length': 3}, - 'foo', - expected_headers={'Authorization': 'SharedKey myaccount2:Cm8BtA8Wkst7zAdGmcoKoR0tWuj2rzO+WpfBwWQ4RrY='}) + handler.add( + "GET", + "/azure/blob/myaccount2/az_fake_bucket/resource", + 200, + {"Content-Length": 3}, + "foo", + expected_headers={ + "Authorization": "SharedKey myaccount2:Cm8BtA8Wkst7zAdGmcoKoR0tWuj2rzO+WpfBwWQ4RrY=" + }, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" ############################################################################### @@ -1554,22 +2030,32 @@ def test_vsiaz_read_credentials_config_file_account_and_sas_token(): sas_token = sig=sas """ - with gdaltest.tempfile('/vsimem/azure_config_dir/config', config_content), \ - gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING': None, - 'CPL_AZURE_ENDPOINT': 'http://127.0.0.1:%d/azure/blob/myaccount2' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'AZURE_CONFIG_DIR': '/vsimem/azure_config_dir'}): + with gdaltest.tempfile( + "/vsimem/azure_config_dir/config", config_content + ), gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": None, + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount2" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "AZURE_CONFIG_DIR": "/vsimem/azure_config_dir", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount2/az_fake_bucket/resource?sig=sas', 200, - {'Content-Length': 3}, - 'foo') + handler.add( + "GET", + "/azure/blob/myaccount2/az_fake_bucket/resource?sig=sas", + 200, + {"Content-Length": 3}, + "foo", + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" ############################################################################### @@ -1589,14 +2075,20 @@ def test_vsiaz_read_credentials_config_file_missing_account(): [storage] """ - with gdaltest.tempfile('/vsimem/azure_config_dir/config', config_content), \ - gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING': None, - 'CPL_AZURE_ENDPOINT': 'http://127.0.0.1:%d/azure/blob/foo' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'AZURE_CONFIG_DIR': '/vsimem/azure_config_dir'}): + with gdaltest.tempfile( + "/vsimem/azure_config_dir/config", config_content + ), gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": None, + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/foo" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "AZURE_CONFIG_DIR": "/vsimem/azure_config_dir", + } + ): handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is None @@ -1611,20 +2103,29 @@ def test_vsiaz_access_token(): gdal.VSICurlClearCache() - with gdaltest.config_options({'AZURE_STORAGE_CONNECTION_STRING': None, - 'AZURE_STORAGE_ACCOUNT': 'myaccount', - 'CPL_AZURE_ENDPOINT': 'http://127.0.0.1:%d/azure/blob/myaccount' % gdaltest.webserver_port, - 'CPL_AZURE_USE_HTTPS': 'NO', - 'AZURE_STORAGE_ACCESS_TOKEN': 'my_token'}): + with gdaltest.config_options( + { + "AZURE_STORAGE_CONNECTION_STRING": None, + "AZURE_STORAGE_ACCOUNT": "myaccount", + "CPL_AZURE_ENDPOINT": "http://127.0.0.1:%d/azure/blob/myaccount" + % gdaltest.webserver_port, + "CPL_AZURE_USE_HTTPS": "NO", + "AZURE_STORAGE_ACCESS_TOKEN": "my_token", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', 200, - {'Content-Length': 3}, - 'foo', - expected_headers={'Authorization': 'Bearer my_token'}) + handler.add( + "GET", + "/azure/blob/myaccount/az_fake_bucket/resource", + 200, + {"Content-Length": 3}, + "foo", + expected_headers={"Authorization": "Bearer my_token"}, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsiaz/az_fake_bucket/resource') + f = open_for_read("/vsiaz/az_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" diff --git a/autotest/gcore/vsiaz_real_instance_auto.py b/autotest/gcore/vsiaz_real_instance_auto.py index d76c380f0384..881a3df3a527 100644 --- a/autotest/gcore/vsiaz_real_instance_auto.py +++ b/autotest/gcore/vsiaz_real_instance_auto.py @@ -28,46 +28,52 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - -import gdaltest import os -import pytest import stat import sys -pytestmark = pytest.mark.skipif(not gdaltest.built_against_curl(), reason="GDAL not built against curl") +import gdaltest +import pytest + +from osgeo import gdal + +pytestmark = pytest.mark.skipif( + not gdaltest.built_against_curl(), reason="GDAL not built against curl" +) def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): az_vars = {} for var, reset_val in ( - ('AZURE_STORAGE_CONNECTION_STRING', None), - ('AZURE_STORAGE_ACCOUNT', None), - ('AZURE_STORAGE_ACCESS_KEY', None), - ('AZURE_STORAGE_SAS_TOKEN', None), - ('AZURE_NO_SIGN_REQUEST', None), - ('AZURE_CONFIG_DIR', ''), - ('AZURE_STORAGE_ACCESS_TOKEN', '')): + ("AZURE_STORAGE_CONNECTION_STRING", None), + ("AZURE_STORAGE_ACCOUNT", None), + ("AZURE_STORAGE_ACCESS_KEY", None), + ("AZURE_STORAGE_SAS_TOKEN", None), + ("AZURE_NO_SIGN_REQUEST", None), + ("AZURE_CONFIG_DIR", ""), + ("AZURE_STORAGE_ACCESS_TOKEN", ""), + ): az_vars[var] = gdal.GetConfigOption(var) gdal.SetConfigOption(var, reset_val) - assert gdal.GetSignedURL('/vsiaz/foo/bar') is None + assert gdal.GetSignedURL("/vsiaz/foo/bar") is None yield for var in az_vars: gdal.SetConfigOption(var, az_vars[var]) + ############################################################################### # Error cases @@ -80,45 +86,56 @@ def test_vsiaz_real_server_errors(): # 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 + 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 + 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 - with gdaltest.config_option('AZURE_STORAGE_CONNECTION_STRING', 'invalid'): + with gdaltest.config_option("AZURE_STORAGE_CONNECTION_STRING", "invalid"): gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsiaz/foo/bar') + f = open_for_read("/vsiaz/foo/bar") assert f is None # Missing AZURE_STORAGE_ACCESS_KEY gdal.ErrorReset() - with gdaltest.config_options({'AZURE_STORAGE_ACCOUNT': 'AZURE_STORAGE_ACCOUNT', - 'CPL_AZURE_VM_API_ROOT_URL': 'disabled'}): + with gdaltest.config_options( + { + "AZURE_STORAGE_ACCOUNT": "AZURE_STORAGE_ACCOUNT", + "CPL_AZURE_VM_API_ROOT_URL": "disabled", + } + ): with gdaltest.error_handler(): - f = open_for_read('/vsiaz/foo/bar') - assert f is None and gdal.VSIGetLastErrorMsg().find('AZURE_STORAGE_ACCESS_KEY') >= 0 + f = open_for_read("/vsiaz/foo/bar") + assert ( + f is None + and gdal.VSIGetLastErrorMsg().find("AZURE_STORAGE_ACCESS_KEY") >= 0 + ) # AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_ACCESS_KEY but invalid gdal.ErrorReset() - with gdaltest.config_options({'AZURE_STORAGE_ACCOUNT': 'AZURE_STORAGE_ACCOUNT', - 'AZURE_STORAGE_ACCESS_KEY': 'AZURE_STORAGE_ACCESS_KEY'}): + with gdaltest.config_options( + { + "AZURE_STORAGE_ACCOUNT": "AZURE_STORAGE_ACCOUNT", + "AZURE_STORAGE_ACCESS_KEY": "AZURE_STORAGE_ACCESS_KEY", + } + ): with gdaltest.error_handler(): - f = open_for_read('/vsiaz/foo/bar.baz') + 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: + 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') + f = open_for_read("/vsiaz_streaming/foo/bar.baz") assert f is None, gdal.VSIGetLastErrorMsg() @@ -127,6 +144,7 @@ def test_vsiaz_real_server_errors(): # FIXME: this resource is no longer accessible through no sign request... # Find another one. + def test_vsiaz_no_sign_request(): if not gdaltest.built_against_curl(): @@ -134,42 +152,64 @@ def test_vsiaz_no_sign_request(): gdal.VSICurlClearCache() - with gdaltest.config_options({ 'AZURE_STORAGE_ACCOUNT': 'naipblobs', 'AZURE_NO_SIGN_REQUEST': 'YES'}): - actual_url = gdal.GetActualURL('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') - assert actual_url == 'https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif' - assert actual_url == gdal.GetSignedURL('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') - - f = open_for_read('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') + with gdaltest.config_options( + {"AZURE_STORAGE_ACCOUNT": "naipblobs", "AZURE_NO_SIGN_REQUEST": "YES"} + ): + actual_url = gdal.GetActualURL( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + assert ( + actual_url + == "https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + assert actual_url == gdal.GetSignedURL( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + + f = open_for_read( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) if f is None: - if gdaltest.gdalurlopen('https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') is None: - pytest.skip('cannot open URL') + if ( + gdaltest.gdalurlopen( + "https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + is None + ): + pytest.skip("cannot open URL") pytest.fail() gdal.VSIFCloseL(f) - assert 'm_3008601_ne_16_1_20150804.tif' in gdal.ReadDir('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/') + assert "m_3008601_ne_16_1_20150804.tif" in gdal.ReadDir( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/" + ) gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip").mode) gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip/').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip/").mode) gdal.VSICurlClearCache() - assert gdal.VSIStatL('/vsiaz/naip_i_dont_exist') is None + assert gdal.VSIStatL("/vsiaz/naip_i_dont_exist") is None gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip/v002').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip/v002").mode) ############################################################################### # Test AZURE_SAS option -@pytest.mark.skipif(sys.platform == 'darwin' and 'CI' in os.environ, reason='Randomly fails on MacOSX. Not sure why.') + +@pytest.mark.skipif( + sys.platform == "darwin" and "CI" in os.environ, + reason="Randomly fails on MacOSX. Not sure why.", +) def test_vsiaz_sas(): if not gdaltest.built_against_curl(): @@ -178,33 +218,57 @@ def test_vsiaz_sas(): gdal.VSICurlClearCache() # See https://azure.microsoft.com/en-us/services/open-datasets/catalog/naip/ for the value of AZURE_SAS - with gdaltest.config_options({ 'AZURE_STORAGE_ACCOUNT': 'naipblobs', 'AZURE_SAS': 'st=2019-07-18T03%3A53%3A22Z&se=2035-07-19T03%3A53%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=2RIXmLbLbiagYnUd49rgx2kOXKyILrJOgafmkODhRAQ%3D'}): - actual_url = gdal.GetActualURL('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') - assert actual_url == 'https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif' - assert gdal.GetSignedURL('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') == 'https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif?st=2019-07-18T03%3A53%3A22Z&se=2035-07-19T03%3A53%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=2RIXmLbLbiagYnUd49rgx2kOXKyILrJOgafmkODhRAQ%3D' - - f = open_for_read('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') + with gdaltest.config_options( + { + "AZURE_STORAGE_ACCOUNT": "naipblobs", + "AZURE_SAS": "st=2019-07-18T03%3A53%3A22Z&se=2035-07-19T03%3A53%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=2RIXmLbLbiagYnUd49rgx2kOXKyILrJOgafmkODhRAQ%3D", + } + ): + actual_url = gdal.GetActualURL( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + assert ( + actual_url + == "https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + assert ( + gdal.GetSignedURL( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + == "https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif?st=2019-07-18T03%3A53%3A22Z&se=2035-07-19T03%3A53%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=2RIXmLbLbiagYnUd49rgx2kOXKyILrJOgafmkODhRAQ%3D" + ) + + f = open_for_read( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) if f is None: - if gdaltest.gdalurlopen('https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif') is None: - pytest.skip('cannot open URL') + if ( + gdaltest.gdalurlopen( + "https://naipblobs.blob.core.windows.net/naip/v002/al/2015/al_100cm_2015/30086/m_3008601_ne_16_1_20150804.tif" + ) + is None + ): + pytest.skip("cannot open URL") pytest.fail() gdal.VSIFCloseL(f) - assert 'm_3008601_ne_16_1_20150804.tif' in gdal.ReadDir('/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/') + assert "m_3008601_ne_16_1_20150804.tif" in gdal.ReadDir( + "/vsiaz/naip/v002/al/2015/al_100cm_2015/30086/" + ) gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip").mode) gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip/').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip/").mode) gdal.VSICurlClearCache() - assert gdal.VSIStatL('/vsiaz/naip_i_dont_exist') is None + assert gdal.VSIStatL("/vsiaz/naip_i_dont_exist") is None gdal.VSICurlClearCache() - assert stat.S_ISDIR(gdal.VSIStatL('/vsiaz/naip/v002').mode) + assert stat.S_ISDIR(gdal.VSIStatL("/vsiaz/naip/v002").mode) diff --git a/autotest/gcore/vsiaz_real_instance_manual.py b/autotest/gcore/vsiaz_real_instance_manual.py index 8cf395ccfd14..abb190377b81 100644 --- a/autotest/gcore/vsiaz_real_instance_manual.py +++ b/autotest/gcore/vsiaz_real_instance_manual.py @@ -29,20 +29,23 @@ ############################################################################### import stat -from osgeo import gdal - import gdaltest import pytest -pytestmark = pytest.mark.skipif(not gdaltest.built_against_curl(), reason="GDAL not built against curl") +from osgeo import gdal + +pytestmark = pytest.mark.skipif( + not gdaltest.built_against_curl(), reason="GDAL not built against curl" +) def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### # Nominal cases (require valid credentials) @@ -53,105 +56,118 @@ def test_vsiaz_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() - az_resource = gdal.GetConfigOption('AZ_RESOURCE') + az_resource = gdal.GetConfigOption("AZ_RESOURCE") if az_resource is None: - pytest.skip('Missing AZ_RESOURCE') + pytest.skip("Missing AZ_RESOURCE") - if '/' not in az_resource: - path = '/vsiaz/' + 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) + 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' + 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 + 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) + 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)) + 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) + 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) + 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)) + assert unique_id not in readdir, "ReadDir(%s) should not contain %s" % ( + path, + unique_id, + ) ret = gdal.Mkdir(subpath, 0) - assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "wb") assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + 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) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') - assert 'x-ms-blob-type' in md + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") + assert "x-ms-blob-type" in md - metadata_md = gdal.GetFileMetadata(subpath + '/test.txt', 'METADATA') - assert 'ETag' in metadata_md or 'etag' in metadata_md + metadata_md = gdal.GetFileMetadata(subpath + "/test.txt", "METADATA") + assert "ETag" in metadata_md or "etag" in metadata_md assert metadata_md != md - md = gdal.GetFileMetadata(subpath + '/test.txt', 'TAGS') + md = gdal.GetFileMetadata(subpath + "/test.txt", "TAGS") assert md == {} # Change properties - assert gdal.SetFileMetadata(subpath + '/test.txt', {'x-ms-blob-content-type' : 'foo'}, 'PROPERTIES') - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') - assert md.get('Content-Type', '') == 'foo' or md.get('content-type', '') == 'foo', md + assert gdal.SetFileMetadata( + subpath + "/test.txt", {"x-ms-blob-content-type": "foo"}, "PROPERTIES" + ) + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") + assert ( + md.get("Content-Type", "") == "foo" or md.get("content-type", "") == "foo" + ), md # Change metadata - assert gdal.SetFileMetadata(subpath + '/test.txt', {'x-ms-meta-FOO' : 'BAR'}, 'METADATA') - md = gdal.GetFileMetadata(subpath + '/test.txt', 'METADATA') - assert md['x-ms-meta-FOO'] == 'BAR' + assert gdal.SetFileMetadata( + subpath + "/test.txt", {"x-ms-meta-FOO": "BAR"}, "METADATA" + ) + md = gdal.GetFileMetadata(subpath + "/test.txt", "METADATA") + assert md["x-ms-meta-FOO"] == "BAR" # Change tags (doesn't seem to work with Azurite) - if ':10000/devstoreaccount1' not in gdal.GetConfigOption('AZURE_STORAGE_CONNECTION_STRING', ''): - assert gdal.SetFileMetadata(subpath + '/test.txt', {'BAR' : 'BAZ'}, 'TAGS') - md = gdal.GetFileMetadata(subpath + '/test.txt', 'TAGS') - assert md['BAR'] == 'BAZ' + if ":10000/devstoreaccount1" not in gdal.GetConfigOption( + "AZURE_STORAGE_CONNECTION_STRING", "" + ): + assert gdal.SetFileMetadata(subpath + "/test.txt", {"BAR": "BAZ"}, "TAGS") + md = gdal.GetFileMetadata(subpath + "/test.txt", "TAGS") + assert md["BAR"] == "BAZ" - assert gdal.Rename(subpath + '/test.txt', subpath + '/test2.txt') == 0 + assert gdal.Rename(subpath + "/test.txt", subpath + "/test2.txt") == 0 - f = gdal.VSIFOpenL(subpath + '/test2.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test2.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - ret = gdal.Unlink(subpath + '/test2.txt') - assert ret >= 0, \ - ('Unlink(%s) should not return an error' % (subpath + '/test2.txt')) + ret = gdal.Unlink(subpath + "/test2.txt") + assert ret >= 0, "Unlink(%s) should not return an error" % ( + subpath + "/test2.txt" + ) ret = gdal.Rmdir(subpath) - assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) + assert ret >= 0, "Rmdir(%s) should not return an error" % subpath return - f = open_for_read('/vsiaz/' + az_resource) + f = open_for_read("/vsiaz/" + az_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -159,7 +175,7 @@ def test_vsiaz_extra_1(): assert len(ret) == 1 # Same with /vsiaz_streaming/ - f = open_for_read('/vsiaz_streaming/' + az_resource) + f = open_for_read("/vsiaz_streaming/" + az_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -170,20 +186,20 @@ def test_vsiaz_extra_1(): # 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') + f = open_for_read("/vsiaz/not_existing_bucket/foo") with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) - assert gdal.VSIGetLastErrorMsg() != '' + assert gdal.VSIGetLastErrorMsg() != "" # Invalid resource gdal.ErrorReset() - f = open_for_read('/vsiaz_streaming/' + az_resource + '/invalid_resource.baz') + 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) + 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) diff --git a/autotest/gcore/vsicredential.py b/autotest/gcore/vsicredential.py index 2ce27ed60248..be9940a01d52 100755 --- a/autotest/gcore/vsicredential.py +++ b/autotest/gcore/vsicredential.py @@ -28,43 +28,44 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import pytest + from osgeo import gdal -import pytest def test_vsicredential(): with pytest.raises(Exception): - assert gdal.GetCredential(None, 'key') + assert gdal.GetCredential(None, "key") with pytest.raises(Exception): - assert gdal.GetCredential('prefix', None) + assert gdal.GetCredential("prefix", None) - assert gdal.GetCredential('prefix', 'key') is None + assert gdal.GetCredential("prefix", "key") is None - assert gdal.GetCredential('prefix', 'key', 'default') == 'default' + assert gdal.GetCredential("prefix", "key", "default") == "default" with pytest.raises(Exception): - gdal.SetCredential(None, 'key', 'value') + gdal.SetCredential(None, "key", "value") with pytest.raises(Exception): - gdal.SetCredential('prefix', None, 'value') + gdal.SetCredential("prefix", None, "value") - gdal.SetCredential('prefix', 'key', 'value') - assert gdal.GetCredential('prefix', 'key') == 'value' - assert gdal.GetCredential('prefix/object', 'key') == 'value' - assert gdal.GetCredential('prefix', 'key', 'default') == 'value' - assert gdal.GetCredential('another_prefix', 'key') is None + gdal.SetCredential("prefix", "key", "value") + assert gdal.GetCredential("prefix", "key") == "value" + assert gdal.GetCredential("prefix/object", "key") == "value" + assert gdal.GetCredential("prefix", "key", "default") == "value" + assert gdal.GetCredential("another_prefix", "key") is None - gdal.SetCredential('prefix', 'key', None) - assert gdal.GetCredential('prefix', 'key') is None + gdal.SetCredential("prefix", "key", None) + assert gdal.GetCredential("prefix", "key") is None - gdal.SetCredential('prefix', 'key', 'value') - gdal.ClearCredentials('prefix') - assert gdal.GetCredential('prefix', 'key') is None + gdal.SetCredential("prefix", "key", "value") + gdal.ClearCredentials("prefix") + assert gdal.GetCredential("prefix", "key") is None - gdal.SetCredential('prefix', 'key', 'value') - gdal.ClearCredentials('another_prefix') - assert gdal.GetCredential('prefix', 'key') == 'value' + gdal.SetCredential("prefix", "key", "value") + gdal.ClearCredentials("another_prefix") + assert gdal.GetCredential("prefix", "key") == "value" gdal.ClearCredentials() - assert gdal.GetCredential('prefix', 'key') is None + assert gdal.GetCredential("prefix", "key") is None diff --git a/autotest/gcore/vsicrypt.py b/autotest/gcore/vsicrypt.py index 362f5bbcb42f..d00fd12ae413 100755 --- a/autotest/gcore/vsicrypt.py +++ b/autotest/gcore/vsicrypt.py @@ -33,13 +33,14 @@ import os import struct -from osgeo import gdal - import gdaltest import pytest - from gcore.testnonboundtoswig import setup as testnonboundtoswig_setup # noqa -testnonboundtoswig_setup; # to please pyflakes + +from osgeo import gdal + +testnonboundtoswig_setup +# to please pyflakes ############################################################################### # Use common test for /vsicrypt @@ -48,15 +49,19 @@ def test_vsicrypt_1(): gdaltest.has_vsicrypt = False - fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb+') + 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') + 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') + + return vsifile.vsifile_generic( + "/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin" + ) + ############################################################################### # Test various error cases @@ -69,49 +74,59 @@ def test_vsicrypt_2(): # Missing key with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') + 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') + 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') + 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') + 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') + 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+') + fp = gdal.VSIFOpenL("/vsicrypt/key=a,file=/vsimem/file.bin", "wb+") assert fp is None # Invalid signature - gdal.FileFromMemBuffer('/vsimem/file.bin', 'foo') + gdal.FileFromMemBuffer("/vsimem/file.bin", "foo") with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') + 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') + 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') + 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') + fp = gdal.VSIFOpenL("/vsimem/file.bin", "rb") header = gdal.VSIFReadL(1, 1000, fp) gdal.VSIFCloseL(fp) @@ -119,233 +134,353 @@ def test_vsicrypt_2(): # Test shortening header for i in range(46): - fp = gdal.VSIFOpenL('/vsimem/file.bin', 'wb') + 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') + 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') + fp = gdal.VSIFOpenL("/vsimem/file.bin", "wb") try: - new_byte = chr(val).encode('latin1') + new_byte = chr(val).encode("latin1") except (UnicodeDecodeError, UnicodeEncodeError): new_byte = chr(val) - header_new = header[0:i] + new_byte + header[i + 1:] + 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') + 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') + 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) + 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') + 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') + "/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') + 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') + 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) + 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') + 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' + assert content != "hello" with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt/key=short_key,file=/vsimem/file.bin', 'ab') + 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) + 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') + 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') + 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') + fp = gdal.VSIFOpenL( + "/vsicrypt/key=dont_use_in_prod,file=/vsimem/file.bin", "ab" + ) assert fp is None # Test creating with potentially not built-in alg: with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt/alg=blowfish,key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb') + 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') + 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') + 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') + gdal.Unlink("/vsimem/file.bin") + ############################################################################### # Test various options + @pytest.mark.skipif( - os.environ.get('BUILD_NAME', '') == 's390x', - reason='Fails randomly on that platform' + os.environ.get("BUILD_NAME", "") == "s390x", + reason="Fails randomly on that platform", ) 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': + 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') + 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') + 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.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') + 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 + 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') + 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') + 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.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') + 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 + 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') + 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') + key_b64 = gdal.GetConfigOption("VSICRYPT_KEY_B64") assert key_b64 is not None - gdal.VSIFWriteL('hello', 1, 5, fp) + 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') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "rb") + content = gdal.VSIFReadL(1, 5, fp).decode("latin1") gdal.VSIFCloseL(fp) - assert content == 'hello', options + assert content == "hello", options - gdal.SetConfigOption('VSICRYPT_KEY_B64', None) + 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') + 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 + assert content == "hello", options with gdaltest.error_handler(): - statRes = gdal.VSIStatL('/vsicrypt//vsimem/file.bin') + statRes = gdal.VSIStatL("/vsicrypt//vsimem/file.bin") assert statRes is None - ret = gdal.Rename('/vsicrypt//vsimem/file.bin', '/vsicrypt//vsimem/subdir_crypt/file.bin') + 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') + 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'] + dir_content = gdal.ReadDir("/vsicrypt//vsimem/subdir_crypt") + assert dir_content == ["file2.bin"] + + gdal.Unlink("/vsimem/subdir_crypt/file2.bin") - gdal.Unlink('/vsimem/subdir_crypt/file2.bin') ############################################################################### # Test "random" operations against reference filesystem @@ -356,18 +491,21 @@ 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' + 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+') + test_f = gdal.VSIFOpenL(test_file, "wb+") + ref_f = gdal.VSIFOpenL(ref_file, "wb+") import random + random.seed(seed) for _ in range(20): @@ -376,7 +514,9 @@ def test_vsicrypt_4(): 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)]) + 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) @@ -390,9 +530,9 @@ def test_vsicrypt_4(): 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)) + 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) @@ -404,13 +544,14 @@ def test_vsicrypt_4(): if test_content != ref_content: print(seed) - print('Test content (%d):' % len(test_content)) - print('') - pytest.fail('Ref content (%d):' % len(ref_content)) + 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 @@ -420,51 +561,52 @@ def test_vsicrypt_5(): if not gdaltest.has_vsicrypt: pytest.skip() - test_file = '/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file_enc.bin' + 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) + f = gdal.VSIFOpenL(test_file, "wb+") + gdal.VSIFWriteL("ab", 1, 2, f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL(test_file, 'rb+') + f = gdal.VSIFOpenL(test_file, "rb+") gdal.VSIFSeekL(f, 3, 0) - gdal.VSIFWriteL('d', 1, 1, f) + gdal.VSIFWriteL("d", 1, 1, f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL(test_file, 'rb') + f = gdal.VSIFOpenL(test_file, "rb") content = gdal.VSIFReadL(1, 4, f) - content = struct.unpack('B' * len(content), content) + content = struct.unpack("B" * len(content), content) gdal.VSIFCloseL(f) assert content == (97, 98, 0, 100) - f = gdal.VSIFOpenL(test_file, 'rb+') + f = gdal.VSIFOpenL(test_file, "rb+") gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 5, 0) - gdal.VSIFWriteL('f', 1, 1, f) + gdal.VSIFWriteL("f", 1, 1, f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL(test_file, 'rb') + f = gdal.VSIFOpenL(test_file, "rb") content = gdal.VSIFReadL(1, 6, f) - content = struct.unpack('B' * len(content), content) + content = struct.unpack("B" * len(content), content) gdal.VSIFCloseL(f) assert content == (97, 98, 0, 100, 0, 102) - f = gdal.VSIFOpenL(test_file, 'rb+') + f = gdal.VSIFOpenL(test_file, "rb+") gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 512, 0) - gdal.VSIFWriteL('Z', 1, 1, f) + gdal.VSIFWriteL("Z", 1, 1, f) gdal.VSIFSeekL(f, 7, 0) - gdal.VSIFWriteL('h', 1, 1, f) + gdal.VSIFWriteL("h", 1, 1, f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL(test_file, 'rb') + f = gdal.VSIFOpenL(test_file, "rb") content = gdal.VSIFReadL(1, 8, f) - content = struct.unpack('B' * len(content), content) + 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 @@ -475,50 +617,47 @@ def test_vsicrypt_6(testnonboundtoswig_setup): # noqa testnonboundtoswig_setup.VSISetCryptKey.restype = None # Set a valid key - testnonboundtoswig_setup.VSISetCryptKey('DONT_USE_IN_PROD'.encode('ASCII'), 16) + 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+') + 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.VSIFWriteL("hello", 1, 5, fp) gdal.VSIFCloseL(fp) - fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') - content = gdal.VSIFReadL(1, 5, fp).decode('latin1') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "rb") + content = gdal.VSIFReadL(1, 5, fp).decode("latin1") gdal.VSIFCloseL(fp) - assert content == 'hello' + assert content == "hello" - fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "wb+") assert fp is not None - gdal.VSIFWriteL('hello', 1, 5, fp) + 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') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "rb") + content = gdal.VSIFReadL(1, 5, fp).decode("latin1") gdal.VSIFCloseL(fp) - assert content == 'hello' + assert content == "hello" # Set a too short key - testnonboundtoswig_setup.VSISetCryptKey('bbc'.encode('ASCII'), 3) + testnonboundtoswig_setup.VSISetCryptKey("bbc".encode("ASCII"), 3) with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "rb") assert fp is None with gdaltest.error_handler(): - fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') + 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+') + fp = gdal.VSIFOpenL("/vsicrypt//vsimem/file.bin", "wb+") assert fp is None - gdal.Unlink('/vsimem/file.bin') - - - + gdal.Unlink("/vsimem/file.bin") diff --git a/autotest/gcore/vsicurl.py b/autotest/gcore/vsicurl.py index 9c37aa13f19f..6884992a0387 100755 --- a/autotest/gcore/vsicurl.py +++ b/autotest/gcore/vsicurl.py @@ -29,18 +29,17 @@ ############################################################################### import time -from osgeo import gdal -from osgeo import ogr - import gdaltest -import webserver import pytest +import webserver +from osgeo import gdal, ogr ############################################################################### # + def test_vsicurl_1(): if not gdaltest.run_slow_tests(): pytest.skip() @@ -48,9 +47,12 @@ def test_vsicurl_1(): 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') + ds = ogr.Open( + "/vsizip/vsicurl/http://publicfiles.dep.state.fl.us/dear/BWR_GIS/2007NWFLULC/NWFWMD2007LULC.zip" + ) assert ds is not None + ############################################################################### # @@ -62,9 +64,12 @@ def vsicurl_2(): 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') + 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 @@ -76,9 +81,12 @@ def vsicurl_3(): if not gdaltest.built_against_curl(): pytest.skip() - ds = ogr.Open('/vsizip/vsicurl/http://www.iucnredlist.org/spatial-data/MAMMALS_TERRESTRIAL.zip') + 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 @@ -90,9 +98,12 @@ def test_vsicurl_4(): 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') + 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 @@ -104,9 +115,12 @@ def test_vsicurl_5(): 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') + 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 @@ -118,13 +132,14 @@ def vsicurl_6_disabled(): if not gdaltest.built_against_curl(): pytest.skip() - fl = gdal.ReadDir('/vsicurl/ftp://ftp2.cits.rncan.gc.ca/pub/cantopo/250k_tif') + 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() @@ -132,9 +147,10 @@ def test_vsicurl_7(): if not gdaltest.built_against_curl(): pytest.skip() - fl = gdal.ReadDir('/vsicurl/http://ortho.linz.govt.nz/tifs/2005_06') + fl = gdal.ReadDir("/vsicurl/http://ortho.linz.govt.nz/tifs/2005_06") assert fl + ############################################################################### # Test interleaved reading between 2 datasets @@ -146,11 +162,16 @@ def vsicurl_8(): 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') + 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. @@ -163,10 +184,13 @@ def test_vsicurl_9(): if not gdaltest.built_against_curl(): pytest.skip() - ds = gdal.Open('/vsicurl/http://download.osgeo.org/gdal/data/gtiff/' - 'xx\u4E2D\u6587.\u4E2D\u6587') + ds = gdal.Open( + "/vsicurl/http://download.osgeo.org/gdal/data/gtiff/" + "xx\u4E2D\u6587.\u4E2D\u6587" + ) assert ds is not None + ############################################################################### # Test reading a file with escaped Chinese characters. @@ -178,9 +202,12 @@ def test_vsicurl_10(): 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') + 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 @@ -192,16 +219,19 @@ def test_vsicurl_11(): if not gdaltest.built_against_curl(): pytest.skip() - f = gdal.VSIFOpenL('/vsicurl/http://download.osgeo.org/gdal/data/bmp/Bug2236.bmp', 'rb') + 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') + filelist = gdal.ReadDir("/vsicurl/http://download.osgeo.org/gdal/data/gtiff") assert filelist is not None and filelist + ############################################################################### @@ -213,7 +243,9 @@ def test_vsicurl_start_webserver(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if gdaltest.webserver_port == 0: pytest.skip() @@ -230,58 +262,84 @@ def test_vsicurl_test_redirect(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/test_redirect/', 404) + 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'}, '') + 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' + 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.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': + 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.protocol_version = "HTTP/1.1" request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() else: request.send_response(404) - request.send_header('Content-Length', 0) + 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) + 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') + 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) @@ -293,51 +351,75 @@ def method(request): 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) + 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' + 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.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')) + request.wfile.write(("x" * 16384).encode("ascii")) - handler.add('GET', '/test_redirect/test.bin', custom_method=method) + 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' + 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.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')) + 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) + 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': + 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': + content = gdal.VSIFReadL(1, 2, f).decode("ascii") + if content != "xy": gdal.VSIFCloseL(f) pytest.fail(content) gdal.VSIFCloseL(f) + ############################################################################### # Test redirection with X-Amz-Expires= + X-Amz-Date= type of signed URLs @@ -350,58 +432,87 @@ def test_vsicurl_test_redirect_x_amz(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/test_redirect/', 404) + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % (gdaltest.webserver_port, time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)))) - 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), 403, - {'Server': 'foo'}, '') + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % ( + gdaltest.webserver_port, + time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + ) + ) + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + 403, + {"Server": "foo"}, + "", + ) def method(request): - if 'Range' in request.headers: - if request.headers['Range'] == 'bytes=0-16383': - request.protocol_version = 'HTTP/1.1' + 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.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': + 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.protocol_version = "HTTP/1.1" request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() else: request.send_response(404) - request.send_header('Content-Length', 0) + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), custom_method=method) + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + custom_method=method, + ) with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsicurl/http://localhost:%d/test_redirect/test.bin' % gdaltest.webserver_port, 'rb') + 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) @@ -413,51 +524,78 @@ def method(request): gdal.VSIFSeekL(f, 0, 0) handler = webserver.SequentialHandler() - handler.add('GET', '/foo.s3.amazonaws.com/test_redirected/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), custom_method=method) - handler.add('GET', '/foo.s3.amazonaws.com/test_redirected/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), custom_method=method) + handler.add( + "GET", + "/foo.s3.amazonaws.com/test_redirected/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + custom_method=method, + ) + handler.add( + "GET", + "/foo.s3.amazonaws.com/test_redirected/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + 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' + 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?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % (request.server.port, time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)))) - request.send_header('Content-Length', 16384) + request.send_header( + "Location", + "http://localhost:%d/foo.s3.amazonaws.com/test_redirected2/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % ( + request.server.port, + time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + ), + ) + request.send_header("Content-Length", 16384) request.end_headers() - request.wfile.write(('x' * 16384).encode('ascii')) + request.wfile.write(("x" * 16384).encode("ascii")) - handler.add('GET', '/test_redirect/test.bin', custom_method=method) + 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' + 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.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')) + request.wfile.write("y".encode("ascii")) - handler.add('GET', '/foo.s3.amazonaws.com/test_redirected2/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s' % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), custom_method=method) + handler.add( + "GET", + "/foo.s3.amazonaws.com/test_redirected2/test.bin?X-Amz-Signature=foo&X-Amz-Expires=30&X-Amz-Date=%s" + % time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(current_time)), + 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': + 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': + content = gdal.VSIFReadL(1, 2, f).decode("ascii") + if content != "xy": gdal.VSIFCloseL(f) pytest.fail(content) gdal.VSIFCloseL(f) + ############################################################################### # TODO: better testing @@ -467,6 +605,7 @@ def test_vsicurl_test_clear_cache(): gdal.VSICurlClearCache() gdal.VSICurlClearCache() + ############################################################################### @@ -476,11 +615,15 @@ def test_vsicurl_test_retry(): 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) + 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') + 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)) @@ -490,21 +633,25 @@ def test_vsicurl_test_retry(): 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') + 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') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") error_msg = gdal.GetLastErrorMsg() gdal.VSIFCloseL(f) - assert data == 'foo' - assert '429' in error_msg + assert data == "foo" + assert "429" in error_msg ############################################################################### @@ -518,14 +665,18 @@ def test_vsicurl_test_fallback_from_head_to_get(): 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') + 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) + statres = gdal.VSIStatL( + "/vsicurl/http://localhost:%d/test_fallback_from_head_to_get" + % gdaltest.webserver_port + ) assert statres.size == 3 gdal.VSICurlClearCache() + ############################################################################### @@ -535,7 +686,12 @@ def test_vsicurl_test_parse_html_filelist_apache(): pytest.skip() handler = webserver.SequentialHandler() - handler.add('GET', '/mydir/', 200, {}, """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> + handler.add( + "GET", + "/mydir/", + 200, + {}, + """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> <head> <title>Index of /mydir @@ -548,17 +704,34 @@ def test_vsicurl_test_parse_html_filelist_apache(): [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 + 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, {}) + 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 + assert ( + gdal.VSIStatL( + "/vsicurl/http://localhost:%d/mydir/i_dont_exist" + % gdaltest.webserver_port, + gdal.VSI_STAT_EXISTS_FLAG, + ) + is None + ) ############################################################################### @@ -570,12 +743,22 @@ def test_vsicurl_no_size_in_HEAD(): 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) + 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) + statres = gdal.VSIStatL( + "/vsicurl/http://localhost:%d/test_vsicurl_no_size_in_HEAD.bin" + % gdaltest.webserver_port + ) assert statres.size == 10 + ############################################################################### @@ -593,20 +776,25 @@ def __init__(self): self.found_CURL_INFO_HEADER_OUT = False def handler(self, err_type, err_no, err_msg): - if 'CURL_INFO_TEXT:' in err_msg: + if "CURL_INFO_TEXT:" in err_msg: self.found_CURL_INFO_TEXT = True - if 'CURL_INFO_HEADER_IN:' in err_msg: + if "CURL_INFO_HEADER_IN:" in err_msg: self.found_CURL_INFO_HEADER_IN = True - if 'CURL_INFO_HEADER_OUT:' in err_msg: + if "CURL_INFO_HEADER_OUT:" in err_msg: self.found_CURL_INFO_HEADER_OUT = True handler = webserver.SequentialHandler() - handler.add('HEAD', '/test_vsicurl_test_CPL_CURL_VERBOSE', 200, {'Content-Length': '3'}) + handler.add( + "HEAD", "/test_vsicurl_test_CPL_CURL_VERBOSE", 200, {"Content-Length": "3"} + ) my_error_handler = MyHandler() - with gdaltest.config_options({'CPL_CURL_VERBOSE': 'YES', 'CPL_DEBUG': 'ON'}): + with gdaltest.config_options({"CPL_CURL_VERBOSE": "YES", "CPL_DEBUG": "ON"}): with gdaltest.error_handler(my_error_handler.handler): with webserver.install_http_handler(handler): - statres = gdal.VSIStatL('/vsicurl/http://localhost:%d/test_vsicurl_test_CPL_CURL_VERBOSE' % gdaltest.webserver_port) + statres = gdal.VSIStatL( + "/vsicurl/http://localhost:%d/test_vsicurl_test_CPL_CURL_VERBOSE" + % gdaltest.webserver_port + ) assert statres.size == 3 assert my_error_handler.found_CURL_INFO_TEXT @@ -615,6 +803,7 @@ def handler(self, err_type, err_no, err_msg): gdal.VSICurlClearCache() + ############################################################################### @@ -628,6 +817,3 @@ def test_vsicurl_stop_webserver(): gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) - - - diff --git a/autotest/gcore/vsicurl_streaming.py b/autotest/gcore/vsicurl_streaming.py index 354ca3425f32..01488887e3cd 100755 --- a/autotest/gcore/vsicurl_streaming.py +++ b/autotest/gcore/vsicurl_streaming.py @@ -29,35 +29,44 @@ ############################################################################### import time -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # def test_vsicurl_streaming_1(): - drv = gdal.GetDriverByName('HTTP') + 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) + 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') + 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': + if data.decode("ascii") != " 114p01DEMe Base Ma": gdal.VSIFCloseL(fp) pytest.fail() if gdal.VSIFTellL(fp) != 50: @@ -70,7 +79,7 @@ def test_vsicurl_streaming_1(): gdal.VSIFCloseL(fp) pytest.fail() data = gdal.VSIFReadL(1, 50, fp) - if data.decode('ascii') != ' 114p01DEMe Base Ma': + if data.decode("ascii") != " 114p01DEMe Base Ma": gdal.VSIFCloseL(fp) pytest.fail() if gdal.VSIFTellL(fp) != 50: @@ -80,7 +89,7 @@ def test_vsicurl_streaming_1(): 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-': + if data_2001.decode("ascii") != "7-32767-32767-32767-": gdal.VSIFCloseL(fp) pytest.fail(data_2001) if gdal.VSIFTellL(fp) != 2001 + 20: @@ -109,7 +118,7 @@ def test_vsicurl_streaming_1(): gdal.VSIFSeekL(fp, 1024 * 1024 + 100, 0) data = gdal.VSIFReadL(1, 20, fp) - if data.decode('ascii') != '67-32767-32767-32767': + if data.decode("ascii") != "67-32767-32767-32767": gdal.VSIFCloseL(fp) pytest.fail(data) if gdal.VSIFTellL(fp) != 1024 * 1024 + 100 + 20: @@ -117,6 +126,3 @@ def test_vsicurl_streaming_1(): pytest.fail() gdal.VSIFCloseL(fp) - - - diff --git a/autotest/gcore/vsifile.py b/autotest/gcore/vsifile.py index 739afc7fe124..d610ee94d4ec 100755 --- a/autotest/gcore/vsifile.py +++ b/autotest/gcore/vsifile.py @@ -32,11 +32,12 @@ import os import sys import time -from osgeo import gdal -from lxml import etree import gdaltest import pytest +from lxml import etree + +from osgeo import gdal ############################################################################### # Generic test @@ -46,10 +47,10 @@ def vsifile_generic(filename): start_time = time.time() - fp = gdal.VSIFOpenL(filename, 'wb+') + fp = gdal.VSIFOpenL(filename, "wb+") assert fp is not None - assert gdal.VSIFWriteL('0123456789', 1, 10, fp) == 10 + assert gdal.VSIFWriteL("0123456789", 1, 10, fp) == 10 assert gdal.VSIFFlushL(fp) == 0 @@ -65,29 +66,35 @@ def vsifile_generic(filename): assert gdal.VSIFTellL(fp) == 5 - gdal.VSIFWriteL('XX', 1, 2, fp) + 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) + statBuf = gdal.VSIStatL( + filename, + gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG, + ) assert statBuf.size == 7 assert start_time == pytest.approx(statBuf.mtime, abs=2) - fp = gdal.VSIFOpenL(filename, 'rb') + fp = gdal.VSIFOpenL(filename, "rb") assert gdal.VSIFReadL(1, 0, fp) is None assert gdal.VSIFReadL(0, 1, fp) is None buf = gdal.VSIFReadL(1, 7, fp) - assert gdal.VSIFWriteL('a', 1, 1, fp) == 0 + assert gdal.VSIFWriteL("a", 1, 1, fp) == 0 assert gdal.VSIFTruncateL(fp, 0) != 0 gdal.VSIFCloseL(fp) - assert buf.decode('ascii') == '01234XX' + assert buf.decode("ascii") == "01234XX" # Test append mode on existing file - fp = gdal.VSIFOpenL(filename, 'ab') - gdal.VSIFWriteL('XX', 1, 2, fp) + 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) + 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 @@ -96,28 +103,34 @@ def vsifile_generic(filename): assert statBuf is None # Test append mode on non existing file - fp = gdal.VSIFOpenL(filename, 'ab') - gdal.VSIFWriteL('XX', 1, 2, fp) + 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) + 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(): - vsifile_generic('/vsimem/vsifile_1.bin') + vsifile_generic("/vsimem/vsifile_1.bin") + ############################################################################### # Test regular file system def test_vsifile_2(): - vsifile_generic('tmp/vsifile_2.bin') + vsifile_generic("tmp/vsifile_2.bin") + ############################################################################### # Test ftruncate >= 32 bit @@ -125,12 +138,12 @@ def test_vsifile_2(): def test_vsifile_3(): - if not gdaltest.filesystem_supports_sparse_files('tmp'): + if not gdaltest.filesystem_supports_sparse_files("tmp"): pytest.skip() - filename = 'tmp/vsifile_3' + filename = "tmp/vsifile_3" - fp = gdal.VSIFOpenL(filename, 'wb+') + fp = gdal.VSIFOpenL(filename, "wb+") gdal.VSIFTruncateL(fp, 10 * 1024 * 1024 * 1024) gdal.VSIFSeekL(fp, 0, 2) pos = gdal.VSIFTellL(fp) @@ -148,18 +161,22 @@ def test_vsifile_3(): gdal.VSIFCloseL(fp) - statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) + 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') + fp = gdal.VSIFOpenL("vsifile.py", "rb") data = gdal.VSIFReadL(1000000, 1, fp) # print(len(data)) gdal.VSIFSeekL(fp, 0, 0) @@ -167,73 +184,75 @@ def test_vsifile_4(): 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)]) + 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') + gdal.SetConfigOption("VSI_CACHE", "YES") for i in range(3): if i == 0: - gdal.SetConfigOption('VSI_CACHE_SIZE', '0') + gdal.SetConfigOption("VSI_CACHE_SIZE", "0") elif i == 1: - gdal.SetConfigOption('VSI_CACHE_SIZE', '65536') + gdal.SetConfigOption("VSI_CACHE_SIZE", "65536") else: - gdal.SetConfigOption('VSI_CACHE_SIZE', None) + gdal.SetConfigOption("VSI_CACHE_SIZE", None) - fp = gdal.VSIFOpenL('tmp/vsifile_5.bin', 'rb') + 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) + 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) + 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) + 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) + 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) + 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) + 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') + gdal.SetConfigOption("VSI_CACHE_SIZE", None) + gdal.SetConfigOption("VSI_CACHE", None) + gdal.Unlink("tmp/vsifile_5.bin") + ############################################################################### # Test vsicache an read errors (https://github.com/qgis/QGIS/issues/45293) @@ -241,14 +260,14 @@ def test_vsifile_5(): def test_vsifile_vsicache_read_error(): - tmpfilename = 'tmp/test_vsifile_vsicache_read_error.bin' - f = gdal.VSIFOpenL(tmpfilename, 'wb') + tmpfilename = "tmp/test_vsifile_vsicache_read_error.bin" + f = gdal.VSIFOpenL(tmpfilename, "wb") assert f try: gdal.VSIFTruncateL(f, 1000 * 1000) - with gdaltest.config_option('VSI_CACHE', 'YES'): - f2 = gdal.VSIFOpenL(tmpfilename, 'rb') + with gdaltest.config_option("VSI_CACHE", "YES"): + f2 = gdal.VSIFOpenL(tmpfilename, "rb") assert f2 try: gdal.VSIFSeekL(f2, 500 * 1000, 0) @@ -268,7 +287,7 @@ def test_vsifile_vsicache_read_error(): # Truncate the file to simulate a read error gdal.VSIFTruncateL(f, 10) - CHUNK_SIZE=32768 + CHUNK_SIZE = 32768 gdal.VSIFSeekL(f2, 0, 0) assert len(gdal.VSIFReadL(1, CHUNK_SIZE, f2)) == 10 @@ -282,25 +301,26 @@ def test_vsifile_vsicache_read_error(): gdal.VSIFCloseL(f) gdal.Unlink(tmpfilename) + ############################################################################### # Test vsicache above 2 GB def test_vsifile_6(): - if not gdaltest.filesystem_supports_sparse_files('tmp'): + 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') + 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') + 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) @@ -308,16 +328,17 @@ def test_vsifile_6(): 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.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') + gdal.Unlink("tmp/vsifile_6.bin") + ############################################################################### # Test limit cases on /vsimem @@ -325,22 +346,22 @@ def test_vsifile_6(): def test_vsifile_7(): - if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: + 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') + fp = gdal.VSIFOpenL("/vsimem/vsifile_7.bin", "wb") assert gdal.VSIFSeekL(fp, 0x7FFFFFFFFFFFFFFF, 0) == 0 - assert gdal.VSIStatL('/vsimem/vsifile_7.bin').size == 0 + assert gdal.VSIStatL("/vsimem/vsifile_7.bin").size == 0 gdal.PushErrorHandler() - ret = gdal.VSIFWriteL('a', 1, 1, fp) + ret = gdal.VSIFWriteL("a", 1, 1, fp) gdal.PopErrorHandler() assert ret == 0 - assert gdal.VSIStatL('/vsimem/vsifile_7.bin').size == 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') + 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 @@ -348,7 +369,8 @@ def test_vsifile_7(): assert gdal.VSIFEofL(fp) == 1 gdal.VSIFCloseL(fp) - gdal.Unlink('/vsimem/vsifile_7.bin') + gdal.Unlink("/vsimem/vsifile_7.bin") + ############################################################################### # Test renaming directory in /vsimem @@ -357,14 +379,15 @@ def test_vsifile_7(): def test_vsifile_8(): # octal 0666 = decimal 438 - gdal.Mkdir('/vsimem/mydir', 438) - fp = gdal.VSIFOpenL('/vsimem/mydir/a', 'wb') + 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') + 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() @@ -372,26 +395,27 @@ def test_vsifile_8(): def test_vsifile_9(): - lst = gdal.ReadDir('.') + lst = gdal.ReadDir(".") assert len(lst) >= 4 # Test truncation - lst_truncated = gdal.ReadDir('.', int(len(lst) / 2)) + lst_truncated = gdal.ReadDir(".", int(len(lst) / 2)) assert len(lst_truncated) > int(len(lst) / 2) - gdal.Mkdir('/vsimem/mydir', 438) + gdal.Mkdir("/vsimem/mydir", 438) for i in range(10): - fp = gdal.VSIFOpenL('/vsimem/mydir/%d' % i, 'wb') + fp = gdal.VSIFOpenL("/vsimem/mydir/%d" % i, "wb") gdal.VSIFCloseL(fp) - lst = gdal.ReadDir('/vsimem/mydir') + lst = gdal.ReadDir("/vsimem/mydir") assert len(lst) >= 4 # Test truncation - lst_truncated = gdal.ReadDir('/vsimem/mydir', int(len(lst) / 2)) + 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') + gdal.Unlink("/vsimem/mydir/%d" % i) + gdal.Rmdir("/vsimem/mydir") + ############################################################################### # Test fuzzer friendly archive @@ -399,8 +423,9 @@ def test_vsifile_9(): def test_vsifile_10(): - gdal.FileFromMemBuffer('/vsimem/vsifile_10.tar', - """FUZZER_FRIENDLY_ARCHIVE + gdal.FileFromMemBuffer( + "/vsimem/vsifile_10.tar", + """FUZZER_FRIENDLY_ARCHIVE ***NEWFILE***:test.txt abc***NEWFILE***:huge.txt 01234567890123456789012345678901234567890123456789012345678901234567890123456789 @@ -452,55 +477,68 @@ def test_vsifile_10(): 01234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678X ***NEWFILE***:small.txt -a""") - contents = gdal.ReadDir('/vsitar//vsimem/vsifile_10.tar') +a""", + ) + contents = gdal.ReadDir("/vsitar//vsimem/vsifile_10.tar") if contents is None: - gdal.Unlink('/vsimem/vsifile_10.tar') + 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 + 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 +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'] +abc***NEWFILE***:""", + ) + contents = gdal.ReadDir("/vsitar//vsimem/vsifile_10.tar") + assert contents == ["x"] + + gdal.Unlink("/vsimem/vsifile_10.tar") - gdal.Unlink('/vsimem/vsifile_10.tar') ############################################################################### # Test generic Truncate implementation for file extension def test_vsifile_11(): - f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'wb') + 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) + 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') + 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') + 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 @@ -508,27 +546,28 @@ def test_vsifile_11(): def test_vsifile_12(): - target_dir = 'tmp' + 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) + 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') + 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') + gdal.Unlink(target_dir + "/vsifile_12") + ############################################################################### # Test reading filename with prefixes without terminating slash @@ -536,34 +575,35 @@ def test_vsifile_12(): 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') + 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') + 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) @@ -572,7 +612,11 @@ def test_vsifile_13(): 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') + 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) @@ -580,7 +624,7 @@ def test_vsifile_14(): def test_vsifile_15(): - fp = gdal.VSIFOpenL('/vsigzip/data/corrupted_z_buf_error.gz', 'rb') + fp = gdal.VSIFOpenL("/vsigzip/data/corrupted_z_buf_error.gz", "rb") assert fp is not None file_len = 0 while not gdal.VSIFEofL(fp): @@ -602,6 +646,7 @@ def test_vsifile_15(): gdal.VSIFCloseL(fp) + ############################################################################### # Test failed gdal.Rename() with exceptions enabled @@ -611,23 +656,25 @@ 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' + gdal.Rename("/tmp/i_do_not_exist_vsifile_16.tif", "/tmp/me_neither.tif") + ret = "fail" except RuntimeError: - ret = 'success' + 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.GetActualURL("foo") is None + + assert gdal.GetSignedURL("foo") is None - assert gdal.GetSignedURL('foo') is None ############################################################################### # Test gdal.GetFileSystemsPrefixes() @@ -636,7 +683,8 @@ def test_vsifile_17(): def test_vsifile_18(): prefixes = gdal.GetFileSystemsPrefixes() - assert '/vsimem/' in prefixes + assert "/vsimem/" in prefixes + ############################################################################### # Test gdal.GetFileSystemOptions() @@ -667,21 +715,22 @@ def test_vsifile_20(): 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' + filename = "/vsimem/read.tif" + filename_write = "/vsimem/write.tif" + data = "This is some data" - vsifile = gdal.VSIFOpenL(filename, 'wb') + vsifile = gdal.VSIFOpenL(filename, "wb") assert gdal.VSIFWriteL(data, 1, len(data), vsifile) == len(data) gdal.VSIFCloseL(vsifile) - vsifile = gdal.VSIFOpenL(filename, 'rb') + vsifile = gdal.VSIFOpenL(filename, "rb") gdal.VSIFSeekL(vsifile, 0, 2) vsilen = gdal.VSIFTellL(vsifile) gdal.VSIFSeekL(vsifile, 0, 0) @@ -689,7 +738,7 @@ def test_vsifile_21(): data_mem = gdal.VSIGetMemFileBuffer_unsafe(filename) assert data_read == data_mem[:] gdal.VSIFCloseL(vsifile) - vsifile_write = gdal.VSIFOpenL(filename_write, 'wb') + 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) @@ -699,27 +748,30 @@ def test_vsifile_21(): 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()) + assert gdal.VSIGetLastErrorNo() == 0, ( + "Expected Err=0 after VSIErrorReset(), got %d" % gdal.VSIGetLastErrorNo() + ) - fp = gdal.VSIFOpenL('tmp/not-existing', 'r') + 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()) + assert gdal.VSIGetLastErrorNo() == 0, ( + "Expected Err=0 from VSIFOpenL, got %d" % gdal.VSIGetLastErrorNo() + ) # VSIOpenExL does - fp = gdal.VSIFOpenExL('tmp/not-existing', 'r', 1) + 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 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()) + assert gdal.VSIGetLastErrorNo() == 0, ( + "Expected Err=0 after VSIErrorReset(), got %d" % gdal.VSIGetLastErrorNo() + ) ############################################################################### @@ -728,32 +780,34 @@ def test_vsifile_22(): def test_vsitar_bug_675(): - content = gdal.ReadDir('/vsitar/data/tar_with_star_base256_fields.tar') + 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') + 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.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') + 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') + gdal.Unlink("/vsimem/vsigzip_multi_thread.gz") - if data != 'hello' * 100000: + 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]) + 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() @@ -766,67 +820,72 @@ def test_vsigzip_multi_thread(): def test_vsisync(): with gdaltest.error_handler(): - assert not gdal.Sync('/i_do/not/exist', '/vsimem/') + assert not gdal.Sync("/i_do/not/exist", "/vsimem/") with gdaltest.error_handler(): - assert not gdal.Sync('vsifile.py', '/i_do/not/exist') + 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') + 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') + 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': + if sys.platform != "win32": with gdaltest.error_handler(): # even root cannot write into /proc - assert not gdal.Sync('/vsimem/test_sync/', '/proc/i_do_not/exist') + assert not gdal.Sync("/vsimem/test_sync/", "/proc/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' ] + 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') + assert gdal.Sync("/vsimem/test_sync/", "/vsimem/out") - gdal.RmdirRecursive('/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 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' ] + 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") - gdal.RmdirRecursive('/vsimem/test_sync') - gdal.RmdirRecursive('/vsimem/out') ############################################################################### # Test gdal.OpenDir() + @pytest.mark.parametrize("basepath", ["/vsimem/", "tmp/"]) def test_vsifile_opendir(basepath): # Non existing dir - d = gdal.OpenDir(basepath + '/i_dont_exist') + d = gdal.OpenDir(basepath + "/i_dont_exist") assert not d - gdal.RmdirRecursive(basepath + '/vsifile_opendir') + gdal.RmdirRecursive(basepath + "/vsifile_opendir") - gdal.Mkdir(basepath + '/vsifile_opendir', 0o755) + gdal.Mkdir(basepath + "/vsifile_opendir", 0o755) # Empty dir - d = gdal.OpenDir(basepath + '/vsifile_opendir') + d = gdal.OpenDir(basepath + "/vsifile_opendir") assert d entry = gdal.GetNextDirEntry(d) @@ -834,27 +893,27 @@ def test_vsifile_opendir(basepath): gdal.CloseDir(d) - f = gdal.VSIFOpenL(basepath + '/vsifile_opendir/test', 'wb') + f = gdal.VSIFOpenL(basepath + "/vsifile_opendir/test", "wb") assert f - gdal.VSIFWriteL('foo', 1, 3, f) + gdal.VSIFWriteL("foo", 1, 3, f) gdal.VSIFCloseL(f) - gdal.Mkdir(basepath + '/vsifile_opendir/subdir', 0o755) - gdal.Mkdir(basepath + '/vsifile_opendir/subdir/subdir2', 0o755) + gdal.Mkdir(basepath + "/vsifile_opendir/subdir", 0o755) + gdal.Mkdir(basepath + "/vsifile_opendir/subdir/subdir2", 0o755) - f = gdal.VSIFOpenL(basepath + '/vsifile_opendir/subdir/subdir2/test2', 'wb') + f = gdal.VSIFOpenL(basepath + "/vsifile_opendir/subdir/subdir2/test2", "wb") assert f - gdal.VSIFWriteL('bar', 1, 3, f) + gdal.VSIFWriteL("bar", 1, 3, f) gdal.VSIFCloseL(f) # Unlimited depth - d = gdal.OpenDir(basepath + '/vsifile_opendir') + d = gdal.OpenDir(basepath + "/vsifile_opendir") entries_found = [] for i in range(4): entry = gdal.GetNextDirEntry(d) assert entry - if entry.name == 'test': + if entry.name == "test": entries_found.append(entry.name) assert (entry.mode & 32768) != 0 assert entry.modeKnown @@ -863,13 +922,13 @@ def test_vsifile_opendir(basepath): assert entry.mtime != 0 assert entry.mtimeKnown assert not entry.extra - elif entry.name == 'subdir': + elif entry.name == "subdir": entries_found.append(entry.name) assert (entry.mode & 16384) != 0 - elif entry.name == 'subdir/subdir2': + elif entry.name == "subdir/subdir2": entries_found.append(entry.name) assert (entry.mode & 16384) != 0 - elif entry.name == 'subdir/subdir2/test2': + elif entry.name == "subdir/subdir2/test2": entries_found.append(entry.name) assert (entry.mode & 32768) != 0 else: @@ -881,27 +940,27 @@ def test_vsifile_opendir(basepath): gdal.CloseDir(d) # Unlimited depth, do not require stating (only honoured on Unix) - d = gdal.OpenDir(basepath + '/vsifile_opendir', -1, ['NAME_AND_TYPE_ONLY=YES']) + d = gdal.OpenDir(basepath + "/vsifile_opendir", -1, ["NAME_AND_TYPE_ONLY=YES"]) entries_found = [] for i in range(4): entry = gdal.GetNextDirEntry(d) assert entry - if entry.name == 'test': + if entry.name == "test": entries_found.append(entry.name) assert (entry.mode & 32768) != 0 - if os.name == 'posix' and basepath == 'tmp/': + if os.name == "posix" and basepath == "tmp/": assert entry.size == 0 - elif entry.name == 'subdir': + elif entry.name == "subdir": entries_found.append(entry.name) assert (entry.mode & 16384) != 0 - elif entry.name == 'subdir/subdir2': + elif entry.name == "subdir/subdir2": entries_found.append(entry.name) assert (entry.mode & 16384) != 0 - elif entry.name == 'subdir/subdir2/test2': + elif entry.name == "subdir/subdir2/test2": entries_found.append(entry.name) assert (entry.mode & 32768) != 0 - if os.name == 'posix' and basepath == 'tmp/': + if os.name == "posix" and basepath == "tmp/": assert entry.size == 0 else: assert False, entry.name @@ -912,57 +971,60 @@ def test_vsifile_opendir(basepath): gdal.CloseDir(d) # Only top level - d = gdal.OpenDir(basepath + '/vsifile_opendir', 0) + d = gdal.OpenDir(basepath + "/vsifile_opendir", 0) entries_found = set() for i in range(2): entry = gdal.GetNextDirEntry(d) assert entry entries_found.add(entry.name) - assert entries_found == set(['test', 'subdir']) + assert entries_found == set(["test", "subdir"]) entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) # Depth 1 - files = set([l_entry.name for l_entry in gdal.listdir(basepath + '/vsifile_opendir', 1)]) - assert files == set(['test', 'subdir', 'subdir/subdir2']) + files = set( + [l_entry.name for l_entry in gdal.listdir(basepath + "/vsifile_opendir", 1)] + ) + assert files == set(["test", "subdir", "subdir/subdir2"]) # Prefix filtering - d = gdal.OpenDir(basepath + '/vsifile_opendir', -1, ['PREFIX=t']) + d = gdal.OpenDir(basepath + "/vsifile_opendir", -1, ["PREFIX=t"]) entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test' + assert entry.name == "test" entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) - d = gdal.OpenDir(basepath + '/vsifile_opendir', -1, ['PREFIX=testtoolong']) + d = gdal.OpenDir(basepath + "/vsifile_opendir", -1, ["PREFIX=testtoolong"]) entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) - d = gdal.OpenDir(basepath + '/vsifile_opendir', -1, ['PREFIX=subd']) + d = gdal.OpenDir(basepath + "/vsifile_opendir", -1, ["PREFIX=subd"]) entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir' + assert entry.name == "subdir" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/subdir2' + assert entry.name == "subdir/subdir2" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/subdir2/test2' + assert entry.name == "subdir/subdir2/test2" entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) - d = gdal.OpenDir(basepath + '/vsifile_opendir', -1, ['PREFIX=subdir/sub']) + d = gdal.OpenDir(basepath + "/vsifile_opendir", -1, ["PREFIX=subdir/sub"]) entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/subdir2' + assert entry.name == "subdir/subdir2" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/subdir2/test2' + assert entry.name == "subdir/subdir2/test2" entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) # Cleanup - gdal.RmdirRecursive(basepath + '/vsifile_opendir') + gdal.RmdirRecursive(basepath + "/vsifile_opendir") + ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1559 @@ -970,11 +1032,15 @@ def test_vsifile_opendir(basepath): def test_vsitar_verylongfilename_posix(): - f = gdal.VSIFOpenL('/vsitar/data/verylongfilename.tar/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccccccccccccc/ddddddddddddddddddddddddddddddddddddddd/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/fffffffffffffffffffffffffffffffffffffffffffffff/foo', 'rb') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" + ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/4625 @@ -982,47 +1048,55 @@ def test_vsitar_verylongfilename_posix(): def test_vsitar_longfilename_ustar(): - assert gdal.VSIStatL('/vsitar/data/longfilename_ustar.tar/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/bbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccc/dddddddddd/e/byte.tif') is not None + assert ( + gdal.VSIStatL( + "/vsitar/data/longfilename_ustar.tar/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/bbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccc/dddddddddd/e/byte.tif" + ) + is not None + ) def test_unlink_batch(): - gdal.FileFromMemBuffer('/vsimem/foo', 'foo') - gdal.FileFromMemBuffer('/vsimem/bar', 'bar') - assert gdal.UnlinkBatch(['/vsimem/foo', '/vsimem/bar']) - assert not gdal.VSIStatL('/vsimem/foo') - assert not gdal.VSIStatL('/vsimem/bar') + gdal.FileFromMemBuffer("/vsimem/foo", "foo") + gdal.FileFromMemBuffer("/vsimem/bar", "bar") + assert gdal.UnlinkBatch(["/vsimem/foo", "/vsimem/bar"]) + assert not gdal.VSIStatL("/vsimem/foo") + assert not gdal.VSIStatL("/vsimem/bar") assert not gdal.UnlinkBatch([]) - gdal.FileFromMemBuffer('/vsimem/foo', 'foo') - open('tmp/bar', 'wt').write('bar') + gdal.FileFromMemBuffer("/vsimem/foo", "foo") + open("tmp/bar", "wt").write("bar") with gdaltest.error_handler(): - assert not gdal.UnlinkBatch(['/vsimem/foo', 'tmp/bar']) - gdal.Unlink('/vsimem/foo') - gdal.Unlink('tmp/bar') + assert not gdal.UnlinkBatch(["/vsimem/foo", "tmp/bar"]) + gdal.Unlink("/vsimem/foo") + gdal.Unlink("tmp/bar") ############################################################################### # Test gdal.RmdirRecursive() + def test_vsifile_rmdirrecursive(): - gdal.Mkdir('tmp/rmdirrecursive', 493) - gdal.Mkdir('tmp/rmdirrecursive/subdir', 493) - open('tmp/rmdirrecursive/foo.bin', 'wb').close() - open('tmp/rmdirrecursive/subdir/bar.bin', 'wb').close() - assert gdal.RmdirRecursive('tmp/rmdirrecursive') == 0 - assert not os.path.exists('tmp/rmdirrecursive') + gdal.Mkdir("tmp/rmdirrecursive", 493) + gdal.Mkdir("tmp/rmdirrecursive/subdir", 493) + open("tmp/rmdirrecursive/foo.bin", "wb").close() + open("tmp/rmdirrecursive/subdir/bar.bin", "wb").close() + assert gdal.RmdirRecursive("tmp/rmdirrecursive") == 0 + assert not os.path.exists("tmp/rmdirrecursive") + ############################################################################### + def test_vsifile_vsizip_error(): for i in range(128): - filename = '/vsimem/tmp||maxlength=%d.zip' % i + filename = "/vsimem/tmp||maxlength=%d.zip" % i with gdaltest.error_handler(): - f = gdal.VSIFOpenL('/vsizip/%s/out.bin' % filename, 'wb') + f = gdal.VSIFOpenL("/vsizip/%s/out.bin" % filename, "wb") if f is not None: assert gdal.VSIFCloseL(f) < 0 gdal.Unlink(filename) @@ -1034,12 +1108,13 @@ def test_vsifile_vsizip_error(): def test_vsifile_vsitar_gz_with_tar_multiple_of_65536_bytes(): - f = gdal.VSIFOpenL('/vsitar/data/tar_of_65536_bytes.tar.gz/zero.bin', 'rb') + f = gdal.VSIFOpenL("/vsitar/data/tar_of_65536_bytes.tar.gz/zero.bin", "rb") assert f is not None read_bytes = gdal.VSIFReadL(1, 65024, f) gdal.VSIFCloseL(f) - assert read_bytes == b'\x00' * 65024 - gdal.Unlink('data/tar_of_65536_bytes.tar.gz.properties') + assert read_bytes == b"\x00" * 65024 + gdal.Unlink("data/tar_of_65536_bytes.tar.gz.properties") + ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/5468 @@ -1047,9 +1122,9 @@ def test_vsifile_vsitar_gz_with_tar_multiple_of_65536_bytes(): def test_vsifile_vsizip_stored(): - f = gdal.VSIFOpenL('/vsizip/data/stored.zip/foo.txt', 'rb') + f = gdal.VSIFOpenL("/vsizip/data/stored.zip/foo.txt", "rb") assert f - assert gdal.VSIFReadL(1, 5, f) == b'foo\n' + assert gdal.VSIFReadL(1, 5, f) == b"foo\n" assert gdal.VSIFEofL(f) gdal.VSIFCloseL(f) @@ -1060,13 +1135,13 @@ def test_vsifile_vsizip_stored(): def test_vsifile_vsimem_truncate_zeroize(): - filename = '/vsimem/test.bin' - f = gdal.VSIFOpenL(filename, 'wb+') - data = b'\xFF' * 10000 + filename = "/vsimem/test.bin" + f = gdal.VSIFOpenL(filename, "wb+") + data = b"\xFF" * 10000 gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFTruncateL(f, 0) gdal.VSIFSeekL(f, 10000, 0) - gdal.VSIFWriteL(b'\x00', 1, 1, f) + gdal.VSIFWriteL(b"\x00", 1, 1, f) gdal.VSIFSeekL(f, 0, 0) - assert gdal.VSIFReadL(1, 1, f) == b'\x00' + assert gdal.VSIFReadL(1, 1, f) == b"\x00" gdal.VSIFCloseL(f) diff --git a/autotest/gcore/vsigs.py b/autotest/gcore/vsigs.py index 1175bdc9527e..7ddec62e721a 100755 --- a/autotest/gcore/vsigs.py +++ b/autotest/gcore/vsigs.py @@ -30,19 +30,19 @@ import stat import sys -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) @pytest.fixture() @@ -50,18 +50,19 @@ def gs_test_config(): # To avoid user credentials in ~/.boto # to mess up our tests options = { - 'CPL_GS_CREDENTIALS_FILE': '', - 'GS_OAUTH2_REFRESH_TOKEN': '', - 'GS_OAUTH2_CLIENT_EMAIL': '', - 'GS_OAUTH2_CLIENT_SECRET': '', - 'GS_OAUTH2_CLIENT_ID': '', - 'GOOGLE_APPLICATION_CREDENTIALS': '', - 'GS_USER_PROJECT': '' + "CPL_GS_CREDENTIALS_FILE": "", + "GS_OAUTH2_REFRESH_TOKEN": "", + "GS_OAUTH2_CLIENT_EMAIL": "", + "GS_OAUTH2_CLIENT_SECRET": "", + "GS_OAUTH2_CLIENT_ID": "", + "GOOGLE_APPLICATION_CREDENTIALS": "", + "GS_USER_PROJECT": "", } with gdaltest.config_options(options): yield + @pytest.fixture(scope="module") def webserver_port(): if not gdaltest.built_against_curl(): @@ -74,21 +75,22 @@ def webserver_port(): if webserver_port == 0: pytest.skip() with gdaltest.config_options( - {'CPL_GS_ENDPOINT': 'http://127.0.0.1:%d/' % webserver_port}): + {"CPL_GS_ENDPOINT": "http://127.0.0.1:%d/" % webserver_port} + ): yield webserver_port finally: gdal.VSICurlClearCache() webserver.server_stop(webserver_process, webserver_port) + ############################################################################### def test_vsigs_init(gs_test_config): - with gdaltest.config_options({'CPL_GCE_SKIP': 'YES', - 'CPL_GS_ENDPOINT': ''}): - assert gdal.GetSignedURL('/vsigs/foo/bar') is None + with gdaltest.config_options({"CPL_GCE_SKIP": "YES", "CPL_GS_ENDPOINT": ""}): + assert gdal.GetSignedURL("/vsigs/foo/bar") is None ############################################################################### @@ -102,22 +104,21 @@ def test_vsigs_1(gs_test_config): gdal.VSICurlClearCache() - with gdaltest.config_options({'CPL_GCE_SKIP': 'YES', - 'CPL_GS_ENDPOINT': ''}): + with gdaltest.config_options({"CPL_GCE_SKIP": "YES", "CPL_GS_ENDPOINT": ""}): # Invalid header filename gdal.ErrorReset() - with gdaltest.config_option('GDAL_HTTP_HEADER_FILE', '/i_dont/exist.py'): + with gdaltest.config_option("GDAL_HTTP_HEADER_FILE", "/i_dont/exist.py"): with gdaltest.error_handler(): - f = open_for_read('/vsigs/foo/bar') + 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 + assert "Cannot read" in last_err # Invalid content for header file - with gdaltest.config_option('GDAL_HTTP_HEADER_FILE', 'vsigs.py'): - f = open_for_read('/vsigs/foo/bar') + with gdaltest.config_option("GDAL_HTTP_HEADER_FILE", "vsigs.py"): + f = open_for_read("/vsigs/foo/bar") if f is not None: gdal.VSIFCloseL(f) pytest.fail() @@ -125,39 +126,40 @@ def test_vsigs_1(gs_test_config): # Missing GS_SECRET_ACCESS_KEY gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsigs/foo/bar') - assert f is None and gdal.VSIGetLastErrorMsg().find('GS_SECRET_ACCESS_KEY') >= 0 + f = open_for_read("/vsigs/foo/bar") + assert f is None and gdal.VSIGetLastErrorMsg().find("GS_SECRET_ACCESS_KEY") >= 0 gdal.ErrorReset() 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 + f = open_for_read("/vsigs_streaming/foo/bar") + assert f is None and gdal.VSIGetLastErrorMsg().find("GS_SECRET_ACCESS_KEY") >= 0 - with gdaltest.config_option('GS_SECRET_ACCESS_KEY', 'GS_SECRET_ACCESS_KEY'): + with gdaltest.config_option("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 + f = open_for_read("/vsigs/foo/bar") + assert f is None and gdal.VSIGetLastErrorMsg().find("GS_ACCESS_KEY_ID") >= 0 - with gdaltest.config_option('GS_ACCESS_KEY_ID', 'GS_ACCESS_KEY_ID'): + with gdaltest.config_option("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() == '': + 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: + 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() != '' + f = open_for_read("/vsigs_streaming/foo/bar.baz") + assert f is None and gdal.VSIGetLastErrorMsg() != "" + ############################################################################### # Test GS_NO_SIGN_REQUEST=YES @@ -168,23 +170,23 @@ def test_vsigs_no_sign_request(gs_test_config): if not gdaltest.built_against_curl(): pytest.skip() - with gdaltest.config_options({'CPL_GS_ENDPOINT': ''}): + with gdaltest.config_options({"CPL_GS_ENDPOINT": ""}): - object_key = 'gcp-public-data-landsat/LC08/01/044/034/LC08_L1GT_044034_20130330_20170310_01_T2/LC08_L1GT_044034_20130330_20170310_01_T2_B1.TIF' - expected_url = 'https://storage.googleapis.com/' + object_key + object_key = "gcp-public-data-landsat/LC08/01/044/034/LC08_L1GT_044034_20130330_20170310_01_T2/LC08_L1GT_044034_20130330_20170310_01_T2_B1.TIF" + expected_url = "https://storage.googleapis.com/" + object_key - with gdaltest.config_option('GS_NO_SIGN_REQUEST', 'YES'): - actual_url = gdal.GetActualURL('/vsigs/' + object_key) + with gdaltest.config_option("GS_NO_SIGN_REQUEST", "YES"): + actual_url = gdal.GetActualURL("/vsigs/" + object_key) assert actual_url == expected_url - actual_url = gdal.GetActualURL('/vsigs_streaming/' + object_key) + actual_url = gdal.GetActualURL("/vsigs_streaming/" + object_key) assert actual_url == expected_url - f = open_for_read('/vsigs/' + object_key) + f = open_for_read("/vsigs/" + object_key) if f is None: if gdaltest.gdalurlopen(expected_url) is None: - pytest.skip('cannot open URL') + pytest.skip("cannot open URL") pytest.fail() gdal.VSIFCloseL(f) @@ -199,64 +201,98 @@ def test_vsigs_2(gs_test_config, webserver_port, use_config_options): gdal.VSICurlClearCache() # header file - gdal.FileFromMemBuffer('/vsimem/my_headers.txt', 'foo: bar') + 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'}) + 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_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID', - 'GDAL_HTTP_HEADER_FILE': '/vsimem/my_headers.txt'}): - f = open_for_read('/vsigs/gs_fake_bucket_http_header_file/resource') + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + "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.Unlink("/vsimem/my_headers.txt") - options = { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID', - 'CPL_GS_TIMESTAMP': 'my_timestamp'} - with gdaltest.config_options(options) if use_config_options else gdaltest.credentials('/vsigs/', options): + options = { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + "CPL_GS_TIMESTAMP": "my_timestamp", + } + with gdaltest.config_options( + options + ) if use_config_options else gdaltest.credentials("/vsigs/", options): - 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')) + 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='}) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + 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='}) + 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') + f = open_for_read("/vsigs_streaming/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket/resource2.bin', 206, - {'Content-Range': 'bytes 0-0/1000000'}, 'x') + 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') + 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) @@ -265,10 +301,11 @@ def test_vsigs_2(gs_test_config, webserver_port, use_config_options): pytest.fail() handler = webserver.SequentialHandler() - handler.add('HEAD', '/gs_fake_bucket/resource2.bin', 200, - {'Content-Length': 1000000}) + 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') + 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) @@ -278,19 +315,28 @@ def test_vsigs_2(gs_test_config, webserver_port, use_config_options): # Test GS_USER_PROJECT handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket/resource_under_requester_pays', 200, - {'Content-type': 'text/plain'}, 'foo', - expected_headers={ - 'Authorization': 'GOOG1 GS_ACCESS_KEY_ID:q7i3g4lJD1c4OwiFtn/N/ePxxS0=', - 'x-goog-user-project': 'my_project_id'}) + handler.add( + "GET", + "/gs_fake_bucket/resource_under_requester_pays", + 200, + {"Content-type": "text/plain"}, + "foo", + expected_headers={ + "Authorization": "GOOG1 GS_ACCESS_KEY_ID:q7i3g4lJD1c4OwiFtn/N/ePxxS0=", + "x-goog-user-project": "my_project_id", + }, + ) with webserver.install_http_handler(handler): - with gdaltest.config_option('GS_USER_PROJECT', 'my_project_id'): - f = open_for_read('/vsigs_streaming/gs_fake_bucket/resource_under_requester_pays') + with gdaltest.config_option("GS_USER_PROJECT", "my_project_id"): + f = open_for_read( + "/vsigs_streaming/gs_fake_bucket/resource_under_requester_pays" + ) assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Test ReadDir() with a fake Google Cloud Storage server @@ -299,13 +345,19 @@ def test_vsigs_2(gs_test_config, webserver_port, use_config_options): def test_vsigs_readdir(gs_test_config, webserver_port): with gdaltest.config_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID' }): + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', 200, - {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/gs_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F", + 200, + {"Content-type": "application/xml"}, + """ a_dir/ bla @@ -315,10 +367,14 @@ def test_vsigs_readdir(gs_test_config, webserver_port): 123456 - """) - handler.add('GET', '/gs_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F', 200, - {'Content-type': 'application/xml'}, - """ + """, + ) + handler.add( + "GET", + "/gs_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F", + 200, + {"Content-type": "application/xml"}, + """ a_dir/ @@ -330,31 +386,38 @@ def test_vsigs_readdir(gs_test_config, webserver_port): a_dir/subdir/ - """) + """, + ) with webserver.install_http_handler(handler): - f = open_for_read('/vsigs/gs_fake_bucket2/a_dir/resource3.bin') + 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') + 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 + 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') + 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'}, - """ + handler.add( + "GET", + "/", + 200, + {"Content-type": "application/xml"}, + """ @@ -362,10 +425,12 @@ def test_vsigs_readdir(gs_test_config, webserver_port): - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsigs/') - assert dir_contents == ['mybucket'] + dir_contents = gdal.ReadDir("/vsigs/") + assert dir_contents == ["mybucket"] + ############################################################################### # Test write @@ -376,91 +441,122 @@ def test_vsigs_write(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID' }): + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + } + ): with webserver.install_http_handler(webserver.SequentialHandler()): - f = gdal.VSIFOpenExL('/vsigs/gs_fake_bucket3/another_file.bin', 'wb', 0, - ['Content-Type=foo', 'Content-Encoding=bar', 'x-goog-storage-class=NEARLINE']) + f = gdal.VSIFOpenExL( + "/vsigs/gs_fake_bucket3/another_file.bin", + "wb", + 0, + [ + "Content-Type=foo", + "Content-Encoding=bar", + "x-goog-storage-class=NEARLINE", + ], + ) 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.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 - assert gdal.VSIFWriteL('bar', 1, 3, f) == 3 + assert gdal.VSIFWriteL("bar", 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): - if request.headers['Content-Length'] != '6' or \ - request.headers['Content-Type'] != 'foo' or \ - request.headers['Content-Encoding'] != 'bar' or \ - request.headers['x-goog-storage-class'] != 'NEARLINE': - sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) + if ( + request.headers["Content-Length"] != "6" + or request.headers["Content-Type"] != "foo" + or request.headers["Content-Encoding"] != "bar" + or request.headers["x-goog-storage-class"] != "NEARLINE" + ): + sys.stderr.write( + "Did not get expected headers: %s\n" % str(request.headers) + ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) + 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) + 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.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/gs_fake_bucket3/another_file.bin', custom_method=method) + handler.add("PUT", "/gs_fake_bucket3/another_file.bin", custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" + ############################################################################### # Test rename + def test_vsigs_fake_rename(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID' }): + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/test/source.txt', 206, - { 'Content-Length' : '3', - 'Content-Range': 'bytes 0-2/3' }, "foo") - handler.add('GET', '/test/target.txt', 404) - handler.add('GET', '/test/?delimiter=%2F&max-keys=100&prefix=target.txt%2F', 200) + handler.add( + "GET", + "/test/source.txt", + 206, + {"Content-Length": "3", "Content-Range": "bytes 0-2/3"}, + "foo", + ) + handler.add("GET", "/test/target.txt", 404) + handler.add( + "GET", "/test/?delimiter=%2F&max-keys=100&prefix=target.txt%2F", 200 + ) def method(request): - if request.headers['Content-Length'] != '0': - sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) + if request.headers["Content-Length"] != "0": + sys.stderr.write( + "Did not get expected headers: %s\n" % str(request.headers) + ) request.send_response(400) return - if request.headers['x-goog-copy-source'] != '/test/source.txt': - sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) + if request.headers["x-goog-copy-source"] != "/test/source.txt": + 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.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/test/target.txt', custom_method=method) - handler.add('DELETE', '/test/source.txt', 204) + handler.add("PUT", "/test/target.txt", custom_method=method) + handler.add("DELETE", "/test/source.txt", 204) with webserver.install_http_handler(handler): - assert gdal.Rename( '/vsigs/test/source.txt', '/vsigs/test/target.txt') == 0 + assert gdal.Rename("/vsigs/test/source.txt", "/vsigs/test/target.txt") == 0 + ############################################################################### # Test reading/writing ACL @@ -471,40 +567,53 @@ def test_vsigs_acl(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID' }): + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/test_metadata/foo.txt?acl', 200, {}, "") + handler.add("GET", "/test_metadata/foo.txt?acl", 200, {}, "") with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsigs/test_metadata/foo.txt', 'ACL') - assert 'XML' in md and md['XML'] == '' + md = gdal.GetFileMetadata("/vsigs/test_metadata/foo.txt", "ACL") + assert "XML" in md and md["XML"] == "" # Error cases with gdaltest.error_handler(): - assert gdal.GetFileMetadata('/vsigs/test_metadata/foo.txt', 'UNSUPPORTED') == {} + assert ( + gdal.GetFileMetadata("/vsigs/test_metadata/foo.txt", "UNSUPPORTED") + == {} + ) handler = webserver.SequentialHandler() - handler.add('GET', '/test_metadata/foo.txt?acl', 400) + handler.add("GET", "/test_metadata/foo.txt?acl", 400) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - assert not gdal.GetFileMetadata('/vsigs/test_metadata/foo.txt', 'ACL') + assert not gdal.GetFileMetadata("/vsigs/test_metadata/foo.txt", "ACL") handler = webserver.SequentialHandler() - handler.add('PUT', '/test_metadata/foo.txt?acl', 200, expected_body=b'') + handler.add("PUT", "/test_metadata/foo.txt?acl", 200, expected_body=b"") with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsigs/test_metadata/foo.txt', {'XML': ''}, 'ACL') + assert gdal.SetFileMetadata( + "/vsigs/test_metadata/foo.txt", {"XML": ""}, "ACL" + ) # Error cases with gdaltest.error_handler(): - assert not gdal.SetFileMetadata('/vsigs/test_metadata/foo.txt', {}, 'UNSUPPORTED') - assert not gdal.SetFileMetadata('/vsigs/test_metadata/foo.txt', {}, 'ACL') + assert not gdal.SetFileMetadata( + "/vsigs/test_metadata/foo.txt", {}, "UNSUPPORTED" + ) + assert not gdal.SetFileMetadata("/vsigs/test_metadata/foo.txt", {}, "ACL") handler = webserver.SequentialHandler() - handler.add('PUT', '/test_metadata/foo.txt?acl', 400) + handler.add("PUT", "/test_metadata/foo.txt?acl", 400) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - assert not gdal.SetFileMetadata('/vsigs/test_metadata/foo.txt', {'XML': ''}, 'ACL') + assert not gdal.SetFileMetadata( + "/vsigs/test_metadata/foo.txt", {"XML": ""}, "ACL" + ) + ############################################################################### # Test reading/writing HEADERS @@ -515,163 +624,210 @@ def test_vsigs_headers(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'GS_SECRET_ACCESS_KEY': 'GS_SECRET_ACCESS_KEY', - 'GS_ACCESS_KEY_ID': 'GS_ACCESS_KEY_ID' }): + { + "GS_SECRET_ACCESS_KEY": "GS_SECRET_ACCESS_KEY", + "GS_ACCESS_KEY_ID": "GS_ACCESS_KEY_ID", + } + ): handler = webserver.SequentialHandler() - handler.add('GET', '/test_metadata/foo.txt', 200, {'x-goog-meta-foo': 'bar'}) + handler.add("GET", "/test_metadata/foo.txt", 200, {"x-goog-meta-foo": "bar"}) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsigs/test_metadata/foo.txt', 'HEADERS') - assert 'x-goog-meta-foo' in md and md['x-goog-meta-foo'] == 'bar' + md = gdal.GetFileMetadata("/vsigs/test_metadata/foo.txt", "HEADERS") + assert "x-goog-meta-foo" in md and md["x-goog-meta-foo"] == "bar" # Write HEADERS domain handler = webserver.SequentialHandler() - handler.add('PUT', '/test_metadata/foo.txt', 200, {}, - expected_headers = {'x-goog-meta-foo': 'bar', - 'x-goog-metadata-directive': 'REPLACE', - 'x-goog-copy-source': '/test_metadata/foo.txt'}) + handler.add( + "PUT", + "/test_metadata/foo.txt", + 200, + {}, + expected_headers={ + "x-goog-meta-foo": "bar", + "x-goog-metadata-directive": "REPLACE", + "x-goog-copy-source": "/test_metadata/foo.txt", + }, + ) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata('/vsigs/test_metadata/foo.txt', {'x-goog-meta-foo': 'bar'}, 'HEADERS') + assert gdal.SetFileMetadata( + "/vsigs/test_metadata/foo.txt", {"x-goog-meta-foo": "bar"}, "HEADERS" + ) ############################################################################### # Read credentials with OAuth2 refresh_token -def test_vsigs_read_credentials_refresh_token_default_gdal_app(gs_test_config, webserver_port): +def test_vsigs_read_credentials_refresh_token_default_gdal_app( + gs_test_config, webserver_port +): with gdaltest.config_options( - { 'GOA2_AUTH_URL_TOKEN': 'http://localhost:%d/accounts.google.com/o/oauth2/token' % webserver_port, - 'GS_OAUTH2_REFRESH_TOKEN': 'REFRESH_TOKEN'}): + { + "GOA2_AUTH_URL_TOKEN": "http://localhost:%d/accounts.google.com/o/oauth2/token" + % webserver_port, + "GS_OAUTH2_REFRESH_TOKEN": "REFRESH_TOKEN", + } + ): with gdaltest.error_handler(): - assert gdal.GetSignedURL('/vsigs/foo/bar') is None + 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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Test GS_USER_PROJECT handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket/resource_under_requester_pays', 200, - {'Content-type': 'text/plain'}, 'foo', - expected_headers={'x-goog-user-project': 'my_project_id'}) + handler.add( + "GET", + "/gs_fake_bucket/resource_under_requester_pays", + 200, + {"Content-type": "text/plain"}, + "foo", + expected_headers={"x-goog-user-project": "my_project_id"}, + ) with webserver.install_http_handler(handler): - with gdaltest.config_option('GS_USER_PROJECT', 'my_project_id'): - f = open_for_read('/vsigs_streaming/gs_fake_bucket/resource_under_requester_pays') + with gdaltest.config_option("GS_USER_PROJECT", "my_project_id"): + f = open_for_read( + "/vsigs_streaming/gs_fake_bucket/resource_under_requester_pays" + ) assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Read credentials with OAuth2 refresh_token -def test_vsigs_read_credentials_refresh_token_custom_app(gs_test_config, webserver_port): +def test_vsigs_read_credentials_refresh_token_custom_app( + gs_test_config, webserver_port +): with gdaltest.config_options( - { 'GOA2_AUTH_URL_TOKEN': 'http://localhost:%d/accounts.google.com/o/oauth2/token' % webserver_port, - 'GS_OAUTH2_REFRESH_TOKEN': 'REFRESH_TOKEN', - 'GS_OAUTH2_CLIENT_ID': 'CLIENT_ID', - 'GS_OAUTH2_CLIENT_SECRET': 'CLIENT_SECRET' }): + { + "GOA2_AUTH_URL_TOKEN": "http://localhost:%d/accounts.google.com/o/oauth2/token" + % webserver_port, + "GS_OAUTH2_REFRESH_TOKEN": "REFRESH_TOKEN", + "GS_OAUTH2_CLIENT_ID": "CLIENT_ID", + "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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Read credentials with OAuth2 service account @@ -699,228 +855,279 @@ def test_vsigs_read_credentials_oauth2_service_account(gs_test_config, webserver gwE6fxOLyJDxuWRf -----END PRIVATE KEY----- """ - gdal.FileFromMemBuffer('/vsimem/pkey', key) + gdal.FileFromMemBuffer("/vsimem/pkey", key) with gdaltest.config_options( - { 'GO2A_AUD': 'http://localhost:%d/oauth2/v4/token' % webserver_port, - 'GOA2_NOW': '123456', - 'GS_OAUTH2_CLIENT_EMAIL': 'CLIENT_EMAIL' }): + { + "GO2A_AUD": "http://localhost:%d/oauth2/v4/token" % webserver_port, + "GOA2_NOW": "123456", + "GS_OAUTH2_CLIENT_EMAIL": "CLIENT_EMAIL", + } + ): for i in range(2): - with gdaltest.config_options({'GS_OAUTH2_PRIVATE_KEY': key} if i == 0 else {'GS_OAUTH2_PRIVATE_KEY_FILE': '/vsimem/pkey'}): + with gdaltest.config_options( + {"GS_OAUTH2_PRIVATE_KEY": key} + if i == 0 + else {"GS_OAUTH2_PRIVATE_KEY_FILE": "/vsimem/pkey"} + ): 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' + 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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/oauth2/v4/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) except: - if gdal.GetLastErrorMsg().find('CPLRSASHA256Sign() not implemented') >= 0: + if ( + gdal.GetLastErrorMsg().find( + "CPLRSASHA256Sign() not implemented" + ) + >= 0 + ): pytest.skip() - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/pkey") - 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(gs_test_config, webserver_port): +def test_vsigs_read_credentials_oauth2_service_account_json_file( + gs_test_config, webserver_port +): - gdal.FileFromMemBuffer('/vsimem/service_account.json', """{ + 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", "type": "service_account" - }""") + }""", + ) with gdaltest.config_options( - { 'GOOGLE_APPLICATION_CREDENTIALS': '/vsimem/service_account.json', - 'GO2A_AUD': 'http://localhost:%d/oauth2/v4/token' % webserver_port, - 'GOA2_NOW': '123456' }): + { + "GOOGLE_APPLICATION_CREDENTIALS": "/vsimem/service_account.json", + "GO2A_AUD": "http://localhost:%d/oauth2/v4/token" % webserver_port, + "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' + 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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/oauth2/v4/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") if f is None: - gdal.Unlink('/vsimem/service_account.json') + gdal.Unlink("/vsimem/service_account.json") pytest.fail() - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + 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') + 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: + if gdal.GetLastErrorMsg().find("CPLRSASHA256Sign() not implemented") >= 0: pytest.skip() - gdal.Unlink('/vsimem/service_account.json') + gdal.Unlink("/vsimem/service_account.json") + + assert data == "foo" - assert data == 'foo' ############################################################################### # Read credentials with OAuth2 authorized user through a json configuration file -def test_vsigs_read_credentials_oauth2_authorized_user_json_file(gs_test_config, webserver_port): +def test_vsigs_read_credentials_oauth2_authorized_user_json_file( + gs_test_config, webserver_port +): - gdal.FileFromMemBuffer('/vsimem/authorized_user.json', """{ + gdal.FileFromMemBuffer( + "/vsimem/authorized_user.json", + """{ "client_id": "CLIENT_ID", "client_secret": "CLIENT_SECRET", "refresh_token": "REFRESH_TOKEN", "type": "authorized_user" - }""") + }""", + ) with gdaltest.config_options( - { 'GOOGLE_APPLICATION_CREDENTIALS': '/vsimem/authorized_user.json', - 'GOA2_AUTH_URL_TOKEN': 'http://localhost:%d/accounts.google.com/o/oauth2/token' % webserver_port }): + { + "GOOGLE_APPLICATION_CREDENTIALS": "/vsimem/authorized_user.json", + "GOA2_AUTH_URL_TOKEN": "http://localhost:%d/accounts.google.com/o/oauth2/token" + % webserver_port, + } + ): 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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/service_account.json") - gdal.Unlink('/vsimem/service_account.json') ############################################################################### # Read credentials from simulated ~/.boto @@ -930,7 +1137,9 @@ def test_vsigs_read_credentials_file(gs_test_config, webserver_port): gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/.boto', """ + gdal.FileFromMemBuffer( + "/vsimem/.boto", + """ [unrelated] gs_access_key_id = foo gs_secret_access_key = bar @@ -940,40 +1149,46 @@ def test_vsigs_read_credentials_file(gs_test_config, webserver_port): [unrelated] gs_access_key_id = foo gs_secret_access_key = bar -""") +""", + ) with gdaltest.config_options( - { 'CPL_GS_TIMESTAMP': 'my_timestamp', - 'CPL_GS_CREDENTIALS_FILE': '/vsimem/.boto'}): + {"CPL_GS_TIMESTAMP": "my_timestamp", "CPL_GS_CREDENTIALS_FILE": "/vsimem/.boto"} + ): def method(request): - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/.boto") - gdal.Unlink('/vsimem/.boto') ############################################################################### # Read credentials from simulated ~/.boto @@ -983,72 +1198,90 @@ def test_vsigs_read_credentials_file_refresh_token(gs_test_config, webserver_por gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/.boto', """ + gdal.FileFromMemBuffer( + "/vsimem/.boto", + """ [Credentials] gs_oauth2_refresh_token = REFRESH_TOKEN [OAuth2] client_id = CLIENT_ID client_secret = CLIENT_SECRET -""") +""", + ) with gdaltest.config_options( - { 'CPL_GS_CREDENTIALS_FILE': '/vsimem/.boto', - 'GOA2_AUTH_URL_TOKEN': - 'http://localhost:%d/accounts.google.com/o/oauth2/token' % webserver_port }): + { + "CPL_GS_CREDENTIALS_FILE": "/vsimem/.boto", + "GOA2_AUTH_URL_TOKEN": "http://localhost:%d/accounts.google.com/o/oauth2/token" + % webserver_port, + } + ): 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) + 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') + 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.send_header("Content-Length", len(content)) request.end_headers() - request.wfile.write(content.encode('ascii')) + request.wfile.write(content.encode("ascii")) - handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) + 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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Test UnlinkBatch() handler = webserver.SequentialHandler() - handler.add('POST', '/batch/storage/v1', 200, - {'content-type': 'multipart/mixed; boundary=batch_nWfTDwb9aAhYucqUtdLRWUX93qsJaf3T'}, - """--batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5 + handler.add( + "POST", + "/batch/storage/v1", + 200, + { + "content-type": "multipart/mixed; boundary=batch_nWfTDwb9aAhYucqUtdLRWUX93qsJaf3T" + }, + """--batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5 Content-Type: application/http Content-ID: @@ -1066,10 +1299,16 @@ def method(request): --batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5-- """, - expected_body = b'--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <1>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/foo HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <2>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/bar%2Fbaz HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==--\r\n') - handler.add('POST', '/batch/storage/v1', 200, - {'content-type': 'multipart/mixed; boundary=batch_nWfTDwb9aAhYucqUtdLRWUX93qsJaf3T'}, - """--batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5 + expected_body=b"--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <1>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/foo HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <2>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/bar%2Fbaz HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==--\r\n", + ) + handler.add( + "POST", + "/batch/storage/v1", + 200, + { + "content-type": "multipart/mixed; boundary=batch_nWfTDwb9aAhYucqUtdLRWUX93qsJaf3T" + }, + """--batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5 Content-Type: application/http Content-ID: @@ -1079,134 +1318,167 @@ def method(request): --batch_phVs0DE8tHbyfvlYTZEeI5_snlh9XJR5-- """, - expected_body = b'--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <3>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/baw HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==--\r\n') - with gdaltest.config_option('CPL_VSIGS_UNLINK_BATCH_SIZE', '2'): + expected_body=b"--===============7330845974216740156==\r\nContent-Type: application/http\r\nContent-ID: <3>\r\n\r\n\r\nDELETE /storage/v1/b/unlink_batch/o/baw HTTP/1.1\r\n\r\n\r\n--===============7330845974216740156==--\r\n", + ) + with gdaltest.config_option("CPL_VSIGS_UNLINK_BATCH_SIZE", "2"): with webserver.install_http_handler(handler): - ret = gdal.UnlinkBatch(['/vsigs/unlink_batch/foo', '/vsigs/unlink_batch/bar/baz', '/vsigs/unlink_batch/baw']) + ret = gdal.UnlinkBatch( + [ + "/vsigs/unlink_batch/foo", + "/vsigs/unlink_batch/bar/baz", + "/vsigs/unlink_batch/baw", + ] + ) assert ret - gdal.Unlink('/vsimem/.boto') + gdal.Unlink("/vsimem/.boto") ############################################################################### # Read credentials from simulated GCE instance -@pytest.mark.skipif(sys.platform not in ('linux', 'win32'), reason='Incorrect platform') +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") def test_vsigs_read_credentials_gce(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'CPL_GS_CREDENTIALS_FILE': '', - 'CPL_GCE_CREDENTIALS_URL': - 'http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token' % webserver_port, - # Disable hypervisor related check to test if we are really on EC2 - 'CPL_GCE_CHECK_LOCAL_FILES': 'NO'}): + { + "CPL_GS_CREDENTIALS_FILE": "", + "CPL_GCE_CREDENTIALS_URL": "http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token" + % webserver_port, + # Disable hypervisor related check to test if we are really on EC2 + "CPL_GCE_CHECK_LOCAL_FILES": "NO", + } + ): def method(request): - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/computeMetadata/v1/instance/service-accounts/default/token', 200, {}, - """{ + 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) + }""", + ) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Set a fake URL to check that credentials re-use works - with gdaltest.config_option('CPL_GCE_CREDENTIALS_URL', ''): + with gdaltest.config_option("CPL_GCE_CREDENTIALS_URL", ""): handler = webserver.SequentialHandler() - handler.add('GET', '/gs_fake_bucket/bar', 200, {}, 'bar') + handler.add("GET", "/gs_fake_bucket/bar", 200, {}, "bar") with webserver.install_http_handler(handler): - f = open_for_read('/vsigs/gs_fake_bucket/bar') + f = open_for_read("/vsigs/gs_fake_bucket/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" with gdaltest.error_handler(): - assert gdal.GetSignedURL('/vsigs/foo/bar') is None + assert gdal.GetSignedURL("/vsigs/foo/bar") is None ############################################################################### # Read credentials from simulated GCE instance with expiration of the # cached credentials -@pytest.mark.skipif(sys.platform not in ('linux', 'win32'), reason='Incorrect platform') +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") def test_vsigs_read_credentials_gce_expiration(gs_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.config_options( - { 'CPL_GS_CREDENTIALS_FILE': '', - 'CPL_GCE_CREDENTIALS_URL': - 'http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token' % webserver_port, - # Disable hypervisor related check to test if we are really on EC2 - 'CPL_GCE_CHECK_LOCAL_FILES': 'NO'}): + { + "CPL_GS_CREDENTIALS_FILE": "", + "CPL_GCE_CREDENTIALS_URL": "http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token" + % webserver_port, + # Disable hypervisor related check to test if we are really on EC2 + "CPL_GCE_CHECK_LOCAL_FILES": "NO", + } + ): def method(request): - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + 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, {}, - """{ + 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, {}, - """{ + 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) + }""", + ) + 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') + f = open_for_read("/vsigs/gs_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Nominal cases (require valid credentials) @@ -1217,92 +1489,99 @@ def test_vsigs_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() - gs_resource = gdal.GetConfigOption('GS_RESOURCE') + gs_resource = gdal.GetConfigOption("GS_RESOURCE") if gs_resource is None: - pytest.skip('Missing GS_RESOURCE') + pytest.skip("Missing GS_RESOURCE") - if '/' not in gs_resource: - path = '/vsigs/' + 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) + 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' + 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 + 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) + 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)) + 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) + 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenExL(subpath + '/test.txt', 'wb', 0, ['Content-Type=foo', 'Content-Encoding=bar']) + f = gdal.VSIFOpenExL( + subpath + "/test.txt", "wb", 0, ["Content-Type=foo", "Content-Encoding=bar"] + ) assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + gdal.VSIFWriteL("hello", 1, 5, f) gdal.VSIFCloseL(f) - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") new_md = {} for key in md: new_md[key.lower()] = md[key] md = new_md - assert 'content-type' in md - assert md['content-type'] == 'foo' - assert 'content-encoding' in md - assert md['content-encoding'] == 'bar' + assert "content-type" in md + assert md["content-type"] == "foo" + assert "content-encoding" in md + assert md["content-encoding"] == "bar" ret = gdal.Rmdir(subpath) - assert ret != 0, \ - ('Rmdir(%s) on non empty directory should return an error' % subpath) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - assert gdal.Rename(subpath + '/test.txt', subpath + '/test2.txt') == 0 + assert gdal.Rename(subpath + "/test.txt", subpath + "/test2.txt") == 0 - f = gdal.VSIFOpenL(subpath + '/test2.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test2.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - ret = gdal.Unlink(subpath + '/test2.txt') - assert ret >= 0, \ - ('Unlink(%s) should not return an error' % (subpath + '/test2.txt')) + ret = gdal.Unlink(subpath + "/test2.txt") + assert ret >= 0, "Unlink(%s) should not return an error" % ( + subpath + "/test2.txt" + ) ret = gdal.Rmdir(subpath) - assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) + assert ret >= 0, "Rmdir(%s) should not return an error" % subpath return - f = open_for_read('/vsigs/' + gs_resource) + f = open_for_read("/vsigs/" + gs_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -1310,7 +1589,7 @@ def test_vsigs_extra_1(): assert len(ret) == 1 # Same with /vsigs_streaming/ - f = open_for_read('/vsigs_streaming/' + gs_resource) + f = open_for_read("/vsigs_streaming/" + gs_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -1321,20 +1600,20 @@ def test_vsigs_extra_1(): # 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') + f = open_for_read("/vsigs/not_existing_bucket/foo") with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) - assert gdal.VSIGetLastErrorMsg() != '' + assert gdal.VSIGetLastErrorMsg() != "" # Invalid resource gdal.ErrorReset() - f = open_for_read('/vsigs_streaming/' + gs_resource + '/invalid_resource.baz') + 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) + 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) diff --git a/autotest/gcore/vsihdfs.py b/autotest/gcore/vsihdfs.py index 2942606f6295..0415468a2583 100755 --- a/autotest/gcore/vsihdfs.py +++ b/autotest/gcore/vsihdfs.py @@ -31,16 +31,17 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + + # Read test def test_vsihdfs_1(): - filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' - fp = gdal.VSIFOpenL(filename, 'rb') + filename = "/vsihdfs/file:" + os.getcwd() + "/data/text.txt" + fp = gdal.VSIFOpenL(filename, "rb") if fp is None: gdaltest.have_vsihdfs = False pytest.skip() @@ -48,65 +49,69 @@ def test_vsihdfs_1(): gdaltest.have_vsihdfs = True data = gdal.VSIFReadL(5, 1, fp) - assert data and data.decode('ascii') == 'Lorem' + assert data and data.decode("ascii") == "Lorem" data = gdal.VSIFReadL(1, 6, fp) - assert data and data.decode('ascii') == ' ipsum' + 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') + 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, 2, 0) # From beginning gdal.VSIFSeekL(fp, 5, 0) data = gdal.VSIFReadL(6, 1, fp) - assert data and data.decode('ascii') == ' ipsum' + assert data and data.decode("ascii") == " ipsum" - gdal.VSIFSeekL(fp, 7, 1) # From current + gdal.VSIFSeekL(fp, 7, 1) # From current data = gdal.VSIFReadL(3, 1, fp) - assert data and data.decode('ascii') == 'sit' + assert data and data.decode("ascii") == "sit" - gdal.VSIFSeekL(fp, 9, 2) # From end + gdal.VSIFSeekL(fp, 9, 2) # From end data = gdal.VSIFReadL(7, 1, fp) - assert data and data.decode('ascii') == 'laborum' + 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') + 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' + 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') + filename = "/vsihdfs/file:" + os.getcwd() + "/data/text.txt" + fp = gdal.VSIFOpenL(filename, "rb") assert fp is not None gdal.VSIFReadL(5, 1, fp) @@ -127,27 +132,26 @@ def test_vsihdfs_5(): gdal.VSIFCloseL(fp) + # Stat test def test_vsihdfs_6(): if gdaltest.have_vsihdfs == False: pytest.skip() - filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' + 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' + 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/' + dirname = "/vsihdfs/file:" + os.getcwd() + "/data/" lst = gdal.ReadDir(dirname) assert len(lst) >= 360 - - - diff --git a/autotest/gcore/vsioss.py b/autotest/gcore/vsioss.py index 7fa7f2ddd7a6..db2a130f0cb4 100755 --- a/autotest/gcore/vsioss.py +++ b/autotest/gcore/vsioss.py @@ -30,19 +30,20 @@ import stat import sys -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### @@ -50,12 +51,20 @@ def open_for_read(uri): 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'): + 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 + assert gdal.GetSignedURL("/vsioss/foo/bar") is None + ############################################################################### # Error cases @@ -69,23 +78,23 @@ def test_visoss_1(): # 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 + 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 + 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') + 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 + 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') + gdal.SetConfigOption("OSS_ACCESS_KEY_ID", "OSS_ACCESS_KEY_ID") def test_visoss_real_test(): @@ -99,18 +108,19 @@ def test_visoss_real_test(): # 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() == '': + 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: + 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() != '' + f = open_for_read("/vsioss_streaming/foo/bar.baz") + assert f is None and gdal.VSIGetLastErrorMsg() != "" + ############################################################################### @@ -123,39 +133,45 @@ def test_visoss_start_webserver(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (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) + 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' + request.protocol_version = "HTTP/1.1" - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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'])) + 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.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')) + request.wfile.write("""foo""".encode("ascii")) + ############################################################################### # Test with a fake OSS server @@ -166,183 +182,237 @@ 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')) + 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) + 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') + f = open_for_read("/vsioss/oss_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() - handler.add('GET', '/oss_fake_bucket/resource', custom_method=get_oss_fake_bucket_resource_method) + 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') + f = open_for_read("/vsioss_streaming/oss_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(400) - response = """ + 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.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')) + request.wfile.write(response.encode("ascii")) - handler.add('GET', '/oss_fake_bucket/redirect', custom_method=method) + 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.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.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')) + request.wfile.write("""foo""".encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - handler.add('GET', '/oss_fake_bucket/redirect', custom_method=method) + 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') + f = open_for_read("/vsioss/oss_fake_bucket/redirect") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - if data != 'foo': + if data != "foo": - if gdaltest.is_travis_branch('trusty'): - pytest.skip('Skipped on trusty branch, but should be investigated') + 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') + f = open_for_read("/vsioss_streaming/oss_fake_bucket/redirect") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + 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)) + 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.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') + 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')) + request.wfile.write(response.encode("ascii")) - handler.add('GET', '/oss_fake_bucket/non_xml_error', custom_method=method) + 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 + 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) + 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 + 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) + 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 + 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) + 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 + 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) + 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 + 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) + 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 + 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 @@ -356,9 +426,9 @@ def test_visoss_3(): handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'application/xml') + request.send_header("Content-type", "application/xml") response = """ a_dir/ @@ -370,16 +440,18 @@ def method(request): """ - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - handler.add('GET', '/oss_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', custom_method=method) + 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.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'application/xml') + request.send_header("Content-type", "application/xml") response = """ a_dir/ @@ -393,87 +465,96 @@ def method(request): """ - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - handler.add('GET', '/oss_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F', custom_method=method) + 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') + 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') + 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 + 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') + 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): + 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') - handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'foo') + handler.add("GET", "/oss_non_cached/test.txt", 200, {}, "foo") + 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') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo', config_option_value + assert data == "foo", config_option_value handler = webserver.SequentialHandler() - handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'bar2') + 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 + 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') + 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 + 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') - handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'bar2') + handler.add("GET", "/oss_non_cached/test.txt", 200, {}, "bar2") + 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') + 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') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar2', config_option_value + 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): + 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'}, - """ + handler.add( + "GET", + "/oss_non_cached/?delimiter=%2F", + 200, + {"Content-type": "application/xml"}, + """ / @@ -487,44 +568,54 @@ def method(request): 40 - """) - handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'foo') + """, + ) + 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') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo', config_option_value + 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') + 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') + 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 + assert data == "foo", config_option_value # List buckets (empty result) handler = webserver.SequentialHandler() - handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/", + 200, + {"Content-type": "application/xml"}, + """ - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsioss/') - assert dir_contents == ['.'] + dir_contents = gdal.ReadDir("/vsioss/") + assert dir_contents == ["."] gdal.VSICurlClearCache() # List buckets handler = webserver.SequentialHandler() - handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/", + 200, + {"Content-type": "application/xml"}, + """ @@ -532,10 +623,12 @@ def method(request): - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsioss/') - assert dir_contents == ['mybucket'] + dir_contents = gdal.ReadDir("/vsioss/") + assert dir_contents == ["mybucket"] + ############################################################################### # Test simple PUT support with a fake OSS server @@ -548,45 +641,51 @@ def test_visoss_4(): with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): - f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3', 'wb') + 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') + 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 + 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)) + 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.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/oss_fake_bucket3/empty_file.bin', custom_method=method) + 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') + f = gdal.VSIFOpenL("/vsioss/oss_fake_bucket3/empty_file.bin", "wb") assert f is not None gdal.ErrorReset() gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" handler = webserver.SequentialHandler() - handler.add('GET', '/oss_fake_bucket3/empty_file.bin', 200, {'Connection': 'close'}, '') + 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 + 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') + 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) @@ -596,7 +695,7 @@ def method(request): # Invalid read handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/empty_file.bin', 'wb') + 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) @@ -605,56 +704,59 @@ def method(request): # Error case handler = webserver.SequentialHandler() - handler.add('PUT', '/oss_fake_bucket3/empty_file_error.bin', 403) + 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') + 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() != '' + assert gdal.GetLastErrorMsg() != "" # Nominal case with webserver.install_http_handler(webserver.SequentialHandler()): - f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/another_file.bin', 'wb') + 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.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 - assert gdal.VSIFWriteL('bar', 1, 3, f) == 3 + 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)) + 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.send_header("Content-Length", 0) request.end_headers() return - request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) + 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) + 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.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/oss_fake_bucket3/another_file.bin', custom_method=method) + 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() == '' + assert gdal.GetLastErrorMsg() == "" + ############################################################################### # Test simple DELETE support with a fake OSS server @@ -667,37 +769,48 @@ def test_visoss_5(): with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): - ret = gdal.Unlink('/vsioss/foo') + ret = gdal.Unlink("/vsioss/foo") assert ret != 0 handler = webserver.SequentialHandler() - handler.add('GET', '/oss_delete_bucket/delete_file', 200, {'Connection': 'close'}, 'foo') + 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 + 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 + assert gdal.VSIStatL("/vsioss/oss_delete_bucket/delete_file").size == 3 handler = webserver.SequentialHandler() - handler.add('DELETE', '/oss_delete_bucket/delete_file', 204) + handler.add("DELETE", "/oss_delete_bucket/delete_file", 204) with webserver.install_http_handler(handler): - ret = gdal.Unlink('/vsioss/oss_delete_bucket/delete_file') + 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') + 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 + 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) + 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') + ret = gdal.Unlink("/vsioss/oss_delete_bucket/delete_file_error") assert ret != 0 + ############################################################################### # Test multipart upload with a fake OSS server @@ -707,39 +820,47 @@ def test_visoss_6(): if gdaltest.webserver_port == 0: pytest.skip() - with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB + 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') + f = gdal.VSIFOpenL("/vsioss/oss_fake_bucket4/large_file.bin", "wb") assert f is not None size = 1024 * 1024 + 1 - big_buffer = 'a' * size + big_buffer = "a" * size handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + 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.send_header("Content-type", "application/xml") + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - handler.add('POST', '/oss_fake_bucket4/large_file.bin?uploads', custom_method=method) + 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)) + 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.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.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) + 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) @@ -747,106 +868,178 @@ def method(request): 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)) + 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.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) + 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)) + 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.send_header("Content-Length", 0) request.end_headers() return - content = request.rfile.read(186).decode('ascii') - if content != """ + 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) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('POST', '/oss_fake_bucket4/large_file.bin?uploadId=my_id', custom_method=method) + 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() == '' + 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, {}, '') + 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') + 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() == '' + 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) + 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') + 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 + 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' + 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') + 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) @@ -854,28 +1047,49 @@ def method(request): gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() != '', filename + 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( + "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' + 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') + 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 + assert gdal.GetLastErrorMsg() != "", filename ############################################################################### @@ -888,40 +1102,53 @@ def test_visoss_7(): 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) + 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) + 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) + 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) + 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) + handler.add("DELETE", "/oss_bucket_test_mkdir/dir/", 204) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsioss/oss_bucket_test_mkdir/dir') + 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'}) + 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') + 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'}, - """ + 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/ @@ -930,11 +1157,13 @@ def test_visoss_7(): 40 - """) + """, + ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsioss/oss_bucket_test_mkdir/dir_nonempty') + ret = gdal.Rmdir("/vsioss/oss_bucket_test_mkdir/dir_nonempty") assert ret != 0 + ############################################################################### # Test handling of file and directory with same name @@ -945,9 +1174,12 @@ def test_visoss_8(): pytest.skip() handler = webserver.SequentialHandler() - handler.add('GET', '/visoss_8/?delimiter=%2F', 200, - {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/visoss_8/?delimiter=%2F", + 200, + {"Content-type": "application/xml"}, + """ @@ -959,19 +1191,20 @@ def test_visoss_8(): test/ - """) + """, + ) with webserver.install_http_handler(handler): - listdir = gdal.ReadDir('/vsioss/visoss_8', 0) - assert listdir == ['test', 'test/'] + 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) + 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) + assert stat.S_ISDIR(gdal.VSIStatL("/vsioss/visoss_8/test/").mode) ############################################################################### @@ -988,6 +1221,7 @@ def test_visoss_stop_webserver(): webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) + ############################################################################### # Nominal cases (require valid credentials) @@ -998,87 +1232,92 @@ def test_visoss_extra_1(): pytest.skip() # Either a bucket name or bucket/filename - OSS_RESOURCE = gdal.GetConfigOption('OSS_RESOURCE') + 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') + 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') + pytest.skip("Missing OSS_RESOURCE") - if '/' not in OSS_RESOURCE: - path = '/vsioss/' + 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) + 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' + 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 + 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) + 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)) + 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) + 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "wb") assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + 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) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + 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.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) + 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)) + 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) + f = open_for_read("/vsioss_streaming/" + OSS_RESOURCE) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -1089,26 +1328,27 @@ def test_visoss_extra_1(): # 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') + f = open_for_read("/vsioss/not_existing_bucket/foo") with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) - assert gdal.VSIGetLastErrorMsg() != '' + assert gdal.VSIGetLastErrorMsg() != "" # Invalid resource gdal.ErrorReset() - f = open_for_read('/vsioss_streaming/' + OSS_RESOURCE + '/invalid_resource.baz') + 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) + 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 + ############################################################################### diff --git a/autotest/gcore/vsis3.py b/autotest/gcore/vsis3.py index 60053fcd29a4..2d00646836b4 100755 --- a/autotest/gcore/vsis3.py +++ b/autotest/gcore/vsis3.py @@ -34,45 +34,46 @@ import sys import tempfile -from osgeo import gdal - - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) general_s3_options = { # To avoid user AWS credentials in ~/.aws/credentials # and ~/.aws/config to mess up our tests - 'CPL_AWS_CREDENTIALS_FILE': '', - 'AWS_CONFIG_FILE': '', - 'CPL_AWS_EC2_API_ROOT_URL': '', - 'AWS_NO_SIGN_REQUEST': 'NO', - 'AWS_SECRET_ACCESS_KEY': 'AWS_SECRET_ACCESS_KEY', - 'AWS_ACCESS_KEY_ID': 'AWS_ACCESS_KEY_ID', - 'AWS_TIMESTAMP': '20150101T000000Z', - 'AWS_HTTPS': 'NO', - 'AWS_VIRTUAL_HOSTING': 'NO', - 'AWS_REQUEST_PAYER': '', - 'AWS_DEFAULT_REGION': 'us-east-1', - 'AWS_DEFAULT_PROFILE': '', - 'AWS_PROFILE': 'default' + "CPL_AWS_CREDENTIALS_FILE": "", + "AWS_CONFIG_FILE": "", + "CPL_AWS_EC2_API_ROOT_URL": "", + "AWS_NO_SIGN_REQUEST": "NO", + "AWS_SECRET_ACCESS_KEY": "AWS_SECRET_ACCESS_KEY", + "AWS_ACCESS_KEY_ID": "AWS_ACCESS_KEY_ID", + "AWS_TIMESTAMP": "20150101T000000Z", + "AWS_HTTPS": "NO", + "AWS_VIRTUAL_HOSTING": "NO", + "AWS_REQUEST_PAYER": "", + "AWS_DEFAULT_REGION": "us-east-1", + "AWS_DEFAULT_PROFILE": "", + "AWS_PROFILE": "default", } -@pytest.fixture(params = [True, False]) +@pytest.fixture(params=[True, False]) def aws_test_config_as_config_options_or_credentials(request): options = general_s3_options - with gdaltest.config_options(options) if request.param else gdaltest.credentials("/vsis3/", options): + with gdaltest.config_options(options) if request.param else gdaltest.credentials( + "/vsis3/", options + ): yield request.param @@ -83,6 +84,7 @@ def aws_test_config(): with gdaltest.config_options(options): yield + @pytest.fixture(scope="module") def webserver_port(): if not gdaltest.built_against_curl(): @@ -95,7 +97,8 @@ def webserver_port(): if webserver_port == 0: pytest.skip() with gdaltest.config_option( - 'AWS_S3_ENDPOINT', f'127.0.0.1:{webserver_port}', + "AWS_S3_ENDPOINT", + f"127.0.0.1:{webserver_port}", ): yield webserver_port finally: @@ -109,11 +112,12 @@ def webserver_port(): def test_vsis3_init(aws_test_config): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", } with gdaltest.config_options(options): - assert gdal.GetSignedURL('/vsis3/foo/bar') is None + assert gdal.GetSignedURL("/vsis3/foo/bar") is None + ############################################################################### # Test AWS_NO_SIGN_REQUEST=YES @@ -125,28 +129,34 @@ def test_vsis3_no_sign_request(aws_test_config_as_config_options_or_credentials) pytest.skip() options = { - 'AWS_S3_ENDPOINT': 's3.amazonaws.com', - 'AWS_NO_SIGN_REQUEST': 'YES', - 'AWS_HTTPS': 'YES', - 'AWS_VIRTUAL_HOSTING': 'TRUE' + "AWS_S3_ENDPOINT": "s3.amazonaws.com", + "AWS_NO_SIGN_REQUEST": "YES", + "AWS_HTTPS": "YES", + "AWS_VIRTUAL_HOSTING": "TRUE", } - bucket = 'noaa-goes16' - obj = 'ABI-L1b-RadC/2022/001/00/OR_ABI-L1b-RadC-M6C01_G16_s20220010001173_e20220010003546_c20220010003587.nc' - vsis3_path = '/vsis3/' + bucket + '/' + obj - url = 'https://' + bucket + '.s3.amazonaws.com/' + obj + bucket = "noaa-goes16" + obj = "ABI-L1b-RadC/2022/001/00/OR_ABI-L1b-RadC-M6C01_G16_s20220010001173_e20220010003546_c20220010003587.nc" + vsis3_path = "/vsis3/" + bucket + "/" + obj + url = "https://" + bucket + ".s3.amazonaws.com/" + obj - with gdaltest.config_options(options) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials('/vsis3/' + bucket, options): + with gdaltest.config_options( + options + ) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials( + "/vsis3/" + bucket, options + ): actual_url = gdal.GetActualURL(vsis3_path) assert actual_url == url - actual_url = gdal.GetActualURL(vsis3_path.replace('/vsis3/', '/vsis3_streaming/')) + actual_url = gdal.GetActualURL( + vsis3_path.replace("/vsis3/", "/vsis3_streaming/") + ) assert actual_url == url f = open_for_read(vsis3_path) if f is None: if gdaltest.gdalurlopen(url) is None: - pytest.skip('cannot open URL') + pytest.skip("cannot open URL") pytest.fail() gdal.VSIFCloseL(f) @@ -155,7 +165,9 @@ def test_vsis3_no_sign_request(aws_test_config_as_config_options_or_credentials) # Test Sync() and multithreaded download -def test_vsis3_sync_multithreaded_download(aws_test_config_as_config_options_or_credentials): +def test_vsis3_sync_multithreaded_download( + aws_test_config_as_config_options_or_credentials, +): if not gdaltest.built_against_curl(): pytest.skip() @@ -167,24 +179,33 @@ def cbk(pct, _, tab): tab = [-1] options = { - 'AWS_S3_ENDPOINT': 's3.amazonaws.com', - 'AWS_NO_SIGN_REQUEST': 'YES', - 'AWS_VIRTUAL_HOSTING': 'FALSE' + "AWS_S3_ENDPOINT": "s3.amazonaws.com", + "AWS_NO_SIGN_REQUEST": "YES", + "AWS_VIRTUAL_HOSTING": "FALSE", } # Use a public bucket with /test_dummy/foo and /test_dummy/bar files - with gdaltest.config_options(options) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials('/vsis3/cdn.proj.org', options): - assert gdal.Sync('/vsis3/cdn.proj.org/test_dummy', - '/vsimem/test_vsis3_no_sign_request_sync', - options=['NUM_THREADS=2'], - callback=cbk, callback_data=tab) + with gdaltest.config_options( + options + ) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials( + "/vsis3/cdn.proj.org", options + ): + assert gdal.Sync( + "/vsis3/cdn.proj.org/test_dummy", + "/vsimem/test_vsis3_no_sign_request_sync", + options=["NUM_THREADS=2"], + callback=cbk, + callback_data=tab, + ) assert tab[0] == 1.0 - assert gdal.VSIStatL( - '/vsimem/test_vsis3_no_sign_request_sync/test_dummy/foo' - ).size == 4 - assert gdal.VSIStatL( - '/vsimem/test_vsis3_no_sign_request_sync/test_dummy/bar' - ).size == 4 - gdal.RmdirRecursive('/vsimem/test_vsis3_no_sign_request_sync') + assert ( + gdal.VSIStatL("/vsimem/test_vsis3_no_sign_request_sync/test_dummy/foo").size + == 4 + ) + assert ( + gdal.VSIStatL("/vsimem/test_vsis3_no_sign_request_sync/test_dummy/bar").size + == 4 + ) + gdal.RmdirRecursive("/vsimem/test_vsis3_no_sign_request_sync") ############################################################################### @@ -203,25 +224,31 @@ def cbk(pct, _, tab): tab = [-1] options = { - 'AWS_S3_ENDPOINT': 's3.amazonaws.com', - 'AWS_NO_SIGN_REQUEST': 'YES', - 'AWS_VIRTUAL_HOSTING': 'FALSE' + "AWS_S3_ENDPOINT": "s3.amazonaws.com", + "AWS_NO_SIGN_REQUEST": "YES", + "AWS_VIRTUAL_HOSTING": "FALSE", } # Use a public bucket with /test_dummy/foo and /test_dummy/bar files with gdaltest.config_options(options): - assert gdal.Sync('/vsis3/cdn.proj.org/test_dummy', - '/vsimem/test_vsis3_no_sign_request_sync', - options=['NUM_THREADS=2', 'CHUNK_SIZE=3'], - callback=cbk, callback_data=tab) + assert gdal.Sync( + "/vsis3/cdn.proj.org/test_dummy", + "/vsimem/test_vsis3_no_sign_request_sync", + options=["NUM_THREADS=2", "CHUNK_SIZE=3"], + callback=cbk, + callback_data=tab, + ) assert tab[0] == 1.0 - assert gdal.VSIStatL( - '/vsimem/test_vsis3_no_sign_request_sync/test_dummy/foo' - ).size == 4 - assert gdal.VSIStatL( - '/vsimem/test_vsis3_no_sign_request_sync/test_dummy/bar' - ).size == 4 + assert ( + gdal.VSIStatL("/vsimem/test_vsis3_no_sign_request_sync/test_dummy/foo").size + == 4 + ) + assert ( + gdal.VSIStatL("/vsimem/test_vsis3_no_sign_request_sync/test_dummy/bar").size + == 4 + ) + + gdal.RmdirRecursive("/vsimem/test_vsis3_no_sign_request_sync") - gdal.RmdirRecursive('/vsimem/test_vsis3_no_sign_request_sync') ############################################################################### # Error cases @@ -233,123 +260,125 @@ def test_vsis3_1(aws_test_config): pytest.skip() # Missing AWS_SECRET_ACCESS_KEY - with gdaltest.config_options({ - 'AWS_SECRET_ACCESS_KEY': '' - }): + with gdaltest.config_options({"AWS_SECRET_ACCESS_KEY": ""}): gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsis3/foo/bar') + f = open_for_read("/vsis3/foo/bar") assert f is None - assert gdal.VSIGetLastErrorMsg().find('AWS_SECRET_ACCESS_KEY') >= 0 + assert gdal.VSIGetLastErrorMsg().find("AWS_SECRET_ACCESS_KEY") >= 0 gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsis3_streaming/foo/bar') + f = open_for_read("/vsis3_streaming/foo/bar") assert f is None - assert gdal.VSIGetLastErrorMsg().find('AWS_SECRET_ACCESS_KEY') >= 0 + assert gdal.VSIGetLastErrorMsg().find("AWS_SECRET_ACCESS_KEY") >= 0 - with gdaltest.config_options({ - 'AWS_SECRET_ACCESS_KEY': 'AWS_SECRET_ACCESS_KEY', - 'AWS_ACCESS_KEY_ID': '' - }): + with gdaltest.config_options( + {"AWS_SECRET_ACCESS_KEY": "AWS_SECRET_ACCESS_KEY", "AWS_ACCESS_KEY_ID": ""} + ): # Missing AWS_ACCESS_KEY_ID gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsis3/foo/bar') + f = open_for_read("/vsis3/foo/bar") assert f is None - assert gdal.VSIGetLastErrorMsg().find('AWS_ACCESS_KEY_ID') >= 0 + assert gdal.VSIGetLastErrorMsg().find("AWS_ACCESS_KEY_ID") >= 0 - with gdaltest.config_options({ - 'AWS_SECRET_ACCESS_KEY': 'AWS_SECRET_ACCESS_KEY', - 'AWS_ACCESS_KEY_ID': 'AWS_ACCESS_KEY_ID' - }): + with gdaltest.config_options( + { + "AWS_SECRET_ACCESS_KEY": "AWS_SECRET_ACCESS_KEY", + "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() == '': + 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: + 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() != '' + f = open_for_read("/vsis3_streaming/foo/bar.baz") + assert f is None and gdal.VSIGetLastErrorMsg() != "" + ############################################################################### def get_s3_fake_bucket_resource_method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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' + "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' + "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" ) expected_authorization_8082 = ( - '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=' - 'a78e2d484679a19bec940a72d40c7fda37d1651a8ab82a6ed8fd7be46a53afb1' - ) - actual_authorization = request.headers['Authorization'] - if (actual_authorization not in - (expected_authorization_8080, expected_authorization_8081, expected_authorization_8082)): - sys.stderr.write( - "Bad Authorization: '%s'\n" % str(actual_authorization) - ) + "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=" + "a78e2d484679a19bec940a72d40c7fda37d1651a8ab82a6ed8fd7be46a53afb1" + ) + actual_authorization = request.headers["Authorization"] + if actual_authorization not in ( + expected_authorization_8080, + expected_authorization_8081, + expected_authorization_8082, + ): + sys.stderr.write("Bad Authorization: '%s'\n" % str(actual_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.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')) + request.wfile.write("""foo""".encode("ascii")) + ############################################################################### # Test with a fake AWS server def test_vsis3_2(aws_test_config_as_config_options_or_credentials, webserver_port): - signed_url = gdal.GetSignedURL('/vsis3/s3_fake_bucket/resource') + 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' + "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' + "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) @@ -357,121 +386,118 @@ def test_vsis3_2(aws_test_config_as_config_options_or_credentials, webserver_por handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "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') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "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') + f = open_for_read("/vsis3_streaming/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" - if 'Authorization' not in request.headers: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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' + "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' + "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" ) - actual_authorization = request.headers['Authorization'] - if (actual_authorization not in - (expected_authorization_8080, expected_authorization_8081)): - sys.stderr.write( - "Bad Authorization: '%s'\n" % str(actual_authorization) - ) + actual_authorization = request.headers["Authorization"] + if actual_authorization not in ( + expected_authorization_8080, + expected_authorization_8081, + ): + sys.stderr.write("Bad Authorization: '%s'\n" % str(actual_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("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) handler.add( - 'GET', - '/s3_fake_bucket_with_session_token/resource', - custom_method=method + "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') \ - if aws_test_config_as_config_options_or_credentials else \ - gdaltest.credentials('/vsis3/s3_fake_bucket_with_session_token', {'AWS_SESSION_TOKEN': 'AWS_SESSION_TOKEN'}): + with gdaltest.config_option( + "AWS_SESSION_TOKEN", "AWS_SESSION_TOKEN" + ) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials( + "/vsis3/s3_fake_bucket_with_session_token", + {"AWS_SESSION_TOKEN": "AWS_SESSION_TOKEN"}, + ): with webserver.install_http_handler(handler): - f = open_for_read( - '/vsis3/s3_fake_bucket_with_session_token/resource' - ) + 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') + 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.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.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')) + 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.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')) + request.wfile.write(("a" * 1000000).encode("ascii")) - handler.add('GET', '/s3_fake_bucket/resource2.bin', custom_method=method) + 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') + 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: @@ -481,14 +507,18 @@ def method(request): pytest.fail() handler = webserver.SequentialHandler() - handler.add('HEAD', '/s3_fake_bucket/resource2.bin', 200, - {'Content-type': 'text/plain', - 'Content-Length': 1000000, - 'Connection': 'close'}) + 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' - ) + 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) @@ -499,86 +529,85 @@ def method(request): handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' - if request.headers['Authorization'].find('us-east-1') >= 0: + request.protocol_version = "HTTP/1.1" + if request.headers["Authorization"].find("us-east-1") >= 0: request.send_response(400) - response = ''' + response = """ bla AuthorizationHeaderMalformed us-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') + """ + 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')) + request.wfile.write(response.encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) + handler.add("GET", "/s3_fake_bucket/redirect", custom_method=method) def method(request): - request.protocol_version = 'HTTP/1.1' - includes_us_west_2 = request.headers['Authorization'].find( - 'us-west-2' - ) >= 0 - host_is_127_0_0_1 = request.headers['Host'].startswith('127.0.0.1') + request.protocol_version = "HTTP/1.1" + includes_us_west_2 = request.headers["Authorization"].find("us-west-2") >= 0 + host_is_127_0_0_1 = request.headers["Host"].startswith("127.0.0.1") if includes_us_west_2 and host_is_127_0_0_1: request.send_response(301) - response = ''' + response = ( + """ bla PermanentRedirect 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.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')) + request.wfile.write(response.encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) + handler.add("GET", "/s3_fake_bucket/redirect", custom_method=method) def method(request): - request.protocol_version = 'HTTP/1.1' - includes_us_west_2 = request.headers['Authorization'].find( - 'us-west-2' - ) >= 0 - host_is_localhost = request.headers['Host'].startswith('localhost') + request.protocol_version = "HTTP/1.1" + includes_us_west_2 = request.headers["Authorization"].find("us-west-2") >= 0 + host_is_localhost = request.headers["Host"].startswith("localhost") if includes_us_west_2 and host_is_localhost: request.send_response(200) - request.send_header('Content-type', 'text/plain') - request.send_header('Content-Length', 3) - request.send_header('Connection', 'close') + 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')) + request.wfile.write("""foo""".encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) + 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') + f = open_for_read("/vsis3/s3_fake_bucket/redirect") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - if data != 'foo': + if data != "foo": - if gdaltest.is_travis_branch('trusty'): - pytest.skip('Skipped on trusty branch, but should be investigated') + if gdaltest.is_travis_branch("trusty"): + pytest.skip("Skipped on trusty branch, but should be investigated") pytest.fail(data) @@ -587,205 +616,219 @@ def method(request): handler.req_count = 0 with webserver.install_http_handler(handler): - f = open_for_read('/vsis3_streaming/s3_fake_bucket/redirect') + f = open_for_read("/vsis3_streaming/s3_fake_bucket/redirect") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + 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)) + 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.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') + 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')) + request.wfile.write(response.encode("ascii")) - handler.add('GET', '/s3_fake_bucket/non_xml_error', custom_method=method) + 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 + 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) + 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 + 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) + 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 + 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 = ''' + response = """ AuthorizationHeaderMalformed - ''' - response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) + """ + 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', + "GET", + "/s3_fake_bucket/no_region_in_AuthorizationHeaderMalformed_error", 400, { - 'Content-type': 'application/xml', - 'Transfer-Encoding': 'chunked', - 'Connection': 'close' + "Content-type": "application/xml", + "Transfer-Encoding": "chunked", + "Connection": "close", }, - response + 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' + "/vsis3_streaming/s3_fake_bucket" + "/no_region_in_AuthorizationHeaderMalformed_error" ) - assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 + assert f is None and gdal.VSIGetLastErrorMsg().find("") >= 0 handler = webserver.SequentialHandler() - response = ''' + response = """ PermanentRedirect - ''' - response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) + """ + 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', + "GET", + "/s3_fake_bucket/no_endpoint_in_PermanentRedirect_error", 400, { - 'Content-type': 'application/xml', - 'Transfer-Encoding': 'chunked', - 'Connection': 'close' + "Content-type": "application/xml", + "Transfer-Encoding": "chunked", + "Connection": "close", }, - response + 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' + "/vsis3_streaming/s3_fake_bucket" + "/no_endpoint_in_PermanentRedirect_error" ) - assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 + assert f is None and gdal.VSIGetLastErrorMsg().find("") >= 0 handler = webserver.SequentialHandler() - response = ''' + 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) + """ + 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 + 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)) + 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' + "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' + "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" ) - actual_authorization = request.headers['Authorization'] - if (actual_authorization not in - (expected_authorization_8080, expected_authorization_8081)): - sys.stderr.write( - "Bad Authorization: '%s'\n" % str(actual_authorization) - ) + actual_authorization = request.headers["Authorization"] + if actual_authorization not in ( + expected_authorization_8080, + expected_authorization_8081, + ): + sys.stderr.write("Bad Authorization: '%s'\n" % str(actual_authorization)) request.send_response(403) return - if request.headers['x-amz-request-payer'] != 'requester': + 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']) + % 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.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')) + request.wfile.write("""foo""".encode("ascii")) handler.add( - 'GET', - '/s3_fake_bucket_with_requester_pays/resource', - custom_method=method + "GET", "/s3_fake_bucket_with_requester_pays/resource", custom_method=method ) - with gdaltest.config_option('AWS_REQUEST_PAYER', 'requester') \ - if aws_test_config_as_config_options_or_credentials else \ - gdaltest.credentials('/vsis3/s3_fake_bucket_with_requester_pays', {'AWS_REQUEST_PAYER': 'requester'}): + with gdaltest.config_option( + "AWS_REQUEST_PAYER", "requester" + ) if aws_test_config_as_config_options_or_credentials else gdaltest.credentials( + "/vsis3/s3_fake_bucket_with_requester_pays", {"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' - ) + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Test temporary redirect handler = webserver.SequentialHandler() @@ -796,119 +839,115 @@ def __init__(self, response_value): 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)) + 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' + self.old_authorization = request.headers["Authorization"] + request.protocol_version = "HTTP/1.1" request.send_response(307) - response = ''' + response = ( + """ bla TemporaryRedirect 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.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')) + 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)) + 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']: + if self.old_authorization == request.headers["Authorization"]: sys.stderr.write( - 'Should have get a different Authorization. ' - 'Bad headers: %s\n' % str(request.headers) + "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.protocol_version = "HTTP/1.1" request.send_response(200) response = self.response_value - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - h = HandlerClass('foo') + h = HandlerClass("foo") handler.add( - 'GET', - '/s3_test_temporary_redirect_read/resource', - custom_method=h.method_req_1 + "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 + "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') + f = open_for_read("/vsis3/s3_test_temporary_redirect_read/resource") assert f is not None - data = gdal.VSIFReadL(1, 3, f).decode('ascii') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Retry on the same bucket and check that the redirection was indeed # temporary handler = webserver.SequentialHandler() - h = HandlerClass('bar') + h = HandlerClass("bar") handler.add( - 'GET', - '/s3_test_temporary_redirect_read/resource2', - custom_method=h.method_req_1 + "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 + "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') + f = open_for_read("/vsis3/s3_test_temporary_redirect_read/resource2") assert f is not None - data = gdal.VSIFReadL(1, 3, f).decode('ascii') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" + ############################################################################### # Test re-opening after changing configuration option (#2294) -def test_vsis3_open_after_config_option_change( - aws_test_config, - webserver_port): +def test_vsis3_open_after_config_option_change(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/test_vsis3_change_config_options/?delimiter=%2F', 403) - handler.add('GET', '/test_vsis3_change_config_options/test.bin', 403) + handler.add("GET", "/test_vsis3_change_config_options/?delimiter=%2F", 403) + handler.add("GET", "/test_vsis3_change_config_options/test.bin", 403) with webserver.install_http_handler(handler): with gdaltest.error_handler(): - f = open_for_read( - '/vsis3/test_vsis3_change_config_options/test.bin' - ) + f = open_for_read("/vsis3/test_vsis3_change_config_options/test.bin") assert f is None # Does not attempt any network access since we didn't change significant # parameters - f = open_for_read('/vsis3/test_vsis3_change_config_options/test.bin') + f = open_for_read("/vsis3/test_vsis3_change_config_options/test.bin") assert f is None - with gdaltest.config_option('AWS_ACCESS_KEY_ID', 'another_key_id'): + with gdaltest.config_option("AWS_ACCESS_KEY_ID", "another_key_id"): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/test_vsis3_change_config_options/?delimiter=%2F', + "GET", + "/test_vsis3_change_config_options/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -918,12 +957,10 @@ def test_vsis3_open_after_config_option_change( 123456 - """ + """, ) with webserver.install_http_handler(handler): - f = open_for_read( - '/vsis3/test_vsis3_change_config_options/test.bin' - ) + f = open_for_read("/vsis3/test_vsis3_change_config_options/test.bin") assert f is not None gdal.VSIFCloseL(f) @@ -936,37 +973,40 @@ def test_vsis3_readdir(aws_test_config, webserver_port): handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' - if request.headers['Authorization'].find('us-east-1') >= 0: + request.protocol_version = "HTTP/1.1" + if request.headers["Authorization"].find("us-east-1") >= 0: request.send_response(400) - response = ''' + response = """ bla AuthorizationHeaderMalformed us-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') + """ + 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.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 = ''' + response = ( + """ bla PermanentRedirect 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.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.wfile.write(response.encode("ascii")) + elif request.headers["Host"].startswith("localhost"): request.send_response(200) - request.send_header('Content-type', 'application/xml') + request.send_header("Content-type", "application/xml") response = """ a_dir with_space/ @@ -978,42 +1018,43 @@ def method(request): """ - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + 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)) + 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%20with_space%2F', - custom_method=method + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%20with_space%2F", + custom_method=method, ) handler.add( - 'GET', - '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%20with_space%2F', - custom_method=method + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%20with_space%2F", + custom_method=method, ) handler.add( - 'GET', - '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%20with_space%2F', - custom_method=method + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%20with_space%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)) + 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.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'application/xml') + request.send_header("Content-type", "application/xml") response = """ a_dir with_space/ @@ -1039,102 +1080,94 @@ def method(request): """ - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) handler.add( - 'GET', - ( - '/s3_fake_bucket2/' - '?delimiter=%2F&marker=bla&prefix=a_dir%20with_space%2F' - ), - custom_method=method + "GET", + ("/s3_fake_bucket2/" "?delimiter=%2F&marker=bla&prefix=a_dir%20with_space%2F"), + custom_method=method, ) with webserver.install_http_handler(handler): f = open_for_read( - '/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin' + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" ) if f is None: - if gdaltest.is_travis_branch('trusty'): - pytest.skip('Skipped on trusty branch, but should be investigated') + 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 with_space') - assert dir_contents == [ - 'resource3 with_space.bin', - 'resource4.bin', - 'subdir' - ] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir with_space") + assert dir_contents == ["resource3 with_space.bin", "resource4.bin", "subdir"] - assert gdal.VSIStatL( - '/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin' - ).size == 123456 - assert gdal.VSIStatL( - '/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin' - ).mtime == 1 + assert ( + gdal.VSIStatL( + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).size + == 123456 + ) + assert ( + gdal.VSIStatL( + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).mtime + == 1 + ) # Same as above: cached - dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir with_space') - assert dir_contents == [ - 'resource3 with_space.bin', - 'resource4.bin', - 'subdir' - ] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir with_space") + assert dir_contents == ["resource3 with_space.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 with_space/resource3 with_space.bin' + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" ) assert dir_contents is None # Test unrelated partial clear of the cache - gdal.VSICurlPartialClearCache('/vsis3/s3_fake_bucket_unrelated') + gdal.VSICurlPartialClearCache("/vsis3/s3_fake_bucket_unrelated") - assert gdal.VSIStatL( - '/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin' - ).size == 123456 + assert ( + gdal.VSIStatL( + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" + ).size + == 123456 + ) - dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir with_space') - assert dir_contents == [ - 'resource3 with_space.bin', - 'resource4.bin', - 'subdir' - ] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir with_space") + assert dir_contents == ["resource3 with_space.bin", "resource4.bin", "subdir"] # Test partial clear of the cache - gdal.VSICurlPartialClearCache('/vsis3/s3_fake_bucket2/a_dir with_space') + gdal.VSICurlPartialClearCache("/vsis3/s3_fake_bucket2/a_dir with_space") handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket2/a_dir%20with_space/resource3%20with_space.bin', - 400 + "GET", "/s3_fake_bucket2/a_dir%20with_space/resource3%20with_space.bin", 400 ) handler.add( - 'GET', + "GET", ( - '/s3_fake_bucket2/?delimiter=%2F&max-keys=100' - '&prefix=a_dir%20with_space%2Fresource3%20with_space.bin%2F' + "/s3_fake_bucket2/?delimiter=%2F&max-keys=100" + "&prefix=a_dir%20with_space%2Fresource3%20with_space.bin%2F" ), - 400 + 400, ) with webserver.install_http_handler(handler): gdal.VSIStatL( - '/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin' + "/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin" ) handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ a_dir/ @@ -1144,18 +1177,18 @@ def method(request): 40 - """ + """, ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') - assert dir_contents == ['test.txt'] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir") + assert dir_contents == ["test.txt"] # Test CPL_VSIL_CURL_IGNORE_GLACIER_STORAGE=NO gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F", 200, {}, """ @@ -1182,19 +1215,24 @@ def method(request): a_dir/subdir/ - """ + """, ) - with gdaltest.config_option('CPL_VSIL_CURL_IGNORE_GLACIER_STORAGE', 'NO'): + 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', 'i_am_a_deep_archive_file', 'subdir'] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir") + assert dir_contents == [ + "resource4.bin", + "i_am_a_glacier_file", + "i_am_a_deep_archive_file", + "subdir", + ] # Test CPL_VSIL_CURL_IGNORE_STORAGE_CLASSES= gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', + "GET", + "/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F", 200, {}, """ @@ -1221,81 +1259,77 @@ def method(request): a_dir/subdir/ - """ + """, ) - with gdaltest.config_option('CPL_VSIL_CURL_IGNORE_STORAGE_CLASSES', ''): + with gdaltest.config_option("CPL_VSIL_CURL_IGNORE_STORAGE_CLASSES", ""): 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', 'i_am_a_deep_archive_file', 'subdir'] + dir_contents = gdal.ReadDir("/vsis3/s3_fake_bucket2/a_dir") + assert dir_contents == [ + "resource4.bin", + "i_am_a_glacier_file", + "i_am_a_deep_archive_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' + "/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 - ): + 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') - handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'foo') + handler.add("GET", "/s3_non_cached/test.txt", 200, {}, "foo") + 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') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo', config_option_value + assert data == "foo", config_option_value handler = webserver.SequentialHandler() - handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'bar2') + 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 + 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') + 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 + 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') - handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'bar2') + handler.add("GET", "/s3_non_cached/test.txt", 200, {}, "bar2") + 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') + 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') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar2', config_option_value + 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 - ): + 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', + "GET", + "/s3_non_cached/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -1310,45 +1344,54 @@ def method(request): 40 - """ + """, ) - handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'foo') + 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') + 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') + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo', config_option_value + 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') + 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') + 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 + assert data == "foo", config_option_value # List buckets (empty result) handler = webserver.SequentialHandler() - handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/", + 200, + {"Content-type": "application/xml"}, + """ - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsis3/') - assert dir_contents == ['.'] + dir_contents = gdal.ReadDir("/vsis3/") + assert dir_contents == ["."] gdal.VSICurlClearCache() # List buckets handler = webserver.SequentialHandler() - handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, - """ + handler.add( + "GET", + "/", + 200, + {"Content-type": "application/xml"}, + """ @@ -1356,10 +1399,11 @@ def method(request): - """) + """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsis3/') - assert dir_contents == ['mybucket'] + dir_contents = gdal.ReadDir("/vsis3/") + assert dir_contents == ["mybucket"] # Test temporary redirect handler = webserver.SequentialHandler() @@ -1370,98 +1414,102 @@ def __init__(self, response_value): 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)) + 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' + self.old_authorization = request.headers["Authorization"] + request.protocol_version = "HTTP/1.1" request.send_response(307) - response = ''' + response = ( + """ bla TemporaryRedirect 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.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')) + 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)) + 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']: + if self.old_authorization == request.headers["Authorization"]: sys.stderr.write( - 'Should have get a different Authorization. ' - 'Bad headers: %s\n' % str(request.headers) + "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.protocol_version = "HTTP/1.1" request.send_response(200) - request.send_header('Content-type', 'application/xml') + request.send_header("Content-type", "application/xml") response = self.response_value - request.send_header('Content-Length', len(response)) + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - h = HandlerClass(""" + h = HandlerClass( + """ test - """) + """ + ) handler.add( - 'GET', - '/s3_test_temporary_redirect_read_dir/?delimiter=%2F', - custom_method=h.method_req_1 + "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 + "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'] + 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(""" + 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 + "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 + "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'] + dir_contents = gdal.ReadDir("/vsis3/s3_test_temporary_redirect_read_dir/test") + assert dir_contents == ["test2"] + ############################################################################### # Test OpenDir() with a fake AWS server @@ -1471,10 +1519,10 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # Unlimited depth handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/', + "GET", + "/vsis3_opendir/", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -1495,24 +1543,24 @@ def test_vsis3_opendir(aws_test_config, webserver_port): 5 - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsis3/vsis3_opendir') + d = gdal.OpenDir("/vsis3/vsis3_opendir") assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test.txt' + 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.name == "subdir" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/test.txt' + assert entry.name == "subdir/test.txt" entry = gdal.GetNextDirEntry(d) assert entry is None @@ -1522,10 +1570,10 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # Depth = 0 handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?delimiter=%2F', + "GET", + "/vsis3_opendir/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -1539,20 +1587,20 @@ def test_vsis3_opendir(aws_test_config, webserver_port): subdir/ - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsis3/vsis3_opendir', 0) + d = gdal.OpenDir("/vsis3/vsis3_opendir", 0) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test.txt' + 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.name == "subdir" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) @@ -1563,10 +1611,10 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # Depth = 1 handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?delimiter=%2F', + "GET", + "/vsis3_opendir/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -1580,28 +1628,28 @@ def test_vsis3_opendir(aws_test_config, webserver_port): subdir/ - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsis3/vsis3_opendir', 1) + d = gdal.OpenDir("/vsis3/vsis3_opendir", 1) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test.txt' + 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.name == "subdir" assert entry.mode == 16384 handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?delimiter=%2F&prefix=subdir%2F', + "GET", + "/vsis3_opendir/?delimiter=%2F&prefix=subdir%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ subdir/ @@ -1612,11 +1660,11 @@ def test_vsis3_opendir(aws_test_config, webserver_port): 5 - """ + """, ) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) - assert entry.name == 'subdir/test.txt' + assert entry.name == "subdir/test.txt" entry = gdal.GetNextDirEntry(d) assert entry is None @@ -1626,10 +1674,10 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # Prefix filtering on root of bucket handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?prefix=my_prefix', + "GET", + "/vsis3_opendir/?prefix=my_prefix", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ my_prefix @@ -1640,14 +1688,14 @@ def test_vsis3_opendir(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsis3/vsis3_opendir', -1, ['PREFIX=my_prefix']) + d = gdal.OpenDir("/vsis3/vsis3_opendir", -1, ["PREFIX=my_prefix"]) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'my_prefix_test.txt' + assert entry.name == "my_prefix_test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 @@ -1660,10 +1708,10 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # Prefix filtering on subdir handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?prefix=some_dir%2Fmy_prefix', + "GET", + "/vsis3_opendir/?prefix=some_dir%2Fmy_prefix", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ some_dir/my_prefix @@ -1674,18 +1722,14 @@ def test_vsis3_opendir(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir( - '/vsis3/vsis3_opendir/some_dir', - -1, - ['PREFIX=my_prefix'] - ) + d = gdal.OpenDir("/vsis3/vsis3_opendir/some_dir", -1, ["PREFIX=my_prefix"]) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'my_prefix_test.txt' + assert entry.name == "my_prefix_test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 @@ -1697,13 +1741,13 @@ def test_vsis3_opendir(aws_test_config, webserver_port): # No network access done s = gdal.VSIStatL( - '/vsis3/vsis3_opendir/some_dir/my_prefix_test.txt', + "/vsis3/vsis3_opendir/some_dir/my_prefix_test.txt", ( gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG | gdal.VSI_STAT_CACHE_ONLY - ) + ), ) assert s assert (s.mode & 32768) != 0 @@ -1711,15 +1755,19 @@ def test_vsis3_opendir(aws_test_config, webserver_port): assert s.mtime == 1 # No network access done - assert gdal.VSIStatL( - '/vsis3/vsis3_opendir/some_dir/i_do_not_exist.txt', - ( - gdal.VSI_STAT_EXISTS_FLAG - | gdal.VSI_STAT_NATURE_FLAG - | gdal.VSI_STAT_SIZE_FLAG - | gdal.VSI_STAT_CACHE_ONLY + assert ( + gdal.VSIStatL( + "/vsis3/vsis3_opendir/some_dir/i_do_not_exist.txt", + ( + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY + ), ) - ) is None + is None + ) + ############################################################################### # Test OpenDir(['SYNTHETIZE_MISSING_DIRECTORIES=YES']) with a fake AWS server @@ -1729,10 +1777,10 @@ def test_vsis3_opendir_synthetize_missing_directory(aws_test_config, webserver_p # Unlimited depth handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_opendir/?prefix=maindir%2F', + "GET", + "/vsis3_opendir/?prefix=maindir%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ maindir/ @@ -1773,58 +1821,61 @@ def test_vsis3_opendir_synthetize_missing_directory(aws_test_config, webserver_p 5 - """ + """, ) with webserver.install_http_handler(handler): - d = gdal.OpenDir('/vsis3/vsis3_opendir/maindir', -1, ['SYNTHETIZE_MISSING_DIRECTORIES=YES']) + d = gdal.OpenDir( + "/vsis3/vsis3_opendir/maindir", -1, ["SYNTHETIZE_MISSING_DIRECTORIES=YES"] + ) assert d is not None entry = gdal.GetNextDirEntry(d) - assert entry.name == 'test.txt' + assert entry.name == "test.txt" assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir' + assert entry.name == "explicit_subdir" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/test.txt' + assert entry.name == "explicit_subdir/test.txt" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/implicit_subdir' + assert entry.name == "explicit_subdir/implicit_subdir" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/implicit_subdir/test.txt' + assert entry.name == "explicit_subdir/implicit_subdir/test.txt" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/implicit_subdir/test2.txt' + assert entry.name == "explicit_subdir/implicit_subdir/test2.txt" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/implicit_subdir2' + assert entry.name == "explicit_subdir/implicit_subdir2" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'explicit_subdir/implicit_subdir2/test.txt' + assert entry.name == "explicit_subdir/implicit_subdir2/test.txt" entry = gdal.GetNextDirEntry(d) - assert entry.name == 'implicit_subdir' + assert entry.name == "implicit_subdir" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'implicit_subdir/implicit_subdir2' + assert entry.name == "implicit_subdir/implicit_subdir2" assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) - assert entry.name == 'implicit_subdir/implicit_subdir2/test.txt' + assert entry.name == "implicit_subdir/implicit_subdir2/test.txt" entry = gdal.GetNextDirEntry(d) assert entry is None gdal.CloseDir(d) + ############################################################################### # Test simple PUT support with a fake AWS server @@ -1832,71 +1883,71 @@ def test_vsis3_opendir_synthetize_missing_directory(aws_test_config, webserver_p def test_vsis3_4(aws_test_config, webserver_port): with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): - f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3', 'wb') + 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' + "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 + assert gdal.VSIStatL("/vsis3/s3_fake_bucket3/empty_file.bin").size == 3 handler = webserver.SequentialHandler() handler.add( - 'HEAD', - '/s3_fake_bucket3/empty_file.bin', + "HEAD", + "/s3_fake_bucket3/empty_file.bin", 200, - {'Connection': 'close', 'Content-Length': '3'} + {"Connection": "close", "Content-Length": "3"}, ) with webserver.install_http_handler(handler): - assert gdal.VSIStatL('/vsis3_streaming/s3_fake_bucket3/empty_file.bin').size == 3 + assert ( + gdal.VSIStatL("/vsis3_streaming/s3_fake_bucket3/empty_file.bin").size == 3 + ) # Empty file handler = webserver.SequentialHandler() - handler.add('PUT', '/s3_fake_bucket3/empty_file.bin', 200, - headers={'Content-Length': '0'}, - expected_headers={'Content-Length': '0', - 'Content-Type': 'foo', - 'Content-Encoding': 'bar', - 'x-amz-storage-class': 'GLACIER'}) + handler.add( + "PUT", + "/s3_fake_bucket3/empty_file.bin", + 200, + headers={"Content-Length": "0"}, + expected_headers={ + "Content-Length": "0", + "Content-Type": "foo", + "Content-Encoding": "bar", + "x-amz-storage-class": "GLACIER", + }, + ) with webserver.install_http_handler(handler): f = gdal.VSIFOpenExL( - '/vsis3/s3_fake_bucket3/empty_file.bin', - 'wb', + "/vsis3/s3_fake_bucket3/empty_file.bin", + "wb", 0, - ['Content-Type=foo', 'Content-Encoding=bar', 'x-amz-storage-class=GLACIER'] + ["Content-Type=foo", "Content-Encoding=bar", "x-amz-storage-class=GLACIER"], ) assert f is not None gdal.ErrorReset() gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket3/empty_file.bin', - 200, - {'Connection': 'close'}, - '' + "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 + assert gdal.VSIStatL("/vsis3/s3_fake_bucket3/empty_file.bin").size == 0 # Check that the update of the file results in the /vsis3_streaming/ # cached properties to be updated - assert gdal.VSIStatL('/vsis3_streaming/s3_fake_bucket3/empty_file.bin').size == 0 + assert gdal.VSIStatL("/vsis3_streaming/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') + 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) @@ -1906,7 +1957,7 @@ def test_vsis3_4(aws_test_config, webserver_port): # Invalid read handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): - f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/empty_file.bin', 'wb') + 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) @@ -1915,230 +1966,187 @@ def test_vsis3_4(aws_test_config, webserver_port): # Error case handler = webserver.SequentialHandler() - handler.add('PUT', '/s3_fake_bucket3/empty_file_error.bin', 403) + 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') + 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() != '' + assert gdal.GetLastErrorMsg() != "" # Nominal case gdal.NetworkStatsReset() - with gdaltest.config_option('CPL_VSIL_NETWORK_STATS_ENABLED', 'YES'): + with gdaltest.config_option("CPL_VSIL_NETWORK_STATS_ENABLED", "YES"): with webserver.install_http_handler(webserver.SequentialHandler()): - f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/another_file.bin', 'wb') + 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.VSIFWriteL("foo", 1, 3, f) == 3 assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 - assert gdal.VSIFWriteL('bar', 1, 3, f) == 3 + assert gdal.VSIFWriteL("bar", 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): - if request.headers['Content-Length'] != '6': + if request.headers["Content-Length"] != "6": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - request.wfile.write( - 'HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii') - ) + 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 - ) + 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.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add( - 'PUT', - '/s3_fake_bucket3/another_file.bin', - custom_method=method - ) + 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() == '' + assert gdal.GetLastErrorMsg() == "" j = json.loads(gdal.NetworkStatsGetAsSerializedJSON()) assert j == { - "methods": { - "PUT": { - "count": 1, - "uploaded_bytes": 6 - } - }, + "methods": {"PUT": {"count": 1, "uploaded_bytes": 6}}, "handlers": { "vsis3": { "files": { "/vsis3/s3_fake_bucket3/another_file.bin": { - "methods": { - "PUT": { - "count": 1, - "uploaded_bytes": 6 - } - }, + "methods": {"PUT": {"count": 1, "uploaded_bytes": 6}}, "actions": { "Write": { - "methods": { - "PUT": { - "count": 1, - "uploaded_bytes": 6 - } - } + "methods": {"PUT": {"count": 1, "uploaded_bytes": 6}} } - } + }, } }, - "methods": { - "PUT": { - "count": 1, - "uploaded_bytes": 6 - } - } + "methods": {"PUT": {"count": 1, "uploaded_bytes": 6}}, } - } + }, } gdal.NetworkStatsReset() # Redirect case with webserver.install_http_handler(webserver.SequentialHandler()): - f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/redirect.tif', 'wb') + f = gdal.VSIFOpenL("/vsis3/s3_fake_bucket3/redirect.tif", "wb") assert f is not None - assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 + 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.protocol_version = "HTTP/1.1" + if request.headers["Authorization"].find("us-east-1") >= 0: request.send_response(400) - response = ''' + response = """ bla AuthorizationHeaderMalformed us-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') + """ + 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' - or request.headers['Content-Type'] != 'image/tiff'): + request.wfile.write(response.encode("ascii")) + elif request.headers["Authorization"].find("us-west-2") >= 0: + if ( + request.headers["Content-Length"] != "6" + or request.headers["Content-Type"] != "image/tiff" + ): sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + 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.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.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/s3_fake_bucket3/redirect.tif', custom_method=method) - handler.add('PUT', '/s3_fake_bucket3/redirect.tif', custom_method=method) + handler.add("PUT", "/s3_fake_bucket3/redirect.tif", custom_method=method) + handler.add("PUT", "/s3_fake_bucket3/redirect.tif", custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" + ############################################################################### # Test simple PUT support with retry logic def test_vsis3_write_single_put_retry(aws_test_config, webserver_port): - with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', - 'GDAL_HTTP_RETRY_DELAY': '0.01'}): + 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' - ) + 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 + assert gdal.VSIFWriteL("foo", 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): - if request.headers['Content-Length'] != '3': + if request.headers["Content-Length"] != "3": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - request.wfile.write( - 'HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii') - ) + 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 - ) + 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.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + 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 - ) + 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 gdaltest.error_handler(): with webserver.install_http_handler(handler): @@ -2152,107 +2160,101 @@ def method(request): def test_vsis3_5(aws_test_config, webserver_port): with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): - ret = gdal.Unlink('/vsis3/foo') + ret = gdal.Unlink("/vsis3/foo") assert ret != 0 handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_delete_bucket/delete_file', - 200, - {'Connection': 'close'}, - 'foo' + "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 + 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 + assert gdal.VSIStatL("/vsis3/s3_delete_bucket/delete_file").size == 3 handler = webserver.SequentialHandler() - handler.add('DELETE', '/s3_delete_bucket/delete_file', 204) + handler.add("DELETE", "/s3_delete_bucket/delete_file", 204) with webserver.install_http_handler(handler): - ret = gdal.Unlink('/vsis3/s3_delete_bucket/delete_file') + 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/delete_file', + "GET", + "/s3_delete_bucket/?delimiter=%2F&max-keys=100&prefix=delete_file%2F", 404, - {'Connection': 'close'} - ) - handler.add( - 'GET', - '/s3_delete_bucket/?delimiter=%2F&max-keys=100&prefix=delete_file%2F', - 404, - {'Connection': 'close'} + {"Connection": "close"}, ) with webserver.install_http_handler(handler): - assert gdal.VSIStatL('/vsis3/s3_delete_bucket/delete_file') is None + 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) + 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') + ret = gdal.Unlink("/vsis3/s3_delete_bucket/delete_file_error") assert ret != 0 handler = webserver.SequentialHandler() - handler.add('GET', '/s3_delete_bucket/redirect', 200) + 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.protocol_version = "HTTP/1.1" + if request.headers["Authorization"].find("us-east-1") >= 0: request.send_response(400) - response = ''' + response = """ bla AuthorizationHeaderMalformed us-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') + """ + 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.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.send_header("Content-Length", 0) request.end_headers() else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + 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) + 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') + ret = gdal.Unlink("/vsis3/s3_delete_bucket/redirect") assert ret == 0 + ############################################################################### # Test DeleteObjects with a fake AWS server def test_vsis3_unlink_batch(aws_test_config, webserver_port): def method(request): - if request.headers['Content-MD5'] != 'Ze0X4LdlTwCsT+WpNxD9FA==': + if request.headers["Content-MD5"] != "Ze0X4LdlTwCsT+WpNxD9FA==": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(403) return - content = request.rfile.read( - int(request.headers['Content-Length']) - ).decode('ascii') - if content != """ + content = request.rfile.read(int(request.headers["Content-Length"])).decode( + "ascii" + ) + if ( + content + != """ foo @@ -2261,12 +2263,13 @@ def method(request): bar/baz -""": - sys.stderr.write('Did not get expected content: %s\n' % content) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(403) return - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(200) response = """ @@ -2277,20 +2280,16 @@ def method(request): bar/baz """ - request.send_header('Content-Length', len(response)) - request.send_header('Connection', 'close') + request.send_header("Content-Length", len(response)) + request.send_header("Connection", "close") request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) handler = webserver.SequentialHandler() + handler.add("POST", "/unlink_batch/?delete", custom_method=method) handler.add( - 'POST', - '/unlink_batch/?delete', - custom_method=method - ) - handler.add( - 'POST', - '/unlink_batch/?delete', + "POST", + "/unlink_batch/?delete", 200, {}, """ @@ -2298,22 +2297,24 @@ def method(request): baw - """ + """, ) - with gdaltest.config_option('CPL_VSIS3_UNLINK_BATCH_SIZE', '2'): + with gdaltest.config_option("CPL_VSIS3_UNLINK_BATCH_SIZE", "2"): with webserver.install_http_handler(handler): - ret = gdal.UnlinkBatch([ - '/vsis3/unlink_batch/foo', - '/vsis3/unlink_batch/bar/baz', - '/vsis3/unlink_batch/baw' - ]) + ret = gdal.UnlinkBatch( + [ + "/vsis3/unlink_batch/foo", + "/vsis3/unlink_batch/bar/baz", + "/vsis3/unlink_batch/baw", + ] + ) assert ret handler = webserver.SequentialHandler() handler.add( - 'POST', - '/unlink_batch/?delete', + "POST", + "/unlink_batch/?delete", 200, {}, """ @@ -2321,13 +2322,14 @@ def method(request): foo - """ + """, ) with webserver.install_http_handler(handler): - ret = gdal.UnlinkBatch(['/vsis3/unlink_batch/foo']) + ret = gdal.UnlinkBatch(["/vsis3/unlink_batch/foo"]) assert not ret + ############################################################################### # Test RmdirRecursive() with a fake AWS server @@ -2335,10 +2337,10 @@ def method(request): def test_vsis3_rmdir_recursive(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/test_rmdir_recursive/?prefix=somedir%2F', + "GET", + "/test_rmdir_recursive/?prefix=somedir%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ somedir/ @@ -2359,14 +2361,16 @@ def test_vsis3_rmdir_recursive(aws_test_config, webserver_port): 5 - """ + """, ) def method(request): - content = request.rfile.read( - int(request.headers['Content-Length']) - ).decode('ascii') - if content != """ + content = request.rfile.read(int(request.headers["Content-Length"])).decode( + "ascii" + ) + if ( + content + != """ somedir/test.txt @@ -2375,12 +2379,13 @@ def method(request): somedir/subdir/ -""": - sys.stderr.write('Did not get expected content: %s\n' % content) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(403) return - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(200) response = """ @@ -2391,18 +2396,20 @@ def method(request): somedir/subdir/ """ - request.send_header('Content-Length', len(response)) - request.send_header('Connection', 'close') + request.send_header("Content-Length", len(response)) + request.send_header("Connection", "close") request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - handler.add('POST', '/test_rmdir_recursive/?delete', custom_method=method) + handler.add("POST", "/test_rmdir_recursive/?delete", custom_method=method) def method(request): - content = request.rfile.read( - int(request.headers['Content-Length']) - ).decode('ascii') - if content != """ + content = request.rfile.read(int(request.headers["Content-Length"])).decode( + "ascii" + ) + if ( + content + != """ somedir/subdir/test.txt @@ -2411,12 +2418,13 @@ def method(request): somedir/ -""": - sys.stderr.write('Did not get expected content: %s\n' % content) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(403) return - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" request.send_response(200) response = """ @@ -2427,18 +2435,16 @@ def method(request): somedir/ """ - request.send_header('Content-Length', len(response)) - request.send_header('Connection', 'close') + request.send_header("Content-Length", len(response)) + request.send_header("Connection", "close") request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) - handler.add('POST', '/test_rmdir_recursive/?delete', custom_method=method) + handler.add("POST", "/test_rmdir_recursive/?delete", custom_method=method) - with gdaltest.config_option('CPL_VSIS3_UNLINK_BATCH_SIZE', '2'): + with gdaltest.config_option("CPL_VSIS3_UNLINK_BATCH_SIZE", "2"): with webserver.install_http_handler(handler): - assert gdal.RmdirRecursive( - '/vsis3/test_rmdir_recursive/somedir' - ) == 0 + assert gdal.RmdirRecursive("/vsis3/test_rmdir_recursive/somedir") == 0 ############################################################################### @@ -2446,83 +2452,75 @@ def method(request): def test_vsis3_6(aws_test_config, webserver_port): - with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB + 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.tif', 'wb') + f = gdal.VSIFOpenL("/vsis3/s3_fake_bucket4/large_file.tif", "wb") assert f is not None size = 1024 * 1024 + 1 - big_buffer = 'a' * size + 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.protocol_version = "HTTP/1.1" + if request.headers["Authorization"].find("us-east-1") >= 0: request.send_response(400) - response = ''' + response = """ bla AuthorizationHeaderMalformed us-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') + """ + 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-Type'] != 'image/tiff': + request.wfile.write(response.encode("ascii")) + elif request.headers["Authorization"].find("us-west-2") >= 0: + if request.headers["Content-Type"] != "image/tiff": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - response = ''' + response = """ my_id - ''' + """ request.send_response(200) - request.send_header('Content-type', 'application/xml') - request.send_header('Content-Length', len(response)) + request.send_header("Content-type", "application/xml") + request.send_header("Content-Length", len(response)) request.end_headers() - request.wfile.write(response.encode('ascii')) + request.wfile.write(response.encode("ascii")) else: - sys.stderr.write('Bad headers: %s\n' % str(request.headers)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploads', - custom_method=method - ) - handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploads', - custom_method=method - ) + handler.add("POST", "/s3_fake_bucket4/large_file.tif?uploads", custom_method=method) + handler.add("POST", "/s3_fake_bucket4/large_file.tif?uploads", custom_method=method) def method(request): - if request.headers['Content-Length'] != '1048576': + if request.headers["Content-Length"] != "1048576": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + 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.send_header("ETag", '"first_etag"') + request.send_header("Content-Length", 0) request.end_headers() handler.add( - 'PUT', - '/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id', - custom_method=method + "PUT", + "/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id", + custom_method=method, ) with webserver.install_http_handler(handler): @@ -2531,207 +2529,198 @@ def method(request): handler = webserver.SequentialHandler() def method(request): - if request.headers['Content-Length'] != '1': + if request.headers["Content-Length"] != "1": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "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.send_header("ETag", '"second_etag"') + request.send_header("Content-Length", 0) request.end_headers() handler.add( - 'PUT', - '/s3_fake_bucket4/large_file.tif?partNumber=2&uploadId=my_id', - custom_method=method + "PUT", + "/s3_fake_bucket4/large_file.tif?partNumber=2&uploadId=my_id", + custom_method=method, ) def method(request): - if request.headers['Content-Length'] != '186': + if request.headers["Content-Length"] != "186": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - content = request.rfile.read(186).decode('ascii') - if content != """ + 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) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploadId=my_id', - custom_method=method + "POST", "/s3_fake_bucket4/large_file.tif?uploadId=my_id", custom_method=method ) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" handler = webserver.SequentialHandler() handler.add( - 'POST', - '/s3_fake_bucket4/large_file_initiate_403_error.bin?uploads', - 403 + "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 + "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', + "POST", + "/s3_fake_bucket4/large_file_initiate_invalid_xml_result.bin?uploads", 200, {}, - 'foo' + "foo", ) handler.add( - 'POST', - '/s3_fake_bucket4/large_file_initiate_no_uploadId.bin?uploads', + "POST", + "/s3_fake_bucket4/large_file_initiate_no_uploadId.bin?uploads", 200, {}, - '' + "", ) filenames = [ - '/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' + "/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 webserver.install_http_handler(handler): for filename in filenames: - with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB - f = gdal.VSIFOpenL(filename, 'wb') + 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() == '' + assert gdal.GetLastErrorMsg() == "" handler = webserver.SequentialHandler() handler.add( - 'POST', - '/s3_fake_bucket4/large_file_upload_part_403_error.bin?uploads', + "POST", + "/s3_fake_bucket4/large_file_upload_part_403_error.bin?uploads", 200, {}, - '''xml version="1.0" encoding="UTF-8"?> + """xml version="1.0" encoding="UTF-8"?> my_id - ''' + """, ) handler.add( - 'PUT', + "PUT", ( - '/s3_fake_bucket4/large_file_upload_part_403_error.bin' - '?partNumber=1&uploadId=my_id' + "/s3_fake_bucket4/large_file_upload_part_403_error.bin" + "?partNumber=1&uploadId=my_id" ), - 403 + 403, ) handler.add( - 'DELETE', - ( - '/s3_fake_bucket4/large_file_upload_part_403_error.bin' - '?uploadId=my_id' - ), - 204 + "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', + "POST", + "/s3_fake_bucket4/large_file_upload_part_no_etag.bin?uploads", 200, {}, - ''' + """ my_id - ''' + """, ) handler.add( - 'PUT', + "PUT", ( - '/s3_fake_bucket4/large_file_upload_part_no_etag.bin' - '?partNumber=1&uploadId=my_id' + "/s3_fake_bucket4/large_file_upload_part_no_etag.bin" + "?partNumber=1&uploadId=my_id" ), - 200 + 200, ) handler.add( - 'DELETE', - '/s3_fake_bucket4/large_file_upload_part_no_etag.bin?uploadId=my_id', - 204 + "DELETE", + "/s3_fake_bucket4/large_file_upload_part_no_etag.bin?uploadId=my_id", + 204, ) filenames = [ - '/vsis3/s3_fake_bucket4/large_file_upload_part_403_error.bin', - '/vsis3/s3_fake_bucket4/large_file_upload_part_no_etag.bin' + "/vsis3/s3_fake_bucket4/large_file_upload_part_403_error.bin", + "/vsis3/s3_fake_bucket4/large_file_upload_part_no_etag.bin", ] with webserver.install_http_handler(handler): for filename in filenames: - with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB - f = gdal.VSIFOpenL(filename, 'wb') + 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 + 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', + "POST", + "/s3_fake_bucket4/large_file_abortmultipart_403_error.bin?uploads", 200, {}, - ''' + """ my_id - ''' + """, ) handler.add( - 'PUT', + "PUT", ( - '/s3_fake_bucket4/large_file_abortmultipart_403_error.bin' - '?partNumber=1&uploadId=my_id' + "/s3_fake_bucket4/large_file_abortmultipart_403_error.bin" + "?partNumber=1&uploadId=my_id" ), - 403 + 403, ) handler.add( - 'DELETE', - ( - '/s3_fake_bucket4/large_file_abortmultipart_403_error.bin' - '?uploadId=my_id' - ), - 403 + "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' + 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') + 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) @@ -2739,62 +2728,60 @@ def method(request): gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() != '', filename + 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', + "POST", + "/s3_fake_bucket4/large_file_completemultipart_403_error.bin?uploads", 200, {}, - ''' + """ my_id - ''' + """, ) handler.add( - 'PUT', + "PUT", ( - '/s3_fake_bucket4/large_file_completemultipart_403_error.bin' - '?partNumber=1&uploadId=my_id' + "/s3_fake_bucket4/large_file_completemultipart_403_error.bin" + "?partNumber=1&uploadId=my_id" ), 200, - {'ETag': 'first_etag'}, - '' + {"ETag": "first_etag"}, + "", ) handler.add( - 'PUT', + "PUT", ( - '/s3_fake_bucket4/large_file_completemultipart_403_error.bin' - '?partNumber=2&uploadId=my_id' + "/s3_fake_bucket4/large_file_completemultipart_403_error.bin" + "?partNumber=2&uploadId=my_id" ), 200, - {'ETag': 'second_etag'}, - '' + {"ETag": "second_etag"}, + "", ) handler.add( - 'POST', + "POST", ( - '/s3_fake_bucket4/large_file_completemultipart_403_error.bin' - '?uploadId=my_id' + "/s3_fake_bucket4/large_file_completemultipart_403_error.bin" + "?uploadId=my_id" ), - 403 + 403, ) - filename = ( - '/vsis3/s3_fake_bucket4/large_file_completemultipart_403_error.bin' - ) + 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') + 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 + assert gdal.GetLastErrorMsg() != "", filename ############################################################################### @@ -2803,57 +2790,45 @@ def method(request): def test_vsis3_write_multipart_retry(aws_test_config, webserver_port): - with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', - 'GDAL_HTTP_RETRY_DELAY': '0.01'}): + 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 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.tif', - 'wb' - ) + f = gdal.VSIFOpenL("/vsis3/s3_fake_bucket4/large_file.tif", "wb") assert f is not None size = 1024 * 1024 + 1 - big_buffer = 'a' * size + big_buffer = "a" * size handler = webserver.SequentialHandler() - response = ''' + response = """ my_id - ''' + """ + handler.add("POST", "/s3_fake_bucket4/large_file.tif?uploads", 502) handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploads', - 502 - ) - handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploads', + "POST", + "/s3_fake_bucket4/large_file.tif?uploads", 200, { - 'Content-type': 'application/xml', - 'Content-Length': len(response), - 'Connection': 'close' + "Content-type": "application/xml", + "Content-Length": len(response), + "Connection": "close", }, - response + response, ) handler.add( - 'PUT', - '/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id', - 502 + "PUT", "/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id", 502 ) handler.add( - 'PUT', - '/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id', + "PUT", + "/s3_fake_bucket4/large_file.tif?partNumber=1&uploadId=my_id", 200, - { - 'Content-Length': '0', - 'ETag': '"first_etag"', - 'Connection': 'close' - }, - {} + {"Content-Length": "0", "ETag": '"first_etag"', "Connection": "close"}, + {}, ) with gdaltest.error_handler(): @@ -2863,31 +2838,20 @@ def test_vsis3_write_multipart_retry(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/s3_fake_bucket4/large_file.tif?partNumber=2&uploadId=my_id', + "PUT", + "/s3_fake_bucket4/large_file.tif?partNumber=2&uploadId=my_id", 200, - { - 'Content-Length': '0', - 'ETag': '"second_etag"', - 'Connection': 'close' - }, - {} + {"Content-Length": "0", "ETag": '"second_etag"', "Connection": "close"}, + {}, ) + handler.add("POST", "/s3_fake_bucket4/large_file.tif?uploadId=my_id", 502) handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploadId=my_id', - 502 - ) - handler.add( - 'POST', - '/s3_fake_bucket4/large_file.tif?uploadId=my_id', + "POST", + "/s3_fake_bucket4/large_file.tif?uploadId=my_id", 200, - { - 'Content-Length': '0', - 'Connection': 'close' - }, - {} + {"Content-Length": "0", "Connection": "close"}, + {}, ) with gdaltest.error_handler(): @@ -2903,8 +2867,8 @@ def test_vsis3_abort_pending_uploads(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/my_bucket/?max-uploads=1&uploads', + "GET", + "/my_bucket/?max-uploads=1&uploads", 200, {}, """ @@ -2917,13 +2881,13 @@ def test_vsis3_abort_pending_uploads(aws_test_config, webserver_port): my_upload_id - """ + """, ) handler.add( - 'GET', + "GET", ( - '/my_bucket/?key-marker=next_key_marker&max-uploads=1' - '&upload-id-marker=next_upload_id_marker&uploads' + "/my_bucket/?key-marker=next_key_marker&max-uploads=1" + "&upload-id-marker=next_upload_id_marker&uploads" ), 200, {}, @@ -2935,21 +2899,13 @@ def test_vsis3_abort_pending_uploads(aws_test_config, webserver_port): my_upload_id2 - """ - ) - handler.add( - 'DELETE', - "/my_bucket/my_key?uploadId=my_upload_id", - 204 - ) - handler.add( - 'DELETE', - "/my_bucket/my_key2?uploadId=my_upload_id2", - 204 + """, ) + handler.add("DELETE", "/my_bucket/my_key?uploadId=my_upload_id", 204) + handler.add("DELETE", "/my_bucket/my_key2?uploadId=my_upload_id2", 204) with webserver.install_http_handler(handler): - with gdaltest.config_option('CPL_VSIS3_LIST_UPLOADS_MAX', '1'): - assert gdal.AbortPendingUploads('/vsis3/my_bucket') + with gdaltest.config_option("CPL_VSIS3_LIST_UPLOADS_MAX", "1"): + assert gdal.AbortPendingUploads("/vsis3/my_bucket") ############################################################################### @@ -2959,86 +2915,57 @@ def test_vsis3_abort_pending_uploads(aws_test_config, webserver_port): def test_vsis3_7(aws_test_config, webserver_port): handler = webserver.SequentialHandler() + handler.add("GET", "/s3_bucket_test_mkdir/dir/", 404, {"Connection": "close"}) handler.add( - 'GET', - '/s3_bucket_test_mkdir/dir/', + "GET", + "/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F", 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 + {"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) + 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) + 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 == ['.'] + 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'} - ) + 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) + 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 - ) + handler.add("DELETE", "/s3_bucket_test_mkdir/dir/", 204) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir') + 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/dir/', - 404 - ) - handler.add( - 'GET', - '/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F', + "GET", + "/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F", 404, - {'Connection': 'close'} + {"Connection": "close"}, ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir') + 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/dir_nonempty/', - 416 - ) - handler.add( - 'GET', - ( - '/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100' - '&prefix=dir_nonempty%2F' - ), + "GET", + ("/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100" "&prefix=dir_nonempty%2F"), 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ dir_nonempty/ @@ -3048,27 +2975,23 @@ def test_vsis3_7(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): - ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir_nonempty') + 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/test_dir_stat', - 400 - ) - handler.add( - 'GET', + "GET", ( - '/s3_bucket_test_dir_stat/?delimiter=%2F&max-keys=100' - '&prefix=test_dir_stat%2F' + "/s3_bucket_test_dir_stat/?delimiter=%2F&max-keys=100" + "&prefix=test_dir_stat%2F" ), 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ test_dir_stat/ @@ -3078,20 +3001,20 @@ def test_vsis3_7(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): assert stat.S_ISDIR( - gdal.VSIStatL('/vsis3/s3_bucket_test_dir_stat/test_dir_stat').mode + 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', + "GET", + "/s3_bucket_test_readdir/?delimiter=%2F&prefix=test_dirread%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ test_dirread/ @@ -3101,28 +3024,22 @@ def test_vsis3_7(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): - assert gdal.ReadDir( - '/vsis3/s3_bucket_test_readdir/test_dirread' - ) is not None + 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/test_dir_stat/', - 400 - ) - handler.add( - 'GET', + "GET", ( - '/s3_bucket_test_dir_stat_2/?delimiter=%2F&max-keys=100' - '&prefix=test_dir_stat%2F' + "/s3_bucket_test_dir_stat_2/?delimiter=%2F&max-keys=100" + "&prefix=test_dir_stat%2F" ), 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ test_dir_stat/ @@ -3132,22 +3049,20 @@ def test_vsis3_7(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): assert stat.S_ISDIR( - gdal.VSIStatL( - '/vsis3/s3_bucket_test_dir_stat_2/test_dir_stat/' - ).mode + 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', + "GET", + "/s3_bucket_test_readdir2/?delimiter=%2F&prefix=test_dirread%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ test_dirread/ @@ -3157,12 +3072,10 @@ def test_vsis3_7(aws_test_config, webserver_port): 40 - """ + """, ) with webserver.install_http_handler(handler): - assert gdal.ReadDir( - '/vsis3/s3_bucket_test_readdir2/test_dirread' - ) is not None + assert gdal.ReadDir("/vsis3/s3_bucket_test_readdir2/test_dirread") is not None ############################################################################### @@ -3173,10 +3086,10 @@ def test_vsis3_8(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/vsis3_8/?delimiter=%2F', + "GET", + "/vsis3_8/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ @@ -3189,20 +3102,20 @@ def test_vsis3_8(aws_test_config, webserver_port): test/ - """ + """, ) with webserver.install_http_handler(handler): - listdir = gdal.ReadDir('/vsis3/vsis3_8', 0) - assert listdir == ['test', 'test/'] + 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) + 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) + assert stat.S_ISDIR(gdal.VSIStatL("/vsis3/vsis3_8/test/").mode) ############################################################################### @@ -3213,62 +3126,36 @@ def test_vsis3_sync_etag(aws_test_config, webserver_port): gdal.VSICurlClearCache() - options = ['SYNC_STRATEGY=ETAG'] + 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) + 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 - ) + 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 - ) + 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) + 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 + "PUT", + "/out/testsync.txt", + 200, + headers={"Content-Length": 0, "ETag": '"acbd18db4cc2f85cedef654fccc4a4d8"'}, + expected_body=b"foo", + expected_headers={"Content-Length": "3", "x-amz-storage-class": "GLACIER"}, ) - handler.add('PUT', '/out/testsync.txt', 200, - headers = {'Content-Length': 0, - 'ETag': '"acbd18db4cc2f85cedef654fccc4a4d8"'}, - expected_body = b'foo', - expected_headers = {'Content-Length': '3', - 'x-amz-storage-class': 'GLACIER'}) - - gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'foo') + gdal.FileFromMemBuffer("/vsimem/testsync.txt", "foo") def cbk(pct, _, tab): assert pct > tab[0] @@ -3277,23 +3164,21 @@ def cbk(pct, _, tab): tab = [0] with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/testsync.txt', '/vsis3/out', - options=options + ['x-amz-storage-class=GLACIER'], - callback=cbk, callback_data=tab) + assert gdal.Sync( + "/vsimem/testsync.txt", + "/vsis3/out", + options=options + ["x-amz-storage-class=GLACIER"], + callback=cbk, + callback_data=tab, + ) assert tab[0] == 1.0 # 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) assert gdal.Sync( - '/vsimem/testsync.txt', - '/vsis3/out', - options=options - ) - assert gdal.Sync( - '/vsimem/testsync.txt', - '/vsis3/out/testsync.txt', - options=options + "/vsimem/testsync.txt", "/vsis3/out/testsync.txt", options=options ) gdal.VSICurlClearCache() @@ -3301,96 +3186,75 @@ def cbk(pct, _, tab): # Other direction: S3 to /vsimem handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'ETag': '"acbd18db4cc2f85cedef654fccc4a4d8"' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "ETag": '"acbd18db4cc2f85cedef654fccc4a4d8"', }, - "foo" + "foo", ) with webserver.install_http_handler(handler): - assert gdal.Sync( - '/vsis3/out/testsync.txt', - '/vsimem/', - options=options - ) + 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) assert gdal.Sync( - '/vsis3/out/testsync.txt', - '/vsimem/', - options=options - ) - assert gdal.Sync( - '/vsis3/out/testsync.txt', - '/vsimem/testsync.txt', - options=options + "/vsis3/out/testsync.txt", "/vsimem/testsync.txt", options=options ) # Modify target file, and redo synchronization - gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'bar') + gdal.FileFromMemBuffer("/vsimem/testsync.txt", "bar") handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 200, - { - 'Content-Length': '3', - 'ETag': '"acbd18db4cc2f85cedef654fccc4a4d8"' - }, - "foo" + {"Content-Length": "3", "ETag": '"acbd18db4cc2f85cedef654fccc4a4d8"'}, + "foo", ) with webserver.install_http_handler(handler): - assert gdal.Sync( - '/vsis3/out/testsync.txt', - '/vsimem/', - options=options - ) + 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') + f = gdal.VSIFOpenL("/vsimem/testsync.txt", "rb") + data = gdal.VSIFReadL(1, 3, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + 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/', - 200 - ) - handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'ETag': '"acbd18db4cc2f85cedef654fccc4a4d8"' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "ETag": '"acbd18db4cc2f85cedef654fccc4a4d8"', }, - "foo" + "foo", ) with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/testsync.txt', '/vsis3/out', options=options) + assert gdal.Sync("/vsimem/testsync.txt", "/vsis3/out", options=options) - gdal.Unlink('/vsimem/testsync.txt') + gdal.Unlink("/vsimem/testsync.txt") # Directory copying gdal.VSICurlClearCache() - gdal.Mkdir('/vsimem/subdir', 0) - gdal.FileFromMemBuffer('/vsimem/subdir/testsync.txt', 'foo') + gdal.Mkdir("/vsimem/subdir", 0) + gdal.FileFromMemBuffer("/vsimem/subdir/testsync.txt", "foo") handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/', + "GET", + "/out/", 200, {}, """ @@ -3405,11 +3269,12 @@ def cbk(pct, _, tab): "acbd18db4cc2f85cedef654fccc4a4d8" - """ + """, ) with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/subdir/', '/vsis3/out', options=options) - gdal.RmdirRecursive('/vsimem/subdir') + assert gdal.Sync("/vsimem/subdir/", "/vsis3/out", options=options) + gdal.RmdirRecursive("/vsimem/subdir") + ############################################################################### # Test vsisync() with SYNC_STRATEGY=TIMESTAMP @@ -3417,107 +3282,93 @@ def cbk(pct, _, tab): def test_vsis3_sync_timestamp(aws_test_config, webserver_port): - options = ['SYNC_STRATEGY=TIMESTAMP'] + options = ["SYNC_STRATEGY=TIMESTAMP"] - gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'foo') + 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', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 1970 00:00:01 GMT", }, - "foo" + "foo", ) handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 200, - { - 'Content-Length': '3', - 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' - }, - "foo" + {"Content-Length": "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 - ) + 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', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", # TODO: Will this test fail post-2037? - 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' + "Last-Modified": "Mon, 01 Jan 2037 00:00:01 GMT", }, - "foo" + "foo", ) with webserver.install_http_handler(handler): - assert gdal.Sync( - '/vsis3/out/testsync.txt', - '/vsimem/', - options=options - ) + 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', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 1970 00:00:01 GMT", }, - "foo" + "foo", ) - handler.add('PUT', '/out/testsync.txt', 200) + 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 + "/vsimem/testsync.txt", "/vsis3/out/testsync.txt", options=options ) # Local to S3: S3 file is newer -> do nothing gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 2037 00:00:01 GMT", }, - "foo" + "foo", ) with webserver.install_http_handler(handler): assert gdal.Sync( - '/vsimem/testsync.txt', - '/vsis3/out/testsync.txt', - options=options + "/vsimem/testsync.txt", "/vsis3/out/testsync.txt", options=options ) - gdal.Unlink('/vsimem/testsync.txt') + gdal.Unlink("/vsimem/testsync.txt") + ############################################################################### # Test vsisync() with SYNC_STRATEGY=OVERWRITE @@ -3525,64 +3376,56 @@ def test_vsis3_sync_timestamp(aws_test_config, webserver_port): def test_vsis3_sync_overwrite(aws_test_config, webserver_port): - options = ['SYNC_STRATEGY=OVERWRITE'] + options = ["SYNC_STRATEGY=OVERWRITE"] - gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'foo') + gdal.FileFromMemBuffer("/vsimem/testsync.txt", "foo") # S3 to local: S3 file is newer gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 2037 00:00:01 GMT", }, - "foo" + "foo", ) handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 200, - { - 'Content-Length': '3', - 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' - }, - "foo" + {"Content-Length": "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 - ) + assert gdal.Sync("/vsis3/out/testsync.txt", "/vsimem/", options=options) # Local to S3: S3 file is newer gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/out/testsync.txt', + "GET", + "/out/testsync.txt", 206, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 2037 00:00:01 GMT", }, - "foo" + "foo", ) - handler.add('PUT', '/out/testsync.txt', 200) + 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 + "/vsimem/testsync.txt", "/vsis3/out/testsync.txt", options=options ) - gdal.Unlink('/vsimem/testsync.txt') + gdal.Unlink("/vsimem/testsync.txt") + ############################################################################### # Test vsisync() with source in /vsis3 with implicit directories @@ -3594,8 +3437,8 @@ def test_vsis3_sync_implicit_directories(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/mybucket/?prefix=subdir%2F', + "GET", + "/mybucket/?prefix=subdir%2F", 200, {}, """ @@ -3610,10 +3453,14 @@ def test_vsis3_sync_implicit_directories(aws_test_config, webserver_port): "acbd18db4cc2f85cedef654fccc4a4d8" - """ + """, ) - handler.add('GET', '/mybucket/subdir', 404) - handler.add('GET', '/mybucket/?delimiter=%2F&max-keys=100&prefix=subdir%2F', 200, {}, + handler.add("GET", "/mybucket/subdir", 404) + handler.add( + "GET", + "/mybucket/?delimiter=%2F&max-keys=100&prefix=subdir%2F", + 200, + {}, """ subdir/ @@ -3626,15 +3473,16 @@ def test_vsis3_sync_implicit_directories(aws_test_config, webserver_port): "acbd18db4cc2f85cedef654fccc4a4d8" - """) - handler.add('GET', '/mybucket/subdir/implicit_subdir/testsync.txt', 200, {}, b'abc') - tmpdirname = 'tmp/test_vsis3_sync_implicit_directories' + """, + ) + handler.add("GET", "/mybucket/subdir/implicit_subdir/testsync.txt", 200, {}, b"abc") + tmpdirname = "tmp/test_vsis3_sync_implicit_directories" gdal.Mkdir(tmpdirname, 0o755) try: with webserver.install_http_handler(handler): - assert gdal.Sync('/vsis3/mybucket/subdir/', tmpdirname + '/') - assert os.path.exists(tmpdirname + '/implicit_subdir') - assert os.path.exists(tmpdirname + '/implicit_subdir/testsync.txt') + assert gdal.Sync("/vsis3/mybucket/subdir/", tmpdirname + "/") + assert os.path.exists(tmpdirname + "/implicit_subdir") + assert os.path.exists(tmpdirname + "/implicit_subdir/testsync.txt") finally: gdal.RmdirRecursive(tmpdirname) @@ -3643,50 +3491,49 @@ def test_vsis3_sync_implicit_directories(aws_test_config, webserver_port): # Test vsisync() with source and target in /vsis3 -def test_vsis3_sync_source_target_in_vsis3( - aws_test_config, - webserver_port -): +def test_vsis3_sync_source_target_in_vsis3(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/in/testsync.txt', + "GET", + "/in/testsync.txt", 200, { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3', - 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' + "Content-Length": "3", + "Content-Range": "bytes 0-2/3", + "Last-Modified": "Mon, 01 Jan 1970 00:00:01 GMT", }, - "foo" + "foo", ) + handler.add("GET", "/out/", 200) handler.add( - 'GET', - '/out/', - 200 + "GET", + "/out/testsync.txt", + 200, + {"Content-Length": "3", "Last-Modified": "Mon, 01 Jan 1970 00:00:01 GMT"}, + "foo", ) + handler.add( - 'GET', - '/out/testsync.txt', + "PUT", + "/out/testsync.txt", 200, - { - 'Content-Length': '3', - 'Last-Modified': - 'Mon, 01 Jan 1970 00:00:01 GMT' + headers={"Content-Length": 0}, + expected_headers={ + "Content-Length": "0", + "x-amz-copy-source": "/in/testsync.txt", + "x-amz-storage-class": "GLACIER", }, - "foo" ) - handler.add('PUT', '/out/testsync.txt', 200, - headers = {'Content-Length': 0}, - expected_headers = {'Content-Length': '0', - 'x-amz-copy-source': '/in/testsync.txt', - 'x-amz-storage-class': 'GLACIER'}) - with webserver.install_http_handler(handler): - assert gdal.Sync('/vsis3/in/testsync.txt', '/vsis3/out/', - options = ['x-amz-storage-class=GLACIER']) + assert gdal.Sync( + "/vsis3/in/testsync.txt", + "/vsis3/out/", + options=["x-amz-storage-class=GLACIER"], + ) + ############################################################################### # Test rename @@ -3697,52 +3544,39 @@ def test_vsis3_fake_rename(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/test/source.txt', + "GET", + "/test/source.txt", 206, - { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3' - }, - "foo" - ) - handler.add( - 'GET', - '/test/target.txt', - 404 - ) - handler.add( - 'GET', - '/test/?delimiter=%2F&max-keys=100&prefix=target.txt%2F', - 200 + {"Content-Length": "3", "Content-Range": "bytes 0-2/3"}, + "foo", ) + handler.add("GET", "/test/target.txt", 404) + handler.add("GET", "/test/?delimiter=%2F&max-keys=100&prefix=target.txt%2F", 200) def method(request): - if request.headers['Content-Length'] != '0': + if request.headers["Content-Length"] != "0": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) return - if request.headers['x-amz-copy-source'] != '/test/source.txt': + if request.headers["x-amz-copy-source"] != "/test/source.txt": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "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.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/test/target.txt', custom_method=method) - handler.add('DELETE', '/test/source.txt', 204) + handler.add("PUT", "/test/target.txt", custom_method=method) + handler.add("DELETE", "/test/source.txt", 204) with webserver.install_http_handler(handler): - assert gdal.Rename( - '/vsis3/test/source.txt', - '/vsis3/test/target.txt' - ) == 0 + assert gdal.Rename("/vsis3/test/source.txt", "/vsis3/test/target.txt") == 0 + ############################################################################### # Test rename @@ -3752,16 +3586,12 @@ def test_vsis3_fake_rename_dir(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() + handler.add("GET", "/test/source_dir", 404) handler.add( - 'GET', - '/test/source_dir', - 404 - ) - handler.add( - 'GET', - '/test/?delimiter=%2F&max-keys=100&prefix=source_dir%2F', + "GET", + "/test/?delimiter=%2F&max-keys=100&prefix=source_dir%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ source_dir/ @@ -3771,115 +3601,76 @@ def test_vsis3_fake_rename_dir(aws_test_config, webserver_port): 3 - """ - ) - handler.add( - 'GET', - '/test/target_dir/', - 404 - ) - handler.add( - 'GET', - '/test/?delimiter=%2F&max-keys=100&prefix=target_dir%2F', - 404 + """, ) + handler.add("GET", "/test/target_dir/", 404) + handler.add("GET", "/test/?delimiter=%2F&max-keys=100&prefix=target_dir%2F", 404) def method(request): - if request.headers['Content-Length'] != '0': + if request.headers["Content-Length"] != "0": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) + request.wfile.write("HTTP/1.1 100 Continue\r\n\r\n".encode("ascii")) request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/test/target_dir/', custom_method=method) + handler.add("PUT", "/test/target_dir/", custom_method=method) def method(request): - if request.headers['Content-Length'] != '0': + if request.headers["Content-Length"] != "0": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) return - if request.headers['x-amz-copy-source'] != '/test/source_dir/test.txt': + if request.headers["x-amz-copy-source"] != "/test/source_dir/test.txt": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "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.send_header("Content-Length", 0) request.end_headers() - handler.add( - 'PUT', - '/test/target_dir/test.txt', - custom_method=method - ) + handler.add("PUT", "/test/target_dir/test.txt", custom_method=method) - handler.add( - 'DELETE', - '/test/source_dir/test.txt', - 204 - ) + handler.add("DELETE", "/test/source_dir/test.txt", 204) - handler.add( - 'GET', - '/test/source_dir/', - 404 - ) - handler.add( - 'GET', - '/test/?delimiter=%2F&max-keys=100&prefix=source_dir%2F', - 404 - ) + handler.add("GET", "/test/source_dir/", 404) + handler.add("GET", "/test/?delimiter=%2F&max-keys=100&prefix=source_dir%2F", 404) with webserver.install_http_handler(handler): - assert gdal.Rename( - '/vsis3/test/source_dir', - '/vsis3/test/target_dir' - ) == 0 + assert gdal.Rename("/vsis3/test/source_dir", "/vsis3/test/target_dir") == 0 + ############################################################################### # Test rename onto existing dir is not allowed -def test_vsis3_fake_rename_on_existing_dir( - aws_test_config, - webserver_port -): +def test_vsis3_fake_rename_on_existing_dir(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - '/test/source.txt', + "GET", + "/test/source.txt", 206, - { - 'Content-Length': '3', - 'Content-Range': 'bytes 0-2/3' - }, - "foo" - ) - handler.add( - 'GET', - '/test_target_dir/', - 200 + {"Content-Length": "3", "Content-Range": "bytes 0-2/3"}, + "foo", ) + handler.add("GET", "/test_target_dir/", 200) with webserver.install_http_handler(handler): - assert gdal.Rename( - '/vsis3/test/source.txt', - '/vsis3/test_target_dir' - ) == -1 + assert gdal.Rename("/vsis3/test/source.txt", "/vsis3/test_target_dir") == -1 ############################################################################### @@ -3887,8 +3678,7 @@ def test_vsis3_fake_rename_on_existing_dir( def test_vsis3_fake_sync_multithreaded_upload_chunk_size( - aws_test_config, - webserver_port + aws_test_config, webserver_port ): gdal.VSICurlClearCache() @@ -3898,210 +3688,165 @@ def cbk(pct, _, tab): tab[0] = pct return True - gdal.Mkdir('/vsimem/test', 0) - gdal.FileFromMemBuffer('/vsimem/test/foo', 'foo\n') + gdal.Mkdir("/vsimem/test", 0) + gdal.FileFromMemBuffer("/vsimem/test/foo", "foo\n") tab = [-1] handler = webserver.SequentialHandler() - handler.add( - 'GET', - '/test_bucket/?prefix=test%2F', - 200 - ) - handler.add( - 'GET', - '/test_bucket/test', - 404 - ) - handler.add( - 'GET', - '/test_bucket/?delimiter=%2F&max-keys=100&prefix=test%2F', - 200 - ) - handler.add( - 'GET', - '/test_bucket/', - 200 - ) - handler.add( - 'GET', - '/test_bucket/test/', - 404 - ) - handler.add( - 'PUT', - '/test_bucket/test/', - 200 - ) + handler.add("GET", "/test_bucket/?prefix=test%2F", 200) + handler.add("GET", "/test_bucket/test", 404) + handler.add("GET", "/test_bucket/?delimiter=%2F&max-keys=100&prefix=test%2F", 200) + handler.add("GET", "/test_bucket/", 200) + handler.add("GET", "/test_bucket/test/", 404) + handler.add("PUT", "/test_bucket/test/", 200) - handler.add('POST', '/test_bucket/test/foo?uploads', 200, - expected_headers = {'x-amz-storage-class': 'GLACIER'}, - body = b''' + handler.add( + "POST", + "/test_bucket/test/foo?uploads", + 200, + expected_headers={"x-amz-storage-class": "GLACIER"}, + body=b""" my_id - ''', - headers = {'Content-type': 'application/xml'}) + """, + headers={"Content-type": "application/xml"}, + ) def method(request): - if request.headers['Content-Length'] != '3': + if request.headers["Content-Length"] != "3": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + 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.send_header("ETag", '"first_etag"') + request.send_header("Content-Length", 0) request.end_headers() handler.add( - 'PUT', - '/test_bucket/test/foo?partNumber=1&uploadId=my_id', - custom_method=method + "PUT", "/test_bucket/test/foo?partNumber=1&uploadId=my_id", custom_method=method ) def method(request): - if request.headers['Content-Length'] != '1': + if request.headers["Content-Length"] != "1": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('ETag', '"second_etag"') - request.send_header('Content-Length', 0) + request.send_header("ETag", '"second_etag"') + request.send_header("Content-Length", 0) request.end_headers() handler.add( - 'PUT', - '/test_bucket/test/foo?partNumber=2&uploadId=my_id', - custom_method=method + "PUT", "/test_bucket/test/foo?partNumber=2&uploadId=my_id", custom_method=method ) def method(request): - if request.headers['Content-Length'] != '186': + if request.headers["Content-Length"] != "186": sys.stderr.write( - 'Did not get expected headers: %s\n' % str(request.headers) + "Did not get expected headers: %s\n" % str(request.headers) ) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return - content = request.rfile.read(186).decode('ascii') - if content != """ + 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) +""" + ): + sys.stderr.write("Did not get expected content: %s\n" % content) request.send_response(400) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add( - 'POST', - '/test_bucket/test/foo?uploadId=my_id', - custom_method=method - ) + handler.add("POST", "/test_bucket/test/foo?uploadId=my_id", custom_method=method) - with gdaltest.config_option('VSIS3_SIMULATE_THREADING', 'YES'): + with gdaltest.config_option("VSIS3_SIMULATE_THREADING", "YES"): with webserver.install_http_handler(handler): - assert gdal.Sync('/vsimem/test', - '/vsis3/test_bucket', - options=['NUM_THREADS=1', - 'CHUNK_SIZE=3', - 'x-amz-storage-class=GLACIER'], - callback=cbk, callback_data=tab) + assert gdal.Sync( + "/vsimem/test", + "/vsis3/test_bucket", + options=[ + "NUM_THREADS=1", + "CHUNK_SIZE=3", + "x-amz-storage-class=GLACIER", + ], + callback=cbk, + callback_data=tab, + ) assert tab[0] == 1.0 - gdal.RmdirRecursive('/vsimem/test') + gdal.RmdirRecursive("/vsimem/test") def test_vsis3_fake_sync_multithreaded_upload_chunk_size_failure( - aws_test_config, - webserver_port + aws_test_config, webserver_port ): gdal.VSICurlClearCache() - gdal.Mkdir('/vsimem/test', 0) - gdal.FileFromMemBuffer('/vsimem/test/foo', 'foo\n') + gdal.Mkdir("/vsimem/test", 0) + gdal.FileFromMemBuffer("/vsimem/test/foo", "foo\n") handler = webserver.SequentialHandler() - handler.add( - 'GET', - '/test_bucket/?prefix=test%2F', - 200 - ) - handler.add( - 'GET', - '/test_bucket/test', - 404 - ) - handler.add( - 'GET', - '/test_bucket/?delimiter=%2F&max-keys=100&prefix=test%2F', - 200 - ) - handler.add( - 'GET', - '/test_bucket/', - 200 - ) - handler.add( - 'GET', - '/test_bucket/test/', - 404 - ) - handler.add( - 'PUT', - '/test_bucket/test/', - 200 - ) - handler.add( - 'POST', - '/test_bucket/test/foo?uploads', + handler.add("GET", "/test_bucket/?prefix=test%2F", 200) + handler.add("GET", "/test_bucket/test", 404) + handler.add("GET", "/test_bucket/?delimiter=%2F&max-keys=100&prefix=test%2F", 200) + handler.add("GET", "/test_bucket/", 200) + handler.add("GET", "/test_bucket/test/", 404) + handler.add("PUT", "/test_bucket/test/", 200) + handler.add( + "POST", + "/test_bucket/test/foo?uploads", 200, - {'Content-type': 'application:/xml'}, - b''' + {"Content-type": "application:/xml"}, + b""" my_id - ''' + """, ) handler.add( - 'PUT', - '/test_bucket/test/foo?partNumber=1&uploadId=my_id', + "PUT", + "/test_bucket/test/foo?partNumber=1&uploadId=my_id", 200, - {'ETag': '"first_etag"'}, - expected_headers={'Content-Length': '3'} - ) - handler.add( - 'DELETE', - '/test_bucket/test/foo?uploadId=my_id', - 204 + {"ETag": '"first_etag"'}, + expected_headers={"Content-Length": "3"}, ) + handler.add("DELETE", "/test_bucket/test/foo?uploadId=my_id", 204) - with gdaltest.config_options({'VSIS3_SIMULATE_THREADING': 'YES', - 'VSIS3_SYNC_MULTITHREADING': 'NO'}): + with gdaltest.config_options( + {"VSIS3_SIMULATE_THREADING": "YES", "VSIS3_SYNC_MULTITHREADING": "NO"} + ): with webserver.install_http_handler(handler): with gdaltest.error_handler(): - assert not gdal.Sync('/vsimem/test', - '/vsis3/test_bucket', - options=['NUM_THREADS=1', 'CHUNK_SIZE=3']) + assert not gdal.Sync( + "/vsimem/test", + "/vsis3/test_bucket", + options=["NUM_THREADS=1", "CHUNK_SIZE=3"], + ) + + gdal.RmdirRecursive("/vsimem/test") - gdal.RmdirRecursive('/vsimem/test') ############################################################################### # Test reading/writing metadata @@ -4113,21 +3858,16 @@ def test_vsis3_metadata(aws_test_config, webserver_port): # Read HEADERS domain handler = webserver.SequentialHandler() - handler.add( - 'GET', - '/test_metadata/foo.txt', - 200, - {'foo': 'bar'} - ) + handler.add("GET", "/test_metadata/foo.txt", 200, {"foo": "bar"}) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsis3/test_metadata/foo.txt', 'HEADERS') - assert 'foo' in md and md['foo'] == 'bar' + md = gdal.GetFileMetadata("/vsis3/test_metadata/foo.txt", "HEADERS") + assert "foo" in md and md["foo"] == "bar" # Read TAGS domain handler = webserver.SequentialHandler() handler.add( - 'GET', - '/test_metadata/foo.txt?tagging', + "GET", + "/test_metadata/foo.txt?tagging", 200, {}, """ @@ -4137,37 +3877,35 @@ def test_vsis3_metadata(aws_test_config, webserver_port): bar - """ + """, ) with webserver.install_http_handler(handler): - md = gdal.GetFileMetadata('/vsis3/test_metadata/foo.txt', 'TAGS') - assert 'foo' in md and md['foo'] == 'bar' + md = gdal.GetFileMetadata("/vsis3/test_metadata/foo.txt", "TAGS") + assert "foo" in md and md["foo"] == "bar" # Write HEADERS domain handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/test_metadata/foo.txt', + "PUT", + "/test_metadata/foo.txt", 200, {}, expected_headers={ - 'foo': 'bar', - 'x-amz-metadata-directive': 'REPLACE', - 'x-amz-copy-source': '/test_metadata/foo.txt' - } + "foo": "bar", + "x-amz-metadata-directive": "REPLACE", + "x-amz-copy-source": "/test_metadata/foo.txt", + }, ) with webserver.install_http_handler(handler): assert gdal.SetFileMetadata( - '/vsis3/test_metadata/foo.txt', - {'foo': 'bar'}, - 'HEADERS' + "/vsis3/test_metadata/foo.txt", {"foo": "bar"}, "HEADERS" ) # Write TAGS domain handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/test_metadata/foo.txt?tagging', + "PUT", + "/test_metadata/foo.txt?tagging", 200, expected_body=b""" @@ -4178,43 +3916,30 @@ def test_vsis3_metadata(aws_test_config, webserver_port): -""") +""", + ) with webserver.install_http_handler(handler): assert gdal.SetFileMetadata( - '/vsis3/test_metadata/foo.txt', - {'foo': 'bar'}, - 'TAGS' + "/vsis3/test_metadata/foo.txt", {"foo": "bar"}, "TAGS" ) # Write TAGS domain (wiping tags) handler = webserver.SequentialHandler() - handler.add( - 'DELETE', - '/test_metadata/foo.txt?tagging', - 204 - ) + handler.add("DELETE", "/test_metadata/foo.txt?tagging", 204) with webserver.install_http_handler(handler): - assert gdal.SetFileMetadata( - '/vsis3/test_metadata/foo.txt', - {}, - 'TAGS' - ) + assert gdal.SetFileMetadata("/vsis3/test_metadata/foo.txt", {}, "TAGS") # Error case with gdaltest.error_handler(): - assert gdal.GetFileMetadata( - '/vsis3/test_metadata/foo.txt', - 'UNSUPPORTED' - ) == {} + assert gdal.GetFileMetadata("/vsis3/test_metadata/foo.txt", "UNSUPPORTED") == {} # Error case with gdaltest.error_handler(): assert not gdal.SetFileMetadata( - '/vsis3/test_metadata/foo.txt', - {}, - 'UNSUPPORTED' + "/vsis3/test_metadata/foo.txt", {}, "UNSUPPORTED" ) + ############################################################################### # Test that we take into account directory listing to avoid useless # requests @@ -4226,28 +3951,23 @@ def test_vsis3_no_useless_requests(aws_test_config, webserver_port): handler = webserver.SequentialHandler() handler.add( - 'GET', - '/no_useless_requests/?delimiter=%2F', + "GET", + "/no_useless_requests/?delimiter=%2F", 200, - {'Content-type': 'application/xml'}, + {"Content-type": "application/xml"}, """ - """ + """, ) with webserver.install_http_handler(handler): - assert gdal.VSIFOpenL( - '/vsis3/no_useless_requests/foo.txt', 'rb' - ) is None - assert gdal.VSIFOpenL( - '/vsis3/no_useless_requests/bar.txt', 'rb' - ) is None - assert gdal.VSIStatL( - '/vsis3/no_useless_requests/baz.txt' - ) is None + assert gdal.VSIFOpenL("/vsis3/no_useless_requests/foo.txt", "rb") is None + assert gdal.VSIFOpenL("/vsis3/no_useless_requests/bar.txt", "rb") is None + assert gdal.VSIStatL("/vsis3/no_useless_requests/baz.txt") is None + ############################################################################### # Test w+ access @@ -4258,25 +3978,23 @@ def test_vsis3_random_write(aws_test_config, webserver_port): gdal.VSICurlClearCache() with gdaltest.error_handler(): - assert gdal.VSIFOpenL('/vsis3/random_write/test.bin', 'w+b') is None + assert gdal.VSIFOpenL("/vsis3/random_write/test.bin", "w+b") is None - with gdaltest.config_option( - 'CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE', - 'YES' - ): - f = gdal.VSIFOpenL('/vsis3/random_write/test.bin', 'w+b') + with gdaltest.config_option("CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE", "YES"): + f = gdal.VSIFOpenL("/vsis3/random_write/test.bin", "w+b") assert f - assert gdal.VSIFWriteL('foo', 3, 1, f) == 1 + assert gdal.VSIFWriteL("foo", 3, 1, f) == 1 assert gdal.VSIFSeekL(f, 0, 0) == 0 - assert gdal.VSIFReadL(3, 1, f).decode('ascii') == 'foo' + assert gdal.VSIFReadL(3, 1, f).decode("ascii") == "foo" assert gdal.VSIFEofL(f) == 0 assert gdal.VSIFTellL(f) == 3 handler = webserver.SequentialHandler() - handler.add('PUT', '/random_write/test.bin', 200, {}, expected_body=b'foo') + handler.add("PUT", "/random_write/test.bin", 200, {}, expected_body=b"foo") with webserver.install_http_handler(handler): assert gdal.VSIFCloseL(f) == 0 + ############################################################################### # Test w+ access @@ -4285,15 +4003,12 @@ def test_vsis3_random_write_failure_1(aws_test_config, webserver_port): gdal.VSICurlClearCache() - with gdaltest.config_option( - 'CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE', - 'YES' - ): - f = gdal.VSIFOpenL('/vsis3/random_write/test.bin', 'w+b') + with gdaltest.config_option("CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE", "YES"): + f = gdal.VSIFOpenL("/vsis3/random_write/test.bin", "w+b") assert f handler = webserver.SequentialHandler() - handler.add('PUT', '/random_write/test.bin', 400, {}) + handler.add("PUT", "/random_write/test.bin", 400, {}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): assert gdal.VSIFCloseL(f) != 0 @@ -4307,64 +4022,48 @@ def test_vsis3_random_write_failure_2(aws_test_config, webserver_port): gdal.VSICurlClearCache() - with gdaltest.config_option( - 'CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE', - 'YES' - ): - with gdaltest.config_option('VSIS3_CHUNK_SIZE_BYTES', '1'): - f = gdal.VSIFOpenL('/vsis3/random_write/test.bin', 'w+b') + with gdaltest.config_option("CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE", "YES"): + with gdaltest.config_option("VSIS3_CHUNK_SIZE_BYTES", "1"): + f = gdal.VSIFOpenL("/vsis3/random_write/test.bin", "w+b") assert f - assert gdal.VSIFWriteL('foo', 3, 1, f) == 1 + assert gdal.VSIFWriteL("foo", 3, 1, f) == 1 handler = webserver.SequentialHandler() - handler.add('POST', '/random_write/test.bin?uploads', 400, {}) + handler.add("POST", "/random_write/test.bin?uploads", 400, {}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): assert gdal.VSIFCloseL(f) != 0 + ############################################################################### # Test w+ access -def test_vsis3_random_write_gtiff_create_copy( - aws_test_config, - webserver_port -): +def test_vsis3_random_write_gtiff_create_copy(aws_test_config, webserver_port): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() + handler.add("GET", "/random_write/test.tif", 404, {}) handler.add( - 'GET', - '/random_write/test.tif', - 404, - {} - ) - handler.add( - 'GET', - '/random_write/?delimiter=%2F&max-keys=100&prefix=test.tif%2F', - 404, - {} + "GET", "/random_write/?delimiter=%2F&max-keys=100&prefix=test.tif%2F", 404, {} ) - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - with gdaltest.config_option( - 'CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE', - 'YES' - ): + with gdaltest.config_option("CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE", "YES"): with webserver.install_http_handler(handler): - ds = gdal.GetDriverByName('GTiff').CreateCopy( - '/vsis3/random_write/test.tif', - src_ds + ds = gdal.GetDriverByName("GTiff").CreateCopy( + "/vsis3/random_write/test.tif", src_ds ) assert ds is not None handler = webserver.SequentialHandler() - handler.add('PUT', '/random_write/test.tif', 200, {}) + handler.add("PUT", "/random_write/test.tif", 200, {}) with webserver.install_http_handler(handler): ds = None + ############################################################################### # Read credentials from simulated ~/.aws/credentials @@ -4372,14 +4071,16 @@ def test_vsis3_random_write_gtiff_create_copy( def test_vsis3_read_credentials_file(aws_test_config, webserver_port): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_CREDENTIALS_FILE': '/vsimem/aws_credentials' + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_CREDENTIALS_FILE": "/vsimem/aws_credentials", } gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_credentials", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4389,24 +4090,26 @@ def test_vsis3_read_credentials_file(aws_test_config, webserver_port): [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 + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/aws_credentials") - gdal.Unlink('/vsimem/aws_credentials') ############################################################################### # Read credentials from simulated ~/.aws/config @@ -4414,14 +4117,16 @@ def test_vsis3_read_credentials_file(aws_test_config, webserver_port): def test_vsis3_read_config_file(aws_test_config, webserver_port): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'AWS_CONFIG_FILE': '/vsimem/aws_config' + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "AWS_CONFIG_FILE": "/vsimem/aws_config", } gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/aws_config', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_config", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4432,43 +4137,44 @@ def test_vsis3_read_config_file(aws_test_config, webserver_port): [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 + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/aws_config") - gdal.Unlink('/vsimem/aws_config') ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config -def test_vsis3_read_credentials_config_file( - aws_test_config, - webserver_port -): +def test_vsis3_read_credentials_config_file(aws_test_config, webserver_port): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_CREDENTIALS_FILE': '/vsimem/aws_credentials', - 'AWS_CONFIG_FILE': '/vsimem/aws_config' + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_CREDENTIALS_FILE": "/vsimem/aws_credentials", + "AWS_CONFIG_FILE": "/vsimem/aws_config", } gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_credentials", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4478,9 +4184,12 @@ def test_vsis3_read_credentials_config_file( [unrelated] aws_access_key_id = foo aws_secret_access_key = bar -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/aws_config', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_config", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4491,25 +4200,27 @@ def test_vsis3_read_credentials_config_file( [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 + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + + gdal.Unlink("/vsimem/aws_credentials") + gdal.Unlink("/vsimem/aws_config") - gdal.Unlink('/vsimem/aws_credentials') - gdal.Unlink('/vsimem/aws_config') ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config with @@ -4517,23 +4228,22 @@ def test_vsis3_read_credentials_config_file( def test_vsis3_read_credentials_config_file_non_default_profile( - aws_test_config, - webserver_port, - tmpdir + aws_test_config, webserver_port, tmpdir ): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_CREDENTIALS_FILE': None, - 'AWS_CONFIG_FILE': None, - 'AWS_PROFILE': 'myprofile' + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_CREDENTIALS_FILE": None, + "AWS_CONFIG_FILE": None, + "AWS_PROFILE": "myprofile", } os_aws = tmpdir.mkdir(".aws") gdal.VSICurlClearCache() - os_aws.join('credentials').write(""" + os_aws.join("credentials").write( + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4543,9 +4253,11 @@ def test_vsis3_read_credentials_config_file_non_default_profile( [default] aws_access_key_id = foo aws_secret_access_key = bar -""") +""" + ) - os_aws.join('config').write(""" + os_aws.join("config").write( + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4554,46 +4266,48 @@ def test_vsis3_read_credentials_config_file_non_default_profile( [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 + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): with gdaltest.config_option( - 'USERPROFILE' if sys.platform == 'win32' else 'HOME', - str(tmpdir) + "USERPROFILE" if sys.platform == "win32" else "HOME", str(tmpdir) ): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config def test_vsis3_read_credentials_config_file_inconsistent( - aws_test_config, - webserver_port + aws_test_config, webserver_port ): options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_CREDENTIALS_FILE': '/vsimem/aws_credentials', - 'AWS_CONFIG_FILE': '/vsimem/aws_config' + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_CREDENTIALS_FILE": "/vsimem/aws_credentials", + "AWS_CONFIG_FILE": "/vsimem/aws_config", } gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_credentials", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4603,9 +4317,12 @@ def test_vsis3_read_credentials_config_file_inconsistent( [unrelated] aws_access_key_id = foo aws_secret_access_key = bar -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/aws_config', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_config", + """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar @@ -4616,60 +4333,57 @@ def test_vsis3_read_credentials_config_file_inconsistent( [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 + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): with gdaltest.error_handler(): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + 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') + assert gdal.GetLastErrorMsg() != "" + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" - gdal.Unlink('/vsimem/aws_credentials') - gdal.Unlink('/vsimem/aws_config') + gdal.Unlink("/vsimem/aws_credentials") + gdal.Unlink("/vsimem/aws_config") ############################################################################### # Read credentials from sts AssumeRoleWithWebIdentity -@pytest.mark.skipif( - sys.platform not in ('linux', 'win32'), - reason='Incorrect platform' -) +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") def test_vsis3_read_credentials_sts_assume_role_with_web_identity( - aws_test_config, - webserver_port + aws_test_config, webserver_port ): fp = tempfile.NamedTemporaryFile(delete=False) - fp.write(b'token') + fp.write(b"token") fp.close() - aws_role_arn = 'arn:aws:iam:role/test' + aws_role_arn = "arn:aws:iam:role/test" options = { - 'CPL_AWS_CREDENTIALS_FILE': '', - 'AWS_CONFIG_FILE': '', - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'AWS_ROLE_ARN': aws_role_arn, - 'AWS_WEB_IDENTITY_TOKEN_FILE': fp.name + "CPL_AWS_CREDENTIALS_FILE": "", + "AWS_CONFIG_FILE": "", + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "AWS_ROLE_ARN": aws_role_arn, + "AWS_WEB_IDENTITY_TOKEN_FILE": fp.name, } gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'GET', - f'/?Action=AssumeRoleWithWebIdentity&RoleSessionName=gdal&Version=2011-06-15&RoleArn={aws_role_arn}&WebIdentityToken=token', + "GET", + f"/?Action=AssumeRoleWithWebIdentity&RoleSessionName=gdal&Version=2011-06-15&RoleArn={aws_role_arn}&WebIdentityToken=token", 200, {}, """ @@ -4692,70 +4406,63 @@ def test_vsis3_read_credentials_sts_assume_role_with_web_identity( ad4156e9-bce1-11e2-82e6-6b6efEXAMPLE - """ + """, ) handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): with gdaltest.config_option( - 'CPL_AWS_STS_ROOT_URL', - 'http://localhost:%d' % webserver_port + "CPL_AWS_STS_ROOT_URL", "http://localhost:%d" % webserver_port ): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) gdal.Unlink(fp.name) - assert data == 'foo' + assert data == "foo" ############################################################################### # Read credentials from simulated EC2 instance -@pytest.mark.skipif( - sys.platform not in ('linux', 'win32'), - reason='Incorrect platform' -) -def test_vsis3_read_credentials_ec2_imdsv2( - aws_test_config, - webserver_port -): +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") +def test_vsis3_read_credentials_ec2_imdsv2(aws_test_config, webserver_port): options = { - 'CPL_AWS_CREDENTIALS_FILE': '', - 'AWS_CONFIG_FILE': '', - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', + "CPL_AWS_CREDENTIALS_FILE": "", + "AWS_CONFIG_FILE": "", + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", # Disable hypervisor related check to test if we are really on EC2 - 'CPL_AWS_AUTODETECT_EC2': 'NO', - 'CPL_AWS_WEB_IDENTITY_ENABLE': 'NO' + "CPL_AWS_AUTODETECT_EC2": "NO", + "CPL_AWS_WEB_IDENTITY_ENABLE": "NO", } gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/latest/api/token', + "PUT", + "/latest/api/token", 200, {}, - 'mytoken', - expected_headers={'X-aws-ec2-metadata-token-ttl-seconds': '10'} + "mytoken", + expected_headers={"X-aws-ec2-metadata-token-ttl-seconds": "10"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/', + "GET", + "/latest/meta-data/iam/security-credentials/", 200, {}, - 'myprofile', - expected_headers={'X-aws-ec2-metadata-token': 'mytoken'} + "myprofile", + expected_headers={"X-aws-ec2-metadata-token": "mytoken"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/myprofile', + "GET", + "/latest/meta-data/iam/security-credentials/myprofile", 200, {}, """{ @@ -4763,64 +4470,63 @@ def test_vsis3_read_credentials_ec2_imdsv2( "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "3000-01-01T00:00:00Z" }""", - expected_headers={'X-aws-ec2-metadata-token': 'mytoken'} + expected_headers={"X-aws-ec2-metadata-token": "mytoken"}, ) handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): with gdaltest.config_option( - 'CPL_AWS_EC2_API_ROOT_URL', - 'http://localhost:%d' % webserver_port + "CPL_AWS_EC2_API_ROOT_URL", "http://localhost:%d" % webserver_port ): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() - handler.add('GET', '/s3_fake_bucket/bar', 200, {}, 'bar') + handler.add("GET", "/s3_fake_bucket/bar", 200, {}, "bar") with webserver.install_http_handler(handler): with gdaltest.config_options(options): # Set a fake URL to check that credentials re-use works - with gdaltest.config_option('CPL_AWS_EC2_API_ROOT_URL', ''): - f = open_for_read('/vsis3/s3_fake_bucket/bar') + with gdaltest.config_option("CPL_AWS_EC2_API_ROOT_URL", ""): + f = open_for_read("/vsis3/s3_fake_bucket/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" # We can reuse credentials here as their expiration is far away in the future with gdaltest.config_options( - {**options, - 'CPL_AWS_EC2_API_ROOT_URL': 'http://localhost:%d' % webserver_port}): - signed_url = gdal.GetSignedURL('/vsis3/s3_fake_bucket/resource') + {**options, "CPL_AWS_EC2_API_ROOT_URL": "http://localhost:%d" % webserver_port} + ): + 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' + "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' + "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) @@ -4828,16 +4534,16 @@ def test_vsis3_read_credentials_ec2_imdsv2( # cause credentials to be queried again handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/latest/api/token', + "PUT", + "/latest/api/token", 200, {}, - 'mytoken2', - expected_headers={'X-aws-ec2-metadata-token-ttl-seconds': '10'} + "mytoken2", + expected_headers={"X-aws-ec2-metadata-token-ttl-seconds": "10"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/myprofile', + "GET", + "/latest/meta-data/iam/security-credentials/myprofile", 200, {}, """{ @@ -4846,83 +4552,79 @@ def test_vsis3_read_credentials_ec2_imdsv2( "Token": "AWS_SESSION_TOKEN", "Expiration": "5000-01-01T00:00:00Z" }""", - expected_headers={'X-aws-ec2-metadata-token': 'mytoken2'} + expected_headers={"X-aws-ec2-metadata-token": "mytoken2"}, ) with gdaltest.config_options( - {**options, - 'CPL_AWS_EC2_API_ROOT_URL': 'http://localhost:%d' % webserver_port}): + {**options, "CPL_AWS_EC2_API_ROOT_URL": "http://localhost:%d" % webserver_port} + ): with webserver.install_http_handler(handler): - signed_url = gdal.GetSignedURL('/vsis3/s3_fake_bucket/resource', - ['EXPIRATION_DELAY=' + str(2000 * 365 * 86400)]) + signed_url = gdal.GetSignedURL( + "/vsis3/s3_fake_bucket/resource", + ["EXPIRATION_DELAY=" + str(2000 * 365 * 86400)], + ) 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=63072000000' - '&X-Amz-Security-Token=AWS_SESSION_TOKEN' - '&X-Amz-Signature=' - '42770a74a5ad96940a42d5660959d36bb027d3ec8433d66d1b003983ef9f47c9' - '&X-Amz-SignedHeaders=host' + "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=63072000000" + "&X-Amz-Security-Token=AWS_SESSION_TOKEN" + "&X-Amz-Signature=" + "42770a74a5ad96940a42d5660959d36bb027d3ec8433d66d1b003983ef9f47c9" + "&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=63072000000' - '&X-Amz-Security-Token=AWS_SESSION_TOKEN' - '&X-Amz-Signature=' - '20e35d2707bd2e2896879dc009f5327d4dfd43500e16bb1c6e157dd5eda4403f' - '&X-Amz-SignedHeaders=host' + "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=63072000000" + "&X-Amz-Security-Token=AWS_SESSION_TOKEN" + "&X-Amz-Signature=" + "20e35d2707bd2e2896879dc009f5327d4dfd43500e16bb1c6e157dd5eda4403f" + "&X-Amz-SignedHeaders=host" ) assert signed_url in (expected_url_8080, expected_url_8081), signed_url ############################################################################### # Read credentials from simulated EC2 instance that only supports IMDSv1 -@pytest.mark.skipif( - sys.platform not in ('linux', 'win32'), - reason='Incorrect platform' -) -def test_vsis3_read_credentials_ec2_imdsv1( - aws_test_config, - webserver_port -): +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") +def test_vsis3_read_credentials_ec2_imdsv1(aws_test_config, webserver_port): options = { - 'CPL_AWS_CREDENTIALS_FILE': '', - 'AWS_CONFIG_FILE': '', - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_EC2_API_ROOT_URL': 'http://localhost:%d' % webserver_port, + "CPL_AWS_CREDENTIALS_FILE": "", + "AWS_CONFIG_FILE": "", + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_EC2_API_ROOT_URL": "http://localhost:%d" % webserver_port, # Disable hypervisor related check to test if we are really on EC2 - 'CPL_AWS_AUTODETECT_EC2': 'NO' + "CPL_AWS_AUTODETECT_EC2": "NO", } gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/latest/api/token', + "PUT", + "/latest/api/token", 403, {}, - expected_headers={'X-aws-ec2-metadata-token-ttl-seconds': '10'} + expected_headers={"X-aws-ec2-metadata-token-ttl-seconds": "10"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/', + "GET", + "/latest/meta-data/iam/security-credentials/", 200, {}, - 'myprofile', - unexpected_headers=['X-aws-ec2-metadata-token'] + "myprofile", + unexpected_headers=["X-aws-ec2-metadata-token"], ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/myprofile', + "GET", + "/latest/meta-data/iam/security-credentials/myprofile", 200, {}, """{ @@ -4930,70 +4632,64 @@ def test_vsis3_read_credentials_ec2_imdsv1( "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "3000-01-01T00:00:00Z" }""", - unexpected_headers=['X-aws-ec2-metadata-token'] + unexpected_headers=["X-aws-ec2-metadata-token"], ) handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" ############################################################################### # Read credentials from simulated EC2 instance with expiration of the # cached credentials -@pytest.mark.skipif( - sys.platform not in ('linux', 'win32'), - reason='Incorrect platform' -) -def test_vsis3_read_credentials_ec2_expiration( - aws_test_config, - webserver_port -): +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") +def test_vsis3_read_credentials_ec2_expiration(aws_test_config, webserver_port): options = { - 'CPL_AWS_CREDENTIALS_FILE': '', - 'AWS_CONFIG_FILE': '', - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', + "CPL_AWS_CREDENTIALS_FILE": "", + "AWS_CONFIG_FILE": "", + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", # Disable hypervisor related check to test if we are really on EC2 - 'CPL_AWS_AUTODETECT_EC2': 'NO' + "CPL_AWS_AUTODETECT_EC2": "NO", } - valid_url = 'http://localhost:%d' % webserver_port - invalid_url = 'http://localhost:%d/invalid' % webserver_port + valid_url = "http://localhost:%d" % webserver_port + invalid_url = "http://localhost:%d/invalid" % webserver_port gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( - 'PUT', - '/latest/api/token', + "PUT", + "/latest/api/token", 200, {}, - 'mytoken', - expected_headers={'X-aws-ec2-metadata-token-ttl-seconds': '10'} + "mytoken", + expected_headers={"X-aws-ec2-metadata-token-ttl-seconds": "10"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/', + "GET", + "/latest/meta-data/iam/security-credentials/", 200, {}, - 'myprofile', - expected_headers={'X-aws-ec2-metadata-token': 'mytoken'} + "myprofile", + expected_headers={"X-aws-ec2-metadata-token": "mytoken"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/myprofile', + "GET", + "/latest/meta-data/iam/security-credentials/myprofile", 200, {}, """{ @@ -5001,19 +4697,19 @@ def test_vsis3_read_credentials_ec2_expiration( "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "1970-01-01T00:00:00Z" }""", - expected_headers={'X-aws-ec2-metadata-token': 'mytoken'} + expected_headers={"X-aws-ec2-metadata-token": "mytoken"}, ) handler.add( - 'PUT', - '/latest/api/token', + "PUT", + "/latest/api/token", 200, {}, - 'mytoken2', - expected_headers={'X-aws-ec2-metadata-token-ttl-seconds': '10'} + "mytoken2", + expected_headers={"X-aws-ec2-metadata-token-ttl-seconds": "10"}, ) handler.add( - 'GET', - '/latest/meta-data/iam/security-credentials/myprofile', + "GET", + "/latest/meta-data/iam/security-credentials/myprofile", 200, {}, """{ @@ -5021,74 +4717,68 @@ def test_vsis3_read_credentials_ec2_expiration( "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "1970-01-01T00:00:00Z" }""", - expected_headers={'X-aws-ec2-metadata-token': 'mytoken2'} + expected_headers={"X-aws-ec2-metadata-token": "mytoken2"}, ) handler.add( - 'GET', - '/s3_fake_bucket/resource', - custom_method=get_s3_fake_bucket_resource_method + "GET", + "/s3_fake_bucket/resource", + custom_method=get_s3_fake_bucket_resource_method, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - with gdaltest.config_option('CPL_AWS_EC2_API_ROOT_URL', valid_url): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + with gdaltest.config_option("CPL_AWS_EC2_API_ROOT_URL", valid_url): + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" handler = webserver.SequentialHandler() + handler.add("PUT", "/invalid/latest/api/token", 404) handler.add( - 'PUT', - '/invalid/latest/api/token', - 404 - ) - handler.add( - 'GET', - '/invalid/latest/meta-data/iam/security-credentials/myprofile', - 404 + "GET", "/invalid/latest/meta-data/iam/security-credentials/myprofile", 404 ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): # Set a fake URL to demonstrate we try to re-fetch credentials - with gdaltest.config_option( - 'CPL_AWS_EC2_API_ROOT_URL', - invalid_url - ): + with gdaltest.config_option("CPL_AWS_EC2_API_ROOT_URL", invalid_url): with gdaltest.error_handler(): - f = open_for_read('/vsis3/s3_fake_bucket/bar') + f = open_for_read("/vsis3/s3_fake_bucket/bar") assert f is None + ############################################################################### # Read credentials from an assumed role -def test_vsis3_read_credentials_assumed_role( - aws_test_config, - webserver_port -): +def test_vsis3_read_credentials_assumed_role(aws_test_config, webserver_port): if webserver_port != 8080: - pytest.skip('Expected results coded from webserver port = 8080') + pytest.skip("Expected results coded from webserver port = 8080") options = { - 'AWS_SECRET_ACCESS_KEY': '', - 'AWS_ACCESS_KEY_ID': '', - 'CPL_AWS_CREDENTIALS_FILE': '/vsimem/aws_credentials', - 'AWS_CONFIG_FILE': '/vsimem/aws_config', - 'AWS_PROFILE': 'my_profile', - 'AWS_STS_ENDPOINT': 'localhost:%d' % webserver_port + "AWS_SECRET_ACCESS_KEY": "", + "AWS_ACCESS_KEY_ID": "", + "CPL_AWS_CREDENTIALS_FILE": "/vsimem/aws_credentials", + "AWS_CONFIG_FILE": "/vsimem/aws_config", + "AWS_PROFILE": "my_profile", + "AWS_STS_ENDPOINT": "localhost:%d" % webserver_port, } gdal.VSICurlClearCache() - gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_credentials", + """ [foo] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/aws_config', """ + gdal.FileFromMemBuffer( + "/vsimem/aws_config", + """ [profile my_profile] role_arn = arn:aws:iam::557268267719:role/role source_profile = foo @@ -5096,7 +4786,8 @@ def test_vsis3_read_credentials_assumed_role( external_id = my_external_id mfa_serial = my_mfa_serial role_session_name = my_role_session_name -""") +""", + ) expired_xml_response = """ @@ -5108,33 +4799,37 @@ def test_vsis3_read_credentials_assumed_role( handler = webserver.SequentialHandler() handler.add( - 'GET', - '/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8', + "GET", + "/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8", 200, {}, - expired_xml_response) + expired_xml_response, + ) handler.add( - 'GET', - '/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8', + "GET", + "/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8", 200, {}, - expired_xml_response) + expired_xml_response, + ) handler.add( - 'GET', - '/s3_fake_bucket/resource', + "GET", + "/s3_fake_bucket/resource", 200, {}, - 'foo', - expected_headers={'Authorization': 'AWS4-HMAC-SHA256 Credential=TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=d5e8167e066e7439e0e57a43e1167f9ee7efe4b451c72de1a3a150f6fc033403', - 'X-Amz-Security-Token': 'TEMP_SESSION_TOKEN'} + "foo", + expected_headers={ + "Authorization": "AWS4-HMAC-SHA256 Credential=TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=d5e8167e066e7439e0e57a43e1167f9ee7efe4b451c72de1a3a150f6fc033403", + "X-Amz-Security-Token": "TEMP_SESSION_TOKEN", + }, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource') + f = open_for_read("/vsis3/s3_fake_bucket/resource") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Get another resource and check that we renew the expired temporary credentials non_expired_xml_response = """ @@ -5147,69 +4842,77 @@ def test_vsis3_read_credentials_assumed_role( handler = webserver.SequentialHandler() handler.add( - 'GET', - '/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8', + "GET", + "/?Action=AssumeRole&ExternalId=my_external_id&RoleArn=arn%3Aaws%3Aiam%3A%3A557268267719%3Arole%2Frole&RoleSessionName=my_role_session_name&SerialNumber=my_mfa_serial&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-SignedHeaders=host&X-Amz-Signature=cfd8163f2a5438e4957a079c4e40cf36053092722fcb7ecdc4cdc706791684b8", 200, {}, - non_expired_xml_response) + non_expired_xml_response, + ) handler.add( - 'GET', - '/s3_fake_bucket/resource2', + "GET", + "/s3_fake_bucket/resource2", 200, {}, - 'foo', - expected_headers={'Authorization': 'AWS4-HMAC-SHA256 Credential=ANOTHER_TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=9716b5928ed350263c9492159dccbdc9aac321cfea383d7f67bd8b4c7ca33463', - 'X-Amz-Security-Token': 'ANOTHER_TEMP_SESSION_TOKEN'} + "foo", + expected_headers={ + "Authorization": "AWS4-HMAC-SHA256 Credential=ANOTHER_TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=9716b5928ed350263c9492159dccbdc9aac321cfea383d7f67bd8b4c7ca33463", + "X-Amz-Security-Token": "ANOTHER_TEMP_SESSION_TOKEN", + }, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource2') + f = open_for_read("/vsis3/s3_fake_bucket/resource2") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # Get another resource and check that we reuse the still valid temporary credentials handler = webserver.SequentialHandler() handler.add( - 'GET', - '/s3_fake_bucket/resource3', + "GET", + "/s3_fake_bucket/resource3", 200, {}, - 'foo', - expected_headers={'Authorization': 'AWS4-HMAC-SHA256 Credential=ANOTHER_TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=27e28bd4dad95495b851b54ff875b8ebcec6e0f6f5e4adf045153bd0d7958fbb', - 'X-Amz-Security-Token': 'ANOTHER_TEMP_SESSION_TOKEN'} + "foo", + expected_headers={ + "Authorization": "AWS4-HMAC-SHA256 Credential=ANOTHER_TEMP_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=27e28bd4dad95495b851b54ff875b8ebcec6e0f6f5e4adf045153bd0d7958fbb", + "X-Amz-Security-Token": "ANOTHER_TEMP_SESSION_TOKEN", + }, ) with webserver.install_http_handler(handler): with gdaltest.config_options(options): - f = open_for_read('/vsis3/s3_fake_bucket/resource3') + f = open_for_read("/vsis3/s3_fake_bucket/resource3") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' - - gdal.Unlink('/vsimem/aws_credentials') - gdal.Unlink('/vsimem/aws_config') + assert data == "foo" + gdal.Unlink("/vsimem/aws_credentials") + gdal.Unlink("/vsimem/aws_config") ############################################################################### def test_vsis3_non_existing_file_GDAL_DISABLE_READDIR_ON_OPEN( - aws_test_config, - webserver_port): + aws_test_config, webserver_port +): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/test_bucket/non_existing.tif', 404) - handler.add('GET', '/test_bucket/?delimiter=%2F&max-keys=100&prefix=non_existing.tif%2F', 200) + handler.add("GET", "/test_bucket/non_existing.tif", 404) + handler.add( + "GET", + "/test_bucket/?delimiter=%2F&max-keys=100&prefix=non_existing.tif%2F", + 200, + ) gdal.ErrorReset() - with gdaltest.config_option('GDAL_DISABLE_READDIR_ON_OPEN', 'YES'): + with gdaltest.config_option("GDAL_DISABLE_READDIR_ON_OPEN", "YES"): with webserver.install_http_handler(handler): with gdaltest.error_handler(): - gdal.Open('/vsis3/test_bucket/non_existing.tif') - assert gdal.GetLastErrorMsg() == 'HTTP response code: 404' + gdal.Open("/vsis3/test_bucket/non_existing.tif") + assert gdal.GetLastErrorMsg() == "HTTP response code: 404" ############################################################################### @@ -5221,120 +4924,111 @@ def test_vsis3_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() - credentials_filename = gdal.GetConfigOption( - 'HOME', - gdal.GetConfigOption('USERPROFILE', '') - ) + '/.aws/credentials' + credentials_filename = ( + gdal.GetConfigOption("HOME", gdal.GetConfigOption("USERPROFILE", "")) + + "/.aws/credentials" + ) # Either a bucket name or bucket/filename - s3_resource = gdal.GetConfigOption('S3_RESOURCE') + 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 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') + pytest.skip("Missing S3_RESOURCE") - if '/' not in s3_resource: - path = '/vsis3/' + 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) + 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' + 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) + 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 + unique_id = "vsis3_test" + subpath = path + "/" + unique_id ret = gdal.Mkdir(subpath, 0) - assert ret >= 0, \ - ('Mkdir(%s) should not return an error' % subpath) + 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)) + 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) + 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath f = gdal.VSIFOpenExL( - subpath + '/test.txt', - 'wb', - 0, - ['Content-Type=foo', 'Content-Encoding=bar'] + subpath + "/test.txt", "wb", 0, ["Content-Type=foo", "Content-Encoding=bar"] ) assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + gdal.VSIFWriteL("hello", 1, 5, f) gdal.VSIFCloseL(f) - md = gdal.GetFileMetadata(subpath + '/test.txt', 'HEADERS') - assert 'Content-Type' in md - assert md['Content-Type'] == 'foo' - assert 'Content-Encoding' in md - assert md['Content-Encoding'] == 'bar' + md = gdal.GetFileMetadata(subpath + "/test.txt", "HEADERS") + assert "Content-Type" in md + assert md["Content-Type"] == "foo" + assert "Content-Encoding" in md + assert md["Content-Encoding"] == "bar" ret = gdal.Rmdir(subpath) - assert ret != 0, \ - ( - 'Rmdir(%s) on non empty directory should return an error' - % subpath - ) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - assert gdal.Rename(subpath + '/test.txt', subpath + '/test2.txt') == 0 + assert gdal.Rename(subpath + "/test.txt", subpath + "/test2.txt") == 0 - f = gdal.VSIFOpenL(subpath + '/test2.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test2.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + data = gdal.VSIFReadL(1, 5, f).decode("utf-8") + assert data == "hello" gdal.VSIFCloseL(f) - ret = gdal.Unlink(subpath + '/test2.txt') - assert ret >= 0, \ - ( - 'Unlink(%s) should not return an error' - % (subpath + '/test2.txt') - ) + ret = gdal.Unlink(subpath + "/test2.txt") + assert ret >= 0, "Unlink(%s) should not return an error" % ( + subpath + "/test2.txt" + ) ret = gdal.Rmdir(subpath) - assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) + assert ret >= 0, "Rmdir(%s) should not return an error" % subpath def test_sync(): local_file = "tmp/gdal_sync_test.bin" remote_file = path + "/gdal_sync_test.bin" f = gdal.VSIFOpenL(local_file, "wb") - gdal.VSIFWriteL('foo' * 10000, 1, 3 * 10000, f) + gdal.VSIFWriteL("foo" * 10000, 1, 3 * 10000, f) gdal.VSIFCloseL(f) gdal.Sync(local_file, remote_file) @@ -5344,14 +5038,14 @@ def test_sync(): assert gdal.VSIStatL(local_file).size == 3 * 10000 f = gdal.VSIFOpenL(local_file, "wb") - gdal.VSIFWriteL('foobar' * 10000, 1, 6 * 10000, f) + gdal.VSIFWriteL("foobar" * 10000, 1, 6 * 10000, f) gdal.VSIFCloseL(f) gdal.Sync(local_file, remote_file) assert gdal.VSIStatL(remote_file).size == 6 * 10000 - s = gdal.VSIStatL(remote_file.replace('/vsis3/', '/vsis3_streaming/')).size + s = gdal.VSIStatL(remote_file.replace("/vsis3/", "/vsis3_streaming/")).size assert s == 6 * 10000 gdal.Unlink(local_file) @@ -5366,15 +5060,15 @@ def test_sync(): return - f = open_for_read('/vsis3/' + s3_resource) - assert f is not None, ('cannot open %s' % ('/vsis3/' + s3_resource)) + 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) + f = open_for_read("/vsis3_streaming/" + s3_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -5385,24 +5079,24 @@ def test_sync(): # 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') + f = open_for_read("/vsis3/not_existing_bucket/foo") with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) - assert gdal.VSIGetLastErrorMsg() != '' + assert gdal.VSIGetLastErrorMsg() != "" # Invalid resource gdal.ErrorReset() f = open_for_read( - '/vsis3_streaming/' - + gdal.GetConfigOption('S3_RESOURCE') - + '/invalid_resource.baz' + "/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) + 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) diff --git a/autotest/gcore/vsistdin.py b/autotest/gcore/vsistdin.py index e837acc713d0..93fda1990cad 100755 --- a/autotest/gcore/vsistdin.py +++ b/autotest/gcore/vsistdin.py @@ -30,11 +30,11 @@ import os - -from osgeo import gdal import gdaltest -import test_cli_utilities import pytest +import test_cli_utilities + +from osgeo import gdal ############################################################################### # Test on a small file @@ -44,14 +44,17 @@ 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) + 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") + 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") @@ -61,6 +64,7 @@ def test_vsistdin_1(): gdal.Unlink("tmp/vsistdin_1_out.tif") + ############################################################################### # Test on a bigger file (> 1 MB) @@ -69,11 +73,14 @@ 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 = 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") + 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") @@ -83,17 +90,19 @@ def test_vsistdin_2(): 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.PushErrorHandler("CPLQuietErrorHandler") + f = gdal.VSIFOpenL("/vsistdin/", "wb") gdal.PopErrorHandler() assert f is None + ############################################################################### # Test fix for #6061 @@ -102,8 +111,9 @@ 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(""" + f = open("tmp/vsistdin_4_src.vrt", "wt") + f.write( + """ %s 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 @@ -114,11 +124,16 @@ def test_vsistdin_4(): 1 -""" % (' ' * (2 * 1024 * 1024))) +""" + % (" " * (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") + 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") @@ -134,71 +149,87 @@ def test_vsistdin_4(): def test_vsistdin_5(): - f = open('tmp/test_vsistdin_5.bin', 'wb') - f.write(b'0123456789' * (1024 * 1024)) + f = open("tmp/test_vsistdin_5.bin", "wb") + f.write(b"0123456789" * (1024 * 1024)) f.close() - with gdaltest.config_options({'CPL_VSISTDIN_FILE': 'tmp/test_vsistdin_5.bin', - 'CPL_VSISTDIN_RESET_POSITION': 'YES', - 'CPL_VSISTDIN_FILE_CLOSE': 'YES'}): - f = gdal.VSIFOpenL('/vsistdin?buffer_limit=10MB', 'rb') + with gdaltest.config_options( + { + "CPL_VSISTDIN_FILE": "tmp/test_vsistdin_5.bin", + "CPL_VSISTDIN_RESET_POSITION": "YES", + "CPL_VSISTDIN_FILE_CLOSE": "YES", + } + ): + f = gdal.VSIFOpenL("/vsistdin?buffer_limit=10MB", "rb") assert f is not None assert gdal.VSIFEofL(f) == 0 - assert gdal.VSIFReadL(10, 1, f) == b'0123456789' + assert gdal.VSIFReadL(10, 1, f) == b"0123456789" assert gdal.VSIFTellL(f) == 10 assert gdal.VSIFSeekL(f, 5, 0) == 0 assert gdal.VSIFTellL(f) == 5 - assert gdal.VSIFReadL(3, 1, f) == b'567' + assert gdal.VSIFReadL(3, 1, f) == b"567" assert gdal.VSIFTellL(f) == 8 - assert gdal.VSIFReadL(4, 1, f) == b'8901' + assert gdal.VSIFReadL(4, 1, f) == b"8901" assert gdal.VSIFTellL(f) == 12 assert gdal.VSIFSeekL(f, 0, 2) == 0 - assert gdal.VSIFTellL(f) == 10*1024 * 1024 - assert gdal.VSIFReadL(1, 1, f) == b'' + assert gdal.VSIFTellL(f) == 10 * 1024 * 1024 + assert gdal.VSIFReadL(1, 1, f) == b"" assert gdal.VSIFEofL(f) == 1 - assert gdal.VSIFTellL(f) == 10*1024 * 1024 + assert gdal.VSIFTellL(f) == 10 * 1024 * 1024 assert gdal.VSIFSeekL(f, 5, 0) == 0 assert gdal.VSIFTellL(f) == 5 - assert gdal.VSIFReadL(3, 1, f) == b'567' + assert gdal.VSIFReadL(3, 1, f) == b"567" assert gdal.VSIFTellL(f) == 8 - assert gdal.VSIFSeekL(f, 10*1024 * 1024 - 10 + 1, 0) == 0 - assert gdal.VSIFReadL(3, 1, f) == b'123' + assert gdal.VSIFSeekL(f, 10 * 1024 * 1024 - 10 + 1, 0) == 0 + assert gdal.VSIFReadL(3, 1, f) == b"123" gdal.VSIFCloseL(f) - with gdaltest.config_options({'CPL_VSISTDIN_FILE': 'tmp/test_vsistdin_5.bin', - 'CPL_VSISTDIN_RESET_POSITION': 'YES', - 'CPL_VSISTDIN_FILE_CLOSE': 'YES'}): - f = gdal.VSIFOpenL('/vsistdin?buffer_limit=-1', 'rb') + with gdaltest.config_options( + { + "CPL_VSISTDIN_FILE": "tmp/test_vsistdin_5.bin", + "CPL_VSISTDIN_RESET_POSITION": "YES", + "CPL_VSISTDIN_FILE_CLOSE": "YES", + } + ): + f = gdal.VSIFOpenL("/vsistdin?buffer_limit=-1", "rb") assert f is not None assert gdal.VSIFSeekL(f, 0, 2) == 0 - assert gdal.VSIFTellL(f) == 10*1024 * 1024 + assert gdal.VSIFTellL(f) == 10 * 1024 * 1024 gdal.VSIFCloseL(f) - assert gdal.VSIStatL('/vsistdin?buffer_limit=-1').size == 10*1024 * 1024 + assert gdal.VSIStatL("/vsistdin?buffer_limit=-1").size == 10 * 1024 * 1024 - with gdaltest.config_options({'CPL_VSISTDIN_FILE': 'tmp/test_vsistdin_5.bin', - 'CPL_VSISTDIN_RESET_POSITION': 'YES', - 'CPL_VSISTDIN_FILE_CLOSE': 'YES'}): - f = gdal.VSIFOpenL('/vsistdin?buffer_limit=1GB', 'rb') + with gdaltest.config_options( + { + "CPL_VSISTDIN_FILE": "tmp/test_vsistdin_5.bin", + "CPL_VSISTDIN_RESET_POSITION": "YES", + "CPL_VSISTDIN_FILE_CLOSE": "YES", + } + ): + f = gdal.VSIFOpenL("/vsistdin?buffer_limit=1GB", "rb") assert f is not None assert gdal.VSIFSeekL(f, 0, 2) == 0 - assert gdal.VSIFTellL(f) == 10*1024 * 1024 + assert gdal.VSIFTellL(f) == 10 * 1024 * 1024 gdal.VSIFCloseL(f) - assert gdal.VSIStatL('/vsistdin?buffer_limit=-1').size == 10*1024 * 1024 + assert gdal.VSIStatL("/vsistdin?buffer_limit=-1").size == 10 * 1024 * 1024 - with gdaltest.config_options({'CPL_VSISTDIN_FILE': 'tmp/test_vsistdin_5.bin', - 'CPL_VSISTDIN_RESET_POSITION': 'YES', - 'CPL_VSISTDIN_FILE_CLOSE': 'YES'}): - f = gdal.VSIFOpenL('/vsistdin?buffer_limit=10', 'rb') + with gdaltest.config_options( + { + "CPL_VSISTDIN_FILE": "tmp/test_vsistdin_5.bin", + "CPL_VSISTDIN_RESET_POSITION": "YES", + "CPL_VSISTDIN_FILE_CLOSE": "YES", + } + ): + f = gdal.VSIFOpenL("/vsistdin?buffer_limit=10", "rb") assert f is not None assert gdal.VSIFSeekL(f, 0, 2) == 0 - assert gdal.VSIFTellL(f) == 10*1024 * 1024 + assert gdal.VSIFTellL(f) == 10 * 1024 * 1024 assert gdal.VSIFSeekL(f, 0, 0) == 0 - assert gdal.VSIFReadL(5, 1, f) == b'01234' - assert gdal.VSIFReadL(3, 1, f) == b'567' + assert gdal.VSIFReadL(5, 1, f) == b"01234" + assert gdal.VSIFReadL(3, 1, f) == b"567" with gdaltest.error_handler(): - assert gdal.VSIFReadL(3, 1, f) == b'' + assert gdal.VSIFReadL(3, 1, f) == b"" gdal.VSIFCloseL(f) - os.unlink('tmp/test_vsistdin_5.bin') + os.unlink("tmp/test_vsistdin_5.bin") diff --git a/autotest/gcore/vsiswift.py b/autotest/gcore/vsiswift.py index cd3c1a181598..1de9e5027713 100755 --- a/autotest/gcore/vsiswift.py +++ b/autotest/gcore/vsiswift.py @@ -28,22 +28,23 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import json import stat import sys -from osgeo import gdal - import gdaltest -import webserver import pytest -import json +import webserver + +from osgeo import gdal def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### @@ -51,8 +52,13 @@ def open_for_read(uri): def test_vsiswift_init(): gdaltest.swift_vars = {} - for var in ('SWIFT_STORAGE_URL', 'SWIFT_AUTH_TOKEN', - 'SWIFT_AUTH_V1_URL', 'SWIFT_USER', 'SWIFT_KEY'): + 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, "") @@ -70,27 +76,27 @@ def test_vsiswift_real_server_errors(): # 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 + 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 + 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') + 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 + 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.SetConfigOption("SWIFT_AUTH_TOKEN", "SWIFT_AUTH_TOKEN") gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsiswift/foo/bar.baz') + f = open_for_read("/vsiswift/foo/bar.baz") if f is not None: if f is not None: gdal.VSIFCloseL(f) @@ -98,9 +104,10 @@ def test_vsiswift_real_server_errors(): gdal.ErrorReset() with gdaltest.error_handler(): - f = open_for_read('/vsiswift_streaming/foo/bar.baz') + f = open_for_read("/vsiswift_streaming/foo/bar.baz") assert f is None, gdal.VSIGetLastErrorMsg() + ############################################################################### @@ -112,7 +119,9 @@ def test_vsiswift_start_webserver(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if gdaltest.webserver_port == 0: pytest.skip() @@ -127,85 +136,92 @@ def test_vsiswift_fake_auth_v1_url(): 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', '') + 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' + 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)) + 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.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')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/auth/1.0', custom_method=method) + handler.add("GET", "/auth/1.0", custom_method=method) def method(request): - request.protocol_version = 'HTTP/1.1' + 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)) + 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.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')) + request.wfile.write("""foo""".encode("ascii")) - handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) + handler.add("GET", "/v1/AUTH_something/foo/bar", custom_method=method) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/bar') + f = open_for_read("/vsiswift/foo/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" # authentication is reused def method(request): - request.protocol_version = 'HTTP/1.1' + 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)) + 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.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')) + request.wfile.write("""bar""".encode("ascii")) - handler.add('GET', '/v1/AUTH_something/foo/baz', custom_method=method) + handler.add("GET", "/v1/AUTH_something/foo/baz", custom_method=method) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/baz') + f = open_for_read("/vsiswift/foo/baz") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'bar' + assert data == "bar" ############################################################################### @@ -218,38 +234,41 @@ def test_vsiswift_fake_auth_v3_url(): pytest.skip() gdal.VSICurlClearCache() - gdal.SetConfigOption('OS_IDENTITY_API_VERSION', '3') - gdal.SetConfigOption('OS_AUTH_URL', 'http://127.0.0.1:%d/v3' % gdaltest.webserver_port) - gdal.SetConfigOption('OS_USERNAME', 'my_user') - gdal.SetConfigOption('OS_USER_DOMAIN_NAME', 'test_user_domain') - gdal.SetConfigOption('OS_PROJECT_NAME', 'test_proj') - gdal.SetConfigOption('OS_PROJECT_DOMAIN_NAME', 'test_project_domain') - gdal.SetConfigOption('OS_REGION_NAME', 'Test') - gdal.SetConfigOption('OS_PASSWORD', 'pwd') - gdal.SetConfigOption('SWIFT_STORAGE_URL', '') - gdal.SetConfigOption('SWIFT_AUTH_TOKEN', '') + gdal.SetConfigOption("OS_IDENTITY_API_VERSION", "3") + gdal.SetConfigOption( + "OS_AUTH_URL", "http://127.0.0.1:%d/v3" % gdaltest.webserver_port + ) + gdal.SetConfigOption("OS_USERNAME", "my_user") + gdal.SetConfigOption("OS_USER_DOMAIN_NAME", "test_user_domain") + gdal.SetConfigOption("OS_PROJECT_NAME", "test_proj") + gdal.SetConfigOption("OS_PROJECT_DOMAIN_NAME", "test_project_domain") + gdal.SetConfigOption("OS_REGION_NAME", "Test") + gdal.SetConfigOption("OS_PASSWORD", "pwd") + gdal.SetConfigOption("SWIFT_STORAGE_URL", "") + gdal.SetConfigOption("SWIFT_AUTH_TOKEN", "") handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" h = request.headers - if 'Content-Type' not in h or h['Content-Type'] != 'application/json': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if "Content-Type" not in h or h["Content-Type"] != "application/json": + sys.stderr.write("Bad headers: %s\n" % str(h)) request.send_response(403) return - request_len = int(h['Content-Length']) + request_len = int(h["Content-Length"]) request_body = request.rfile.read(request_len).decode() request_json = json.loads(request_body) - methods = request_json['auth']['identity']["methods"] + methods = request_json["auth"]["identity"]["methods"] assert "password" in methods - password = request_json['auth']['identity']['password']['user']['password'] - assert password == 'pwd' + password = request_json["auth"]["identity"]["password"]["user"]["password"] + assert password == "pwd" - content = """{ + content = ( + """{ "token" : { "catalog" : [ { @@ -275,39 +294,40 @@ def method(request): } ] } - }""" % gdaltest.webserver_port - content = content.encode('ascii') + }""" + % gdaltest.webserver_port + ) + content = content.encode("ascii") request.send_response(200) - request.send_header('Content-Length', len(content)) - request.send_header('Content-Type', 'application/json') - request.send_header('X-Subject-Token', 'my_auth_token') + request.send_header("Content-Length", len(content)) + request.send_header("Content-Type", "application/json") + request.send_header("X-Subject-Token", "my_auth_token") request.end_headers() request.wfile.write(content) - handler.add('POST', '/v3/auth/tokens', custom_method=method) + handler.add("POST", "/v3/auth/tokens", custom_method=method) def method(request): - request.protocol_version = 'HTTP/1.1' + 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)) + 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.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')) + request.wfile.write("foo".encode("ascii")) - handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) + handler.add("GET", "/v1/AUTH_something/foo/bar", custom_method=method) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/bar') + f = open_for_read("/vsiswift/foo/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') - assert data == 'foo' + data = gdal.VSIFReadL(1, 4, f).decode("ascii") + assert data == "foo" gdal.VSIFCloseL(f) @@ -322,42 +342,47 @@ def test_vsiswift_fake_auth_v3_application_credential_url(): pytest.skip() gdal.VSICurlClearCache() - gdal.SetConfigOption('SWIFT_STORAGE_URL', '') - gdal.SetConfigOption('SWIFT_AUTH_TOKEN', '') - with gdaltest.config_options( { - 'OS_IDENTITY_API_VERSION': '3', - 'OS_AUTH_URL': 'http://127.0.0.1:%d/v3' % gdaltest.webserver_port, - 'OS_AUTH_TYPE': 'v3applicationcredential', - 'OS_APPLICATION_CREDENTIAL_ID': 'xxxyyycredential-idyyyxxx==', - 'OS_APPLICATION_CREDENTIAL_SECRET': 'xxxyyycredential-secretyyyxxx==', - 'OS_USER_DOMAIN_NAME': 'test_user_domain', - 'OS_REGION_NAME': 'Test' - } ): + gdal.SetConfigOption("SWIFT_STORAGE_URL", "") + gdal.SetConfigOption("SWIFT_AUTH_TOKEN", "") + with gdaltest.config_options( + { + "OS_IDENTITY_API_VERSION": "3", + "OS_AUTH_URL": "http://127.0.0.1:%d/v3" % gdaltest.webserver_port, + "OS_AUTH_TYPE": "v3applicationcredential", + "OS_APPLICATION_CREDENTIAL_ID": "xxxyyycredential-idyyyxxx==", + "OS_APPLICATION_CREDENTIAL_SECRET": "xxxyyycredential-secretyyyxxx==", + "OS_USER_DOMAIN_NAME": "test_user_domain", + "OS_REGION_NAME": "Test", + } + ): handler = webserver.SequentialHandler() def method(request): - request.protocol_version = 'HTTP/1.1' + request.protocol_version = "HTTP/1.1" h = request.headers - if 'Content-Type' not in h or h['Content-Type'] != 'application/json': - sys.stderr.write('Bad headers: %s\n' % str(h)) + if "Content-Type" not in h or h["Content-Type"] != "application/json": + sys.stderr.write("Bad headers: %s\n" % str(h)) request.send_response(403) return - request_len = int(h['Content-Length']) + request_len = int(h["Content-Length"]) request_body = request.rfile.read(request_len).decode() request_json = json.loads(request_body) - methods = request_json['auth']['identity']["methods"] + methods = request_json["auth"]["identity"]["methods"] assert "application_credential" in methods - cred_id = request_json['auth']['identity']['application_credential']['id'] - cred_secret = request_json['auth']['identity']['application_credential']['secret'] + cred_id = request_json["auth"]["identity"]["application_credential"]["id"] + cred_secret = request_json["auth"]["identity"]["application_credential"][ + "secret" + ] - assert cred_id == 'xxxyyycredential-idyyyxxx==' - assert cred_secret == 'xxxyyycredential-secretyyyxxx==' + assert cred_id == "xxxyyycredential-idyyyxxx==" + assert cred_secret == "xxxyyycredential-secretyyyxxx==" - content = """{ + content = ( + """{ "token" : { "catalog" : [ { @@ -383,39 +408,40 @@ def method(request): } ] } - }""" % gdaltest.webserver_port - content = content.encode('ascii') + }""" + % gdaltest.webserver_port + ) + content = content.encode("ascii") request.send_response(200) - request.send_header('Content-Length', len(content)) - request.send_header('Content-Type', 'application/json') - request.send_header('X-Subject-Token', 'my_auth_token') + request.send_header("Content-Length", len(content)) + request.send_header("Content-Type", "application/json") + request.send_header("X-Subject-Token", "my_auth_token") request.end_headers() request.wfile.write(content) - handler.add('POST', '/v3/auth/tokens', custom_method=method) + handler.add("POST", "/v3/auth/tokens", custom_method=method) def method(request): - request.protocol_version = 'HTTP/1.1' + 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)) + 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.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')) + request.wfile.write("foo".encode("ascii")) - handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) + handler.add("GET", "/v1/AUTH_something/foo/bar", custom_method=method) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/bar') + f = open_for_read("/vsiswift/foo/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') - assert data == 'foo' + data = gdal.VSIFReadL(1, 4, f).decode("ascii") + assert data == "foo" gdal.VSIFCloseL(f) @@ -429,19 +455,22 @@ def test_vsiswift_fake_auth_storage_url_and_auth_token(): 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') + 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) + handler.add("GET", "/v1/AUTH_something/foo/bar", 501) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/bar') + f = open_for_read("/vsiswift/foo/bar") assert f is not None - gdal.VSIFReadL(1, 4, f).decode('ascii') + gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) gdal.VSICurlClearCache() @@ -449,29 +478,29 @@ def test_vsiswift_fake_auth_storage_url_and_auth_token(): # Success def method(request): - request.protocol_version = 'HTTP/1.1' + 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)) + 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.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')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) + handler.add("GET", "/v1/AUTH_something/foo/bar", custom_method=method) with webserver.install_http_handler(handler): - f = open_for_read('/vsiswift/foo/bar') + f = open_for_read("/vsiswift/foo/bar") assert f is not None - data = gdal.VSIFReadL(1, 4, f).decode('ascii') + data = gdal.VSIFReadL(1, 4, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == 'foo' + assert data == "foo" + ############################################################################### # Test VSIStatL() @@ -485,10 +514,15 @@ def test_vsiswift_stat(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/v1/AUTH_something/foo/bar', 206, - {'Content-Range': 'bytes 0-0/1000000'}, 'x') + 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') + 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) @@ -497,9 +531,11 @@ def test_vsiswift_stat(): pytest.fail() handler = webserver.SequentialHandler() - handler.add('HEAD', '/v1/AUTH_something/foo/bar', 200, {'Content-Length': '1000000'}) + 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') + 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) @@ -511,20 +547,34 @@ def test_vsiswift_stat(): 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") + handler.add("GET", "/v1/AUTH_something/foo", 200, {}, "blabla") with webserver.install_http_handler(handler): - stat_res = gdal.VSIStatL('/vsiswift/foo') + stat_res = gdal.VSIStatL("/vsiswift/foo") assert stat_res is not None and stat.S_ISDIR(stat_res.mode) # No network access done - s = gdal.VSIStatL('/vsiswift/foo', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG |gdal.VSI_STAT_CACHE_ONLY) + s = gdal.VSIStatL( + "/vsiswift/foo", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) assert s assert stat.S_ISDIR(s.mode) # No network access done - assert gdal.VSIStatL('/vsiswift/i_do_not_exist', - gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG | gdal.VSI_STAT_CACHE_ONLY) is None + assert ( + gdal.VSIStatL( + "/vsiswift/i_do_not_exist", + gdal.VSI_STAT_EXISTS_FLAG + | gdal.VSI_STAT_NATURE_FLAG + | gdal.VSI_STAT_SIZE_FLAG + | gdal.VSI_STAT_CACHE_ONLY, + ) + is None + ) + ############################################################################### # Test ReadDir() @@ -538,94 +588,131 @@ def test_vsiswift_fake_readdir(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=1', 200, - {'Content-type': 'application/json'}, - """[ + 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'}, - """[ +]""", + ) + + 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'): +]""", + ) + + 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') + 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') + 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') + 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) + 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/') + 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'}, - """[] - """) + 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 == ['.'] + 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 }, + 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'] + 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'}, - """[ { + handler.add( + "GET", + "/v1/AUTH_something", + 200, + {"Content-type": "application/json"}, + """[ { "last_modified": "1970-01-01T00:00:01", "bytes": 123456, "name": "foo" }, - { "subdir": "foo/"} ] """) + { "subdir": "foo/"} ] """, + ) with webserver.install_http_handler(handler): - dir_contents = gdal.ReadDir('/vsiswift/') - assert dir_contents == ['foo', 'foo/'] + 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'}, "[]") + 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 == ['.'] + dir_contents = gdal.ReadDir("/vsiswift/foo/") + assert dir_contents == ["."] + ############################################################################### # Test write @@ -639,43 +726,46 @@ def test_vsiswift_fake_write(): gdal.VSICurlClearCache() # Test creation of BlockBob - f = gdal.VSIFOpenL('/vsiswift/test_copy/file.bin', 'wb') + 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)) + 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 = '' + 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') + 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)) + sys.stderr.write("Bad headers: %s\n" % str(request.headers)) request.send_response(403) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() return request.send_response(200) - request.send_header('Content-Length', 0) + request.send_header("Content-Length", 0) request.end_headers() - handler.add('PUT', '/v1/AUTH_something/test_copy/file.bin', custom_method=method) + 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) + 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) @@ -695,23 +785,26 @@ def test_vsiswift_fake_unlink(): # 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'}) + 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') + 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'}) + 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') + ret = gdal.Unlink("/vsiswift/foo/bar") assert ret == -1 + ############################################################################### # Test Mkdir() / Rmdir() @@ -724,83 +817,105 @@ def test_vsiswift_fake_mkdir_rmdir(): gdal.VSICurlClearCache() # Invalid name - ret = gdal.Mkdir('/vsiswift', 0) + 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) + 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) + 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/" } ]""") + 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) + ret = gdal.Mkdir("/vsiswift/foo/dir", 0) assert ret != 0 # Invalid name - ret = gdal.Rmdir('/vsiswift') + 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" } ]""") + 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') + 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) + 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') + 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) + 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') + 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" } ]""") + 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') + ret = gdal.Rmdir("/vsiswift/foo/dir_nonempty") assert ret != 0 + ############################################################################### @@ -815,6 +930,7 @@ def test_vsiswift_stop_webserver(): webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) + ############################################################################### # Nominal cases (require valid credentials) @@ -824,74 +940,79 @@ def test_vsiswift_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() - swift_resource = gdal.GetConfigOption('SWIFT_RESOURCE') + swift_resource = gdal.GetConfigOption("SWIFT_RESOURCE") if swift_resource is None: - pytest.skip('Missing SWIFT_RESOURCE') + pytest.skip("Missing SWIFT_RESOURCE") - if '/' not in swift_resource: - path = '/vsiswift/' + 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) + 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' + 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 + 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) + 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)) + 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) + 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "wb") assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + 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) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + 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.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) + assert ret >= 0, "Rmdir(%s) should not return an error" % subpath return - f = open_for_read('/vsiswift/' + swift_resource) + f = open_for_read("/vsiswift/" + swift_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -899,7 +1020,7 @@ def test_vsiswift_extra_1(): assert len(ret) == 1 # Same with /vsiswift_streaming/ - f = open_for_read('/vsiswift_streaming/' + swift_resource) + f = open_for_read("/vsiswift_streaming/" + swift_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) @@ -908,9 +1029,10 @@ def test_vsiswift_extra_1(): # Invalid resource gdal.ErrorReset() - f = open_for_read('/vsiswift_streaming/' + swift_resource + '/invalid_resource.baz') + f = open_for_read("/vsiswift_streaming/" + swift_resource + "/invalid_resource.baz") assert f is None, gdal.VSIGetLastErrorMsg() + ############################################################################### diff --git a/autotest/gcore/vsiwebhdfs.py b/autotest/gcore/vsiwebhdfs.py index c451474b81e0..d27eef897000 100755 --- a/autotest/gcore/vsiwebhdfs.py +++ b/autotest/gcore/vsiwebhdfs.py @@ -30,19 +30,20 @@ import stat import sys -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal def open_for_read(uri): """ Opens a test file for reading. """ - return gdal.VSIFOpenExL(uri, 'rb', 1) + return gdal.VSIFOpenExL(uri, "rb", 1) + ############################################################################### @@ -50,12 +51,12 @@ def open_for_read(uri): def test_vsiwebhdfs_init(): gdaltest.webhdfs_vars = {} - for var in ('WEBHDFS_USERNAME', 'WEBHDFS_DELEGATION'): + 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, "") - + ############################################################################### @@ -68,14 +69,18 @@ def test_vsiwebhdfs_start_webserver(): pytest.skip() (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( - handler=webserver.DispatcherHttpHandler) + 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' + 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() @@ -90,13 +95,18 @@ def test_vsiwebhdfs_open(): # Download without redirect (not nominal) handler = webserver.SequentialHandler() - handler.add('GET', '/webhdfs/v1/foo/bar?op=OPEN&offset=9999990784&length=16384', 200, - {}, '0123456789data') + 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') + 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' + assert gdal.VSIFReadL(1, 4, f).decode("ascii") == "data" gdal.VSIFCloseL(f) # Download with redirect (nominal) and permissions @@ -104,28 +114,44 @@ def test_vsiwebhdfs_open(): 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'}): + 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') + f = open_for_read(gdaltest.webhdfs_base_connection + "/foo/bar") assert f is not None - assert gdal.VSIFReadL(1, 4, f).decode('ascii') == 'yeah' + 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') + 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) + 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 @@ -134,6 +160,7 @@ def test_vsiwebhdfs_open(): gdal.VSIFCloseL(f) + ############################################################################### # Test VSIStatL() @@ -146,10 +173,15 @@ def test_vsiwebhdfs_stat(): gdal.VSICurlClearCache() handler = webserver.SequentialHandler() - handler.add('GET', '/webhdfs/v1/foo/bar?op=GETFILESTATUS', 200, - {}, '{"FileStatus":{"type":"FILE","length":1000000}}') + 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') + 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) @@ -158,18 +190,23 @@ def test_vsiwebhdfs_stat(): pytest.fail() # Test caching - stat_res = gdal.VSIStatL(gdaltest.webhdfs_base_connection + '/foo/bar') + 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"}}') + 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') + stat_res = gdal.VSIStatL(gdaltest.webhdfs_base_connection + "/unexisting") assert stat_res is None + ############################################################################### # Test ReadDir() @@ -182,28 +219,34 @@ def test_vsiwebhdfs_readdir(): 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}]}}') + 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') + 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') + 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) + 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/') + gdaltest.webhdfs_base_connection + "foo/error_test/" + ) assert dir_contents is None + ############################################################################### # Test write @@ -220,20 +263,30 @@ def test_vsiwebhdfs_write(): with webserver.install_http_handler(handler): # Missing required config options with gdaltest.error_handler(): - f = gdal.VSIFOpenL( - gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') + 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'}): + "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') + f = gdal.VSIFOpenL(gdaltest.webhdfs_base_connection + "/foo/bar", "wb") assert f is not None assert gdal.VSIFCloseL(f) == 0 @@ -242,39 +295,61 @@ def test_vsiwebhdfs_write(): 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'}): + "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') + f = gdal.VSIFOpenL(gdaltest.webhdfs_base_connection + "/foo/bar", "wb") assert f is not None - assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 + 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)) + 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.send_header("Content-Length", 0) request.end_headers() - request.protocol_version = 'HTTP/1.1' + 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.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')) + 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 @@ -285,22 +360,30 @@ def method(request): 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'}): + "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') + 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'}): + 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') + f = gdal.VSIFOpenL(gdaltest.webhdfs_base_connection + "/foo/bar", "wb") assert f is None # Errors during POST @@ -308,30 +391,47 @@ def method(request): 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'}): + "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') + f = gdal.VSIFOpenL(gdaltest.webhdfs_base_connection + "/foo/bar", "wb") assert f is not None - assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 + 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) + "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() @@ -345,48 +445,51 @@ def test_vsiwebhdfs_unlink(): # Success handler = webserver.SequentialHandler() - handler.add('DELETE', '/webhdfs/v1/foo/bar?op=DELETE', 200, - {}, '{"boolean":true}') + 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') + 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'}): + 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') + 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}') + 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') + 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, - {}) + 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') + ret = gdal.Unlink(gdaltest.webhdfs_base_connection + "/foo/bar") assert ret == -1 + ############################################################################### # Test Mkdir() / Rmdir() @@ -399,60 +502,66 @@ def test_vsiwebhdfs_mkdir_rmdir(): gdal.VSICurlClearCache() # Invalid name - ret = gdal.Mkdir('/vsiwebhdfs', 0) + ret = gdal.Mkdir("/vsiwebhdfs", 0) assert ret != 0 # Valid handler = webserver.SequentialHandler() - handler.add('PUT', '/webhdfs/v1/foo/dir?op=MKDIRS', 200, - {}, '{"boolean":true}') + 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) + 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'}): + 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 + 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) + 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) + 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) + ret = gdal.Mkdir(gdaltest.webhdfs_base_connection + "/", 0) assert ret != 0 # Invalid name - ret = gdal.Rmdir('/vsiwebhdfs') + 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}') + 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') + 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) + 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') + ret = gdal.Rmdir(gdaltest.webhdfs_base_connection + "/foo/dir_error") assert ret != 0 + ############################################################################### @@ -467,6 +576,7 @@ def test_vsiwebhdfs_stop_webserver(): webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) + ############################################################################### # Nominal cases (require valid credentials) @@ -476,83 +586,89 @@ def test_vsiwebhdfs_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() - webhdfs_url = gdal.GetConfigOption('WEBHDFS_URL') + webhdfs_url = gdal.GetConfigOption("WEBHDFS_URL") if webhdfs_url is None: - pytest.skip('Missing WEBHDFS_URL') + pytest.skip("Missing WEBHDFS_URL") - if webhdfs_url.endswith('/webhdfs/v1') or webhdfs_url.endswith('/webhdfs/v1/'): - path = '/vsiwebhdfs/' + 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) + 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' + 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 + 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) + 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)) + assert unique_id in readdir, "ReadDir(%s) should contain %s" % (path, unique_id) - #ret = gdal.Mkdir(subpath, 0) + # 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) + 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)) + 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) + 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) + assert ret >= 0, "Mkdir(%s) should not return an error" % subpath - f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "wb") assert f is not None - gdal.VSIFWriteL('hello', 1, 5, f) + 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) + assert ret != 0, ( + "Rmdir(%s) on non empty directory should return an error" % subpath + ) - f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') + f = gdal.VSIFOpenL(subpath + "/test.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 5, f).decode('utf-8') - assert data == 'hello' + 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.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) + assert ret >= 0, "Rmdir(%s) should not return an error" % subpath return - f = open_for_read('/vsiwebhdfs/' + webhdfs_url) + 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 + ############################################################################### diff --git a/autotest/gcore/vsizip.py b/autotest/gcore/vsizip.py index 914e8f3f2fdf..08f7d1c052b5 100755 --- a/autotest/gcore/vsizip.py +++ b/autotest/gcore/vsizip.py @@ -31,11 +31,11 @@ import random - import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### # Test writing a ZIP with multiple files and directories @@ -44,11 +44,11 @@ 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' + 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' + assert f is not None, "fail 2" gdal.VSIFCloseL(f) # A more natural one @@ -56,32 +56,35 @@ def test_vsizip_1(): # Create 1st file f2 = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/abcd", "wb") - assert f2 is not None, 'fail 3' + 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') + 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' + 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' + assert f3 is not None, "fail 4" gdal.VSIFWriteL("efghi", 1, 5, f3) # Try creating a 3d file gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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' + 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) @@ -91,17 +94,17 @@ def test_vsizip_1(): # 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') + f = gdal.VSIFOpenL("/vsizip/vsimem/test.zip", "rb") if f is not None: gdal.VSIFCloseL(f) - assert gdal.GetLastErrorMsg() != '', 'expected error' + assert gdal.GetLastErrorMsg() != "", "expected error" f = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/abcd", "rb") - assert f is not None, 'fail 5' + assert f is not None, "fail 5" data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) - assert data.decode('ASCII') == 'abcd' + assert data.decode("ASCII") == "abcd" # Test alternate uri syntax gdal.Rename("/vsimem/test.zip", "/vsimem/test.xxx") @@ -110,7 +113,7 @@ def test_vsizip_1(): data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) - assert data.decode('ASCII') == 'abcd' + assert data.decode("ASCII") == "abcd" # With a trailing slash f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx}/subdir3/abcd/", "rb") @@ -138,7 +141,7 @@ def test_vsizip_1(): # Test nested { { } } hZIP = gdal.VSIFOpenL("/vsizip/{/vsimem/zipinzip.yyy}", "wb") - assert hZIP is not None, 'fail 1' + 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) @@ -147,21 +150,24 @@ def test_vsizip_1(): gdal.VSIFCloseL(f) gdal.VSIFCloseL(hZIP) - f = gdal.VSIFOpenL("/vsizip/{/vsizip/{/vsimem/zipinzip.yyy}/test.xxx}/subdir3/abcd/", "rb") + 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' + 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 + 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 + assert gdal.ReadDir("/vsizip//vsimem/foo.zip") is None + ############################################################################### # Test writing 2 files in the ZIP by closing it completely between the 2 @@ -169,47 +175,48 @@ def test_vsizip_1(): def test_vsizip_2(): - zip_name = '/vsimem/test2.zip' + zip_name = "/vsimem/test2.zip" fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/foo.bar", "wb") - assert fmain is not None, 'fail 1' + 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' + 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' + assert fmain is not None, "fail 2" gdal.VSIFWriteL("67890", 1, 5, fmain) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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' + 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' + 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' + assert fmain is not None, "fail 3" data = gdal.VSIFReadL(1, 5, fmain) gdal.VSIFCloseL(fmain) - assert data.decode('ASCII') == '12345' + assert data.decode("ASCII") == "12345" fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/bar.baz", "rb") - assert fmain is not None, 'fail 4' + assert fmain is not None, "fail 4" data = gdal.VSIFReadL(1, 5, fmain) gdal.VSIFCloseL(fmain) - assert data.decode('ASCII') == '67890' + assert data.decode("ASCII") == "67890" gdal.Unlink(zip_name) @@ -217,6 +224,7 @@ def test_vsizip_2(): ############################################################################### # 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") @@ -240,7 +248,8 @@ def test_vsizip_3(): gdal.Unlink("/vsimem/test3.zip") - assert res == ['foo', 'bar', 'baz'] + assert res == ["foo", "bar", "baz"] + ############################################################################### # Test ReadRecursive on valid zip @@ -250,10 +259,17 @@ 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' + 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 @@ -262,23 +278,24 @@ def test_vsizip_4(): def test_vsizip_5(): # make file in memory - fmain = gdal.VSIFOpenL('/vsizip/vsimem/bigdepthzip.zip', 'wb') + 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') + 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]) + 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) @@ -293,7 +310,7 @@ def test_vsizip_6(): gdal.VSIFCloseL(f) f = None - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") gdal.PopErrorHandler() if f is not None: @@ -311,7 +328,7 @@ def test_vsizip_6(): gdal.VSIFCloseL(f) f = None - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") gdal.PopErrorHandler() if f is not None: @@ -320,6 +337,7 @@ def test_vsizip_6(): gdal.Unlink("/vsimem/test6.zip") + ############################################################################### # Test that we use the extended field for UTF-8 filenames (#5361). @@ -329,25 +347,36 @@ 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'] + 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']: + 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') + 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 + 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) @@ -355,20 +384,29 @@ def test_vsizip_8(): 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/zero.bin").size + == 5000 * 1000 * 1000 + 1 + ) - assert gdal.VSIStatL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/hello.txt').size == 6 + 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') + 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' + assert data.decode("ascii") == "\x03" - f = gdal.VSIFOpenL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/hello.txt', 'rb') + 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' + assert data.decode("ascii") == "HELLO\n" + ############################################################################### # Test that we recode filenames in ZIP (#5361) @@ -376,26 +414,33 @@ def test_vsizip_9(): def test_vsizip_10(): - gdal.SetConfigOption('CPL_ZIP_ENCODING', 'CP866') + gdal.SetConfigOption("CPL_ZIP_ENCODING", "CP866") content = gdal.ReadDir("/vsizip/data/cp866.zip") - gdal.SetConfigOption('CPL_ZIP_ENCODING', None) + 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'] + 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']: + 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: + if gdal.GetLastErrorMsg().find("Recode from CP866 to UTF-8 not supported") >= 0: pytest.skip() print(content) - pytest.fail('bad content') + pytest.fail("bad content") + - ############################################################################### # Test that we don't do anything with ZIP with filenames in UTF-8 already (#5361) @@ -405,18 +450,25 @@ 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'] + 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']: + 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') + pytest.fail("bad content") + - ############################################################################### # Test changing the content of a zip file (#6005) @@ -425,45 +477,46 @@ 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' + 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' + 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') + 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') + 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') + gdal.ReadDir("/vsizip/vsimem/vsizip_12.zip") # Copy vsizip_12_src2 into vsizip_12 - f = gdal.VSIFOpenL('/vsimem/vsizip_12_src2.zip', 'rb') + 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') + 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') + 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") - gdal.Unlink('/vsimem/vsizip_12_src1.zip') - gdal.Unlink('/vsimem/vsizip_12_src2.zip') - gdal.Unlink('/vsimem/vsizip_12.zip') + assert content == ["bar.baz"] - assert content == ['bar.baz'] ############################################################################### # Test ReadDir() truncation @@ -477,13 +530,14 @@ def test_vsizip_13(): gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) - lst = gdal.ReadDir('/vsizip/vsimem/vsizip_13.zip') + 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)) + 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') + gdal.Unlink("/vsimem/vsizip_13.zip") + ############################################################################### # Test that we can recode filenames in ZIP when writing (#6631) @@ -491,29 +545,30 @@ def test_vsizip_13(): def test_vsizip_14(): - fmain = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_14.zip', 'wb') + fmain = gdal.VSIFOpenL("/vsizip//vsimem/vsizip_14.zip", "wb") try: - x = [''] + x = [""] exec("x[0] = u'\u0430\u0431\u0432\u0433\u0434\u0435'") cp866_filename = x[0] except: - cp866_filename = '\u0430\u0431\u0432\u0433\u0434\u0435' + cp866_filename = "\u0430\u0431\u0432\u0433\u0434\u0435" with gdaltest.error_handler(): - f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_14.zip/' + cp866_filename, 'wb') + f = gdal.VSIFOpenL("/vsizip//vsimem/vsizip_14.zip/" + cp866_filename, "wb") if f is None: gdal.VSIFCloseL(fmain) - gdal.Unlink('/vsimem/vsizip_14.zip') + gdal.Unlink("/vsimem/vsizip_14.zip") pytest.skip() - gdal.VSIFWriteL('hello', 1, 5, f) + 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' + assert content == [cp866_filename], "bad content" + + gdal.Unlink("/vsimem/vsizip_14.zip") - gdal.Unlink('/vsimem/vsizip_14.zip') ############################################################################### # Test multithreaded compression @@ -521,29 +576,31 @@ def test_vsizip_14(): 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') + 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.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') + 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') + gdal.Unlink("/vsimem/vsizip_multi_thread.zip") - if data != 'hello' * 100000: + 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]) + 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 @@ -551,16 +608,22 @@ def test_vsizip_multi_thread(): 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') + 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.VSIFWriteL("hello", 1, 5, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) - gdal.Unlink('/vsimem/vsizip_multi_thread.zip') + gdal.Unlink("/vsimem/vsizip_multi_thread.zip") + ############################################################################### # Test multithreaded compression, below the threshold where it triggers @@ -568,20 +631,21 @@ def test_vsizip_multi_thread_error(): 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) + 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') + 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') + gdal.Unlink("/vsimem/vsizip_multi_thread.zip") + + assert data == "hello" - assert data == 'hello' ############################################################################### # Test creating ZIP64 file: uncompressed larger than 4GB, but compressed @@ -594,11 +658,11 @@ def test_vsizip_create_zip64(): 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') + 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) @@ -607,16 +671,17 @@ def test_vsizip_create_zip64(): size = gdal.VSIStatL(zip_name).size assert size <= 0xFFFFFFFF - size = gdal.VSIStatL('/vsizip/' + zip_name + '/test').size + 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') + 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 @@ -626,14 +691,14 @@ 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' + 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') + 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) @@ -641,11 +706,11 @@ def test_vsizip_create_zip64_stream_larger_than_4G(): size = gdal.VSIStatL(zip_name).size assert size > 0xFFFFFFFF - size = gdal.VSIStatL('/vsizip/' + zip_name + '/test2').size + 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') + f = gdal.VSIFOpenL("/vsizip/" + zip_name + "/test2", "rb") + data = gdal.VSIFReadL(1, len(s), f).decode("ascii") gdal.VSIFCloseL(f) assert data == s @@ -655,8 +720,7 @@ def test_vsizip_create_zip64_stream_larger_than_4G(): ############################################################################### def test_vsizip_byte_zip64_local_header_zeroed(): - size = gdal.VSIStatL('/vsizip/data/byte_zip64_local_header_zeroed.zip/byte.tif').size + size = gdal.VSIStatL( + "/vsizip/data/byte_zip64_local_header_zeroed.zip/byte.tif" + ).size assert size == 736 - - - diff --git a/autotest/gdrivers/aaigrid.py b/autotest/gdrivers/aaigrid.py index 551d1f8cc077..7d5abd4525bf 100755 --- a/autotest/gdrivers/aaigrid.py +++ b/autotest/gdrivers/aaigrid.py @@ -32,62 +32,79 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Perform simple read test. def test_aaigrid_1(): - tst = gdaltest.GDALTest('aaigrid', 'aaigrid/pixel_per_line.asc', 1, 1123) + tst = gdaltest.GDALTest("aaigrid", "aaigrid/pixel_per_line.asc", 1, 1123) return tst.testOpen() + ############################################################################### # Verify some auxiliary data. def test_aaigrid_2(): - ds = gdal.Open('data/aaigrid/pixel_per_line.asc') + ds = gdal.Open("data/aaigrid/pixel_per_line.asc") gt = ds.GetGeoTransform() - assert gt[0] == 100000.0 and gt[1] == 50 and gt[2] == 0 and gt[3] == 650600.0 and gt[4] == 0 and gt[5] == -50, \ - 'Aaigrid geotransform wrong.' + assert ( + gt[0] == 100000.0 + and gt[1] == 50 + and gt[2] == 0 + and gt[3] == 650600.0 + and gt[4] == 0 + and gt[5] == -50 + ), "Aaigrid geotransform wrong." prj = ds.GetProjection() - assert prj == 'PROJCS["unnamed",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",59],PARAMETER["longitude_of_center",-132.5],PARAMETER["standard_parallel_1",61.6666666666667],PARAMETER["standard_parallel_2",68],PARAMETER["false_easting",500000],PARAMETER["false_northing",500000],UNIT["METERS",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]', \ - ('Projection does not match expected:\n%s' % prj) + assert ( + prj + == 'PROJCS["unnamed",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",59],PARAMETER["longitude_of_center",-132.5],PARAMETER["standard_parallel_1",61.6666666666667],PARAMETER["standard_parallel_2",68],PARAMETER["false_easting",500000],PARAMETER["false_northing",500000],UNIT["METERS",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ), ("Projection does not match expected:\n%s" % prj) band1 = ds.GetRasterBand(1) - assert band1.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' + assert band1.GetNoDataValue() == -99999, "Grid NODATA value wrong or missing." - assert band1.DataType == gdal.GDT_Float32, 'Data type is not Float32!' + assert band1.DataType == gdal.GDT_Float32, "Data type is not Float32!" ############################################################################### # Test reading a file where decimal separator is comma (#3668) + def test_aaigrid_comma(): - ds = gdal.Open('data/aaigrid/pixel_per_line_comma.asc') + ds = gdal.Open("data/aaigrid/pixel_per_line_comma.asc") gt = ds.GetGeoTransform() - assert gt[0] == 100000.0 and gt[1] == 50 and gt[2] == 0 and gt[3] == 650600.0 and gt[4] == 0 and gt[5] == -50, \ - 'Aaigrid geotransform wrong.' + assert ( + gt[0] == 100000.0 + and gt[1] == 50 + and gt[2] == 0 + and gt[3] == 650600.0 + and gt[4] == 0 + and gt[5] == -50 + ), "Aaigrid geotransform wrong." band1 = ds.GetRasterBand(1) - assert band1.Checksum() == 1123, 'Did not get expected nodata value.' + assert band1.Checksum() == 1123, "Did not get expected nodata value." + + assert band1.GetNoDataValue() == -99999, "Grid NODATA value wrong or missing." - assert band1.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' + assert band1.DataType == gdal.GDT_Float32, "Data type is not Float32!" - assert band1.DataType == gdal.GDT_Float32, 'Data type is not Float32!' ############################################################################### # Create simple copy and check. @@ -95,22 +112,23 @@ def test_aaigrid_comma(): def test_aaigrid_3(): - tst = gdaltest.GDALTest('AAIGRID', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("AAIGRID", "byte.tif", 1, 4672) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) + ############################################################################### # Read subwindow. Tests the tail recursion problem. def test_aaigrid_4(): - tst = gdaltest.GDALTest('aaigrid', 'aaigrid/pixel_per_line.asc', 1, 187, - 5, 5, 5, 5) + tst = gdaltest.GDALTest("aaigrid", "aaigrid/pixel_per_line.asc", 1, 187, 5, 5, 5, 5) return tst.testOpen() + ############################################################################### # Perform simple read test on mixed-case .PRJ filename @@ -121,7 +139,7 @@ def test_aaigrid_5(): # - case_sensitive.ASC # - case_sensitive.PRJ - tst = gdaltest.GDALTest('aaigrid', 'aaigrid/case_sensitive.ASC', 1, 1123) + tst = gdaltest.GDALTest("aaigrid", "aaigrid/case_sensitive.ASC", 1, 1123) prj = """PROJCS["unnamed", GEOGCS["NAD83", @@ -147,18 +165,20 @@ def test_aaigrid_5(): return tst.testOpen(check_prj=prj) + ############################################################################### # Verify data type determination from type of nodata def test_aaigrid_6(): - ds = gdal.Open('data/aaigrid/nodata_float.asc') + ds = gdal.Open("data/aaigrid/nodata_float.asc") b = ds.GetRasterBand(1) - assert b.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' + assert b.GetNoDataValue() == -99999, "Grid NODATA value wrong or missing." + + assert b.DataType == gdal.GDT_Float32, "Data type is not Float32!" - assert b.DataType == gdal.GDT_Float32, 'Data type is not Float32!' ############################################################################### # Verify data type determination from type of nodata @@ -166,12 +186,13 @@ def test_aaigrid_6(): def test_aaigrid_6bis(): - ds = gdal.Open('data/aaigrid/nodata_int.asc') + ds = gdal.Open("data/aaigrid/nodata_int.asc") b = ds.GetRasterBand(1) - assert b.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' + assert b.GetNoDataValue() == -99999, "Grid NODATA value wrong or missing." + + assert b.DataType == gdal.GDT_Int32, "Data type is not Int32!" - assert b.DataType == gdal.GDT_Int32, 'Data type is not Int32!' ############################################################################### # Verify writing files with non-square pixels. @@ -179,7 +200,7 @@ def test_aaigrid_6bis(): def test_aaigrid_7(): - tst = gdaltest.GDALTest('AAIGRID', 'aaigrid/nonsquare.vrt', 1, 12481) + tst = gdaltest.GDALTest("AAIGRID", "aaigrid/nonsquare.vrt", 1, 12481) return tst.testCreateCopy(check_gt=1) @@ -187,9 +208,10 @@ def test_aaigrid_7(): ############################################################################### # Test creating an in memory copy. + def test_aaigrid_8(): - tst = gdaltest.GDALTest('AAIGRID', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("AAIGRID", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) @@ -197,19 +219,23 @@ def test_aaigrid_8(): ############################################################################### # Test DECIMAL_PRECISION creation option + def test_aaigrid_9(): - ds = gdal.Open('data/ehdr/float32.bil') - ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['DECIMAL_PRECISION=2']) + ds = gdal.Open("data/ehdr/float32.bil") + ds2 = gdal.GetDriverByName("AAIGRID").CreateCopy( + "tmp/aaigrid.tmp", ds, options=["DECIMAL_PRECISION=2"] + ) got_minmax = ds2.GetRasterBand(1).ComputeRasterMinMax() ds2 = None - gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') + gdal.GetDriverByName("AAIGRID").Delete("tmp/aaigrid.tmp") if got_minmax[0] == pytest.approx(-0.84, abs=1e-7): return pytest.fail() + ############################################################################### # Test AAIGRID_DATATYPE configuration option and DATATYPE open options @@ -217,36 +243,44 @@ def test_aaigrid_9(): def test_aaigrid_10(): # By default detected as 32bit float - ds = gdal.Open('data/aaigrid/float64.asc') - assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32, 'Data type is not Float32!' + ds = gdal.Open("data/aaigrid/float64.asc") + assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32, "Data type is not Float32!" for i in range(2): try: - os.remove('data/aaigrid/float64.asc.aux.xml') + os.remove("data/aaigrid/float64.asc.aux.xml") except OSError: pass if i == 0: - gdal.SetConfigOption('AAIGRID_DATATYPE', 'Float64') - ds = gdal.Open('data/aaigrid/float64.asc') - gdal.SetConfigOption('AAIGRID_DATATYPE', None) + gdal.SetConfigOption("AAIGRID_DATATYPE", "Float64") + ds = gdal.Open("data/aaigrid/float64.asc") + gdal.SetConfigOption("AAIGRID_DATATYPE", None) else: - ds = gdal.OpenEx('data/aaigrid/float64.asc', open_options=['DATATYPE=Float64']) + ds = gdal.OpenEx( + "data/aaigrid/float64.asc", open_options=["DATATYPE=Float64"] + ) - assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64, 'Data type is not Float64!' + assert ( + ds.GetRasterBand(1).DataType == gdal.GDT_Float64 + ), "Data type is not Float64!" nv = ds.GetRasterBand(1).GetNoDataValue() - assert nv == pytest.approx(-1.234567890123, abs=1e-16), 'did not get expected nodata value' + assert nv == pytest.approx( + -1.234567890123, abs=1e-16 + ), "did not get expected nodata value" got_minmax = ds.GetRasterBand(1).ComputeRasterMinMax() - assert got_minmax[0] == pytest.approx(1.234567890123, abs=1e-16), \ - 'did not get expected min value' - assert got_minmax[1] == pytest.approx(1.234567890123, abs=1e-16), \ - 'did not get expected max value' + assert got_minmax[0] == pytest.approx( + 1.234567890123, abs=1e-16 + ), "did not get expected min value" + assert got_minmax[1] == pytest.approx( + 1.234567890123, abs=1e-16 + ), "did not get expected max value" try: - os.remove('data/aaigrid/float64.asc.aux.xml') + os.remove("data/aaigrid/float64.asc.aux.xml") except OSError: pass @@ -257,37 +291,42 @@ def test_aaigrid_10(): def test_aaigrid_11(): - ds = gdal.Open('data/ehdr/float32.bil') - ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['SIGNIFICANT_DIGITS=2']) + ds = gdal.Open("data/ehdr/float32.bil") + ds2 = gdal.GetDriverByName("AAIGRID").CreateCopy( + "tmp/aaigrid.tmp", ds, options=["SIGNIFICANT_DIGITS=2"] + ) got_minmax = ds2.GetRasterBand(1).ComputeRasterMinMax() ds2 = None - gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') + gdal.GetDriverByName("AAIGRID").Delete("tmp/aaigrid.tmp") if got_minmax[0] == pytest.approx(-0.84, abs=1e-7): return pytest.fail() + ############################################################################### # Test no data is written to correct precision with DECIMAL_PRECISION. def test_aaigrid_12(): - ds = gdal.Open('data/aaigrid/nodata_float.asc') - ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, - options=['DECIMAL_PRECISION=3']) + ds = gdal.Open("data/aaigrid/nodata_float.asc") + ds2 = gdal.GetDriverByName("AAIGRID").CreateCopy( + "tmp/aaigrid.tmp", ds, options=["DECIMAL_PRECISION=3"] + ) del ds2 - aai = open('tmp/aaigrid.tmp') + aai = open("tmp/aaigrid.tmp") assert aai for _ in range(5): aai.readline() ndv = aai.readline().strip().lower() aai.close() - gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') - assert ndv.startswith('nodata_value') - assert ndv.endswith('-99999.000') + gdal.GetDriverByName("AAIGRID").Delete("tmp/aaigrid.tmp") + assert ndv.startswith("nodata_value") + assert ndv.endswith("-99999.000") + ############################################################################### # Test no data is written to correct precision WITH SIGNIFICANT_DIGITS. @@ -295,20 +334,22 @@ def test_aaigrid_12(): def test_aaigrid_13(): - ds = gdal.Open('data/aaigrid/nodata_float.asc') - ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, - options=['SIGNIFICANT_DIGITS=3']) + ds = gdal.Open("data/aaigrid/nodata_float.asc") + ds2 = gdal.GetDriverByName("AAIGRID").CreateCopy( + "tmp/aaigrid.tmp", ds, options=["SIGNIFICANT_DIGITS=3"] + ) del ds2 - aai = open('tmp/aaigrid.tmp') + aai = open("tmp/aaigrid.tmp") assert aai for _ in range(5): aai.readline() ndv = aai.readline().strip().lower() aai.close() - gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') - assert ndv.startswith('nodata_value') - assert ndv.endswith('-1e+05') or ndv.endswith('-1e+005') + gdal.GetDriverByName("AAIGRID").Delete("tmp/aaigrid.tmp") + assert ndv.startswith("nodata_value") + assert ndv.endswith("-1e+05") or ndv.endswith("-1e+005") + ############################################################################### # Test fix for #6060 @@ -316,19 +357,22 @@ def test_aaigrid_13(): def test_aaigrid_14(): - ds = gdal.Open('data/byte.tif') - mem_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Float32) - mem_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, ds.ReadRaster(0, 0, 20, 20, buf_type=gdal.GDT_Float32)) + ds = gdal.Open("data/byte.tif") + mem_ds = gdal.GetDriverByName("MEM").Create("", 20, 20, 1, gdal.GDT_Float32) + mem_ds.GetRasterBand(1).WriteRaster( + 0, 0, 20, 20, ds.ReadRaster(0, 0, 20, 20, buf_type=gdal.GDT_Float32) + ) ds = None - gdal.GetDriverByName('AAIGRID').CreateCopy('/vsimem/aaigrid_14.asc', mem_ds) + gdal.GetDriverByName("AAIGRID").CreateCopy("/vsimem/aaigrid_14.asc", mem_ds) - f = gdal.VSIFOpenL('/vsimem/aaigrid_14.asc', 'rb') - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + f = gdal.VSIFOpenL("/vsimem/aaigrid_14.asc", "rb") + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - gdal.GetDriverByName('AAIGRID').Delete('/vsimem/aaigrid_14.asc') + gdal.GetDriverByName("AAIGRID").Delete("/vsimem/aaigrid_14.asc") + + assert "107.0 123" in data - assert '107.0 123' in data ############################################################################### # Test Float64 detection when nodata = DBL_MIN @@ -336,20 +380,23 @@ def test_aaigrid_14(): def test_aaigrid_15(): - gdal.FileFromMemBuffer('/vsimem/aaigrid_15.asc', """ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/aaigrid_15.asc", + """ncols 4 nrows 1 xllcorner 0 yllcorner -1 cellsize 1 NODATA_value 2.2250738585072014e-308 2.2250738585072014e-308 0 1 2.3e-308 -""") +""", + ) - ds = gdal.Open('/vsimem/aaigrid_15.asc') + ds = gdal.Open("/vsimem/aaigrid_15.asc") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64 ds = None - gdal.Unlink('/vsimem/aaigrid_15.asc') + gdal.Unlink("/vsimem/aaigrid_15.asc") ############################################################################### @@ -358,22 +405,25 @@ def test_aaigrid_15(): def test_aaigrid_null(): - gdal.FileFromMemBuffer('/vsimem/test_aaigrid_null.asc', """ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/test_aaigrid_null.asc", + """ncols 4 nrows 1 xllcorner 0 yllcorner -1 cellsize 1 NODATA_value null null 1.5 null 3.5 -""") +""", + ) - ds = gdal.Open('/vsimem/test_aaigrid_null.asc') + ds = gdal.Open("/vsimem/test_aaigrid_null.asc") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).GetNoDataValue() < -1e38 - assert ds.GetRasterBand(1).ComputeRasterMinMax() == (1.5,3.5) + assert ds.GetRasterBand(1).ComputeRasterMinMax() == (1.5, 3.5) ds = None - gdal.Unlink('/vsimem/test_aaigrid_null.asc') + gdal.Unlink("/vsimem/test_aaigrid_null.asc") ############################################################################### @@ -382,21 +432,23 @@ def test_aaigrid_null(): def test_aaigrid_null_float64(): - gdal.FileFromMemBuffer('/vsimem/test_aaigrid_null.asc', """ncols 4 + gdal.FileFromMemBuffer( + "/vsimem/test_aaigrid_null.asc", + """ncols 4 nrows 1 xllcorner 0 yllcorner -1 cellsize 1 NODATA_value null null 1.5 null 3.5 -""") +""", + ) - with gdaltest.config_option('AAIGRID_DATATYPE', 'Float64'): - ds = gdal.Open('/vsimem/test_aaigrid_null.asc') + with gdaltest.config_option("AAIGRID_DATATYPE", "Float64"): + ds = gdal.Open("/vsimem/test_aaigrid_null.asc") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64 assert ds.GetRasterBand(1).GetNoDataValue() < -1e308 - assert ds.GetRasterBand(1).ComputeRasterMinMax() == (1.5,3.5) + assert ds.GetRasterBand(1).ComputeRasterMinMax() == (1.5, 3.5) ds = None - gdal.Unlink('/vsimem/test_aaigrid_null.asc') - + gdal.Unlink("/vsimem/test_aaigrid_null.asc") diff --git a/autotest/gdrivers/ace2.py b/autotest/gdrivers/ace2.py index 0e8b2a4fbb8e..8641bd2547ca 100755 --- a/autotest/gdrivers/ace2.py +++ b/autotest/gdrivers/ace2.py @@ -28,23 +28,24 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Test a fake ACE2 dataset def test_ace2_1(): - f = gdal.VSIFOpenL('/vsimem/45N015E_5M.ACE2', 'wb') + f = gdal.VSIFOpenL("/vsimem/45N015E_5M.ACE2", "wb") gdal.VSIFSeekL(f, 180 * 180 * 4 - 1, 0) - gdal.VSIFWriteL('\0', 1, 1, f) + gdal.VSIFWriteL("\0", 1, 1, f) gdal.VSIFCloseL(f) - tst = gdaltest.GDALTest('ACE2', '/vsimem/45N015E_5M.ACE2', 1, 0, filename_absolute=1) + tst = gdaltest.GDALTest( + "ACE2", "/vsimem/45N015E_5M.ACE2", 1, 0, filename_absolute=1 + ) expected_gt = [15.0, 0.08333333333333333, 0.0, 60.0, 0.0, -0.08333333333333333] expected_srs = """GEOGCS["WGS 84", DATUM["WGS_1984", @@ -59,9 +60,6 @@ def test_ace2_1(): AUTHORITY["EPSG","4326"]]""" ret = tst.testOpen(check_gt=expected_gt, check_prj=expected_srs) - gdal.Unlink('/vsimem/45N015E_5M.ACE2') + gdal.Unlink("/vsimem/45N015E_5M.ACE2") return ret - - - diff --git a/autotest/gdrivers/adrg.py b/autotest/gdrivers/adrg.py index 0987bae29c04..71ef9ec6ca1f 100755 --- a/autotest/gdrivers/adrg.py +++ b/autotest/gdrivers/adrg.py @@ -31,56 +31,66 @@ import os import shutil -from osgeo import gdal - import gdaltest +from osgeo import gdal + ############################################################################### # Read test of simple byte reference data. def test_adrg_read_gen(): - tst = gdaltest.GDALTest('ADRG', 'adrg/SMALL_ADRG/ABCDEF01.GEN', 1, 62833) + tst = gdaltest.GDALTest("ADRG", "adrg/SMALL_ADRG/ABCDEF01.GEN", 1, 62833) return tst.testOpen() + ############################################################################### # Read test of simple byte reference data by the TRANSH01.THF file . def test_adrg_read_transh(): - tst = gdaltest.GDALTest('ADRG', 'adrg/SMALL_ADRG/TRANSH01.THF', 1, 62833) + tst = gdaltest.GDALTest("ADRG", "adrg/SMALL_ADRG/TRANSH01.THF", 1, 62833) return tst.testOpen() + ############################################################################### # Read test of simple byte reference data by a subdataset file def test_adrg_read_subdataset_img(): - tst = gdaltest.GDALTest('ADRG', 'ADRG:data/adrg/SMALL_ADRG/ABCDEF01.GEN,data/adrg/SMALL_ADRG/ABCDEF01.IMG', 1, 62833, filename_absolute=1) + tst = gdaltest.GDALTest( + "ADRG", + "ADRG:data/adrg/SMALL_ADRG/ABCDEF01.GEN,data/adrg/SMALL_ADRG/ABCDEF01.IMG", + 1, + 62833, + filename_absolute=1, + ) return tst.testOpen() + ############################################################################### # Test copying. def test_adrg_copy(): - drv = gdal.GetDriverByName('ADRG') - srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') + drv = gdal.GetDriverByName("ADRG") + srcds = gdal.Open("data/adrg/SMALL_ADRG/ABCDEF01.GEN") - dstds = drv.CreateCopy('tmp/ABCDEF01.GEN', srcds) + dstds = drv.CreateCopy("tmp/ABCDEF01.GEN", srcds) chksum = dstds.GetRasterBand(1).Checksum() - assert chksum == 62833, 'Wrong checksum' + assert chksum == 62833, "Wrong checksum" dstds = None - drv.Delete('tmp/ABCDEF01.GEN') + drv.Delete("tmp/ABCDEF01.GEN") + ############################################################################### # Test creating a fake 2 subdataset image and reading it. @@ -88,35 +98,36 @@ def test_adrg_copy(): def test_adrg_2subdatasets(): - drv = gdal.GetDriverByName('ADRG') - srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') + drv = gdal.GetDriverByName("ADRG") + srcds = gdal.Open("data/adrg/SMALL_ADRG/ABCDEF01.GEN") - gdal.SetConfigOption('ADRG_SIMULATE_MULTI_IMG', 'ON') - dstds = drv.CreateCopy('tmp/XXXXXX01.GEN', srcds) + gdal.SetConfigOption("ADRG_SIMULATE_MULTI_IMG", "ON") + dstds = drv.CreateCopy("tmp/XXXXXX01.GEN", srcds) del dstds - gdal.SetConfigOption('ADRG_SIMULATE_MULTI_IMG', 'OFF') + gdal.SetConfigOption("ADRG_SIMULATE_MULTI_IMG", "OFF") - shutil.copy('tmp/XXXXXX01.IMG', 'tmp/XXXXXX02.IMG') + shutil.copy("tmp/XXXXXX01.IMG", "tmp/XXXXXX02.IMG") - ds = gdal.Open('tmp/TRANSH01.THF') - assert ds.RasterCount == 0, 'did not expected non 0 RasterCount' + ds = gdal.Open("tmp/TRANSH01.THF") + assert ds.RasterCount == 0, "did not expected non 0 RasterCount" ds = None - ds = gdal.Open('ADRG:tmp/XXXXXX01.GEN,tmp/XXXXXX02.IMG') + ds = gdal.Open("ADRG:tmp/XXXXXX01.GEN,tmp/XXXXXX02.IMG") chksum = ds.GetRasterBand(1).Checksum() - assert chksum == 62833, 'Wrong checksum' + assert chksum == 62833, "Wrong checksum" - md = ds.GetMetadata('') - assert md['ADRG_NAM'] == 'XXXXXX02', 'metadata wrong.' + md = ds.GetMetadata("") + assert md["ADRG_NAM"] == "XXXXXX02", "metadata wrong." ds = None - os.remove('tmp/XXXXXX01.GEN') - os.remove('tmp/XXXXXX01.GEN.aux.xml') - os.remove('tmp/XXXXXX01.IMG') - os.remove('tmp/XXXXXX02.IMG') - os.remove('tmp/TRANSH01.THF') + os.remove("tmp/XXXXXX01.GEN") + os.remove("tmp/XXXXXX01.GEN.aux.xml") + os.remove("tmp/XXXXXX01.IMG") + os.remove("tmp/XXXXXX02.IMG") + os.remove("tmp/TRANSH01.THF") + ############################################################################### # Test creating an in memory copy. @@ -124,27 +135,28 @@ def test_adrg_2subdatasets(): def test_adrg_copy_vsimem(): - drv = gdal.GetDriverByName('ADRG') - srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') + drv = gdal.GetDriverByName("ADRG") + srcds = gdal.Open("data/adrg/SMALL_ADRG/ABCDEF01.GEN") - dstds = drv.CreateCopy('/vsimem/ABCDEF01.GEN', srcds) + dstds = drv.CreateCopy("/vsimem/ABCDEF01.GEN", srcds) chksum = dstds.GetRasterBand(1).Checksum() - assert chksum == 62833, 'Wrong checksum' + assert chksum == 62833, "Wrong checksum" dstds = None # Reopen file - ds = gdal.Open('/vsimem/ABCDEF01.GEN') + ds = gdal.Open("/vsimem/ABCDEF01.GEN") chksum = ds.GetRasterBand(1).Checksum() - assert chksum == 62833, 'Wrong checksum' + assert chksum == 62833, "Wrong checksum" ds = None - drv.Delete('/vsimem/ABCDEF01.GEN') - gdal.Unlink('/vsimem/TRANSH01.THF') + drv.Delete("/vsimem/ABCDEF01.GEN") + gdal.Unlink("/vsimem/TRANSH01.THF") + ############################################################################### # Test reading a fake North Polar dataset (#6560) @@ -152,14 +164,25 @@ def test_adrg_copy_vsimem(): def test_adrg_zna_9(): - ds = gdal.Open('data/adrg/SMALL_ADRG_ZNA9/ABCDEF01.GEN') - expected_gt = (-307675.73602473765, 100.09145391818853, 0.0, -179477.5051066006, 0.0, -100.09145391818853) + ds = gdal.Open("data/adrg/SMALL_ADRG_ZNA9/ABCDEF01.GEN") + expected_gt = ( + -307675.73602473765, + 100.09145391818853, + 0.0, + -179477.5051066006, + 0.0, + -100.09145391818853, + ) gt = ds.GetGeoTransform() - assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5, \ - 'Wrong geotransfsorm' + assert ( + max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5 + ), "Wrong geotransfsorm" wkt = ds.GetProjectionRef() - assert wkt == """PROJCS["ARC_System_Zone_09",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ - 'Wrong WKT' + assert ( + wkt + == """PROJCS["ARC_System_Zone_09",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" + ), "Wrong WKT" + ############################################################################### # Test reading a fake South Polar dataset (#6560) @@ -167,15 +190,24 @@ def test_adrg_zna_9(): def test_adrg_zna_18(): - ds = gdal.Open('data/adrg/SMALL_ADRG_ZNA18/ABCDEF01.GEN') - expected_gt = (-307675.73602473765, 100.09145391818853, 0.0, 179477.5051066006, 0.0, -100.09145391818853) + ds = gdal.Open("data/adrg/SMALL_ADRG_ZNA18/ABCDEF01.GEN") + expected_gt = ( + -307675.73602473765, + 100.09145391818853, + 0.0, + 179477.5051066006, + 0.0, + -100.09145391818853, + ) gt = ds.GetGeoTransform() - assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5, \ - 'Wrong geotransfsorm' + assert ( + max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5 + ), "Wrong geotransfsorm" wkt = ds.GetProjectionRef() - assert wkt == """PROJCS["ARC_System_Zone_18",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",-90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ - 'Wrong WKT' + assert ( + wkt + == """PROJCS["ARC_System_Zone_18",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",-90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" + ), "Wrong WKT" ############################################################################### - diff --git a/autotest/gdrivers/aigrid.py b/autotest/gdrivers/aigrid.py index f84faab9fc4d..d3720b859bd0 100755 --- a/autotest/gdrivers/aigrid.py +++ b/autotest/gdrivers/aigrid.py @@ -31,42 +31,54 @@ import os import shutil -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Read test of simple byte reference data. def test_aigrid_1(): - tst = gdaltest.GDALTest('AIG', 'aigrid/abc3x1', 1, 3) + tst = gdaltest.GDALTest("AIG", "aigrid/abc3x1", 1, 3) return tst.testOpen() + ############################################################################### # Verify some auxiliary data. def test_aigrid_2(): - ds = gdal.Open('data/aigrid/abc3x1/prj.adf') + ds = gdal.Open("data/aigrid/abc3x1/prj.adf") gt = ds.GetGeoTransform() - assert gt[0] == -0.5 and gt[1] == 1.0 and gt[2] == 0.0 and gt[3] == 0.5 and gt[4] == 0.0 and gt[5] == -1.0, \ - 'Aigrid geotransform wrong.' + 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) + 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.GetNoDataValue() == 255, "Grid NODATA value wrong or missing." + + assert band1.DataType == gdal.GDT_Byte, "Data type is not Byte!" - assert band1.DataType == gdal.GDT_Byte, 'Data type is not Byte!' ############################################################################### # Verify the colormap, and nodata setting for test file. @@ -74,37 +86,47 @@ def test_aigrid_2(): def test_aigrid_3(): - ds = gdal.Open('data/aigrid/abc3x1') + ds = gdal.Open("data/aigrid/abc3x1") cm = ds.GetRasterBand(1).GetRasterColorTable() - assert cm.GetCount() == 256 and cm.GetColorEntry(0) == (95, 113, 150, 255) and cm.GetColorEntry(1) == (95, 57, 29, 255), \ - 'Wrong colormap entries' + 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.' + assert ds.GetRasterBand(1).GetNoDataValue() == 255.0, "Wrong nodata value." + + ############################################################################### # Read test of simple byte reference data with data directory name in all uppercase def test_aigrid_4(): - tst = gdaltest.GDALTest('AIG', 'aigrid/ABC3X1UC', 1, 3) + tst = gdaltest.GDALTest("AIG", "aigrid/ABC3X1UC", 1, 3) return tst.testOpen() + ############################################################################### # Verify the colormap, and nodata setting for test file with names of coverage directory and all files in it in all uppercase. Additionally also test for case where clr file resides in parent directory of coverage. def test_aigrid_5(): - ds = gdal.Open('data/aigrid/ABC3X1UC') + ds = gdal.Open("data/aigrid/ABC3X1UC") cm = ds.GetRasterBand(1).GetRasterColorTable() - assert cm.GetCount() == 256 and cm.GetColorEntry(0) == (95, 113, 150, 255) and cm.GetColorEntry(1) == (95, 57, 29, 255), \ - 'Wrong colormap entries' + 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.' + assert ds.GetRasterBand(1).GetNoDataValue() == 255.0, "Wrong nodata value." + ############################################################################### # Verify dataset whose sta.adf is 24 bytes @@ -112,11 +134,12 @@ def test_aigrid_5(): def test_aigrid_6(): - ds = gdal.Open('data/aigrid/aigrid_sta_24bytes/teststa') + ds = gdal.Open("data/aigrid/aigrid_sta_24bytes/teststa") + + assert ds.GetRasterBand(1).GetMinimum() == 0.0, "Wrong minimum" - assert ds.GetRasterBand(1).GetMinimum() == 0.0, 'Wrong minimum' + assert ds.GetRasterBand(1).GetMaximum() == 2.0, "Wrong maximum" - assert ds.GetRasterBand(1).GetMaximum() == 2.0, 'Wrong maximum' ############################################################################### # Read twice a broken tile (https://github.com/OSGeo/gdal/issues/4316) @@ -124,25 +147,26 @@ def test_aigrid_6(): def test_aigrid_broken(): - if os.path.exists('tmp/broken_aigrid'): - shutil.rmtree('tmp/broken_aigrid') + if os.path.exists("tmp/broken_aigrid"): + shutil.rmtree("tmp/broken_aigrid") - shutil.copytree('data/aigrid/abc3x1', 'tmp/broken_aigrid') + shutil.copytree("data/aigrid/abc3x1", "tmp/broken_aigrid") # Write a bad offset for a block - f = gdal.VSIFOpenL('tmp/broken_aigrid/w001001x.adf', 'rb+') + f = gdal.VSIFOpenL("tmp/broken_aigrid/w001001x.adf", "rb+") gdal.VSIFSeekL(f, 100, 0) - gdal.VSIFWriteL(b'\xff' * 4, 1, 4, f) + gdal.VSIFWriteL(b"\xff" * 4, 1, 4, f) gdal.VSIFCloseL(f) - ds = gdal.Open('tmp/broken_aigrid') + ds = gdal.Open("tmp/broken_aigrid") with gdaltest.error_handler(): assert ds.GetRasterBand(1).Checksum() == 0 with gdaltest.error_handler(): assert ds.GetRasterBand(1).Checksum() == 0 ds = None - shutil.rmtree('tmp/broken_aigrid') + shutil.rmtree("tmp/broken_aigrid") + ############################################################################### # Test on real dataset downloaded from http://download.osgeo.org/gdal/data/aig/nzdem @@ -150,67 +174,75 @@ def test_aigrid_broken(): 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'] + 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') + 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): + 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 = 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') + 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') + print("Skipping RAT checking... OG Python bindings have no RAT API") return - assert rat is not None, 'No RAT found' + assert rat is not None, "No RAT found" + + assert rat.GetRowCount() == 2642, "Wrong row count in RAT" - assert rat.GetRowCount() == 2642, 'Wrong row count in RAT' + assert rat.GetColumnCount() == 2, "Wrong column count in RAT" - assert rat.GetColumnCount() == 2, 'Wrong column count in RAT' + assert rat.GetNameOfCol(0) == "VALUE", "Wrong name of col 0" - assert rat.GetNameOfCol(0) == 'VALUE', 'Wrong name of col 0' + assert rat.GetTypeOfCol(0) == gdal.GFT_Integer, "Wrong type 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.GetUsageOfCol(0) == gdal.GFU_MinMax, 'Wrong usage of col 0' + assert rat.GetNameOfCol(1) == "COUNT", "Wrong name of col 1" - assert rat.GetNameOfCol(1) == 'COUNT', 'Wrong name of col 1' + assert rat.GetTypeOfCol(1) == gdal.GFT_Integer, "Wrong type 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.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'Wrong usage of col 1' + assert rat.GetValueAsInt(2641, 0) == 3627, "Wrong value in RAT" - assert rat.GetValueAsInt(2641, 0) == 3627, 'Wrong value in RAT' + assert ds.GetRasterBand(1).GetMinimum() == 0.0, "Wrong minimum" - assert ds.GetRasterBand(1).GetMinimum() == 0.0, 'Wrong minimum' + assert ds.GetRasterBand(1).GetMaximum() == 3627.0, "Wrong maximum" - assert ds.GetRasterBand(1).GetMaximum() == 3627.0, 'Wrong maximum' ############################################################################### # Test on real dataset downloaded from http://download.osgeo.org/gdal/data/aig/nzdem @@ -218,25 +250,27 @@ def test_aigrid_online_1(): 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'): + 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') + os.stat("tmp/cache/ai_bug") except OSError: try: - gdaltest.unzip('tmp/cache', 'tmp/cache/ai_bug_6886') + gdaltest.unzip("tmp/cache", "tmp/cache/ai_bug_6886") try: - os.stat('tmp/cache/ai_bug') + 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) + tst = gdaltest.GDALTest( + "AIG", "tmp/cache/ai_bug/ai_bug/hdr.adf", 1, 16018, filename_absolute=1 + ) return tst.testOpen() -############################################################################### - - +############################################################################### diff --git a/autotest/gdrivers/arg.py b/autotest/gdrivers/arg.py index 5f089f3b0d54..8a267d85fa27 100755 --- a/autotest/gdrivers/arg.py +++ b/autotest/gdrivers/arg.py @@ -31,12 +31,12 @@ import os import struct from copy import copy -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + # given fmt and nodata, encodes a value as bytes @@ -45,19 +45,21 @@ def pack(fmt, nodata, value): 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) + return "".encode("ascii").join(chunks) + ############################################################################### # def test_arg_init(): - gdaltest.argDriver = gdal.GetDriverByName('ARG') + gdaltest.argDriver = gdal.GetDriverByName("ARG") if gdaltest.argDriver is None: pytest.skip() @@ -75,53 +77,64 @@ def test_arg_init(): "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 + "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]}, + { + "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'])) + 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') + 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') + 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: @@ -129,79 +142,83 @@ def test_arg_unsupported(): # 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') + 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') + 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') + 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') + 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) + 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') + tifDriver = gdal.GetDriverByName("GTiff") assert tifDriver is not None - ds = gdal.Open('data/utm.tif') + 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']) + 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) + ds = gdaltest.argDriver.CreateCopy("data/utm.arg", ds2, False) ds2 = None ds = None - stat = os.stat('data/utm.arg') + stat = os.stat("data/utm.arg") - os.remove('data/utm-uneven-blocks.tif') - gdal.GetDriverByName('ARG').Delete('data/utm.arg') + os.remove("data/utm-uneven-blocks.tif") + gdal.GetDriverByName("ARG").Delete("data/utm.arg") assert stat.st_size == (xsize * ysize) @@ -215,34 +232,34 @@ def test_arg_layername(): if gdaltest.argDriver is None: pytest.skip() - ds = gdal.Open('data/arg-int16.arg') + ds = gdal.Open("data/arg-int16.arg") - lyr = 'ARG FTW' + lyr = "ARG FTW" # set the layer name - ds.SetMetadataItem('LAYER', lyr) + ds.SetMetadataItem("LAYER", lyr) # did the layer name stick? - assert ds.GetMetadata()['LAYER'] == lyr + assert ds.GetMetadata()["LAYER"] == lyr # copy the dataset to a new ARG - ds2 = gdaltest.argDriver.CreateCopy('data/arg-int16-2.arg', ds, False) + 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') + ds = gdal.Open("data/arg-int16-2.arg") - lyr2 = ds.GetMetadata()['LAYER'] + lyr2 = ds.GetMetadata()["LAYER"] ds = None - gdal.GetDriverByName('ARG').Delete('data/arg-int16-2.arg') + 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') + os.unlink("data/arg-int16.arg.aux.xml") def test_arg_nodata(): @@ -253,7 +270,7 @@ def test_arg_nodata(): if gdaltest.argDriver is None: pytest.skip() - ds = gdal.Open('data/arg-int8.arg') + ds = gdal.Open("data/arg-int8.arg") assert ds.GetRasterBand(1).GetNoDataValue() == 128 @@ -269,30 +286,30 @@ def test_arg_byteorder(): if gdaltest.argDriver is None: pytest.skip() - tifDriver = gdal.GetDriverByName('GTiff') + tifDriver = gdal.GetDriverByName("GTiff") assert tifDriver is not None for d in gdaltest.argTests: - for (name, _, _) in d['formats']: + for (name, _, _) in d["formats"]: - basename = 'data/arg-' + name - with gdaltest.error_handler('CPLQuietErrorHandler'): - orig = gdal.Open(basename + '.arg') + 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) + dest = tifDriver.CreateCopy(basename + ".tif", orig, False) assert dest is not None - mirror = gdaltest.argDriver.CreateCopy(basename + '2.arg', dest, False) + 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') + tmp1 = open(basename + ".arg", "rb") + tmp2 = open(basename + "2.arg", "rb") data1 = tmp1.read() data2 = tmp2.read() @@ -300,22 +317,17 @@ def test_arg_byteorder(): tmp1.close() tmp2.close() - gdal.GetDriverByName('GTiff').Delete(basename + '.tif') - gdal.GetDriverByName('ARG').Delete(basename + '2.arg') + 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') - - - - + for (name, _, _) in d["formats"]: + os.remove("data/arg-" + name + ".arg") + os.remove("data/arg-" + name + ".json") diff --git a/autotest/gdrivers/bag.py b/autotest/gdrivers/bag.py index d1800d1d7c1d..a3ab3b17b0a9 100755 --- a/autotest/gdrivers/bag.py +++ b/autotest/gdrivers/bag.py @@ -31,19 +31,19 @@ ############################################################################### +import os +import struct from xml.etree import ElementTree import gdaltest -import os import pytest -import struct -from osgeo import gdal -from osgeo import ogr -pytestmark = pytest.mark.require_driver('BAG') +from osgeo import gdal, ogr +pytestmark = pytest.mark.require_driver("BAG") -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def check_no_file_leaks(): num_files = len(gdaltest.get_opened_files()) @@ -51,11 +51,16 @@ def check_no_file_leaks(): diff = len(gdaltest.get_opened_files()) - num_files - if diff != 0 and (gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1804_32bit') or gdaltest.is_travis_branch('fedora') or gdaltest.is_travis_branch('alpine')): - print('Mysterious leak of file handle on some CI setups') + if diff != 0 and ( + gdaltest.is_travis_branch("ubuntu_1804") + or gdaltest.is_travis_branch("ubuntu_1804_32bit") + or gdaltest.is_travis_branch("fedora") + or gdaltest.is_travis_branch("alpine") + ): + print("Mysterious leak of file handle on some CI setups") return - assert diff == 0, 'Leak of file handles: %d leaked' % diff + assert diff == 0, "Leak of file handles: %d leaked" % diff ############################################################################### @@ -64,40 +69,44 @@ def check_no_file_leaks(): def test_bag_2(): - ds = gdal.Open('data/bag/true_n_nominal.bag') + ds = gdal.Open("data/bag/true_n_nominal.bag") cs = ds.GetRasterBand(1).Checksum() - assert cs == 1072, ('Wrong checksum on band 1, got %d.' % cs) + assert cs == 1072, "Wrong checksum on band 1, got %d." % cs cs = ds.GetRasterBand(2).Checksum() - assert cs == 150, ('Wrong checksum on band 2, got %d.' % cs) + assert cs == 150, "Wrong checksum on band 2, got %d." % cs cs = ds.GetRasterBand(3).Checksum() - assert cs == 1315, ('Wrong checksum on band 3, got %d.' % cs) + assert cs == 1315, "Wrong checksum on band 3, got %d." % cs b1 = ds.GetRasterBand(1) - assert b1.GetMinimum() == pytest.approx(10, abs=0.01), 'band 1 minimum wrong.' + assert b1.GetMinimum() == pytest.approx(10, abs=0.01), "band 1 minimum wrong." - assert b1.GetMaximum() == pytest.approx(19.8, abs=0.01), 'band 1 maximum wrong.' + assert b1.GetMaximum() == pytest.approx(19.8, abs=0.01), "band 1 maximum wrong." - assert b1.GetNoDataValue() == pytest.approx(1000000.0, abs=0.1), 'band 1 nodata wrong.' + assert b1.GetNoDataValue() == pytest.approx( + 1000000.0, abs=0.1 + ), "band 1 nodata wrong." b2 = ds.GetRasterBand(2) - assert b2.GetNoDataValue() == pytest.approx(1000000.0, abs=0.1), 'band 2 nodata wrong.' + assert b2.GetNoDataValue() == pytest.approx( + 1000000.0, abs=0.1 + ), "band 2 nodata wrong." b3 = ds.GetRasterBand(3) - assert b3.GetNoDataValue() == pytest.approx(0.0, abs=0.1), 'band 3 nodata wrong.' + assert b3.GetNoDataValue() == pytest.approx(0.0, abs=0.1), "band 3 nodata wrong." # It would be nice to test srs and geotransform but they are # pretty much worthless on this dataset. # Test the xml:BAG metadata domain - xmlBag = ds.GetMetadata('xml:BAG')[0] - assert xmlBag.startswith('= RES_FILTER_MAX with gdaltest.error_handler(): - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'RES_FILTER_MIN=4', - 'RES_FILTER_MAX=4']) + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=[ + "MODE=RESAMPLED_GRID", + "RES_FILTER_MIN=4", + "RES_FILTER_MAX=4", + ], + ) assert ds is None # Test VALUE_POPULATION - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'RES_STRATEGY=MEAN', - 'VALUE_POPULATION=MAX']) + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=[ + "MODE=RESAMPLED_GRID", + "RES_STRATEGY=MEAN", + "VALUE_POPULATION=MAX", + ], + ) m1_max, M1_max, mean1_max, _ = ds.GetRasterBand(1).ComputeStatistics(False) m2_max, M2_max, mean2_max, _ = ds.GetRasterBand(2).ComputeStatistics(False) - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'RES_STRATEGY=MEAN', - 'VALUE_POPULATION=MEAN']) - m1_mean, M1_mean, mean1_mean, _ = ds.GetRasterBand( - 1).ComputeStatistics(False) - m2_mean, M2_mean, mean2_mean, _ = ds.GetRasterBand( - 2).ComputeStatistics(False) - - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'RES_STRATEGY=MEAN', - 'VALUE_POPULATION=MIN']) + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=[ + "MODE=RESAMPLED_GRID", + "RES_STRATEGY=MEAN", + "VALUE_POPULATION=MEAN", + ], + ) + m1_mean, M1_mean, mean1_mean, _ = ds.GetRasterBand(1).ComputeStatistics(False) + m2_mean, M2_mean, mean2_mean, _ = ds.GetRasterBand(2).ComputeStatistics(False) + + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=[ + "MODE=RESAMPLED_GRID", + "RES_STRATEGY=MEAN", + "VALUE_POPULATION=MIN", + ], + ) m1_min, M1_min, mean1_min, _ = ds.GetRasterBand(1).ComputeStatistics(False) m2_min, M2_min, mean2_min, _ = ds.GetRasterBand(2).ComputeStatistics(False) @@ -568,17 +658,24 @@ def test_bag_vr_resampled(): print(m1_min, M1_min, mean1_min) pytest.fail(m2_min, M2_min, mean2_min) - if m2_min >= m2_max or \ - (m2_mean, M2_mean, mean2_mean) != (m2_max, M2_max, mean2_max): + if m2_min >= m2_max or (m2_mean, M2_mean, mean2_mean) != ( + m2_max, + M2_max, + mean2_max, + ): print(m1_max, M1_max, mean1_max) print(m1_mean, M1_mean, mean1_mean) print(m1_min, M1_min, mean1_min) pytest.fail(m2_min, M2_min, mean2_min) - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'RES_STRATEGY=MEAN', - 'VALUE_POPULATION=COUNT']) + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=[ + "MODE=RESAMPLED_GRID", + "RES_STRATEGY=MEAN", + "VALUE_POPULATION=COUNT", + ], + ) assert ds is not None assert ds.RasterCount == 1 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt32 @@ -591,9 +688,10 @@ def test_bag_vr_resampled(): def test_bag_vr_resampled_mask(): - ds = gdal.OpenEx('data/bag/test_vr.bag', - open_options=['MODE=RESAMPLED_GRID', - 'SUPERGRIDS_MASK=YES']) + ds = gdal.OpenEx( + "data/bag/test_vr.bag", + open_options=["MODE=RESAMPLED_GRID", "SUPERGRIDS_MASK=YES"], + ) assert ds is not None assert ds.RasterCount == 1 assert ds.GetRasterBand(1).DataType == gdal.GDT_Byte @@ -601,15 +699,15 @@ def test_bag_vr_resampled_mask(): cs = ds.GetRasterBand(1).Checksum() assert cs == 4552 + ############################################################################### # def test_bag_write_single_band(): - tst = gdaltest.GDALTest('BAG', 'byte.tif', 1, 4672) - ret = tst.testCreateCopy(quiet_error_handler=False, - new_filename='/vsimem/out.bag') + tst = gdaltest.GDALTest("BAG", "byte.tif", 1, 4672) + ret = tst.testCreateCopy(quiet_error_handler=False, new_filename="/vsimem/out.bag") return ret @@ -619,21 +717,28 @@ def test_bag_write_single_band(): def test_bag_write_two_bands(): - tst = gdaltest.GDALTest('BAG', 'bag/test_vr.bag', 2, 60, - options=['BLOCK_SIZE=2', - 'VAR_ABSTRACT=foo', - 'VAR_XML_IDENTIFICATION_CITATION=']) - tst.testCreateCopy(quiet_error_handler=False, - delete_copy=False, - new_filename='/vsimem/out.bag') - - ds = gdal.Open('/vsimem/out.bag') - xml = ds.GetMetadata_List('xml:BAG')[0] - assert '' in xml - assert 'Generated by GDAL ' in xml + tst = gdaltest.GDALTest( + "BAG", + "bag/test_vr.bag", + 2, + 60, + options=[ + "BLOCK_SIZE=2", + "VAR_ABSTRACT=foo", + "VAR_XML_IDENTIFICATION_CITATION=", + ], + ) + tst.testCreateCopy( + quiet_error_handler=False, delete_copy=False, new_filename="/vsimem/out.bag" + ) + + ds = gdal.Open("/vsimem/out.bag") + xml = ds.GetMetadata_List("xml:BAG")[0] + assert "" in xml + assert "Generated by GDAL " in xml assert 'VERT_CS["MLLW depth"' in xml - gdal.Unlink('/vsimem/out.bag') + gdal.Unlink("/vsimem/out.bag") ############################################################################### @@ -643,12 +748,15 @@ def test_bag_write_two_bands(): def test_bag_write_south_up(): # Generate a south-up dataset - src_ds = gdal.Warp('', 'data/byte.tif', - format='MEM', - outputBounds=[440720, 3751320, 441920, 3750120]) + src_ds = gdal.Warp( + "", + "data/byte.tif", + format="MEM", + outputBounds=[440720, 3751320, 441920, 3750120], + ) # Translate it into BAG - ds = gdal.Translate('/vsimem/out.bag', src_ds) + ds = gdal.Translate("/vsimem/out.bag", src_ds) # Check that it is presented as north-up cs = ds.GetRasterBand(1).Checksum() @@ -659,7 +767,7 @@ def test_bag_write_south_up(): ds = None - gdal.Unlink('/vsimem/out.bag') + gdal.Unlink("/vsimem/out.bag") ############################################################################### @@ -668,20 +776,25 @@ def test_bag_write_south_up(): def test_bag_read_invalid_bag_vlen_bag_version(): - os.stat('data/bag/invalid_bag_vlen_bag_version.bag') - ds = gdal.Open('data/bag/invalid_bag_vlen_bag_version.bag') + os.stat("data/bag/invalid_bag_vlen_bag_version.bag") + ds = gdal.Open("data/bag/invalid_bag_vlen_bag_version.bag") assert not ds def test_bag_read_incorrect_northeast_corner(): - ds = gdal.Open('data/bag/test_offset_ne_corner.bag') + ds = gdal.Open("data/bag/test_offset_ne_corner.bag") geotransform = ds.GetGeoTransform() assert geotransform == (85.0, 30.0, 0.0, 500112.0, 0.0, -32.0) - corner_points = ElementTree.fromstring(ds.GetMetadata('xml:BAG')[0])[8][0][6][0][0].text - assert corner_points == '100.000000000000,500000.000000000000 250.000000000000,500096.000000000000' + corner_points = ElementTree.fromstring(ds.GetMetadata("xml:BAG")[0])[8][0][6][0][ + 0 + ].text + assert ( + corner_points + == "100.000000000000,500000.000000000000 250.000000000000,500096.000000000000" + ) del ds @@ -692,115 +805,195 @@ def test_bag_read_incorrect_northeast_corner(): def test_bag_read_georef_metadata(): - ds = gdal.Open('data/bag/test_georef_metadata.bag') + ds = gdal.Open("data/bag/test_georef_metadata.bag") assert ds is not None sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 - assert sub_ds[0][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values' - assert sub_ds[1][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only' - - ds = gdal.OpenEx('data/bag/test_georef_metadata.bag', open_options=['MODE=LIST_SUPERGRIDS']) + assert ( + sub_ds[0][0] + == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values' + ) + assert ( + sub_ds[1][0] + == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only' + ) + + ds = gdal.OpenEx( + "data/bag/test_georef_metadata.bag", open_options=["MODE=LIST_SUPERGRIDS"] + ) assert ds is not None sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 74 - assert sub_ds[1][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0' + assert ( + sub_ds[1][0] + == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0' + ) with gdaltest.error_handler(): - assert gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:not_existing') is None - - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values') + assert ( + gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:not_existing' + ) + is None + ) + + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values' + ) assert ds is not None assert ds.RasterXSize == 6 assert ds.RasterYSize == 4 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('i' * 24, data) - assert data == (0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5) + data = struct.unpack("i" * 24, data) + assert data == ( + 0, + 1, + 2, + 3, + 4, + 5, + 0, + 1, + 2, + 3, + 4, + 5, + 0, + 1, + 2, + 3, + 4, + 5, + 0, + 1, + 2, + 3, + 4, + 5, + ) assert band.GetNoDataValue() == 0 rat = band.GetDefaultRAT() assert rat is not None assert rat.GetRowCount() == 6 assert rat.GetColumnCount() == 3 - assert rat.GetNameOfCol(0) == 'int' + assert rat.GetNameOfCol(0) == "int" assert rat.GetTypeOfCol(0) == gdal.GFT_Integer - assert rat.GetNameOfCol(1) == 'str' + assert rat.GetNameOfCol(1) == "str" assert rat.GetTypeOfCol(1) == gdal.GFT_String - assert rat.GetNameOfCol(2) == 'float64' + assert rat.GetNameOfCol(2) == "float64" assert rat.GetTypeOfCol(2) == gdal.GFT_Real assert rat.GetValueAsInt(0, 0) == 0 - assert rat.GetValueAsString(0, 1) == 'Val ' + assert rat.GetValueAsString(0, 1) == "Val " assert rat.GetValueAsDouble(0, 2) == 1.25 assert rat.GetValueAsInt(1, 0) == 1 - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only') + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only' + ) assert ds is not None assert ds.RasterXSize == 6 assert ds.RasterYSize == 4 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('B' * 24, data) - assert data == (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1) - - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0') + data = struct.unpack("B" * 24, data) + assert data == ( + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + ) + + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0' + ) assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('i' * 4, data) + data = struct.unpack("i" * 4, data) assert data == (1, 0, 1, 1) - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:1') + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:1' + ) assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('i' * 4, data) + data = struct.unpack("i" * 4, data) assert data == (1, 1, 0, 1) - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:0') + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:0' + ) assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('B' * 4, data) + data = struct.unpack("B" * 4, data) assert data == (1, 1, 0, 1) - ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:1') + ds = gdal.Open( + 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:1' + ) assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() - data = struct.unpack('B' * 4, data) + data = struct.unpack("B" * 4, data) assert data == (1, 0, 1, 1) + ############################################################################### # def test_bag_write_single_band_create(): - tmpfilename = '/vsimem/out.bag' - gdal.Warp(tmpfilename, 'data/byte.tif', options='-ot Float32') + tmpfilename = "/vsimem/out.bag" + gdal.Warp(tmpfilename, "data/byte.tif", options="-ot Float32") ds = gdal.Open(tmpfilename) srs = ds.GetSpatialRef() - assert srs.GetAuthorityCode('PROJCS') == '26711' + assert srs.GetAuthorityCode("PROJCS") == "26711" assert ds.GetGeoTransform() == (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetMinimum() == 74.0 assert ds.GetRasterBand(1).GetMaximum() == 255.0 ds = None - gdal.GetDriverByName('BAG').Delete(tmpfilename) + gdal.GetDriverByName("BAG").Delete(tmpfilename) + ############################################################################### # @@ -808,15 +1001,20 @@ def test_bag_write_single_band_create(): def test_bag_write_single_band_create_two_bands(): - tmpfilename = '/vsimem/out.bag' - gdal.Warp(tmpfilename, 'data/bag/test_vr.bag', options='-co BLOCK_SIZE=2 -co VAR_XML_IDENTIFICATION_CITATION=') + tmpfilename = "/vsimem/out.bag" + gdal.Warp( + tmpfilename, + "data/bag/test_vr.bag", + options="-co BLOCK_SIZE=2 -co VAR_XML_IDENTIFICATION_CITATION=", + ) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).Checksum() == 65529 assert ds.GetRasterBand(2).Checksum() == 60 - xml = ds.GetMetadata_List('xml:BAG')[0] - assert '' in xml + xml = ds.GetMetadata_List("xml:BAG")[0] + assert "" in xml ds = None - gdal.GetDriverByName('BAG').Delete(tmpfilename) + gdal.GetDriverByName("BAG").Delete(tmpfilename) + ############################################################################### # @@ -824,7 +1022,7 @@ def test_bag_write_single_band_create_two_bands(): def test_bag_read_tracking_list(): - ds = ogr.Open('data/bag/test_georef_metadata.bag') + ds = ogr.Open("data/bag/test_georef_metadata.bag") assert ds is not None assert ds.GetLayerCount() == 1 assert ds.GetLayer(1) is None @@ -833,21 +1031,20 @@ def test_bag_read_tracking_list(): lyr.ResetReading() f = lyr.GetNextFeature() - assert f['row'] == 0 - assert f['col'] == 1 - assert f['depth'] == 2.5 - assert f['uncertainty'] == 3.5 - assert f['track_code'] == 4 - assert f['list_series'] == 5 + assert f["row"] == 0 + assert f["col"] == 1 + assert f["depth"] == 2.5 + assert f["uncertainty"] == 3.5 + assert f["track_code"] == 4 + assert f["list_series"] == 5 f = lyr.GetNextFeature() - assert f['row'] == 6 - assert f['col'] == 7 - assert f['depth'] == 8.5 - assert f['uncertainty'] == 9.5 - assert f['track_code'] == 10 - assert f['list_series'] == 11 - + assert f["row"] == 6 + assert f["col"] == 7 + assert f["depth"] == 8.5 + assert f["uncertainty"] == 9.5 + assert f["track_code"] == 10 + assert f["list_series"] == 11 ############################################################################### @@ -856,13 +1053,16 @@ def test_bag_read_tracking_list(): def test_bag_write_and_check_xml_size_and_res(): - tmpfilename = '/vsimem/out.bag' - gdal.Translate(tmpfilename, 'data/byte.tif', options='-ot Float32 -outsize 20 10') + tmpfilename = "/vsimem/out.bag" + gdal.Translate(tmpfilename, "data/byte.tif", options="-ot Float32 -outsize 20 10") ds = gdal.Open(tmpfilename) - xml = ds.GetMetadata_List('xml:BAG')[0] - xml = xml.replace(' ', '').replace('\n', '').replace('> <','><') - assert 'row10120column2060' in xml + xml = ds.GetMetadata_List("xml:BAG")[0] + xml = xml.replace(" ", "").replace("\n", "").replace("> <", "><") + assert ( + 'row10120column2060' + in xml + ) gdal.Unlink(tmpfilename) @@ -873,12 +1073,12 @@ def test_bag_write_and_check_xml_size_and_res(): def test_bag_write_values_at_nodata(): - tmpfilename = '/vsimem/out.bag' - ds = gdal.GetDriverByName('BAG').Create(tmpfilename, 1, 3, 2, gdal.GDT_Float32) + tmpfilename = "/vsimem/out.bag" + ds = gdal.GetDriverByName("BAG").Create(tmpfilename, 1, 3, 2, gdal.GDT_Float32) assert ds.GetRasterBand(1).SetNoDataValue(1000000) == gdal.CE_None assert ds.GetRasterBand(2).SetNoDataValue(1000000) == gdal.CE_None - ds.GetRasterBand(1).WriteRaster(0, 0, 1, 3, struct.pack('f' * 3, -12, 1000000, -11)) - ds.GetRasterBand(2).WriteRaster(0, 0, 1, 3, struct.pack('f' * 3, 5, 1000000, 4)) + ds.GetRasterBand(1).WriteRaster(0, 0, 1, 3, struct.pack("f" * 3, -12, 1000000, -11)) + ds.GetRasterBand(2).WriteRaster(0, 0, 1, 3, struct.pack("f" * 3, 5, 1000000, 4)) ds = None ds = gdal.Open(tmpfilename) diff --git a/autotest/gdrivers/basisu.py b/autotest/gdrivers/basisu.py index 1ec00f5bb538..4b993f13cadb 100755 --- a/autotest/gdrivers/basisu.py +++ b/autotest/gdrivers/basisu.py @@ -28,32 +28,36 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import gdaltest import pytest -pytestmark = pytest.mark.require_driver('BASISU') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("BASISU") def test_basisu_read_etc1s(): - ds = gdal.Open('data/basisu/byte_etc1s.basis') - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'ETC1S' + ds = gdal.Open("data/basisu/byte_etc1s.basis") + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "ETC1S" assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 assert ds.RasterCount == 3 - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == [4916] * 3 + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + 4916 + ] * 3 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None def test_basisu_read_uastc(): - ds = gdal.Open('data/basisu/byte_uastc.basis') - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'UASTC' + ds = gdal.Open("data/basisu/byte_uastc.basis") + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "UASTC" assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 assert ds.RasterCount == 3 - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == [4775] * 3 + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + 4775 + ] * 3 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None @@ -62,13 +66,13 @@ def test_basisu_read_two_images(): # File created with "./basisu -tex_type video -multifile_printf "file%d.png" -multifile_first 1 -multifile_num 2" # where file1.png is ../gcore/data/stefan_full_rgba.tif # and file2.png the output of ´gdal_translate file1.png file2.png -scale_1 0 255 255 0 -scale_2 0 255 255 0 -scale_3 0 255 255 0 - ds = gdal.Open('data/basisu/two_images.basis') + ds = gdal.Open("data/basisu/two_images.basis") assert ds.RasterXSize == 0 assert ds.RasterYSize == 0 assert ds.RasterCount == 0 subds_list = ds.GetSubDatasets() assert len(subds_list) == 2 - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") subds = gdal.Open(subds_list[0][0]) assert subds assert subds.RasterXSize == src_ds.RasterXSize @@ -79,107 +83,143 @@ def test_basisu_read_two_images(): assert subds2.RasterXSize == src_ds.RasterXSize assert subds2.RasterYSize == src_ds.RasterYSize assert subds2.RasterCount == src_ds.RasterCount - assert [subds2.GetRasterBand(i+1).Checksum() for i in range(subds.RasterCount)] != [subds.GetRasterBand(i+1).Checksum() for i in range(subds.RasterCount)] - - -@pytest.mark.parametrize("filename", ['BASISU:', - 'BASISU:data/basisu/two_images.basis', - 'BASISU:data/basisu/i_do_not_exist.basis:0', - 'BASISU:data/basisu/two_images.basis:2', - ]) + assert [ + subds2.GetRasterBand(i + 1).Checksum() for i in range(subds.RasterCount) + ] != [subds.GetRasterBand(i + 1).Checksum() for i in range(subds.RasterCount)] + + +@pytest.mark.parametrize( + "filename", + [ + "BASISU:", + "BASISU:data/basisu/two_images.basis", + "BASISU:data/basisu/i_do_not_exist.basis:0", + "BASISU:data/basisu/two_images.basis:2", + ], +) def test_basisu_read_wrong_subds(filename): with gdaltest.error_handler(): assert gdal.Open(filename) is None def test_basisu_write_rgba_output_on_filesystem(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = 'tmp/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy(out_filename, src_ds) is not None + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "tmp/out.basis" + assert gdal.GetDriverByName("BASISU").CreateCopy(out_filename, src_ds) is not None out_ds = gdal.Open(out_filename) assert out_ds.RasterXSize == src_ds.RasterXSize assert out_ds.RasterYSize == src_ds.RasterYSize assert out_ds.RasterCount == src_ds.RasterCount - got_cs = [out_ds.GetRasterBand(i+1).Checksum() for i in range(out_ds.RasterCount)] - assert got_cs in ([7694, 58409, 37321, 8494], # Linux - [7913, 58488, 37737, 8324]) # Windows - assert out_ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'ETC1S' + got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] + assert got_cs in ( + [7694, 58409, 37321, 8494], # Linux + [7913, 58488, 37737, 8324], + ) # Windows + assert out_ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "ETC1S" gdal.Unlink(out_filename) -@pytest.mark.parametrize("compression", ['ETC1S', 'UASTC']) +@pytest.mark.parametrize("compression", ["ETC1S", "UASTC"]) def test_basisu_write_compression(compression): gdal.ErrorReset() - src_ds = gdal.Open('data/byte.tif') - out_filename = '/vsimem/out.basis' - gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=' + compression]) - gdal.Unlink(out_filename + '.aux.xml') + src_ds = gdal.Open("data/byte.tif") + out_filename = "/vsimem/out.basis" + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=" + compression] + ) + gdal.Unlink(out_filename + ".aux.xml") ds = gdal.Open(out_filename) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == compression + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == compression gdal.Unlink(out_filename) def test_basisu_write_mipmap(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - out_ds = gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['MIPMAP=YES']) - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + out_ds = gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["MIPMAP=YES"] + ) + assert gdal.GetLastErrorMsg() == "" assert out_ds.GetRasterBand(1).GetOverviewCount() == 7 ovr_ds = out_ds.GetRasterBand(1).GetOverview(0).GetDataset() assert ovr_ds.RasterXSize == 81 assert ovr_ds.RasterYSize == 75 - got_cs = [ovr_ds.GetRasterBand(i+1).Checksum() for i in range(ovr_ds.RasterCount)] - assert got_cs in ([19694, 16863, 11239, 35973], # Linux - [19968, 16919, 11262, 36022]) # Windows + got_cs = [ovr_ds.GetRasterBand(i + 1).Checksum() for i in range(ovr_ds.RasterCount)] + assert got_cs in ( + [19694, 16863, 11239, 35973], # Linux + [19968, 16919, 11262, 36022], + ) # Windows gdal.Unlink(out_filename) def test_basisu_write_uastc_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_LEVEL=0']) is not None - assert gdal.GetLastErrorMsg() == '' - #size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_LEVEL=2']) is not None - assert gdal.GetLastErrorMsg() == '' - #new_size = gdal.VSIStatL(out_filename).size - #assert new_size != size # would only be true after LZ compression + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_LEVEL=0"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" + # size = gdal.VSIStatL(out_filename).size + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_LEVEL=2"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" + # new_size = gdal.VSIStatL(out_filename).size + # assert new_size != size # would only be true after LZ compression gdal.Unlink(out_filename) def test_basisu_write_uastc_rdo_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_RDO_LEVEL=0.3']) is not None - assert gdal.GetLastErrorMsg() == '' - #size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_RDO_LEVEL=3']) is not None - assert gdal.GetLastErrorMsg() == '' - #new_size = gdal.VSIStatL(out_filename).size - #assert new_size < size # would only be true after LZ compression + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_RDO_LEVEL=0.3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" + # size = gdal.VSIStatL(out_filename).size + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_RDO_LEVEL=3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" + # new_size = gdal.VSIStatL(out_filename).size + # assert new_size < size # would only be true after LZ compression gdal.Unlink(out_filename) def test_basisu_write_etc1s_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_LEVEL=0']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_LEVEL=0"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_LEVEL=3']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_LEVEL=3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size != size gdal.Unlink(out_filename) @@ -187,15 +227,23 @@ def test_basisu_write_etc1s_level(): def test_basisu_write_etc1s_quality_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_QUALITY_LEVEL=1"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=255']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_QUALITY_LEVEL=255"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size > size gdal.Unlink(out_filename) @@ -203,37 +251,64 @@ def test_basisu_write_etc1s_quality_level(): def test_basisu_write_etc1s_clusters_options(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = []) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy(out_filename, src_ds, options=[]) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16128', - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, + src_ds, + options=[ + "ETC1S_MAX_ENDPOINTS_CLUSTERS=16128", + "ETC1S_MAX_SELECTOR_CLUSTERS=16128", + ], + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size > size gdal.Unlink(out_filename) gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16129', # too big - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is None + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, + src_ds, + options=[ + "ETC1S_MAX_ENDPOINTS_CLUSTERS=16129", # too big + "ETC1S_MAX_SELECTOR_CLUSTERS=16128", + ], + ) + is None + ) + def test_basisu_write_colorspace(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COLORSPACE=PERCEPTUAL_SRGB']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COLORSPACE=PERCEPTUAL_SRGB"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['COLORSPACE=LINEAR']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["COLORSPACE=LINEAR"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size != size gdal.Unlink(out_filename) @@ -241,60 +316,82 @@ def test_basisu_write_colorspace(): def test_basisu_write_num_threads(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" # Just check that it works - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['NUM_THREADS=1']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["NUM_THREADS=1"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" gdal.Unlink(out_filename) def test_basisu_write_etc1s_incompatible_or_missing_options(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.basis' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.basis" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16128']) is None - assert gdal.GetLastErrorMsg() != '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_MAX_ENDPOINTS_CLUSTERS=16128"] + ) + is None + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is None - assert gdal.GetLastErrorMsg() != '' + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, src_ds, options=["ETC1S_MAX_SELECTOR_CLUSTERS=16128"] + ) + is None + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1', - 'ETC1S_MAX_ENDPOINTS_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorType() == 2 # warning + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, + src_ds, + options=["ETC1S_QUALITY_LEVEL=1", "ETC1S_MAX_ENDPOINTS_CLUSTERS=16128"], + ) + is not None + ) + assert gdal.GetLastErrorType() == 2 # warning gdal.Unlink(out_filename) gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1', - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorType() == 2 # warning + assert ( + gdal.GetDriverByName("BASISU").CreateCopy( + out_filename, + src_ds, + options=["ETC1S_QUALITY_LEVEL=1", "ETC1S_MAX_SELECTOR_CLUSTERS=16128"], + ) + is not None + ) + assert gdal.GetLastErrorType() == 2 # warning gdal.Unlink(out_filename) def test_basisu_write_incompatible_source(): - out_filename = '/vsimem/out.basis' + out_filename = "/vsimem/out.basis" - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 0) with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("BASISU").CreateCopy(out_filename, src_ds) is None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 5) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 5) with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("BASISU").CreateCopy(out_filename, src_ds) is None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_UInt16) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_UInt16) with gdaltest.error_handler(): - assert gdal.GetDriverByName('BASISU').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("BASISU").CreateCopy(out_filename, src_ds) is None diff --git a/autotest/gdrivers/blx.py b/autotest/gdrivers/blx.py index 63afadcb9e1c..bc3f7c080847 100755 --- a/autotest/gdrivers/blx.py +++ b/autotest/gdrivers/blx.py @@ -28,74 +28,73 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal ############################################################################### # Test reading a little-endian BLX + def test_blx_1(): - prj = 'WGS84' + prj = "WGS84" gt = [20.0004166, 0.0008333, 0.0, 50.0004166, 0.0, -0.0008333] - tst = gdaltest.GDALTest('BLX', 'blx/s4103.blx', 1, 47024) + tst = gdaltest.GDALTest("BLX", "blx/s4103.blx", 1, 47024) return tst.testOpen(check_prj=prj, check_gt=gt) ############################################################################### # Test reading a big-endian BLX + def test_blx_2(): - prj = 'WGS84' + prj = "WGS84" gt = [20.0004166, 0.0008333, 0.0, 50.0004166, 0.0, -0.0008333] - tst = gdaltest.GDALTest('BLX', 'blx/s4103.xlb', 1, 47024) + tst = gdaltest.GDALTest("BLX", "blx/s4103.xlb", 1, 47024) return tst.testOpen(check_prj=prj, check_gt=gt) ############################################################################### # Test writing a little-endian BLX + def test_blx_3(): - tst = gdaltest.GDALTest('BLX', 'blx/s4103.xlb', 1, 47024) + tst = gdaltest.GDALTest("BLX", "blx/s4103.xlb", 1, 47024) return tst.testCreateCopy(check_gt=1, check_srs=1) ############################################################################### # Test writing a big-endian BLX + def test_blx_4(): - tst = gdaltest.GDALTest('BLX', 'blx/s4103.blx', 1, 47024, options=['BIGENDIAN=YES']) + tst = gdaltest.GDALTest("BLX", "blx/s4103.blx", 1, 47024, options=["BIGENDIAN=YES"]) return tst.testCreateCopy(check_gt=1, check_srs=1) ############################################################################### # Test overviews + def test_blx_5(): - ds = gdal.Open('data/blx/s4103.blx') + ds = gdal.Open("data/blx/s4103.blx") band = ds.GetRasterBand(1) - assert band.GetOverviewCount() == 4, 'did not get expected overview count' + assert band.GetOverviewCount() == 4, "did not get expected overview count" cs = band.GetOverview(0).Checksum() - assert cs == 42981, ('wrong overview checksum (%d)' % cs) + assert cs == 42981, "wrong overview checksum (%d)" % cs cs = band.GetOverview(1).Checksum() - assert cs == 61363, ('wrong overview checksum (%d)' % cs) + assert cs == 61363, "wrong overview checksum (%d)" % cs cs = band.GetOverview(2).Checksum() - assert cs == 48060, ('wrong overview checksum (%d)' % cs) + assert cs == 48060, "wrong overview checksum (%d)" % cs cs = band.GetOverview(3).Checksum() - assert cs == 12058, ('wrong overview checksum (%d)' % cs) - - - - + assert cs == 12058, "wrong overview checksum (%d)" % cs diff --git a/autotest/gdrivers/bsb.py b/autotest/gdrivers/bsb.py index 9afe4cd3fd1a..9aae7cb68d48 100755 --- a/autotest/gdrivers/bsb.py +++ b/autotest/gdrivers/bsb.py @@ -28,23 +28,21 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr - - import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Test driver availability def test_bsb_0(): - gdaltest.bsb_dr = gdal.GetDriverByName('BSB') + gdaltest.bsb_dr = gdal.GetDriverByName("BSB") if gdaltest.bsb_dr is None: pytest.skip() - + ############################################################################### # Test Read @@ -53,10 +51,11 @@ def test_bsb_1(): if gdaltest.bsb_dr is None: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall.kap', 1, 30321) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall.kap", 1, 30321) return tst.testOpen() + ############################################################################### # Test CreateCopy @@ -66,13 +65,14 @@ def test_bsb_2(): pytest.skip() md = gdaltest.bsb_dr.GetMetadata() - if 'DMD_CREATIONDATATYPES' not in md: + if "DMD_CREATIONDATATYPES" not in md: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall.kap', 1, 30321) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall.kap", 1, 30321) return tst.testCreateCopy() + ############################################################################### # Read a BSB with an index table at the end (#2782) # The rgbsmall_index.kap has been generated from rgbsmall.kap by moving the @@ -84,10 +84,11 @@ def test_bsb_3(): if gdaltest.bsb_dr is None: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_index.kap', 1, 30321) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall_index.kap", 1, 30321) return tst.testOpen() + ############################################################################### # Read a BSB without an index table but with 0 in the middle of line data # The rgbsmall_with_line_break.kap has been generated from rgbsmall.kap by @@ -98,10 +99,11 @@ def test_bsb_4(): if gdaltest.bsb_dr is None: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_with_line_break.kap', 1, 30321) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall_with_line_break.kap", 1, 30321) return tst.testOpen() + ############################################################################### # Read a truncated BSB (at the level of the written scanline number starting a new row) @@ -110,14 +112,15 @@ def test_bsb_5(): if gdaltest.bsb_dr is None: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_truncated.kap', 1, 29696) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall_truncated.kap", 1, 29696) - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = tst.testOpen() gdal.PopErrorHandler() return ret + ############################################################################### # Read another truncated BSB (in the middle of row data) @@ -126,25 +129,41 @@ def test_bsb_6(): if gdaltest.bsb_dr is None: pytest.skip() - tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_truncated2.kap', 1, 29696) + tst = gdaltest.GDALTest("BSB", "bsb/rgbsmall_truncated2.kap", 1, 29696) - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = tst.testOpen() gdal.PopErrorHandler() return ret + ############################################################################### + def test_bsb_tmerc(): if gdaltest.bsb_dr is None: pytest.skip() - ds = gdal.Open('data/bsb/transverse_mercator.kap') + ds = gdal.Open("data/bsb/transverse_mercator.kap") gt = ds.GetGeoTransform() - expected_gt = [28487.6637325402, 1.2711141208521637, 0.009061669923111566, - 6539651.728646593, 0.015209115944776083, -1.267821834560455] - assert min([gt[i] == pytest.approx(expected_gt[i], abs=1e-8 * abs(expected_gt[i])) for i in range(6)]) == True, gt + expected_gt = [ + 28487.6637325402, + 1.2711141208521637, + 0.009061669923111566, + 6539651.728646593, + 0.015209115944776083, + -1.267821834560455, + ] + assert ( + min( + [ + gt[i] == pytest.approx(expected_gt[i], abs=1e-8 * abs(expected_gt[i])) + for i in range(6) + ] + ) + == True + ), gt expected_wkt = """PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", @@ -167,7 +186,7 @@ def test_bsb_tmerc(): AXIS["Northing",NORTH]]""" expected_sr = osr.SpatialReference() expected_sr.SetFromUserInput(expected_wkt) - expected_sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); + expected_sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) got_sr = ds.GetSpatialRef() assert expected_sr.IsSame(got_sr), got_sr.ExportToWkt() got_sr = ds.GetGCPSpatialRef() @@ -176,11 +195,14 @@ def test_bsb_tmerc(): gcps = ds.GetGCPs() assert len(gcps) == 3 - assert gcps[0].GCPPixel == 25 and \ - gcps[0].GCPLine == 577 and \ - gcps[0].GCPX == pytest.approx(28524.670169107143, abs=1e-5) and \ - gcps[0].GCPY == pytest.approx(6538920.57567595, abs=1e-5) and \ - gcps[0].GCPZ == 0 + assert ( + gcps[0].GCPPixel == 25 + and gcps[0].GCPLine == 577 + and gcps[0].GCPX == pytest.approx(28524.670169107143, abs=1e-5) + and gcps[0].GCPY == pytest.approx(6538920.57567595, abs=1e-5) + and gcps[0].GCPZ == 0 + ) + ############################################################################### @@ -189,5 +211,8 @@ def test_bsb_cutline(): if gdaltest.bsb_dr is None: pytest.skip() - ds = gdal.Open('data/bsb/australia4c.kap') - assert ds.GetMetadataItem('BSB_CUTLINE') == 'POLYGON ((112.72859333333334 -8.25404666666667,156.57827333333333 -7.66159166666667,164.28394166666666 -40.89653000000000,106.53042166666667 -41.14970000000000))' + ds = gdal.Open("data/bsb/australia4c.kap") + assert ( + ds.GetMetadataItem("BSB_CUTLINE") + == "POLYGON ((112.72859333333334 -8.25404666666667,156.57827333333333 -7.66159166666667,164.28394166666666 -40.89653000000000,106.53042166666667 -41.14970000000000))" + ) diff --git a/autotest/gdrivers/bt.py b/autotest/gdrivers/bt.py index a5d3d1e6f165..bdd2a08a27d1 100755 --- a/autotest/gdrivers/bt.py +++ b/autotest/gdrivers/bt.py @@ -28,23 +28,25 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import osr - - -from osgeo import gdal import gdaltest +from osgeo import gdal, osr + ############################################################################### # Test CreateCopy() of int16.tif def test_bt_1(): - tst = gdaltest.GDALTest('BT', 'int16.tif', 1, 4672) + 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)) + 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 @@ -52,11 +54,14 @@ def test_bt_1(): def test_bt_2(): - tst = gdaltest.GDALTest('BT', 'int32.tif', 1, 4672) + 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)) + 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 @@ -64,11 +69,14 @@ def test_bt_2(): def test_bt_3(): - tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) + 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)) + 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 @@ -76,36 +84,36 @@ def test_bt_3(): def test_bt_4(): - tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) + 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) + 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) + 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') - - - + gdal.Unlink("/vsimem/int16.tif.prj") + gdal.Unlink("tmp/int32.tif.prj") + gdal.Unlink("tmp/float32.tif.prj") diff --git a/autotest/gdrivers/byn.py b/autotest/gdrivers/byn.py index ef593e402023..22e49b109674 100755 --- a/autotest/gdrivers/byn.py +++ b/autotest/gdrivers/byn.py @@ -31,7 +31,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -40,22 +39,25 @@ def test_byn_1(): - tst = gdaltest.GDALTest('BYN', 'byn/cgg2013ai08_reduced.byn', 1, 64764) + tst = gdaltest.GDALTest("BYN", "byn/cgg2013ai08_reduced.byn", 1, 64764) return tst.testOpen() + ############################################################################### # + def test_byn_2(): - tst = gdaltest.GDALTest('BYN', 'byn/cgg2013ai08_reduced.byn', 1, 64764) - return tst.testCreateCopy(new_filename='tmp/byn_test_2.byn') + tst = gdaltest.GDALTest("BYN", "byn/cgg2013ai08_reduced.byn", 1, 64764) + return tst.testCreateCopy(new_filename="tmp/byn_test_2.byn") + ############################################################################### # + def test_byn_invalid_header_bytes(): - tst = gdaltest.GDALTest('BYN', 'byn/test_invalid_header_bytes.byn', 1, 64764) + tst = gdaltest.GDALTest("BYN", "byn/test_invalid_header_bytes.byn", 1, 64764) return tst.testOpen() - diff --git a/autotest/gdrivers/cals.py b/autotest/gdrivers/cals.py index 5b06debdf70c..9f3c2363beda 100755 --- a/autotest/gdrivers/cals.py +++ b/autotest/gdrivers/cals.py @@ -29,9 +29,9 @@ ############################################################################### +import gdaltest from osgeo import gdal -import gdaltest ############################################################################### # Source has no color table @@ -39,10 +39,11 @@ def test_cals_1(): - tst = gdaltest.GDALTest('CALS', 'hfa/small1bit.img', 1, 9907) + tst = gdaltest.GDALTest("CALS", "hfa/small1bit.img", 1, 9907) return tst.testCreateCopy() + ############################################################################### # Source has a color table (0,0,0),(255,255,255) @@ -50,31 +51,33 @@ def test_cals_1(): def test_cals_2(): # Has no color table - tst = gdaltest.GDALTest('CALS', '../../gcore/data/oddsize1bit.tif', 1, 3883) + tst = gdaltest.GDALTest("CALS", "../../gcore/data/oddsize1bit.tif", 1, 3883) return tst.testCreateCopy() + ############################################################################### # Source has a color table (255,255,255),(0,0,0) def test_cals_3(): - src_ds = gdal.Open('../gcore/data/oddsize1bit.tif') - tmp_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_2_tmp.cal', src_ds) - tmp_ds.SetMetadataItem('TIFFTAG_XRESOLUTION', '600') - tmp_ds.SetMetadataItem('TIFFTAG_YRESOLUTION', '600') - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_2.cal', tmp_ds) - assert gdal.VSIStatL('/vsimem/cals_2.cal.aux.xml') is None + src_ds = gdal.Open("../gcore/data/oddsize1bit.tif") + tmp_ds = gdal.GetDriverByName("CALS").CreateCopy("/vsimem/cals_2_tmp.cal", src_ds) + tmp_ds.SetMetadataItem("TIFFTAG_XRESOLUTION", "600") + tmp_ds.SetMetadataItem("TIFFTAG_YRESOLUTION", "600") + out_ds = gdal.GetDriverByName("CALS").CreateCopy("/vsimem/cals_2.cal", tmp_ds) + assert gdal.VSIStatL("/vsimem/cals_2.cal.aux.xml") is None assert out_ds.GetRasterBand(1).Checksum() == 3883 - assert out_ds.GetMetadataItem('PIXEL_PATH') is None - assert out_ds.GetMetadataItem('TIFFTAG_XRESOLUTION') == '600' + assert out_ds.GetMetadataItem("PIXEL_PATH") is None + assert out_ds.GetMetadataItem("TIFFTAG_XRESOLUTION") == "600" assert out_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex tmp_ds = None out_ds = None - gdal.Unlink('/vsimem/cals_2_tmp.cal') - gdal.Unlink('/vsimem/cals_2_tmp.cal.aux.xml') - gdal.Unlink('/vsimem/cals_2.cal') + gdal.Unlink("/vsimem/cals_2_tmp.cal") + gdal.Unlink("/vsimem/cals_2_tmp.cal.aux.xml") + gdal.Unlink("/vsimem/cals_2.cal") + ############################################################################### # Test CreateCopy() error conditions @@ -83,61 +86,67 @@ def test_cals_3(): def test_cals_4(): # 0 band - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 0) gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds) + out_ds = gdal.GetDriverByName("CALS").CreateCopy("/vsimem/cals_4.cal", src_ds) gdal.PopErrorHandler() assert out_ds is None # 2 bands - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) + out_ds = gdal.GetDriverByName("CALS").CreateCopy( + "/vsimem/cals_4.cal", src_ds, strict=True + ) gdal.PopErrorHandler() assert out_ds is None # 1 band but not 1-bit - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) + out_ds = gdal.GetDriverByName("CALS").CreateCopy( + "/vsimem/cals_4.cal", src_ds, strict=True + ) gdal.PopErrorHandler() assert out_ds is None # Dimension > 999999 - src_ds = gdal.GetDriverByName('MEM').Create('', 1000000, 1, 1) - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') + src_ds = gdal.GetDriverByName("MEM").Create("", 1000000, 1, 1) + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", "1", "IMAGE_STRUCTURE") gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) + out_ds = gdal.GetDriverByName("CALS").CreateCopy( + "/vsimem/cals_4.cal", src_ds, strict=True + ) gdal.PopErrorHandler() assert out_ds is None # Invalid output filename - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", "1", "IMAGE_STRUCTURE") gdal.PushErrorHandler() - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/not_existing_dir/cals_4.cal', src_ds) + out_ds = gdal.GetDriverByName("CALS").CreateCopy( + "/not_existing_dir/cals_4.cal", src_ds + ) gdal.PopErrorHandler() assert out_ds is None + ############################################################################### # Test PIXEL_PATH & LINE_PROGRESSION metadata item def test_cals_5(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') - src_ds.SetMetadataItem('PIXEL_PATH', '90') - src_ds.SetMetadataItem('LINE_PROGRESSION', '270') - out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_5.cal', src_ds) - assert gdal.VSIStatL('/vsimem/cals_5.cal.aux.xml') is None - assert out_ds.GetMetadataItem('PIXEL_PATH') == '90' - assert out_ds.GetMetadataItem('LINE_PROGRESSION') == '270' + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", "1", "IMAGE_STRUCTURE") + src_ds.SetMetadataItem("PIXEL_PATH", "90") + src_ds.SetMetadataItem("LINE_PROGRESSION", "270") + out_ds = gdal.GetDriverByName("CALS").CreateCopy("/vsimem/cals_5.cal", src_ds) + assert gdal.VSIStatL("/vsimem/cals_5.cal.aux.xml") is None + assert out_ds.GetMetadataItem("PIXEL_PATH") == "90" + assert out_ds.GetMetadataItem("LINE_PROGRESSION") == "270" out_ds = None - gdal.Unlink('/vsimem/cals_5.cal') - -############################################################################### - - + gdal.Unlink("/vsimem/cals_5.cal") +############################################################################### diff --git a/autotest/gdrivers/ceos.py b/autotest/gdrivers/ceos.py index 1e535876c056..44a77a330914 100755 --- a/autotest/gdrivers/ceos.py +++ b/autotest/gdrivers/ceos.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -39,9 +38,7 @@ def test_ceos_1(): - tst = gdaltest.GDALTest('CEOS', 'ceos/IMAGERY-75K.L-3', 4, 9956, - xoff=0, yoff=0, xsize=5932, ysize=3) + tst = gdaltest.GDALTest( + "CEOS", "ceos/IMAGERY-75K.L-3", 4, 9956, xoff=0, yoff=0, xsize=5932, ysize=3 + ) return tst.testOpen() - - - diff --git a/autotest/gdrivers/cpg.py b/autotest/gdrivers/cpg.py index 7ac77e89e7ca..1fa29a65c1a5 100755 --- a/autotest/gdrivers/cpg.py +++ b/autotest/gdrivers/cpg.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_cpg_1(): - tst = gdaltest.GDALTest('CPG', 'cpg/fakecpgSIRC.hdr', 1, 0) + tst = gdaltest.GDALTest("CPG", "cpg/fakecpgSIRC.hdr", 1, 0) return tst.testOpen() - - - diff --git a/autotest/gdrivers/ctg.py b/autotest/gdrivers/ctg.py index 4012cee45623..306f25c41717 100755 --- a/autotest/gdrivers/ctg.py +++ b/autotest/gdrivers/ctg.py @@ -28,18 +28,17 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Test a fake CTG dataset def test_ctg_1(): - tst = gdaltest.GDALTest('CTG', 'ctg/fake_grid_cell', 1, 21) + tst = gdaltest.GDALTest("CTG", "ctg/fake_grid_cell", 1, 21) expected_gt = [421000.0, 200.0, 0.0, 5094400.0, 0.0, -200.0] expected_srs = """PROJCS["WGS 84 / UTM zone 14N", GEOGCS["WGS 84", @@ -65,16 +64,14 @@ def test_ctg_1(): AXIS["Northing",NORTH]]""" ret = tst.testOpen(check_gt=expected_gt, check_prj=expected_srs) - if ret == 'success': - ds = gdal.Open('data/ctg/fake_grid_cell') + if ret == "success": + ds = gdal.Open("data/ctg/fake_grid_cell") lst = ds.GetRasterBand(1).GetCategoryNames() - assert lst is not None and lst, 'expected non empty category names for band 1' + assert lst is not None and lst, "expected non empty category names for band 1" lst = ds.GetRasterBand(2).GetCategoryNames() - assert lst is None, 'expected empty category names for band 2' - assert ds.GetRasterBand(1).GetNoDataValue() == 0, \ - 'did not get expected nodata value' + assert lst is None, "expected empty category names for band 2" + assert ( + ds.GetRasterBand(1).GetNoDataValue() == 0 + ), "did not get expected nodata value" return ret - - - diff --git a/autotest/gdrivers/daas.py b/autotest/gdrivers/daas.py index 18b4f91c4429..4bb1130b68fb 100755 --- a/autotest/gdrivers/daas.py +++ b/autotest/gdrivers/daas.py @@ -33,38 +33,44 @@ import json import sys -sys.path.append('../pymod') - -from osgeo import gdal +sys.path.append("../pymod") import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal -pytestmark = pytest.mark.require_driver('DAAS') +pytestmark = pytest.mark.require_driver("DAAS") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): # Unset environment variables that influence the driver behavior daas_vars = {} - for var in ('GDAL_DAAS_API_KEY', 'GDAL_DAAS_CLIENT_ID', 'GDAL_DAAS_AUTH_URL', 'GDAL_DAAS_ACCESS_TOKEN'): + for var in ( + "GDAL_DAAS_API_KEY", + "GDAL_DAAS_CLIENT_ID", + "GDAL_DAAS_AUTH_URL", + "GDAL_DAAS_ACCESS_TOKEN", + ): daas_vars[var] = gdal.GetConfigOption(var) if daas_vars[var] is not None: gdal.SetConfigOption(var, "") - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if gdaltest.webserver_port == 0: pytest.skip() yield if gdaltest.webserver_port != 0: - webserver.server_stop(gdaltest.webserver_process, - gdaltest.webserver_port) + webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) - gdal.RmdirRecursive('/vsimem/cache_dir') + gdal.RmdirRecursive("/vsimem/cache_dir") for var in daas_vars: gdal.SetConfigOption(var, daas_vars[var]) @@ -79,56 +85,86 @@ def test_daas_missing_parameters(): ds = gdal.Open("DAAS:") assert not ds + ############################################################################### def test_daas_authentication_failure(): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'missing_GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "missing_GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'missing_GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" % gdaltest.webserver_port, + "missing_GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 400, {}, - '{"error":"unauthorized_client","error_description":"UNKNOWN_CLIENT: Client was not identified by any client authenticator"}') + handler.add( + "POST", + "/auth", + 400, + {}, + '{"error":"unauthorized_client","error_description":"UNKNOWN_CLIENT: Client was not identified by any client authenticator"}', + ) with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 200, {}, 'invalid json') + handler.add("POST", "/auth", 200, {}, "invalid json") with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 200, {}, '{ "missing_access_token": null }') + handler.add("POST", "/auth", 200, {}, '{ "missing_access_token": null }') with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds + ############################################################################### @@ -137,180 +173,265 @@ def test_daas_authentication(): # API_KEY + CLIENT_ID handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 200, - {'Content-type': 'application/json'}, - '{"access_token": "my_token"}', - expected_body='client_id=client_id&apikey=api_key&grant_type=api_key'.encode('ascii')) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, - expected_headers={'Authorization': 'Bearer my_token'}) + handler.add( + "POST", + "/auth", + 200, + {"Content-type": "application/json"}, + '{"access_token": "my_token"}', + expected_body="client_id=client_id&apikey=api_key&grant_type=api_key".encode( + "ascii" + ), + ) + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 404, + expected_headers={"Authorization": "Bearer my_token"}, + ) with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) # Test X-Forwarded-User handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 200, {}, '{ "access_token": "my_token" }') - handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, - expected_headers={'Authorization': 'Bearer my_token', - 'X-Forwarded-User': 'user'}) + handler.add("POST", "/auth", 200, {}, '{ "access_token": "my_token" }') + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 404, + expected_headers={ + "Authorization": "Bearer my_token", + "X-Forwarded-User": "user", + }, + ) with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): - gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, - open_options=['X_FORWARDED_USER=user']) + gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["X_FORWARDED_USER=user"], + ) # Test token expiration handler = webserver.SequentialHandler() - handler.add('POST', '/auth', 200, {}, - '{ "access_token": "my_token", "expires_in": 1 }') - handler.add('POST', '/auth', 200, {}, - '{ "access_token": "my_token", "expires_in": 1 }') - handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, {}) + handler.add( + "POST", "/auth", 200, {}, '{ "access_token": "my_token", "expires_in": 1 }' + ) + handler.add( + "POST", "/auth", 200, {}, '{ "access_token": "my_token", "expires_in": 1 }' + ) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 404, {}) with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, - 'GDAL_DAAS_CLIENT_ID': 'client_id', - 'GDAL_DAAS_API_KEY': 'api_key'}): + with gdaltest.config_options( + { + "GDAL_DAAS_AUTH_URL": "http://127.0.0.1:%d/auth" + % gdaltest.webserver_port, + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + "GDAL_DAAS_CLIENT_ID": "client_id", + "GDAL_DAAS_API_KEY": "api_key", + } + ): with gdaltest.error_handler(): gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) # Test ACCESS_TOKEN handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, - expected_headers={'Authorization': 'Bearer my_token'}) + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 404, + expected_headers={"Authorization": "Bearer my_token"}, + ) with webserver.install_http_handler(handler): - with gdaltest.config_options({'GDAL_DAAS_ACCESS_TOKEN': 'my_token', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + with gdaltest.config_options( + { + "GDAL_DAAS_ACCESS_TOKEN": "my_token", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): gdal.OpenEx( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) + ############################################################################### def test_daas_getimagemetadata_failure(): - def test_json(j): handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps(j)) + handler.add( + "GET", "/daas/sensors/products/foo/images/bar", 200, {}, json.dumps(j) + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) return ds # Empty content returned by server handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 404, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds # Error with json payload handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', - 404, {}, '{ "foo":"bar" }') + handler.add( + "GET", "/daas/sensors/products/foo/images/bar", 404, {}, '{ "foo":"bar" }' + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds # Success but empty response handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 200, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds # Success but invalid JSon handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', - 200, {}, 'invalid json') + handler.add("GET", "/daas/sensors/products/foo/images/bar", 200, {}, "invalid json") with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds - min_valid_json = { "properties": { "width": 1, "height": 1, - "_links": { "getBuffer": { "href": "http://example.com" } }, - "bands": [{"name": "PAN", "pixelType": "Byte"}] } + "_links": {"getBuffer": {"href": "http://example.com"}}, + "bands": [{"name": "PAN", "pixelType": "Byte"}], + } } # Check that min_valid_json actually works gdal.ErrorReset() assert test_json(min_valid_json) is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" # Valid JSon but missing response/payload/payload/imageMetadata/properties or properties assert test_json({}) is None # Valid JSon but missing properties - for prop_to_del in ['width', 'height', 'bands', '_links']: + for prop_to_del in ["width", "height", "bands", "_links"]: j = copy.deepcopy(min_valid_json) - del j['properties'][prop_to_del] + del j["properties"][prop_to_del] assert test_json(j) is None # Valid JSon but invalid width (negative value) j = copy.deepcopy(min_valid_json) - j['properties']['width'] = -1 + j["properties"]["width"] = -1 assert test_json(j) is None # Valid JSon but invalid height (string) j = copy.deepcopy(min_valid_json) - j['properties']['height'] = 'foo' + j["properties"]["height"] = "foo" assert test_json(j) is None # Missing pixelType j = copy.deepcopy(min_valid_json) - del j['properties']['bands'][0]['pixelType'] + del j["properties"]["bands"][0]["pixelType"] assert test_json(j) is None # Invalid pixelType j = copy.deepcopy(min_valid_json) - j['properties']['bands'][0]['pixelType'] = 'foo' + j["properties"]["bands"][0]["pixelType"] = "foo" assert test_json(j) is None # Invalid rpc j = copy.deepcopy(min_valid_json) - j['properties']['rpc'] = {} + j["properties"]["rpc"] = {} gdal.ErrorReset() ds = test_json(j) is None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ############################################################################### @@ -320,223 +441,417 @@ def test_daas_getimagemetadata(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 3, - "actualBitDepth": 7, - "noDataValue": 0, - "metadataInt": 123, - "acquisitionDate": "2018-02-05T22:28:27.242Z", - "cloudCover": 12.345678, - "satellite": "MY_SATELLITE", - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "geotransform": [2, 0, 0.1, 49, 0, -0.1], - "bands": [ - { - "name": "PAN", - "description": "Panchromatic band", - "colorInterpretation": "GRAY", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 3, + "actualBitDepth": 7, + "noDataValue": 0, + "metadataInt": 123, + "acquisitionDate": "2018-02-05T22:28:27.242Z", + "cloudCover": 12.345678, + "satellite": "MY_SATELLITE", + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "geotransform": [2, 0, 0.1, 49, 0, -0.1], + "bands": [ + { + "name": "PAN", + "description": "Panchromatic band", + "colorInterpretation": "GRAY", + "pixelType": "Byte", + } + ], + "srsExpression": { + "names": [ + {"type": "unused", "value": "unused"}, + {"type": "proj4", "value": "still_unused"}, + { + "type": "urn", + "value": "urn:ogc:def:crs:EPSG::4326", + }, + {"type": "proj4", "value": "still_unused"}, + {"type": "unused", "value": "unused"}, + ] + }, + "rpc": { + "sampOff": 1, + "lineOff": 2, + "latOff": 3, + "longOff": 4, + "heightOff": 5, + "lineScale": 6, + "sampScale": 7, + "latScale": 8, + "longScale": 9, + "heightScale": 10, + "lineNumCoeff": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + ], + "lineDenCoeff": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + ], + "sampNumCoeff": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + ], + "sampDenCoeff": [ + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + ], + }, + } + } } - ], - "srsExpression": { - "names": [ - { - "type": "unused", - "value": "unused" - }, - { - "type": "proj4", - "value": "still_unused" - }, - { - "type": "urn", - "value": "urn:ogc:def:crs:EPSG::4326" - }, - { - "type": "proj4", - "value": "still_unused" - }, - { - "type": "unused", - "value": "unused" - }, - ] - }, - "rpc": - { - "sampOff": 1, - "lineOff": 2, - "latOff": 3, - "longOff": 4, - "heightOff": 5, - "lineScale": 6, - "sampScale": 7, - "latScale": 8, - "longScale": 9, - "heightScale": 10, - "lineNumCoeff": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - "lineDenCoeff": [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0], - "sampNumCoeff": [2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1], - "sampDenCoeff": [3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2] } - }}}}}})) + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert ds assert ds.RasterXSize == 2 assert ds.RasterYSize == 3 assert ds.RasterCount == 1 assert ds.GetGeoTransform() == (2, 0, 0.1, 49, 0, -0.1) - assert '4326' in ds.GetProjectionRef() + assert "4326" in ds.GetProjectionRef() md = ds.GetMetadata() - assert md == {'metadataInt': '123', - 'satellite': 'MY_SATELLITE', - 'cloudCover': '12.345678', - 'acquisitionDate': '2018-02-05T22:28:27.242Z'} + assert md == { + "metadataInt": "123", + "satellite": "MY_SATELLITE", + "cloudCover": "12.345678", + "acquisitionDate": "2018-02-05T22:28:27.242Z", + } - md = ds.GetMetadata('IMAGERY') - assert md == {'ACQUISITIONDATETIME': '2018-02-05 22:28:27', - 'CLOUDCOVER': '12.35', - 'SATELLITEID': 'MY_SATELLITE'} + md = ds.GetMetadata("IMAGERY") + assert md == { + "ACQUISITIONDATETIME": "2018-02-05 22:28:27", + "CLOUDCOVER": "12.35", + "SATELLITEID": "MY_SATELLITE", + } - rpc = ds.GetMetadata('RPC') + rpc = ds.GetMetadata("RPC") expected_rpc = { - 'SAMP_OFF': '1', - 'LINE_OFF': '2', - 'LAT_OFF': '3', - 'LONG_OFF': '4', - 'HEIGHT_OFF': '5', - 'LINE_SCALE': '6', - 'SAMP_SCALE': '7', - 'LAT_SCALE': '8', - 'LONG_SCALE': '9', - 'HEIGHT_SCALE': '10', - 'LINE_NUM_COEFF': '0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9', - 'LINE_DEN_COEFF': '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0', - 'SAMP_NUM_COEFF': '2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1', - 'SAMP_DEN_COEFF': '3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2', + "SAMP_OFF": "1", + "LINE_OFF": "2", + "LAT_OFF": "3", + "LONG_OFF": "4", + "HEIGHT_OFF": "5", + "LINE_SCALE": "6", + "SAMP_SCALE": "7", + "LAT_SCALE": "8", + "LONG_SCALE": "9", + "HEIGHT_SCALE": "10", + "LINE_NUM_COEFF": "0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9", + "LINE_DEN_COEFF": "1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0", + "SAMP_NUM_COEFF": "2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1", + "SAMP_DEN_COEFF": "3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2", } assert rpc == expected_rpc assert ds.GetRasterBand(1).GetNoDataValue() == 0.0 - assert ds.GetRasterBand(1).GetDescription() == 'PAN' - assert ds.GetRasterBand(1).GetMetadataItem('DESCRIPTION') == 'Panchromatic band' + assert ds.GetRasterBand(1).GetDescription() == "PAN" + assert ds.GetRasterBand(1).GetMetadataItem("DESCRIPTION") == "Panchromatic band" assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(0) is None - # Valid JSON with additional RPC error/bias parameters handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 3, - "actualBitDepth": 7, - "noDataValue": 0, - "metadataInt": 123, - "acquisitionDate": "2018-02-05T22:28:27.242Z", - "cloudCover": 12.345678, - "satellite": "MY_SATELLITE", - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "geotransform": [2, 0, 0.1, 49, 0, -0.1], - "bands": [ - { - "name": "PAN", - "description": "Panchromatic band", - "colorInterpretation": "GRAY", - "pixelType": "Byte" - } - ], - "srsExpression": { - "names": [ - { - "type": "unused", - "value": "unused" - }, - { - "type": "proj4", - "value": "still_unused" - }, - { - "type": "urn", - "value": "urn:ogc:def:crs:EPSG::4326" - }, - { - "type": "proj4", - "value": "still_unused" - }, - { - "type": "unused", - "value": "unused" - }, - ] - }, - "rpc": - { - "errBias": 1, - "errRand": 2, - "sampOff": 3, - "lineOff": 4, - "latOff": 5, - "longOff": 6, - "heightOff": 7, - "lineScale": 8, - "sampScale": 9, - "latScale": 10, - "longScale": 11, - "heightScale": 12, - "lineNumCoeff": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - "lineDenCoeff": [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0], - "sampNumCoeff": [2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1], - "sampDenCoeff": [3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2] + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 3, + "actualBitDepth": 7, + "noDataValue": 0, + "metadataInt": 123, + "acquisitionDate": "2018-02-05T22:28:27.242Z", + "cloudCover": 12.345678, + "satellite": "MY_SATELLITE", + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "geotransform": [2, 0, 0.1, 49, 0, -0.1], + "bands": [ + { + "name": "PAN", + "description": "Panchromatic band", + "colorInterpretation": "GRAY", + "pixelType": "Byte", + } + ], + "srsExpression": { + "names": [ + {"type": "unused", "value": "unused"}, + {"type": "proj4", "value": "still_unused"}, + { + "type": "urn", + "value": "urn:ogc:def:crs:EPSG::4326", + }, + {"type": "proj4", "value": "still_unused"}, + {"type": "unused", "value": "unused"}, + ] + }, + "rpc": { + "errBias": 1, + "errRand": 2, + "sampOff": 3, + "lineOff": 4, + "latOff": 5, + "longOff": 6, + "heightOff": 7, + "lineScale": 8, + "sampScale": 9, + "latScale": 10, + "longScale": 11, + "heightScale": 12, + "lineNumCoeff": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + ], + "lineDenCoeff": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + ], + "sampNumCoeff": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + ], + "sampDenCoeff": [ + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1, + 2, + ], + }, + } + } } - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert ds - rpc = ds.GetMetadata('RPC') + rpc = ds.GetMetadata("RPC") expected_rpc = { - 'ERR_BIAS': '1', - 'ERR_RAND': '2', - 'SAMP_OFF': '3', - 'LINE_OFF': '4', - 'LAT_OFF': '5', - 'LONG_OFF': '6', - 'HEIGHT_OFF': '7', - 'LINE_SCALE': '8', - 'SAMP_SCALE': '9', - 'LAT_SCALE': '10', - 'LONG_SCALE': '11', - 'HEIGHT_SCALE': '12', - 'LINE_NUM_COEFF': '0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9', - 'LINE_DEN_COEFF': '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0', - 'SAMP_NUM_COEFF': '2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1', - 'SAMP_DEN_COEFF': '3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2', + "ERR_BIAS": "1", + "ERR_RAND": "2", + "SAMP_OFF": "3", + "LINE_OFF": "4", + "LAT_OFF": "5", + "LONG_OFF": "6", + "HEIGHT_OFF": "7", + "LINE_SCALE": "8", + "SAMP_SCALE": "9", + "LAT_SCALE": "10", + "LONG_SCALE": "11", + "HEIGHT_SCALE": "12", + "LINE_NUM_COEFF": "0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9", + "LINE_DEN_COEFF": "1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0", + "SAMP_NUM_COEFF": "2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1", + "SAMP_DEN_COEFF": "3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2", } assert rpc == expected_rpc + ############################################################################### @@ -544,120 +859,156 @@ def test_daas_getimagemetadata_http_retry(): # 4 retries and success handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 502, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 503, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 504, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) - metadata_response = json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 1, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Byte" - }, - { - "name": "Band 2", - "pixelType": "Byte" - }, - { - "name": "Band 3", - "pixelType": "Byte" + handler.add("GET", "/daas/sensors/products/foo/images/bar", 502, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 503, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 504, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 500, {}) + metadata_response = json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 1, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "Byte"}, + {"name": "Band 2", "pixelType": "Byte"}, + {"name": "Band 3", "pixelType": "Byte"}, + ], + } + } + } + } } - ] - }}}}}}) + } + ) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - metadata_response) + handler.add( + "GET", "/daas/sensors/products/foo/images/bar", 200, {}, metadata_response + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', - 'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_INITIAL_RETRY_DELAY": "0.001", + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert ds # 4 retries and failure handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 502, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 503, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 504, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) - handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 502, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 503, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 504, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 500, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 500, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', - 'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_INITIAL_RETRY_DELAY": "0.001", + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds # No retry on HTTP 403 handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 403, {}) + handler.add("GET", "/daas/sensors/products/foo/images/bar", 403, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', - 'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_INITIAL_RETRY_DELAY": "0.001", + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): ds = gdal.Open( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert not ds + ############################################################################### def test_daas_getbuffer_failure(): - metadata_response = json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 1, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Byte" - }, - { - "name": "Band 2", - "pixelType": "Byte" - }, - { - "name": "Band 3", - "pixelType": "Byte" + metadata_response = json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 1, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "Byte"}, + {"name": "Band 2", "pixelType": "Byte"}, + {"name": "Band 3", "pixelType": "Byte"}, + ], + } + } + } + } } - ] - }}}}}}) + } + ) handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - metadata_response) + handler.add( + "GET", "/daas/sensors/products/foo/images/bar", 200, {}, metadata_response + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds # HTTP 404 handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 404) - handler.add('POST', '/getbuffer', 404) + handler.add("POST", "/getbuffer", 404) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -666,8 +1017,8 @@ def test_daas_getbuffer_failure(): # HTTP 404 with payload ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 404, {}, 'my error message') - handler.add('POST', '/getbuffer', 404) + handler.add("POST", "/getbuffer", 404, {}, "my error message") + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -676,8 +1027,8 @@ def test_daas_getbuffer_failure(): # HTTP 200 but invalid multipart ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, {}, 'not multipart') - handler.add('POST', '/getbuffer', 404) + handler.add("POST", "/getbuffer", 200, {}, "not multipart") + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -686,15 +1037,23 @@ def test_daas_getbuffer_failure(): # Missing data payload part ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -703,15 +1062,23 @@ def test_daas_getbuffer_failure(): # Missing metadata part ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream ABCDEF ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -720,9 +1087,14 @@ def test_daas_getbuffer_failure(): # Inconsistent metadata ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream @@ -732,8 +1104,11 @@ def test_daas_getbuffer_failure(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":3,"height":1}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -742,9 +1117,14 @@ def test_daas_getbuffer_failure(): # Inconsistent data size ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream @@ -754,8 +1134,11 @@ def test_daas_getbuffer_failure(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() @@ -764,32 +1147,55 @@ def test_daas_getbuffer_failure(): # Invalid PNG image ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - metadata_response) + handler.add( + "GET", "/daas/sensors/products/foo/images/bar", 200, {}, metadata_response + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): ds = gdal.OpenEx( - "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert ds handler = webserver.SequentialHandler() - png_content = 'This is not png !'.encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + png_content = "This is not png !".encode("ascii") + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png -""".replace('\n', '\r\n').encode('ascii') + png_content + """ +""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ) + + png_content + + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): @@ -799,116 +1205,195 @@ def test_daas_getbuffer_failure(): # Inconsistent PNG image ds.FlushCache() handler = webserver.SequentialHandler() - png_content = open('data/png/test.png', 'rb').read() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + png_content = open("data/png/test.png", "rb").read() + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png -""".replace('\n', '\r\n').encode('ascii') + png_content + """ +""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ) + + png_content + + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) - handler.add('POST', '/getbuffer', 404) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ), + ) + handler.add("POST", "/getbuffer", 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data + ############################################################################### def test_daas_getbuffer_pixel_encoding_failures(): handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 1, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "UInt16" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 1, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "UInt16"} + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) # PNG with UInt16 -> unsupported gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=PNG']) + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=PNG"], + ) assert ds - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" # JPEG with UInt16 -> unsupported gdal.ErrorReset() handler.req_count = 0 with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=JPEG']) + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=JPEG"], + ) assert ds - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" # PIXEL_ENCODING=FOO -> unsupported gdal.ErrorReset() handler.req_count = 0 with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=FOO']) + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=FOO"], + ) assert not ds # JPEG2000 with Float32 -> unsupported handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 1, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Float32", + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 1, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + { + "name": "Band 1", + "pixelType": "Float32", + } + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): with gdaltest.error_handler(): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=JPEG2000']) + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=JPEG2000"], + ) assert ds - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" + ############################################################################### @@ -916,36 +1401,52 @@ def test_daas_getbuffer_pixel_encoding_failures(): def test_daas_getbuffer_raw(): handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 1, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Byte" - }, - { - "name": "Band 2", - "pixelType": "Byte" - }, - { - "name": "Band 3", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 1, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "Byte"}, + {"name": "Band 2", "pixelType": "Byte"}, + {"name": "Band 3", "pixelType": "Byte"}, + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds handler = webserver.SequentialHandler() @@ -960,7 +1461,7 @@ def test_daas_getbuffer_raw(): {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" - response = response.replace('\n', '\r\n') + response = response.replace("\n", "\r\n") expected_body = """{ "bbox":{ "srs":{ @@ -995,15 +1496,24 @@ def test_daas_getbuffer_raw(): "Band 2", "Band 3" ] -}""".encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response, - expected_headers={'Accept': 'application/octet-stream'}, - expected_body=expected_body) +}""".encode( + "ascii" + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + expected_headers={"Accept": "application/octet-stream"}, + expected_body=expected_body, + ) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster() - assert data == 'AB'.encode('ascii') + assert data == "AB".encode("ascii") + ############################################################################### @@ -1015,99 +1525,144 @@ def _daas_getbuffer(pixel_encoding, drv_name, drv_options, mime_type): pytest.skip() handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 100, - "height": 100, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Byte" - }, - { - "name": "Band 2", - "pixelType": "Byte" - }, - { - "name": "Band 3", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 100, + "height": 100, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "Byte"}, + {"name": "Band 2", "pixelType": "Byte"}, + {"name": "Band 3", "pixelType": "Byte"}, + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=' + pixel_encoding]) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=" + pixel_encoding], + ) assert ds handler = webserver.SequentialHandler() - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3) - src_ds.GetRasterBand(1).WriteRaster( - 0, 0, 100, 100, 'A', buf_xsize=1, buf_ysize=1) - src_ds.GetRasterBand(2).WriteRaster(0, 0, 100, 100, 'B', buf_xsize = 1, buf_ysize = 1) - src_ds.GetRasterBand(3).WriteRaster(0, 0, 100, 100, 'C', buf_xsize = 1, buf_ysize = 1) - tmpfile = '/vsimem/tmp' + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100, 3) + src_ds.GetRasterBand(1).WriteRaster(0, 0, 100, 100, "A", buf_xsize=1, buf_ysize=1) + src_ds.GetRasterBand(2).WriteRaster(0, 0, 100, 100, "B", buf_xsize=1, buf_ysize=1) + src_ds.GetRasterBand(3).WriteRaster(0, 0, 100, 100, "C", buf_xsize=1, buf_ysize=1) + tmpfile = "/vsimem/tmp" drv.CreateCopy(tmpfile, src_ds, options=drv_options) - f = gdal.VSIFOpenL(tmpfile, 'rb') + f = gdal.VSIFOpenL(tmpfile, "rb") content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) - response = ("""--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + response = ( + ( + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; -Content-Type: """ + mime_type + """ - -""").replace('\n', '\r\n').encode('ascii') + content + """ +Content-Type: """ + + mime_type + + """ + +""" + ) + .replace("\n", "\r\n") + .encode("ascii") + + content + + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":100,"height":100}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response, - expected_headers={'Accept': mime_type}) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ) + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + expected_headers={"Accept": mime_type}, + ) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - assert data == 'A'.encode('ascii') + assert data == "A".encode("ascii") data = ds.GetRasterBand(2).ReadRaster(0, 0, 1, 1) - assert data == 'B'.encode('ascii') + assert data == "B".encode("ascii") + ############################################################################### def test_daas_getbuffer_png(): - _daas_getbuffer('PNG', 'PNG', [], 'image/png') + _daas_getbuffer("PNG", "PNG", [], "image/png") + ############################################################################### def test_daas_getbuffer_jpeg(): - _daas_getbuffer('JPEG', 'JPEG', ['QUALITY=100'], 'image/jpeg') + _daas_getbuffer("JPEG", "JPEG", ["QUALITY=100"], "image/jpeg") + ############################################################################### def test_daas_getbuffer_jpeg2000_jp2kak(): - _daas_getbuffer('JPEG2000', 'JP2KAK', ['QUALITY=100', 'CODEC=JP2'], 'image/jp2') + _daas_getbuffer("JPEG2000", "JP2KAK", ["QUALITY=100", "CODEC=JP2"], "image/jp2") + ############################################################################### def test_daas_getbuffer_jpeg2000_jp2openjpeg(): - _daas_getbuffer('JPEG2000', 'JP2OPENJPEG', ['QUALITY=100', 'REVERSIBLE=YES', 'RESOLUTIONS=1', 'CODEC=JP2'], 'image/jp2') + _daas_getbuffer( + "JPEG2000", + "JP2OPENJPEG", + ["QUALITY=100", "REVERSIBLE=YES", "RESOLUTIONS=1", "CODEC=JP2"], + "image/jp2", + ) + ############################################################################### @@ -1115,28 +1670,48 @@ def test_daas_getbuffer_jpeg2000_jp2openjpeg(): def test_daas_getbuffer_overview(): handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 1024, - "height": 512, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 1024, + "height": 512, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [{"name": "Band 1", "pixelType": "Byte"}], + } + } } - ] - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds assert ds.GetRasterBand(1).GetOverviewCount() == 2 @@ -1155,8 +1730,10 @@ def test_daas_getbuffer_overview(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":512,"height":256}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (512 * 256)) - response = response.replace('\n', '\r\n') +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ( + " " * (512 * 256) + ) + response = response.replace("\n", "\r\n") expected_body = """{ "bbox":{ @@ -1190,44 +1767,75 @@ def test_daas_getbuffer_overview(): "bands":[ "Band 1" ] -}""".encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response, - expected_body=expected_body) +}""".encode( + "ascii" + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + expected_body=expected_body, + ) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1024, 512, 512, 256) assert data + ############################################################################### def test_daas_rasterio(): handler_metadata = webserver.SequentialHandler() - handler_metadata.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 1024, - "height": 512, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "Band 1", - "pixelType": "UInt16" - } - ] - }}}}}})) + handler_metadata.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 1024, + "height": 512, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + {"name": "Band 1", "pixelType": "UInt16"} + ], + } + } + } + } + } + } + ), + ) with webserver.install_http_handler(handler_metadata): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds handler = webserver.SequentialHandler() @@ -1241,8 +1849,10 @@ def test_daas_rasterio(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":1024,"height":512}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (1024 * 512 * 2)) - response = response.replace('\n', '\r\n') +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ( + " " * (1024 * 512 * 2) + ) + response = response.replace("\n", "\r\n") expected_body = """{ "bbox":{ @@ -1276,11 +1886,19 @@ def test_daas_rasterio(): "bands":[ "Band 1" ] -}""".encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response, - expected_body=expected_body) +}""".encode( + "ascii" + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + expected_body=expected_body, + ) # Check that AdviseRead is properly honoured ds.AdviseRead(0, 0, 1024, 512) @@ -1304,11 +1922,18 @@ def test_daas_rasterio(): handler_metadata.req_count = 0 with webserver.install_http_handler(handler_metadata): with gdaltest.config_options( - {'GDAL_DAAS_SERVER_BYTE_LIMIT': '%d' % (512 * 512), - 'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_SERVER_BYTE_LIMIT": "%d" % (512 * 512), + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds ds.GetRasterBand(1).AdviseRead(0, 0, 1024, 512) @@ -1324,8 +1949,10 @@ def test_daas_rasterio(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":512,"height":512}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (512 * 512 * 2)) - response = response.replace('\n', '\r\n') +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ( + " " * (512 * 512 * 2) + ) + response = response.replace("\n", "\r\n") expected_body = """{ "bbox":{ @@ -1359,18 +1986,33 @@ def test_daas_rasterio(): "bands":[ "Band 1" ] -}""".encode('ascii') - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response, - expected_body=expected_body) - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response) +}""".encode( + "ascii" + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + expected_body=expected_body, + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + ) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1024, 512) assert data + ############################################################################### @@ -1378,36 +2020,61 @@ def test_daas_mask(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 3, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "geotransform": [2, 0, 0.1, 49, 0, -0.1], - "bands": [ - { - "name": "PAN", - "description": "Panchromatic band", - "colorInterpretation": "GRAY", - "pixelType": "UInt16" - }, - { - "name": "THE_MASK", - "colorInterpretation": "MAIN_MASK", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 3, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "geotransform": [2, 0, 0.1, 49, 0, -0.1], + "bands": [ + { + "name": "PAN", + "description": "Panchromatic band", + "colorInterpretation": "GRAY", + "pixelType": "UInt16", + }, + { + "name": "THE_MASK", + "colorInterpretation": "MAIN_MASK", + "pixelType": "Byte", + }, + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port, + open_options=["PIXEL_ENCODING=RAW"], + ) assert ds.RasterCount == 1 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetMaskBand() @@ -1425,8 +2092,10 @@ def test_daas_mask(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3,"bands":[{"name":"PAN","pixelType":"Byte"}]}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ('XXXXXX') - response = response.replace('\n', '\r\n') +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ( + "XXXXXX" + ) + response = response.replace("\n", "\r\n") response2 = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; @@ -1438,35 +2107,62 @@ def test_daas_mask(): Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3,"bands":[{"name":"THE_MASK","pixelType":"Byte"}]}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ('GHIJKL') - response2 = response2.replace('\n', '\r\n') +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ( + "GHIJKL" + ) + response2 = response2.replace("\n", "\r\n") handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response) - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response2) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response2, + ) with webserver.install_http_handler(handler): - data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type = gdal.GDT_Byte) - assert data == 'GHIJKL'.encode('ascii') + data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type=gdal.GDT_Byte) + assert data == "GHIJKL".encode("ascii") ds.FlushCache() handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response) - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - response2) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response, + ) + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + response2, + ) with webserver.install_http_handler(handler): - data = ds.ReadRaster(buf_type = gdal.GDT_Byte) - assert data == 'XXXXXX'.encode('ascii') - data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type = gdal.GDT_Byte) - assert data == 'GHIJKL'.encode('ascii') + data = ds.ReadRaster(buf_type=gdal.GDT_Byte) + assert data == "XXXXXX".encode("ascii") + data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type=gdal.GDT_Byte) + assert data == "GHIJKL".encode("ascii") + ############################################################################### @@ -1475,63 +2171,99 @@ def test_daas_png_response_4_bands_for_a_one_band_request(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() - handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, - json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { - "width": 2, - "height": 3, - "_links": { - "getBuffer": { - "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port - } - }, - "bands": [ - { - "name": "PAN", - "description": "Panchromatic band", - "colorInterpretation": "GRAY", - "pixelType": "Byte" + handler.add( + "GET", + "/daas/sensors/products/foo/images/bar", + 200, + {}, + json.dumps( + { + "response": { + "payload": { + "payload": { + "imageMetadata": { + "properties": { + "width": 2, + "height": 3, + "_links": { + "getBuffer": { + "href": "http://127.0.0.1:%d/getbuffer" + % gdaltest.webserver_port + } + }, + "bands": [ + { + "name": "PAN", + "description": "Panchromatic band", + "colorInterpretation": "GRAY", + "pixelType": "Byte", + } + ], + } + } } - ] - }}}}}})) + } + } + } + ), + ) with webserver.install_http_handler(handler): with gdaltest.config_options( - {'GDAL_DAAS_PERFORM_AUTH': 'No', - 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): - ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % - gdaltest.webserver_port) + { + "GDAL_DAAS_PERFORM_AUTH": "No", + "GDAL_DAAS_SERVICE_URL": "http://127.0.0.1:%d/daas" + % gdaltest.webserver_port, + } + ): + ds = gdal.OpenEx( + "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" + % gdaltest.webserver_port + ) assert ds.RasterCount == 1 - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 3, 4) - src_ds.GetRasterBand(1).WriteRaster( - 0, 0, 2, 3, 'A', buf_xsize=1, buf_ysize=1) - src_ds.GetRasterBand(2).WriteRaster( - 0, 0, 2, 3, 'B', buf_xsize=1, buf_ysize=1) - src_ds.GetRasterBand(3).WriteRaster( - 0, 0, 2, 3, 'C', buf_xsize=1, buf_ysize=1) - src_ds.GetRasterBand(4).WriteRaster( - 0, 0, 2, 3, 'D', buf_xsize=1, buf_ysize=1) - tmpfile = '/vsimem/out.png' - gdal.GetDriverByName('PNG').CreateCopy(tmpfile, src_ds) - f = gdal.VSIFOpenL(tmpfile, 'rb') + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 3, 4) + src_ds.GetRasterBand(1).WriteRaster(0, 0, 2, 3, "A", buf_xsize=1, buf_ysize=1) + src_ds.GetRasterBand(2).WriteRaster(0, 0, 2, 3, "B", buf_xsize=1, buf_ysize=1) + src_ds.GetRasterBand(3).WriteRaster(0, 0, 2, 3, "C", buf_xsize=1, buf_ysize=1) + src_ds.GetRasterBand(4).WriteRaster(0, 0, 2, 3, "D", buf_xsize=1, buf_ysize=1) + tmpfile = "/vsimem/out.png" + gdal.GetDriverByName("PNG").CreateCopy(tmpfile, src_ds) + f = gdal.VSIFOpenL(tmpfile, "rb") png_content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) handler = webserver.SequentialHandler() - handler.add('POST', '/getbuffer', 200, - {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, - """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 + handler.add( + "POST", + "/getbuffer", + 200, + { + "Content-Type": "multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7" + }, + """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png -""".replace('\n', '\r\n').encode('ascii') + png_content + """ +""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ) + + png_content + + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3}} ---bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) +--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace( + "\n", "\r\n" + ).encode( + "ascii" + ), + ) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster() - assert data == 'AAAAAA'.encode('ascii') + assert data == "AAAAAA".encode("ascii") diff --git a/autotest/gdrivers/daas_real_instance.py b/autotest/gdrivers/daas_real_instance.py index 7cab0ba79b93..dc51de11bd90 100755 --- a/autotest/gdrivers/daas_real_instance.py +++ b/autotest/gdrivers/daas_real_instance.py @@ -29,30 +29,37 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import pytest -pytestmark = pytest.mark.require_driver('DAAS') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("DAAS") ############################################################################### # Test accessing a real DAAS asset + def test_daas_real_instance(): - if gdal.GetConfigOption('GDAL_DAAS_ACCESS_TOKEN') is None and \ - gdal.GetConfigOption('GDAL_DAAS_API_KEY') is None and \ - gdal.GetConfigOption('GDAL_DAAS_CLIENT_ID') is None: - pytest.skip('Missing authentication elements: GDAL_DAAS_ACCESS_TOKEN or GDAL_DAAS_API_KEY+GDAL_DAAS_CLIENT_ID') + if ( + gdal.GetConfigOption("GDAL_DAAS_ACCESS_TOKEN") is None + and gdal.GetConfigOption("GDAL_DAAS_API_KEY") is None + and gdal.GetConfigOption("GDAL_DAAS_CLIENT_ID") is None + ): + pytest.skip( + "Missing authentication elements: GDAL_DAAS_ACCESS_TOKEN or GDAL_DAAS_API_KEY+GDAL_DAAS_CLIENT_ID" + ) - md_url = gdal.GetConfigOption('GDAL_AUTOTEST_DAAS_GET_METADATA_URL') + md_url = gdal.GetConfigOption("GDAL_AUTOTEST_DAAS_GET_METADATA_URL") if md_url is None: - pytest.skip('Missing GDAL_AUTOTEST_DAAS_GET_METADATA_URL with a URL to the GetMetadata URL of the scene to test') + pytest.skip( + "Missing GDAL_AUTOTEST_DAAS_GET_METADATA_URL with a URL to the GetMetadata URL of the scene to test" + ) gdal.ErrorReset() - ds = gdal.Open('DAAS:' + md_url) + ds = gdal.Open("DAAS:" + md_url) assert ds is not None req_xsize = min(1024, ds.RasterXSize) req_ysize = min(1024, ds.RasterYSize) assert ds.ReadRaster(0, 0, req_xsize, req_ysize) is not None - assert ds.GetLastErrorMsg() == '' + assert ds.GetLastErrorMsg() == "" diff --git a/autotest/gdrivers/data/zarr/generate_test_files.py b/autotest/gdrivers/data/zarr/generate_test_files.py index ed1431454d1a..23aedd82bdee 100644 --- a/autotest/gdrivers/data/zarr/generate_test_files.py +++ b/autotest/gdrivers/data/zarr/generate_test_files.py @@ -30,86 +30,171 @@ import lzma import os -import zarr + import numpy as np -from numcodecs import Blosc, GZip, Zlib, LZMA, Zstd, LZ4 +import zarr +from numcodecs import LZ4, LZMA, Blosc, GZip, Zlib, Zstd os.chdir(os.path.dirname(__file__)) -z = zarr.open('blosc.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=Blosc()) +z = zarr.open( + "blosc.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=Blosc() +) z[:] = [1, 2] -z = zarr.open('zlib.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=Zlib(level=1)) +z = zarr.open( + "zlib.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=Zlib(level=1) +) z[:] = [1, 2] -z = zarr.open('gzip.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=GZip(level=1)) +z = zarr.open( + "gzip.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=GZip(level=1) +) z[:] = [1, 2] -z = zarr.open('lzma.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=LZMA()) +z = zarr.open( + "lzma.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=LZMA() +) z[:] = [1, 2] -z = zarr.open('lzma_with_filters.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=LZMA(filters=[dict(id=lzma.FILTER_DELTA, dist=4), - dict(id=lzma.FILTER_LZMA2, preset=1)])) +z = zarr.open( + "lzma_with_filters.zarr", + mode="w", + dtype="u1", + shape=(2,), + chunks=(2,), + compressor=LZMA( + filters=[ + dict(id=lzma.FILTER_DELTA, dist=4), + dict(id=lzma.FILTER_LZMA2, preset=1), + ] + ), +) z[:] = [1, 2] -z = zarr.open('lz4.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=LZ4()) +z = zarr.open( + "lz4.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=LZ4() +) z[:] = [1, 2] -z = zarr.open('zstd.zarr', mode='w', dtype='u1', - shape=(2,), chunks=(2,), compressor=Zstd()) +z = zarr.open( + "zstd.zarr", mode="w", dtype="u1", shape=(2,), chunks=(2,), compressor=Zstd() +) z[:] = [1, 2] -z = zarr.open('order_f_u1.zarr', order='F', mode='w', dtype='u1', - shape=(4, 4), chunks=(2, 3), compressor=None) +z = zarr.open( + "order_f_u1.zarr", + order="F", + mode="w", + dtype="u1", + shape=(4, 4), + chunks=(2, 3), + compressor=None, +) z[:] = np.reshape(np.arange(0, 16, dtype=np.uint8), (4, 4)) -z = zarr.open('order_f_u2.zarr', order='F', mode='w', dtype='u2', - shape=(4, 4), chunks=(2, 3), compressor=None) +z = zarr.open( + "order_f_u2.zarr", + order="F", + mode="w", + dtype="u2", + shape=(4, 4), + chunks=(2, 3), + compressor=None, +) z[:] = np.reshape(np.arange(0, 16, dtype=np.uint16), (4, 4)) -z = zarr.open('order_f_u4.zarr', order='F', mode='w', dtype='u4', - shape=(4, 4), chunks=(2, 3), compressor=None) +z = zarr.open( + "order_f_u4.zarr", + order="F", + mode="w", + dtype="u4", + shape=(4, 4), + chunks=(2, 3), + compressor=None, +) z[:] = np.reshape(np.arange(0, 16, dtype=np.uint32), (4, 4)) -z = zarr.open('order_f_u8.zarr', order='F', mode='w', dtype='u8', - shape=(4, 4), chunks=(2, 3), compressor=None) +z = zarr.open( + "order_f_u8.zarr", + order="F", + mode="w", + dtype="u8", + shape=(4, 4), + chunks=(2, 3), + compressor=None, +) z[:] = np.reshape(np.arange(0, 16, dtype=np.uint64), (4, 4)) -z = zarr.open('order_f_s3.zarr', order='F', mode='w', dtype='S3', - shape=(4, 4), chunks=(2, 3), compressor=None) -z[:] = [['000', '111', '222', '333'], - ['444', '555', '666', '777'], - ['888', '999', 'AAA', 'BBB'], - ['CCC', 'DDD', 'EEE', 'FFF']] - -z = zarr.open('order_f_u1_3d.zarr', order='F', mode='w', dtype='u1', - shape=(2, 3, 4), chunks=(2, 3, 4), compressor=None) +z = zarr.open( + "order_f_s3.zarr", + order="F", + mode="w", + dtype="S3", + shape=(4, 4), + chunks=(2, 3), + compressor=None, +) +z[:] = [ + ["000", "111", "222", "333"], + ["444", "555", "666", "777"], + ["888", "999", "AAA", "BBB"], + ["CCC", "DDD", "EEE", "FFF"], +] + +z = zarr.open( + "order_f_u1_3d.zarr", + order="F", + mode="w", + dtype="u1", + shape=(2, 3, 4), + chunks=(2, 3, 4), + compressor=None, +) z[:] = np.reshape(np.arange(0, 2 * 3 * 4, dtype=np.uint8), (2, 3, 4)) -z = zarr.open('compound_well_aligned.zarr', mode='w', dtype=[('a', 'u2'), ('b', 'u2')], - shape=(3,), chunks=(2,), compressor=None) +z = zarr.open( + "compound_well_aligned.zarr", + mode="w", + dtype=[("a", "u2"), ("b", "u2")], + shape=(3,), + chunks=(2,), + compressor=None, +) z[0] = (1000, 3000) z[1] = (4000, 5000) -z = zarr.open('compound_not_aligned.zarr', mode='w', dtype=[('a', 'u2'), ('b', 'u1'), ('c', 'u2')], - shape=(3,), chunks=(2,), compressor=None) +z = zarr.open( + "compound_not_aligned.zarr", + mode="w", + dtype=[("a", "u2"), ("b", "u1"), ("c", "u2")], + shape=(3,), + chunks=(2,), + compressor=None, +) z[0] = (1000, 2, 3000) z[1] = (4000, 4, 5000) -z = zarr.open('compound_complex.zarr', mode='w', dtype=[('a', 'u1'), ('b', [('b1', 'u1'), ('b2', 'u1'), ('b3', 'u2'), ('b5', 'u1')]), ('c', 'S3'), ('d', 'i1')], - shape=(2,), chunks=(1,), fill_value=(2, (255, 254, 65534, 253), 'ZZ', -2), compressor=None) -z[0] = (1, (2, 3, 1000, 4), 'AAA', -1) +z = zarr.open( + "compound_complex.zarr", + mode="w", + dtype=[ + ("a", "u1"), + ("b", [("b1", "u1"), ("b2", "u1"), ("b3", "u2"), ("b5", "u1")]), + ("c", "S3"), + ("d", "i1"), + ], + shape=(2,), + chunks=(1,), + fill_value=(2, (255, 254, 65534, 253), "ZZ", -2), + compressor=None, +) +z[0] = (1, (2, 3, 1000, 4), "AAA", -1) diff --git a/autotest/gdrivers/dds.py b/autotest/gdrivers/dds.py index b4067400304a..c9c2c1d194ad 100644 --- a/autotest/gdrivers/dds.py +++ b/autotest/gdrivers/dds.py @@ -30,37 +30,40 @@ ############################################################################### import pytest + from osgeo import gdal -pytestmark = pytest.mark.require_driver('DDS') +pytestmark = pytest.mark.require_driver("DDS") test_list = [ - ('DXT1', [11376, 57826, 34652, 32919]), - ('DXT3', [12272, 59240, 34811, 7774]), - ('DXT5', [12272, 59240, 34811, 10402]), - ('ETC1', [9560, 57939, 30566]), + ("DXT1", [11376, 57826, 34652, 32919]), + ("DXT3", [12272, 59240, 34811, 7774]), + ("DXT5", [12272, 59240, 34811, 10402]), + ("ETC1", [9560, 57939, 30566]), ] + @pytest.mark.parametrize( - 'compression,checksums', - test_list, - ids=[row[0] for row in test_list] + "compression,checksums", test_list, ids=[row[0] for row in test_list] ) -def test_dds(compression,checksums): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - ds = gdal.GetDriverByName('DDS').CreateCopy('/vsimem/out.dds', src_ds, - options=['FORMAT=' + compression]) +def test_dds(compression, checksums): + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + ds = gdal.GetDriverByName("DDS").CreateCopy( + "/vsimem/out.dds", src_ds, options=["FORMAT=" + compression] + ) assert ds assert ds.RasterCount == len(checksums) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == compression + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == compression assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == checksums + assert [ + ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount) + ] == checksums def test_dds_no_compression(): - ref_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - ds = gdal.Open('data/dds/stefan_full_rgba_no_compression.dds') + ref_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + ds = gdal.Open("data/dds/stefan_full_rgba_no_compression.dds") assert ds assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand - ref_checksum = [ref_ds.GetRasterBand(i+1).Checksum() for i in range(4)] - assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == ref_checksum + ref_checksum = [ref_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] == ref_checksum diff --git a/autotest/gdrivers/derived.py b/autotest/gdrivers/derived.py index 4f1526602f24..ac937fef810b 100755 --- a/autotest/gdrivers/derived.py +++ b/autotest/gdrivers/derived.py @@ -28,104 +28,120 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + def test_derived_test1(): filename = "../gcore/data/cfloat64.tif" gdal.ErrorReset() ds = gdal.Open(filename) - assert ds is not None and gdal.GetLastErrorMsg() == '' - got_dsds = ds.GetMetadata('DERIVED_SUBDATASETS') + assert ds is not None and gdal.GetLastErrorMsg() == "" + got_dsds = ds.GetMetadata("DERIVED_SUBDATASETS") expected_gt = ds.GetGeoTransform() expected_prj = ds.GetProjection() - expected_dsds = {'DERIVED_SUBDATASET_1_NAME': 'DERIVED_SUBDATASET:AMPLITUDE:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_1_DESC': 'Amplitude of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_2_NAME': 'DERIVED_SUBDATASET:PHASE:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_2_DESC': 'Phase of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_3_NAME': 'DERIVED_SUBDATASET:REAL:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_3_DESC': 'Real part of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_4_NAME': 'DERIVED_SUBDATASET:IMAG:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_4_DESC': 'Imaginary part of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_5_NAME': 'DERIVED_SUBDATASET:CONJ:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_5_DESC': 'Conjugate of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_6_NAME': 'DERIVED_SUBDATASET:INTENSITY:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_6_DESC': 'Intensity (squared amplitude) of input bands from ../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_7_NAME': 'DERIVED_SUBDATASET:LOGAMPLITUDE:../gcore/data/cfloat64.tif', - 'DERIVED_SUBDATASET_7_DESC': 'log10 of amplitude of input bands from ../gcore/data/cfloat64.tif'} + expected_dsds = { + "DERIVED_SUBDATASET_1_NAME": "DERIVED_SUBDATASET:AMPLITUDE:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_1_DESC": "Amplitude of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_2_NAME": "DERIVED_SUBDATASET:PHASE:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_2_DESC": "Phase of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_3_NAME": "DERIVED_SUBDATASET:REAL:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_3_DESC": "Real part of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_4_NAME": "DERIVED_SUBDATASET:IMAG:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_4_DESC": "Imaginary part of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_5_NAME": "DERIVED_SUBDATASET:CONJ:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_5_DESC": "Conjugate of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_6_NAME": "DERIVED_SUBDATASET:INTENSITY:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_6_DESC": "Intensity (squared amplitude) of input bands from ../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_7_NAME": "DERIVED_SUBDATASET:LOGAMPLITUDE:../gcore/data/cfloat64.tif", + "DERIVED_SUBDATASET_7_DESC": "log10 of amplitude of input bands from ../gcore/data/cfloat64.tif", + } if got_dsds != expected_dsds: import pprint + pprint.pprint(got_dsds) pytest.fail() for key in expected_dsds: val = expected_dsds[key] - if key.endswith('_NAME'): + if key.endswith("_NAME"): ds = gdal.Open(val) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" gt = ds.GetGeoTransform() if gt != expected_gt: import pprint - pprint.pprint("Expected geotransform: " + str(expected_gt) + ", got " + str(gt)) + + pprint.pprint( + "Expected geotransform: " + str(expected_gt) + ", got " + str(gt) + ) pytest.fail() prj = ds.GetProjection() if prj != expected_prj: import pprint - pprint.pprint("Expected projection: " + str(expected_prj) + ", got: " + str(gt)) + + pprint.pprint( + "Expected projection: " + str(expected_prj) + ", got: " + str(gt) + ) pytest.fail() - + def test_derived_test2(): filename = "../gcore/data/cint_sar.tif" gdal.ErrorReset() ds = gdal.Open(filename) - assert ds is not None and gdal.GetLastErrorMsg() == '' - got_dsds = ds.GetMetadata('DERIVED_SUBDATASETS') - expected_dsds = {'DERIVED_SUBDATASET_1_NAME': 'DERIVED_SUBDATASET:AMPLITUDE:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_1_DESC': 'Amplitude of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_2_NAME': 'DERIVED_SUBDATASET:PHASE:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_2_DESC': 'Phase of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_3_NAME': 'DERIVED_SUBDATASET:REAL:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_3_DESC': 'Real part of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_4_NAME': 'DERIVED_SUBDATASET:IMAG:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_4_DESC': 'Imaginary part of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_5_NAME': 'DERIVED_SUBDATASET:CONJ:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_5_DESC': 'Conjugate of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_6_NAME': 'DERIVED_SUBDATASET:INTENSITY:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_6_DESC': 'Intensity (squared amplitude) of input bands from ../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_7_NAME': 'DERIVED_SUBDATASET:LOGAMPLITUDE:../gcore/data/cint_sar.tif', - 'DERIVED_SUBDATASET_7_DESC': 'log10 of amplitude of input bands from ../gcore/data/cint_sar.tif'} - - expected_cs = {'DERIVED_SUBDATASET_1_NAME': 345, - 'DERIVED_SUBDATASET_2_NAME': 10, - 'DERIVED_SUBDATASET_3_NAME': 159, - 'DERIVED_SUBDATASET_4_NAME': 142, - 'DERIVED_SUBDATASET_5_NAME': 110, - 'DERIVED_SUBDATASET_6_NAME': 314, - 'DERIVED_SUBDATASET_7_NAME': 55} + assert ds is not None and gdal.GetLastErrorMsg() == "" + got_dsds = ds.GetMetadata("DERIVED_SUBDATASETS") + expected_dsds = { + "DERIVED_SUBDATASET_1_NAME": "DERIVED_SUBDATASET:AMPLITUDE:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_1_DESC": "Amplitude of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_2_NAME": "DERIVED_SUBDATASET:PHASE:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_2_DESC": "Phase of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_3_NAME": "DERIVED_SUBDATASET:REAL:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_3_DESC": "Real part of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_4_NAME": "DERIVED_SUBDATASET:IMAG:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_4_DESC": "Imaginary part of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_5_NAME": "DERIVED_SUBDATASET:CONJ:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_5_DESC": "Conjugate of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_6_NAME": "DERIVED_SUBDATASET:INTENSITY:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_6_DESC": "Intensity (squared amplitude) of input bands from ../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_7_NAME": "DERIVED_SUBDATASET:LOGAMPLITUDE:../gcore/data/cint_sar.tif", + "DERIVED_SUBDATASET_7_DESC": "log10 of amplitude of input bands from ../gcore/data/cint_sar.tif", + } + + expected_cs = { + "DERIVED_SUBDATASET_1_NAME": 345, + "DERIVED_SUBDATASET_2_NAME": 10, + "DERIVED_SUBDATASET_3_NAME": 159, + "DERIVED_SUBDATASET_4_NAME": 142, + "DERIVED_SUBDATASET_5_NAME": 110, + "DERIVED_SUBDATASET_6_NAME": 314, + "DERIVED_SUBDATASET_7_NAME": 55, + } if got_dsds != expected_dsds: import pprint + pprint.pprint(got_dsds) pytest.fail() for key in expected_dsds: val = expected_dsds[key] - if key.endswith('_NAME'): + if key.endswith("_NAME"): ds = gdal.Open(val) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" cs = ds.GetRasterBand(1).Checksum() if expected_cs[key] != cs: import pprint - pprint.pprint("Expected checksum " + str(expected_cs[key]) + ", got " + str(cs)) + + pprint.pprint( + "Expected checksum " + str(expected_cs[key]) + ", got " + str(cs) + ) pytest.fail() - + # Error cases @@ -133,38 +149,57 @@ def test_derived_test3(): with gdaltest.error_handler(): # Missing filename - ds = gdal.Open('DERIVED_SUBDATASET:LOGAMPLITUDE') + ds = gdal.Open("DERIVED_SUBDATASET:LOGAMPLITUDE") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('DERIVED_SUBDATASET:invalid_alg:../gcore/data/byte.tif') + ds = gdal.Open("DERIVED_SUBDATASET:invalid_alg:../gcore/data/byte.tif") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('DERIVED_SUBDATASET:LOGAMPLITUDE:dataset_does_not_exist') + ds = gdal.Open("DERIVED_SUBDATASET:LOGAMPLITUDE:dataset_does_not_exist") assert ds is None with gdaltest.error_handler(): # Raster with zero band - ds = gdal.Open('DERIVED_SUBDATASET:LOGAMPLITUDE:data/hdf5/CSK_DGM.h5') + ds = gdal.Open("DERIVED_SUBDATASET:LOGAMPLITUDE:data/hdf5/CSK_DGM.h5") assert ds is None - for function in ['real', 'imag', 'complex', 'mod', 'phase', 'conj', - 'sum', 'diff', 'mul', 'cmul', 'inv', 'intensity', - 'sqrt', 'log10', 'dB', 'dB2amp', 'dB2pow']: - ds = gdal.Open('%s' % function) + for function in [ + "real", + "imag", + "complex", + "mod", + "phase", + "conj", + "sum", + "diff", + "mul", + "cmul", + "inv", + "intensity", + "sqrt", + "log10", + "dB", + "dB2amp", + "dB2pow", + ]: + ds = gdal.Open( + '%s' + % function + ) with gdaltest.error_handler(): ds.GetRasterBand(1).Checksum() - -# test that metadata is transferred + +# test that metadata is transferred + def test_derived_test4(): filename = "../gcore/data/byte_rpc.tif" gdal.ErrorReset() ds = gdal.Open(filename) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" derived_ds = gdal.Open("DERIVED_SUBDATASET:LOGAMPLITUDE:" + filename) assert "RPC" in derived_ds.GetMetadataDomainList() assert ds.GetMetadata("RPC") == derived_ds.GetMetadata("RPC") - diff --git a/autotest/gdrivers/dimap.py b/autotest/gdrivers/dimap.py index 0fe22594d34e..806a29431ce9 100755 --- a/autotest/gdrivers/dimap.py +++ b/autotest/gdrivers/dimap.py @@ -30,10 +30,10 @@ import os import shutil -from osgeo import gdal -import pytest +import pytest +from osgeo import gdal ############################################################################### # Open and verify a the GCPs and metadata. @@ -41,36 +41,44 @@ def test_dimap_1(): - shutil.copy('data/dimap/METADATA.DIM', 'tmp') - shutil.copy('data/dimap/IMAGERY.TIF', 'tmp') - shutil.copy('data/rgbsmall.tif', 'tmp') + shutil.copy("data/dimap/METADATA.DIM", "tmp") + shutil.copy("data/dimap/IMAGERY.TIF", "tmp") + shutil.copy("data/rgbsmall.tif", "tmp") - ds = gdal.Open('tmp/METADATA.DIM') + ds = gdal.Open("tmp/METADATA.DIM") - assert ds.RasterCount == 1 and ds.RasterXSize == 6000 and ds.RasterYSize == 6000, \ - 'wrong size or bands' + assert ( + ds.RasterCount == 1 and ds.RasterXSize == 6000 and ds.RasterYSize == 6000 + ), "wrong size or bands" - assert ds.GetRasterBand(1).Checksum(0, 0, 100, 100) == 21586, 'wrong checksum' + assert ds.GetRasterBand(1).Checksum(0, 0, 100, 100) == 21586, "wrong checksum" md = ds.GetMetadata() - assert md['PROCESSING_LEVEL'] == '1A', 'metadata wrong.' + assert md["PROCESSING_LEVEL"] == "1A", "metadata wrong." md = ds.GetMetadata() - assert md['SPECTRAL_PHYSICAL_BIAS'] == '0.000000', 'metadata wrong.' + assert md["SPECTRAL_PHYSICAL_BIAS"] == "0.000000", "metadata wrong." gcp_srs = ds.GetGCPProjection() - assert (not (gcp_srs[:6] != 'GEOGCS' \ - or gcp_srs.find('WGS') == -1 \ - or gcp_srs.find('84') == -1)), 'GCP Projection not retained.' + assert not ( + gcp_srs[:6] != "GEOGCS" or gcp_srs.find("WGS") == -1 or gcp_srs.find("84") == -1 + ), "GCP Projection not retained." gcps = ds.GetGCPs() - assert len(gcps) == 4 and gcps[0].GCPPixel == 0.5 and gcps[0].GCPLine == 0.5 and gcps[0].GCPX == pytest.approx(4.3641728, abs=0.0000002) and gcps[0].GCPY == pytest.approx(44.2082255, abs=0.0000002) and gcps[0].GCPZ == pytest.approx(0, abs=0.0000002), \ - 'GCPs wrong.' + assert ( + len(gcps) == 4 + and gcps[0].GCPPixel == 0.5 + and gcps[0].GCPLine == 0.5 + and gcps[0].GCPX == pytest.approx(4.3641728, abs=0.0000002) + and gcps[0].GCPY == pytest.approx(44.2082255, abs=0.0000002) + and gcps[0].GCPZ == pytest.approx(0, abs=0.0000002) + ), "GCPs wrong." ds = None - os.unlink('tmp/METADATA.DIM') - os.unlink('tmp/IMAGERY.TIF') - os.unlink('tmp/rgbsmall.tif') + os.unlink("tmp/METADATA.DIM") + os.unlink("tmp/IMAGERY.TIF") + os.unlink("tmp/rgbsmall.tif") + ############################################################################### # Open DIMAP 2 @@ -78,24 +86,77 @@ def test_dimap_1(): def test_dimap_2_single_component(): - for name in ['data/dimap2/single_component', 'data/dimap2/single_component/VOL_PHR.XML', 'data/dimap2/single_component/DIM_foo.XML']: + for name in [ + "data/dimap2/single_component", + "data/dimap2/single_component/VOL_PHR.XML", + "data/dimap2/single_component/DIM_foo.XML", + ]: ds = gdal.Open(name) - assert ds.RasterCount == 4 and ds.RasterXSize == 20 and ds.RasterYSize == 30, \ - 'wrong size or bands' + assert ( + ds.RasterCount == 4 and ds.RasterXSize == 20 and ds.RasterYSize == 30 + ), "wrong size or bands" md = ds.GetMetadata() - expected_md = {'GEOMETRIC_ATTITUDES_USED': 'ACCURATE', 'FACILITY_PROCESSING_CENTER': 'PROCESSING_CENTER', 'GEOMETRIC_VERTICAL_DESC': 'REFERENCE3D', 'EPHEMERIS_ACQUISITION_ORBIT_DIRECTION': 'DESCENDING', 'BAND_MODE': 'PX', 'EPHEMERIS_NADIR_LON': 'NADIR_LON', 'EPHEMERIS_ACQUISITION_ORBIT_NUMBER': 'ACQUISITION_ORBIT_NUMBER', 'SPECTRAL_PROCESSING': 'PMS', 'CLOUDCOVER_MEASURE_TYPE': 'AUTOMATIC', 'DATASET_JOB_ID': 'JOB_ID', 'MISSION': 'PHR', 'GEOMETRIC_GROUND_SETTING': 'true', 'GEOMETRIC_VERTICAL_SETTING': 'true', 'DATASET_PRODUCTION_DATE': 'PRODUCTION_DATE', 'DATASET_PRODUCER_CONTACT': 'PRODUCER_CONTACT', 'IMAGING_DATE': '2016-06-17', 'CLOUDCOVER_QUALITY_TABLES': 'PHR', 'DATASET_PRODUCER_NAME': 'PRODUCER_NAME', 'GEOMETRIC_GEOMETRIC_PROCESSING': 'SENSOR', 'GEOMETRIC_EPHEMERIS_USED': 'CORRECTED', 'GEOMETRIC_GROUND_DESC': 'R3D_ORTHO', 'DATASET_DELIVERY_TYPE': 'DELIVERY_TYPE', 'PROCESSING_LEVEL': 'SENSOR', 'DATASET_PRODUCER_ADDRESS': 'PRODUCER_ADDRESS', 'DATASET_PRODUCT_CODE': 'PRODUCT_CODE', 'INSTRUMENT_INDEX': '1A', 'EPHEMERIS_NADIR_LAT': 'NADIR_LAT', 'INSTRUMENT': 'PHR', 'CLOUDCOVER_MEASURE_NAME': 'Cloud_Cotation (CLD)', 'FACILITY_SOFTWARE': 'SOFTWARE', 'IMAGING_TIME': '12:34:56', 'MISSION_INDEX': '1A'} - assert md == expected_md, 'metadata wrong.' - - rpc = ds.GetMetadata('RPC') - expected_rpc = {'HEIGHT_OFF': 'HEIGHT_OFF', 'LINE_NUM_COEFF': ' LINE_NUM_COEFF_1 LINE_NUM_COEFF_2 LINE_NUM_COEFF_3 LINE_NUM_COEFF_4 LINE_NUM_COEFF_5 LINE_NUM_COEFF_6 LINE_NUM_COEFF_7 LINE_NUM_COEFF_8 LINE_NUM_COEFF_9 LINE_NUM_COEFF_10 LINE_NUM_COEFF_11 LINE_NUM_COEFF_12 LINE_NUM_COEFF_13 LINE_NUM_COEFF_14 LINE_NUM_COEFF_15 LINE_NUM_COEFF_16 LINE_NUM_COEFF_17 LINE_NUM_COEFF_18 LINE_NUM_COEFF_19 LINE_NUM_COEFF_20', 'LONG_OFF': 'LONG_OFF', 'SAMP_DEN_COEFF': ' SAMP_DEN_COEFF_1 SAMP_DEN_COEFF_2 SAMP_DEN_COEFF_3 SAMP_DEN_COEFF_4 SAMP_DEN_COEFF_5 SAMP_DEN_COEFF_6 SAMP_DEN_COEFF_7 SAMP_DEN_COEFF_8 SAMP_DEN_COEFF_9 SAMP_DEN_COEFF_10 SAMP_DEN_COEFF_11 SAMP_DEN_COEFF_12 SAMP_DEN_COEFF_13 SAMP_DEN_COEFF_14 SAMP_DEN_COEFF_15 SAMP_DEN_COEFF_16 SAMP_DEN_COEFF_17 SAMP_DEN_COEFF_18 SAMP_DEN_COEFF_19 SAMP_DEN_COEFF_20', 'LINE_SCALE': 'LINE_SCALE', 'SAMP_NUM_COEFF': ' SAMP_NUM_COEFF_1 SAMP_NUM_COEFF_2 SAMP_NUM_COEFF_3 SAMP_NUM_COEFF_4 SAMP_NUM_COEFF_5 SAMP_NUM_COEFF_6 SAMP_NUM_COEFF_7 SAMP_NUM_COEFF_8 SAMP_NUM_COEFF_9 SAMP_NUM_COEFF_10 SAMP_NUM_COEFF_11 SAMP_NUM_COEFF_12 SAMP_NUM_COEFF_13 SAMP_NUM_COEFF_14 SAMP_NUM_COEFF_15 SAMP_NUM_COEFF_16 SAMP_NUM_COEFF_17 SAMP_NUM_COEFF_18 SAMP_NUM_COEFF_19 SAMP_NUM_COEFF_20', 'LONG_SCALE': 'LONG_SCALE', 'SAMP_SCALE': 'SAMP_SCALE', 'SAMP_OFF': '4', 'LAT_SCALE': 'LAT_SCALE', 'LAT_OFF': 'LAT_OFF', 'LINE_OFF': '9', 'LINE_DEN_COEFF': ' LINE_DEN_COEFF_1 LINE_DEN_COEFF_2 LINE_DEN_COEFF_3 LINE_DEN_COEFF_4 LINE_DEN_COEFF_5 LINE_DEN_COEFF_6 LINE_DEN_COEFF_7 LINE_DEN_COEFF_8 LINE_DEN_COEFF_9 LINE_DEN_COEFF_10 LINE_DEN_COEFF_11 LINE_DEN_COEFF_12 LINE_DEN_COEFF_13 LINE_DEN_COEFF_14 LINE_DEN_COEFF_15 LINE_DEN_COEFF_16 LINE_DEN_COEFF_17 LINE_DEN_COEFF_18 LINE_DEN_COEFF_19 LINE_DEN_COEFF_20', 'HEIGHT_SCALE': 'HEIGHT_SCALE'} - assert rpc == expected_rpc, 'RPC wrong.' + expected_md = { + "GEOMETRIC_ATTITUDES_USED": "ACCURATE", + "FACILITY_PROCESSING_CENTER": "PROCESSING_CENTER", + "GEOMETRIC_VERTICAL_DESC": "REFERENCE3D", + "EPHEMERIS_ACQUISITION_ORBIT_DIRECTION": "DESCENDING", + "BAND_MODE": "PX", + "EPHEMERIS_NADIR_LON": "NADIR_LON", + "EPHEMERIS_ACQUISITION_ORBIT_NUMBER": "ACQUISITION_ORBIT_NUMBER", + "SPECTRAL_PROCESSING": "PMS", + "CLOUDCOVER_MEASURE_TYPE": "AUTOMATIC", + "DATASET_JOB_ID": "JOB_ID", + "MISSION": "PHR", + "GEOMETRIC_GROUND_SETTING": "true", + "GEOMETRIC_VERTICAL_SETTING": "true", + "DATASET_PRODUCTION_DATE": "PRODUCTION_DATE", + "DATASET_PRODUCER_CONTACT": "PRODUCER_CONTACT", + "IMAGING_DATE": "2016-06-17", + "CLOUDCOVER_QUALITY_TABLES": "PHR", + "DATASET_PRODUCER_NAME": "PRODUCER_NAME", + "GEOMETRIC_GEOMETRIC_PROCESSING": "SENSOR", + "GEOMETRIC_EPHEMERIS_USED": "CORRECTED", + "GEOMETRIC_GROUND_DESC": "R3D_ORTHO", + "DATASET_DELIVERY_TYPE": "DELIVERY_TYPE", + "PROCESSING_LEVEL": "SENSOR", + "DATASET_PRODUCER_ADDRESS": "PRODUCER_ADDRESS", + "DATASET_PRODUCT_CODE": "PRODUCT_CODE", + "INSTRUMENT_INDEX": "1A", + "EPHEMERIS_NADIR_LAT": "NADIR_LAT", + "INSTRUMENT": "PHR", + "CLOUDCOVER_MEASURE_NAME": "Cloud_Cotation (CLD)", + "FACILITY_SOFTWARE": "SOFTWARE", + "IMAGING_TIME": "12:34:56", + "MISSION_INDEX": "1A", + } + assert md == expected_md, "metadata wrong." + + rpc = ds.GetMetadata("RPC") + expected_rpc = { + "HEIGHT_OFF": "HEIGHT_OFF", + "LINE_NUM_COEFF": " LINE_NUM_COEFF_1 LINE_NUM_COEFF_2 LINE_NUM_COEFF_3 LINE_NUM_COEFF_4 LINE_NUM_COEFF_5 LINE_NUM_COEFF_6 LINE_NUM_COEFF_7 LINE_NUM_COEFF_8 LINE_NUM_COEFF_9 LINE_NUM_COEFF_10 LINE_NUM_COEFF_11 LINE_NUM_COEFF_12 LINE_NUM_COEFF_13 LINE_NUM_COEFF_14 LINE_NUM_COEFF_15 LINE_NUM_COEFF_16 LINE_NUM_COEFF_17 LINE_NUM_COEFF_18 LINE_NUM_COEFF_19 LINE_NUM_COEFF_20", + "LONG_OFF": "LONG_OFF", + "SAMP_DEN_COEFF": " SAMP_DEN_COEFF_1 SAMP_DEN_COEFF_2 SAMP_DEN_COEFF_3 SAMP_DEN_COEFF_4 SAMP_DEN_COEFF_5 SAMP_DEN_COEFF_6 SAMP_DEN_COEFF_7 SAMP_DEN_COEFF_8 SAMP_DEN_COEFF_9 SAMP_DEN_COEFF_10 SAMP_DEN_COEFF_11 SAMP_DEN_COEFF_12 SAMP_DEN_COEFF_13 SAMP_DEN_COEFF_14 SAMP_DEN_COEFF_15 SAMP_DEN_COEFF_16 SAMP_DEN_COEFF_17 SAMP_DEN_COEFF_18 SAMP_DEN_COEFF_19 SAMP_DEN_COEFF_20", + "LINE_SCALE": "LINE_SCALE", + "SAMP_NUM_COEFF": " SAMP_NUM_COEFF_1 SAMP_NUM_COEFF_2 SAMP_NUM_COEFF_3 SAMP_NUM_COEFF_4 SAMP_NUM_COEFF_5 SAMP_NUM_COEFF_6 SAMP_NUM_COEFF_7 SAMP_NUM_COEFF_8 SAMP_NUM_COEFF_9 SAMP_NUM_COEFF_10 SAMP_NUM_COEFF_11 SAMP_NUM_COEFF_12 SAMP_NUM_COEFF_13 SAMP_NUM_COEFF_14 SAMP_NUM_COEFF_15 SAMP_NUM_COEFF_16 SAMP_NUM_COEFF_17 SAMP_NUM_COEFF_18 SAMP_NUM_COEFF_19 SAMP_NUM_COEFF_20", + "LONG_SCALE": "LONG_SCALE", + "SAMP_SCALE": "SAMP_SCALE", + "SAMP_OFF": "4", + "LAT_SCALE": "LAT_SCALE", + "LAT_OFF": "LAT_OFF", + "LINE_OFF": "9", + "LINE_DEN_COEFF": " LINE_DEN_COEFF_1 LINE_DEN_COEFF_2 LINE_DEN_COEFF_3 LINE_DEN_COEFF_4 LINE_DEN_COEFF_5 LINE_DEN_COEFF_6 LINE_DEN_COEFF_7 LINE_DEN_COEFF_8 LINE_DEN_COEFF_9 LINE_DEN_COEFF_10 LINE_DEN_COEFF_11 LINE_DEN_COEFF_12 LINE_DEN_COEFF_13 LINE_DEN_COEFF_14 LINE_DEN_COEFF_15 LINE_DEN_COEFF_16 LINE_DEN_COEFF_17 LINE_DEN_COEFF_18 LINE_DEN_COEFF_19 LINE_DEN_COEFF_20", + "HEIGHT_SCALE": "HEIGHT_SCALE", + } + assert rpc == expected_rpc, "RPC wrong." cs = ds.GetRasterBand(1).Checksum() - assert cs == 7024, 'wrong checksum.' + assert cs == 7024, "wrong checksum." nOvr = ds.GetRasterBand(1).GetOverviewCount() - assert nOvr == 1, 'overviews not correctly exposed' + assert nOvr == 1, "overviews not correctly exposed" ds = None @@ -106,11 +167,11 @@ def test_dimap_2_single_component(): def test_dimap_2_bundle(): - ds = gdal.Open('data/dimap2/bundle') + ds = gdal.Open("data/dimap2/bundle") assert ds.RasterCount == 4 and ds.RasterXSize == 20 and ds.RasterYSize == 30 md = ds.GetMetadata() assert md != {} - assert ds.GetMetadata('RPC') is not None + assert ds.GetMetadata("RPC") is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 7024 subds = ds.GetSubDatasets() @@ -121,7 +182,7 @@ def test_dimap_2_bundle(): assert ds.RasterCount == 4 and ds.RasterXSize == 20 and ds.RasterYSize == 30 md = ds.GetMetadata() assert md != {} - assert ds.GetMetadata('RPC') is not None + assert ds.GetMetadata("RPC") is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 7024 assert len(ds.GetSubDatasets()) == 0 @@ -131,7 +192,7 @@ def test_dimap_2_bundle(): assert ds.RasterCount == 1 and ds.RasterXSize == 20 and ds.RasterYSize == 30 md = ds.GetMetadata() assert md != {} - assert ds.GetMetadata('RPC') is not None + assert ds.GetMetadata("RPC") is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 7024 @@ -142,7 +203,21 @@ def test_dimap_2_bundle(): def test_dimap_2_vhr2020_ms_fs(): - ds = gdal.Open('data/dimap2/vhr2020_ms_fs') + ds = gdal.Open("data/dimap2/vhr2020_ms_fs") assert ds.RasterCount == 6 and ds.RasterXSize == 1663 and ds.RasterYSize == 1366 - assert [ds.GetRasterBand(i+1).ComputeRasterMinMax()[0] for i in range(6)] == [1,2,3,4,5,6] - assert [ds.GetRasterBand(i+1).GetDescription() for i in range(6)] == ['Red', 'Green', 'Blue', 'NIR', 'Red Edge', 'Deep Blue'] + assert [ds.GetRasterBand(i + 1).ComputeRasterMinMax()[0] for i in range(6)] == [ + 1, + 2, + 3, + 4, + 5, + 6, + ] + assert [ds.GetRasterBand(i + 1).GetDescription() for i in range(6)] == [ + "Red", + "Green", + "Blue", + "NIR", + "Red Edge", + "Deep Blue", + ] diff --git a/autotest/gdrivers/dipex.py b/autotest/gdrivers/dipex.py index 4fd15a05bd5c..726f3c4f947e 100755 --- a/autotest/gdrivers/dipex.py +++ b/autotest/gdrivers/dipex.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_dipex_1(): - tst = gdaltest.GDALTest('DIPEx', 'dipex/fakedipex.dat', 1, 1) + tst = gdaltest.GDALTest("DIPEx", "dipex/fakedipex.dat", 1, 1) return tst.testOpen() - - - diff --git a/autotest/gdrivers/doq1.py b/autotest/gdrivers/doq1.py index c2a6e06cc2c1..54c49747961e 100755 --- a/autotest/gdrivers/doq1.py +++ b/autotest/gdrivers/doq1.py @@ -28,22 +28,18 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Test a fake DOQ1 dataset def test_doq1_1(): - tst = gdaltest.GDALTest('DOQ1', 'doq1/fakedoq1.doq', 1, 1) - gdal.PushErrorHandler('CPLQuietErrorHandler') + tst = gdaltest.GDALTest("DOQ1", "doq1/fakedoq1.doq", 1, 1) + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = tst.testOpen() gdal.PopErrorHandler() return ret - - - diff --git a/autotest/gdrivers/doq2.py b/autotest/gdrivers/doq2.py index 3d81538fbf01..6620d8531ad6 100755 --- a/autotest/gdrivers/doq2.py +++ b/autotest/gdrivers/doq2.py @@ -30,8 +30,6 @@ from osgeo import gdal - - ############################################################################### # Read a truncated and modified version of C3607614.NWS # downloaded from http://edcftp.cr.usgs.gov/pub/data/samples/doq-clr-native.tar.gz @@ -39,27 +37,31 @@ def test_doq2_1(): - ds = gdal.Open('data/doq2/C3607614_truncated.NWS') + ds = gdal.Open("data/doq2/C3607614_truncated.NWS") - mem_ds = gdal.GetDriverByName('MEM').Create('mem_1.mem', 500, 1, gdal.GDT_Byte, 1) + mem_ds = gdal.GetDriverByName("MEM").Create("mem_1.mem", 500, 1, gdal.GDT_Byte, 1) - mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(1).ReadRaster(0, 0, 500, 1)) - assert mem_ds.GetRasterBand(1).Checksum() == 4201, 'wrong checksum for band 1' + mem_ds.GetRasterBand(1).WriteRaster( + 0, 0, 500, 1, ds.GetRasterBand(1).ReadRaster(0, 0, 500, 1) + ) + assert mem_ds.GetRasterBand(1).Checksum() == 4201, "wrong checksum for band 1" - mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(2).ReadRaster(0, 0, 500, 1)) - assert mem_ds.GetRasterBand(1).Checksum() == 4010, 'wrong checksum for band 2' + mem_ds.GetRasterBand(1).WriteRaster( + 0, 0, 500, 1, ds.GetRasterBand(2).ReadRaster(0, 0, 500, 1) + ) + assert mem_ds.GetRasterBand(1).Checksum() == 4010, "wrong checksum for band 2" - mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(3).ReadRaster(0, 0, 500, 1)) - assert mem_ds.GetRasterBand(1).Checksum() == 5820, 'wrong checksum for band 3' + mem_ds.GetRasterBand(1).WriteRaster( + 0, 0, 500, 1, ds.GetRasterBand(3).ReadRaster(0, 0, 500, 1) + ) + assert mem_ds.GetRasterBand(1).Checksum() == 5820, "wrong checksum for band 3" - assert ds.GetGeoTransform() == (377054, 1, 0, 4082205, 0, -1), 'wrong geotransform' + assert ds.GetGeoTransform() == (377054, 1, 0, 4082205, 0, -1), "wrong geotransform" md = ds.GetMetadata() - assert md['QUADRANGLE_NAME'] == 'NORFOLK SOUTH 3.45 or 7.5-min. name*', \ - 'wrong metadata' + assert ( + md["QUADRANGLE_NAME"] == "NORFOLK SOUTH 3.45 or 7.5-min. name*" + ), "wrong metadata" mem_ds = None ds = None - - - diff --git a/autotest/gdrivers/dted.py b/autotest/gdrivers/dted.py index 27170a5c35cc..46f302e842c5 100755 --- a/autotest/gdrivers/dted.py +++ b/autotest/gdrivers/dted.py @@ -31,44 +31,54 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Perform simple read test. def test_dted_1(): - tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) + tst = gdaltest.GDALTest("dted", "n43.dt0", 1, 49187) return tst.testOpen() + ############################################################################### # Verify some auxiliary data. def test_dted_2(): - ds = gdal.Open('data/n43.dt0') + ds = gdal.Open("data/n43.dt0") gt = ds.GetGeoTransform() max_error = 0.000001 - assert gt[0] == pytest.approx((-80.004166666666663), abs=max_error) and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) and gt[2] == pytest.approx(0, abs=max_error) and gt[3] == pytest.approx(44.00416666666667, abs=max_error) and gt[4] == pytest.approx(0, abs=max_error) and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error), \ - 'DTED geotransform wrong.' + assert ( + gt[0] == pytest.approx((-80.004166666666663), abs=max_error) + and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) + and gt[2] == pytest.approx(0, abs=max_error) + and gt[3] == pytest.approx(44.00416666666667, abs=max_error) + and gt[4] == pytest.approx(0, abs=max_error) + and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error) + ), "DTED geotransform wrong." prj = ds.GetProjection() - assert prj == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', \ - ('Projection does not match expected:\n%s' % prj) + assert ( + prj + == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ), ("Projection does not match expected:\n%s" % prj) band1 = ds.GetRasterBand(1) - assert band1.GetNoDataValue() == -32767, 'Grid NODATA value wrong or missing.' + assert band1.GetNoDataValue() == -32767, "Grid NODATA value wrong or missing." + + assert band1.DataType == gdal.GDT_Int16, "Data type is not Int16!" - assert band1.DataType == gdal.GDT_Int16, 'Data type is not Int16!' ############################################################################### # Create simple copy and check. @@ -76,22 +86,23 @@ def test_dted_2(): def test_dted_3(): - tst = gdaltest.GDALTest('DTED', 'n43.dt0', 1, 49187) + tst = gdaltest.GDALTest("DTED", "n43.dt0", 1, 49187) prj = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) + ############################################################################### # Read subwindow. Tests the tail recursion problem. def test_dted_4(): - tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 305, - 5, 5, 5, 5) + tst = gdaltest.GDALTest("dted", "n43.dt0", 1, 305, 5, 5, 5, 5) return tst.testOpen() + ############################################################################### # Test a DTED Level 1 (made from a DTED Level 0) @@ -99,20 +110,30 @@ def test_dted_4(): def test_dted_5(): driver = gdal.GetDriverByName("GTiff") - ds = driver.Create('tmp/n43.dt1.tif', 1201, 1201, 1, gdal.GDT_Int16) - ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') - ref_geotransform = (-80.0004166666666663, 0.0008333333333333, 0, 44.0004166666666670, 0, -0.0008333333333333) + ds = driver.Create("tmp/n43.dt1.tif", 1201, 1201, 1, gdal.GDT_Int16) + ds.SetProjection( + 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ) + ref_geotransform = ( + -80.0004166666666663, + 0.0008333333333333, + 0, + 44.0004166666666670, + 0, + -0.0008333333333333, + ) ds.SetGeoTransform(ref_geotransform) ds = None - ds = gdal.Open('tmp/n43.dt1.tif') + ds = gdal.Open("tmp/n43.dt1.tif") geotransform = ds.GetGeoTransform() for i in range(6): assert geotransform[i] == pytest.approx(ref_geotransform[i], abs=1e-10) ds = None + ############################################################################### # Test a DTED Level 2 (made from a DTED Level 0) @@ -120,59 +141,71 @@ def test_dted_5(): def test_dted_6(): driver = gdal.GetDriverByName("GTiff") - ds = driver.Create('tmp/n43.dt2.tif', 3601, 3601, 1, gdal.GDT_Int16) - ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') - ref_geotransform = (-80.0001388888888888888, 0.0002777777777777777, 0, 44.0001388888888888, 0, -0.0002777777777777777) + ds = driver.Create("tmp/n43.dt2.tif", 3601, 3601, 1, gdal.GDT_Int16) + ds.SetProjection( + 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ) + ref_geotransform = ( + -80.0001388888888888888, + 0.0002777777777777777, + 0, + 44.0001388888888888, + 0, + -0.0002777777777777777, + ) ds.SetGeoTransform(ref_geotransform) ds = None - ds = gdal.Open('tmp/n43.dt2.tif') + ds = gdal.Open("tmp/n43.dt2.tif") geotransform = ds.GetGeoTransform() for i in range(6): assert geotransform[i] == pytest.approx(ref_geotransform[i], abs=1e-10) ds = None + ############################################################################### # Test a WGS72 georeferenced DTED def test_dted_7(): - ds = gdal.Open('data/dted/n43_wgs72.dt0') + ds = gdal.Open("data/dted/n43_wgs72.dt0") # a warning is issued - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") prj = ds.GetProjection() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() is not None, 'An expected warning was not emitted' + assert gdal.GetLastErrorMsg() is not None, "An expected warning was not emitted" assert prj.startswith('GEOGCS["WGS 72"') + ############################################################################### # Test a file whose checksum is corrupted def test_dted_8(): # this will enable DTED_VERIFY_CHECKSUM - gdal.SetConfigOption('DTED_VERIFY_CHECKSUM', 'YES') + gdal.SetConfigOption("DTED_VERIFY_CHECKSUM", "YES") - ds = gdal.Open('data/dted/n43_bad_crc.dt0') + ds = gdal.Open("data/dted/n43_bad_crc.dt0") band = ds.GetRasterBand(1) # numerous errors would be reported - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") chksum = band.Checksum() gdal.PopErrorHandler() - gdal.SetConfigOption('DTED_VERIFY_CHECKSUM', 'NO') + gdal.SetConfigOption("DTED_VERIFY_CHECKSUM", "NO") - assert gdal.GetLastErrorMsg() is not None, 'An expected warning was not emitted' + assert gdal.GetLastErrorMsg() is not None, "An expected warning was not emitted" # 49187 is the checksum of data is the DTED is read without checking its checksum # so we should not get this value - assert chksum != 49187, 'DTED_VERIFY_CHECKSUM=YES has had no effect!' + assert chksum != 49187, "DTED_VERIFY_CHECKSUM=YES has had no effect!" + ############################################################################### # Test a DTED Level 1 above latitude 50 (made from a DTED Level 0) @@ -180,14 +213,25 @@ def test_dted_8(): def test_dted_9(): - ds = gdal.Open('data/n43.dt0') + ds = gdal.Open("data/n43.dt0") bandSrc = ds.GetRasterBand(1) driver = gdal.GetDriverByName("GTiff") - dsDst = driver.Create('tmp/n53.dt1.tif', 601, 1201, 1, gdal.GDT_Int16) - dsDst.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') - dsDst.SetGeoTransform((-80.0008333333333333, 0.001666666666667, 0, 54.0004166666666670, 0, -0.0008333333333333)) + dsDst = driver.Create("tmp/n53.dt1.tif", 601, 1201, 1, gdal.GDT_Int16) + dsDst.SetProjection( + 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ) + dsDst.SetGeoTransform( + ( + -80.0008333333333333, + 0.001666666666667, + 0, + 54.0004166666666670, + 0, + -0.0008333333333333, + ) + ) bandDst = dsDst.GetRasterBand(1) @@ -200,14 +244,15 @@ def test_dted_9(): ds = None dsDst = None - ds = gdal.Open('tmp/n53.dt1.tif') + ds = gdal.Open("tmp/n53.dt1.tif") driver = gdal.GetDriverByName("DTED") - dsDst = driver.CreateCopy('tmp/n53.dt1', ds) + dsDst = driver.CreateCopy("tmp/n53.dt1", ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 36542, ('Wrong checksum. Checksum found %d' % chksum) + assert chksum == 36542, "Wrong checksum. Checksum found %d" % chksum + ############################################################################### # Test creating an in memory copy. @@ -215,7 +260,7 @@ def test_dted_9(): def test_dted_10(): - tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) + tst = gdaltest.GDALTest("dted", "n43.dt0", 1, 49187) return tst.testCreateCopy(vsimem=1) @@ -225,25 +270,35 @@ def test_dted_10(): # inverted. This was fixed in MIL-D-89020 Amendment 1, but some products may # be affected. + def test_dted_11(): - ds = gdal.Open('data/dted/n43_coord_inverted.dt0') + ds = gdal.Open("data/dted/n43_coord_inverted.dt0") gt = ds.GetGeoTransform() max_error = 0.000001 - assert gt[0] == pytest.approx((-80.004166666666663), abs=max_error) and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) and gt[2] == pytest.approx(0, abs=max_error) and gt[3] == pytest.approx(44.00416666666667, abs=max_error) and gt[4] == pytest.approx(0, abs=max_error) and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error), \ - 'DTED geotransform wrong.' + assert ( + gt[0] == pytest.approx((-80.004166666666663), abs=max_error) + and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) + and gt[2] == pytest.approx(0, abs=max_error) + and gt[3] == pytest.approx(44.00416666666667, abs=max_error) + and gt[4] == pytest.approx(0, abs=max_error) + and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error) + ), "DTED geotransform wrong." prj = ds.GetProjection() - assert prj == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', \ - ('Projection does not match expected:\n%s' % prj) + assert ( + prj + == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ), ("Projection does not match expected:\n%s" % prj) band1 = ds.GetRasterBand(1) - assert band1.GetNoDataValue() == -32767, 'Grid NODATA value wrong or missing.' + assert band1.GetNoDataValue() == -32767, "Grid NODATA value wrong or missing." + + assert band1.DataType == gdal.GDT_Int16, "Data type is not Int16!" - assert band1.DataType == gdal.GDT_Int16, 'Data type is not Int16!' ############################################################################### # Test a DTED file that begins with a HDR record, and not directly the UHL record (#2951) @@ -251,9 +306,10 @@ def test_dted_11(): def test_dted_12(): - ds = gdal.Open('data/dted/w118n033_trunc.dt1') + ds = gdal.Open("data/dted/w118n033_trunc.dt1") assert ds is not None + ############################################################################### # Test a DTED file that has only a few (sequential) columns. Derived from # a real-world DTED file @@ -261,9 +317,10 @@ def test_dted_12(): def test_dted_13(): - tst = gdaltest.GDALTest('dted', 'dted/n43_partial_cols.dt0', 1, 56006) + tst = gdaltest.GDALTest("dted", "dted/n43_partial_cols.dt0", 1, 56006) return tst.testOpen() + ############################################################################### # Test a DTED file that has only a few (non-sequential) columns. Only theoretical # case for now. @@ -271,31 +328,35 @@ def test_dted_13(): def test_dted_14(): - tst = gdaltest.GDALTest('dted', 'dted/n43_sparse_cols.dt0', 1, 56369) + tst = gdaltest.GDALTest("dted", "dted/n43_sparse_cols.dt0", 1, 56369) return tst.testOpen() + ############################################################################### # Perform simple read test with GDAL_DTED_SINGLE_BLOCK = YES def test_dted_15(): - gdal.SetConfigOption('GDAL_DTED_SINGLE_BLOCK', 'YES') - tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) + gdal.SetConfigOption("GDAL_DTED_SINGLE_BLOCK", "YES") + tst = gdaltest.GDALTest("dted", "n43.dt0", 1, 49187) ret = tst.testOpen() - gdal.SetConfigOption('GDAL_DTED_SINGLE_BLOCK', None) + gdal.SetConfigOption("GDAL_DTED_SINGLE_BLOCK", None) return ret def test_dted_16(): - with gdaltest.config_option('DTED_APPLY_PIXEL_IS_POINT', 'TRUE'): - ds = gdal.Open('data/n43.dt0') + with gdaltest.config_option("DTED_APPLY_PIXEL_IS_POINT", "TRUE"): + ds = gdal.Open("data/n43.dt0") assert ds is not None max_error = 0.000001 gt = ds.GetGeoTransform() - assert gt == pytest.approx((-80.0, 0.0083333333333333332, 0, 44.0, 0, -0.0083333333333333332), abs=max_error) + assert gt == pytest.approx( + (-80.0, 0.0083333333333333332, 0, 44.0, 0, -0.0083333333333333332), + abs=max_error, + ) ############################################################################### @@ -304,18 +365,14 @@ def test_dted_16(): def test_dted_cleanup(): try: - os.remove('tmp/n43.dt1.tif') - os.remove('tmp/n43.dt1.aux.xml') - os.remove('tmp/n43.dt1') - os.remove('tmp/n53.dt1.tif') - os.remove('tmp/n53.dt1.aux.xml') - os.remove('tmp/n53.dt1') - os.remove('tmp/n43.dt2.tif') - os.remove('tmp/n43.dt2.aux.xml') - os.remove('tmp/n43.dt2') + os.remove("tmp/n43.dt1.tif") + os.remove("tmp/n43.dt1.aux.xml") + os.remove("tmp/n43.dt1") + os.remove("tmp/n53.dt1.tif") + os.remove("tmp/n53.dt1.aux.xml") + os.remove("tmp/n53.dt1") + os.remove("tmp/n43.dt2.tif") + os.remove("tmp/n43.dt2.aux.xml") + os.remove("tmp/n43.dt2") except OSError: pass - - - - diff --git a/autotest/gdrivers/ecrgtoc.py b/autotest/gdrivers/ecrgtoc.py index eacb12ffb6d6..c98e21ae5a40 100755 --- a/autotest/gdrivers/ecrgtoc.py +++ b/autotest/gdrivers/ecrgtoc.py @@ -29,16 +29,16 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal ############################################################################### # Basic test + def test_ecrgtoc_1(): toc_xml = """ @@ -75,36 +75,77 @@ def test_ecrgtoc_1(): """ - f = gdal.VSIFOpenL('/vsimem/TOC.xml', 'wb') + f = gdal.VSIFOpenL("/vsimem/TOC.xml", "wb") gdal.VSIFWriteL(toc_xml, 1, len(toc_xml), f) gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/TOC.xml') + ds = gdal.Open("/vsimem/TOC.xml") assert ds is not None - expected_gt = [-85.43147208121826, 0.00059486040609137061, 0.0, 33.166986564299428, 0.0, -0.00044985604606525913] + expected_gt = [ + -85.43147208121826, + 0.00059486040609137061, + 0.0, + 33.166986564299428, + 0.0, + -0.00044985604606525913, + ] gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10): - gdaltest.post_reason('did not get expected geotransform') + gdaltest.post_reason("did not get expected geotransform") print(gt) wkt = ds.GetProjectionRef() - assert wkt.find('WGS 84') != -1, 'did not get expected SRS' + assert wkt.find("WGS 84") != -1, "did not get expected SRS" filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected filelist' - - ds2 = gdal.GetDriverByName('NITF').Create('/vsimem/clfc/2/000000009s0013.lf2', 2304, 2304, 3, - options=['ICORDS=G', 'TRE=GEOLOB=000605184000800256-85.43147208122+33.16698656430']) - ds2.SetGeoTransform([-85.43147208122, 0.00059486040609137061, 0.0, 33.16698656430, 0.0, -0.00044985604606525913]) + assert len(filelist) == 3, "did not get expected filelist" + + ds2 = gdal.GetDriverByName("NITF").Create( + "/vsimem/clfc/2/000000009s0013.lf2", + 2304, + 2304, + 3, + options=[ + "ICORDS=G", + "TRE=GEOLOB=000605184000800256-85.43147208122+33.16698656430", + ], + ) + ds2.SetGeoTransform( + [ + -85.43147208122, + 0.00059486040609137061, + 0.0, + 33.16698656430, + 0.0, + -0.00044985604606525913, + ] + ) ds2.SetProjection(wkt) ds2.GetRasterBand(1).Fill(255) ds2 = None - ds2 = gdal.GetDriverByName('NITF').Create('/vsimem/clfc/2/000000009t0013.lf2', 2304, 2304, 3, - options=['ICORDS=G', 'TRE=GEOLOB=000605184000800256-84.06091370558+33.16698656430']) - ds2.SetGeoTransform([-84.06091370558, 0.00059486040609137061, 0.0, 33.16698656430, 0.0, -0.00044985604606525913]) + ds2 = gdal.GetDriverByName("NITF").Create( + "/vsimem/clfc/2/000000009t0013.lf2", + 2304, + 2304, + 3, + options=[ + "ICORDS=G", + "TRE=GEOLOB=000605184000800256-84.06091370558+33.16698656430", + ], + ) + ds2.SetGeoTransform( + [ + -84.06091370558, + 0.00059486040609137061, + 0.0, + 33.16698656430, + 0.0, + -0.00044985604606525913, + ] + ) ds2.SetProjection(wkt) ds2 = None @@ -112,7 +153,8 @@ def test_ecrgtoc_1(): ds = None - assert cs == 5966, 'bad checksum' + assert cs == 5966, "bad checksum" + ############################################################################### # Test overviews @@ -120,17 +162,18 @@ def test_ecrgtoc_1(): def test_ecrgtoc_2(): - ds = gdal.Open('/vsimem/TOC.xml') - ds.BuildOverviews('NEAR', [2]) + ds = gdal.Open("/vsimem/TOC.xml") + ds.BuildOverviews("NEAR", [2]) ds = None - ds = gdal.Open('/vsimem/TOC.xml') + ds = gdal.Open("/vsimem/TOC.xml") filelist = ds.GetFileList() - assert len(filelist) == 4, 'did not get expected filelist' + assert len(filelist) == 4, "did not get expected filelist" ds = None + ############################################################################### # Test opening subdataset @@ -138,17 +181,19 @@ def test_ecrgtoc_2(): def test_ecrgtoc_3(): # Try different errors - for name in ['ECRG_TOC_ENTRY:', - 'ECRG_TOC_ENTRY:ProductTitle', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:not_existing', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:c:/not_existing', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:not_existing', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing:extra', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId:inexisting_scale:/vsimem/TOC.xml', - 'ECRG_TOC_ENTRY:ProductTitle:DiscId2:/vsimem/TOC.xml', - 'ECRG_TOC_ENTRY:ProductTitle2:DiscId:/vsimem/TOC.xml']: + for name in [ + "ECRG_TOC_ENTRY:", + "ECRG_TOC_ENTRY:ProductTitle", + "ECRG_TOC_ENTRY:ProductTitle:DiscId", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:not_existing", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:c:/not_existing", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:not_existing", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing:extra", + "ECRG_TOC_ENTRY:ProductTitle:DiscId:inexisting_scale:/vsimem/TOC.xml", + "ECRG_TOC_ENTRY:ProductTitle:DiscId2:/vsimem/TOC.xml", + "ECRG_TOC_ENTRY:ProductTitle2:DiscId:/vsimem/TOC.xml", + ]: gdal.PushErrorHandler() ds = gdal.Open(name) @@ -156,18 +201,19 @@ def test_ecrgtoc_3(): assert ds is None, name # Legacy syntax - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml') + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml") assert ds is not None ds = None - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml') + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml") assert ds is not None ds = None - gdal.Unlink('/vsimem/TOC.xml') - gdal.Unlink('/vsimem/TOC.xml.1.ovr') - gdal.Unlink('/vsimem/clfc/2/000000009s0013.lf2') - gdal.Unlink('/vsimem/clfc/2/000000009t0013.lf2') + gdal.Unlink("/vsimem/TOC.xml") + gdal.Unlink("/vsimem/TOC.xml.1.ovr") + gdal.Unlink("/vsimem/clfc/2/000000009s0013.lf2") + gdal.Unlink("/vsimem/clfc/2/000000009t0013.lf2") + ############################################################################### # Test dataset with 3 subdatasets @@ -223,79 +269,95 @@ def test_ecrgtoc_4(): """ - f = gdal.VSIFOpenL('/vsimem/TOC.xml', 'wb') + f = gdal.VSIFOpenL("/vsimem/TOC.xml", "wb") gdal.VSIFWriteL(toc_xml, 1, len(toc_xml), f) gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/TOC.xml') + ds = gdal.Open("/vsimem/TOC.xml") assert ds is not None - assert ds.RasterCount == 0, 'bad raster count' - - expected_gt = (-85.43147208121826, 0.00059486040609137061, 0.0, 37.241379310344833, 0.0, -0.00044985604606525913) + assert ds.RasterCount == 0, "bad raster count" + + expected_gt = ( + -85.43147208121826, + 0.00059486040609137061, + 0.0, + 37.241379310344833, + 0.0, + -0.00044985604606525913, + ) gt = ds.GetGeoTransform() for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=1e-10), 'did not get expected geotransform' + assert gt[i] == pytest.approx( + expected_gt[i], abs=1e-10 + ), "did not get expected geotransform" wkt = ds.GetProjectionRef() - assert wkt.find('WGS 84') != -1, 'did not get expected SRS' + assert wkt.find("WGS 84") != -1, "did not get expected SRS" filelist = ds.GetFileList() - assert len(filelist) == 4, 'did not get expected filelist' + assert len(filelist) == 4, "did not get expected filelist" - subdatasets = ds.GetMetadata('SUBDATASETS') + subdatasets = ds.GetMetadata("SUBDATASETS") if len(subdatasets) != 6: print(filelist) - pytest.fail('did not get expected subdatasets') + pytest.fail("did not get expected subdatasets") ds = None - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml') - assert ds is not None, 'did not get subdataset' + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml") + assert ds is not None, "did not get subdataset" ds = None - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_1000_K:/vsimem/TOC.xml') - assert ds is not None, 'did not get subdataset' + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId:1_1000_K:/vsimem/TOC.xml") + assert ds is not None, "did not get subdataset" ds = None - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId2:1_500_K:/vsimem/TOC.xml') - assert ds is not None, 'did not get subdataset' + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId2:1_500_K:/vsimem/TOC.xml") + assert ds is not None, "did not get subdataset" ds = None - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml") gdal.PopErrorHandler() - assert ds is None, 'should not have got subdataset' + assert ds is None, "should not have got subdataset" + + gdal.Unlink("/vsimem/TOC.xml") - gdal.Unlink('/vsimem/TOC.xml') ############################################################################### def test_ecrgtoc_online_1(): - if not gdaltest.download_file('http://www.falconview.org/trac/FalconView/downloads/17', 'ECRG_Sample.zip'): + if not gdaltest.download_file( + "http://www.falconview.org/trac/FalconView/downloads/17", "ECRG_Sample.zip" + ): pytest.skip() try: - os.stat('tmp/cache/ECRG_Sample.zip') + os.stat("tmp/cache/ECRG_Sample.zip") except OSError: pytest.skip() - ds = gdal.Open('/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/TOC.xml') + ds = gdal.Open("/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/TOC.xml") assert ds is not None - expected_gt = (-85.43147208121826, 0.00059486040609137061, 0.0, 35.239923224568145, 0.0, -0.00044985604606525913) + expected_gt = ( + -85.43147208121826, + 0.00059486040609137061, + 0.0, + 35.239923224568145, + 0.0, + -0.00044985604606525913, + ) gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10): - gdaltest.post_reason('did not get expected geotransform') + gdaltest.post_reason("did not get expected geotransform") print(gt) wkt = ds.GetProjectionRef() - assert wkt.find('WGS 84') != -1, 'did not get expected SRS' + assert wkt.find("WGS 84") != -1, "did not get expected SRS" filelist = ds.GetFileList() - assert len(filelist) == 7, 'did not get expected filelist' - - - + assert len(filelist) == 7, "did not get expected filelist" diff --git a/autotest/gdrivers/ecw.py b/autotest/gdrivers/ecw.py index f61ab2b7c2c9..83fae9b60048 100755 --- a/autotest/gdrivers/ecw.py +++ b/autotest/gdrivers/ecw.py @@ -30,72 +30,72 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import array import os import os.path -import sys -import array import shutil import struct -from osgeo import gdal -from osgeo import osr - +import sys import gdaltest import pytest -pytestmark = pytest.mark.require_driver('ECW') +from osgeo import gdal, osr + +pytestmark = pytest.mark.require_driver("ECW") ############################################################################### def has_write_support(): - if hasattr(gdaltest, 'b_ecw_has_write_support'): + if hasattr(gdaltest, "b_ecw_has_write_support"): return gdaltest.b_ecw_has_write_support gdaltest.b_ecw_has_write_support = False - ecw_drv = gdal.GetDriverByName('ECW') - if ecw_drv is None or ecw_drv.GetMetadataItem('DMD_CREATIONDATATYPES') is None: + ecw_drv = gdal.GetDriverByName("ECW") + if ecw_drv is None or ecw_drv.GetMetadataItem("DMD_CREATIONDATATYPES") is None: return False - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") if ds: - out_ds = ecw_drv.CreateCopy('tmp/jrc_out.ecw', ds, options=['TARGET=75']) + out_ds = ecw_drv.CreateCopy("tmp/jrc_out.ecw", ds, options=["TARGET=75"]) if out_ds: out_ds = None gdaltest.b_ecw_has_write_support = True try: - os.remove('tmp/jrc_out.ecw') + os.remove("tmp/jrc_out.ecw") except OSError: pass try: - os.remove('tmp/jrc_out.ecw.aux.xml') + os.remove("tmp/jrc_out.ecw.aux.xml") except OSError: pass else: - if 'ECW_ENCODE_KEY' not in gdal.GetLastErrorMsg(): - pytest.fail('ECW creation failed for unknown reason') + if "ECW_ENCODE_KEY" not in gdal.GetLastErrorMsg(): + pytest.fail("ECW creation failed for unknown reason") return gdaltest.b_ecw_has_write_support + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.ecw_drv = gdal.GetDriverByName('ECW') + gdaltest.ecw_drv = gdal.GetDriverByName("ECW") assert gdaltest.ecw_drv is not None - gdaltest.jp2ecw_drv = gdal.GetDriverByName('JP2ECW') + gdaltest.jp2ecw_drv = gdal.GetDriverByName("JP2ECW") - gdaltest.deregister_all_jpeg2000_drivers_but('JP2ECW') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2ECW") - longname = gdaltest.ecw_drv.GetMetadataItem('DMD_LONGNAME') + longname = gdaltest.ecw_drv.GetMetadataItem("DMD_LONGNAME") - sdk_off = longname.find('SDK ') + sdk_off = longname.find("SDK ") if sdk_off != -1: gdaltest.ecw_drv.major_version = int(float(longname[sdk_off + 4])) - sdk_minor_off = longname.find('.', sdk_off) + sdk_minor_off = longname.find(".", sdk_off) if sdk_minor_off >= 0: - if longname[sdk_minor_off + 1] == 'x': + if longname[sdk_minor_off + 1] == "x": gdaltest.ecw_drv.minor_version = 3 else: gdaltest.ecw_drv.minor_version = int(longname[sdk_minor_off + 1]) @@ -113,80 +113,80 @@ def startup_and_cleanup(): gdaltest.reregister_all_jpeg2000_drivers() try: - os.remove('tmp/jrc_out.ecw') + os.remove("tmp/jrc_out.ecw") except OSError: pass try: - os.remove('tmp/jrc_out.ecw.aux.xml') + os.remove("tmp/jrc_out.ecw.aux.xml") except OSError: pass try: - os.remove('tmp/ecw_5.jp2') + os.remove("tmp/ecw_5.jp2") except OSError: pass try: - os.remove('tmp/ecw_5.jp2.aux.xml') + os.remove("tmp/ecw_5.jp2.aux.xml") except OSError: pass try: - os.remove('tmp/ecw_7.ntf') + os.remove("tmp/ecw_7.ntf") except OSError: pass try: - os.remove('tmp/ecw9.jp2') + os.remove("tmp/ecw9.jp2") except OSError: pass try: - os.remove('tmp/test_11.ntf') + os.remove("tmp/test_11.ntf") except OSError: pass try: - os.remove('tmp/rgb_gcp.jp2') + os.remove("tmp/rgb_gcp.jp2") except OSError: pass try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass try: - os.remove('tmp/spif83.ecw.aux.xml') + os.remove("tmp/spif83.ecw.aux.xml") except OSError: pass try: - os.remove('tmp/UInt16_big_out.ecw') + os.remove("tmp/UInt16_big_out.ecw") except OSError: pass try: - os.remove('tmp/UInt16_big_out.jp2') + os.remove("tmp/UInt16_big_out.jp2") except OSError: pass try: - os.remove('tmp/UInt16_big_out.jp2.aux.xml') + os.remove("tmp/UInt16_big_out.jp2.aux.xml") except OSError: pass try: - os.remove('tmp/UInt16_big_out.ecw.aux.xml') + os.remove("tmp/UInt16_big_out.ecw.aux.xml") except OSError: pass try: - os.remove('tmp/jrc312.ecw') + os.remove("tmp/jrc312.ecw") except OSError: pass try: - os.remove('tmp/jrc123.ecw') + os.remove("tmp/jrc123.ecw") except OSError: pass try: - os.remove('tmp/jrcstats.ecw') + os.remove("tmp/jrcstats.ecw") except OSError: pass - if hasattr(gdaltest, 'ecw_38_fname'): + if hasattr(gdaltest, "ecw_38_fname"): gdal.Unlink(gdaltest.ecw_38_fname) gdal.Unlink(gdaltest.ecw_38_fname + ".aux.xml") try: - os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw') + os.remove("tmp/stefan_full_rgba_ecwv3_meta.ecw") except OSError: pass @@ -197,7 +197,7 @@ def startup_and_cleanup(): def test_ecw_2(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (141.172, 67.3636) @@ -209,12 +209,25 @@ def test_ecw_2(): (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(467498.5, abs=0.1) and geotransform[1] == pytest.approx(16.5475, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-16.5475, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(467498.5, abs=0.1) + and geotransform[1] == pytest.approx(16.5475, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-16.5475, abs=0.001) + ), "geotransform differs from expected" + ############################################################################### # Verify various information about our generated image. @@ -225,13 +238,13 @@ def test_ecw_4(): if not has_write_support(): pytest.skip() - src_ds = gdal.Open('data/ecw/jrc.ecw') - gdaltest.ecw_drv.CreateCopy('tmp/jrc_out.ecw', src_ds, options=['TARGET=75']) - gdal.Unlink('tmp/jrc_out.ecw.aux.xml') + src_ds = gdal.Open("data/ecw/jrc.ecw") + gdaltest.ecw_drv.CreateCopy("tmp/jrc_out.ecw", src_ds, options=["TARGET=75"]) + gdal.Unlink("tmp/jrc_out.ecw.aux.xml") - ds = gdal.Open('tmp/jrc_out.ecw') - version = ds.GetMetadataItem('VERSION') - assert version == '2', 'bad VERSION' + ds = gdal.Open("tmp/jrc_out.ecw") + version = ds.GetMetadataItem("VERSION") + assert version == "2", "bad VERSION" if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (140.290, 66.6303) @@ -243,15 +256,28 @@ def test_ecw_4(): (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(467498.5, abs=0.1) and geotransform[1] == pytest.approx(16.5475, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-16.5475, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(467498.5, abs=0.1) + and geotransform[1] == pytest.approx(16.5475, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-16.5475, abs=0.001) + ), "geotransform differs from expected" ds = None + ############################################################################### # Now try writing a JPEG2000 compressed version of the same with the ECW driver @@ -260,13 +286,14 @@ def test_ecw_5(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('data/small.vrt') - ds_out = gdaltest.jp2ecw_drv.CreateCopy('tmp/ecw_5.jp2', ds, options=['TARGET=75']) + ds = gdal.Open("data/small.vrt") + ds_out = gdaltest.jp2ecw_drv.CreateCopy("tmp/ecw_5.jp2", ds, options=["TARGET=75"]) assert ds_out.GetDriver().ShortName == "JP2ECW" - version = ds_out.GetMetadataItem('VERSION') - assert version == '1', 'bad VERSION' + version = ds_out.GetMetadataItem("VERSION") + assert version == "1", "bad VERSION" ds = None + ############################################################################### # Verify various information about our generated image. @@ -276,7 +303,7 @@ def test_ecw_6(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('tmp/ecw_5.jp2') + ds = gdal.Open("tmp/ecw_5.jp2") if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (144.422, 44.9075) @@ -286,30 +313,46 @@ def test_ecw_6(): # The difference in the stddev is outrageously large between win32 and # Linux, but I don't know why. - assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx(exp_stddev, abs=6), \ - ('mean/stddev of (%g,%g) diffs from ' - 'expected(%g,%g)' % (mean, stddev, exp_mean, - exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx( + exp_stddev, abs=6 + ), "mean/stddev of (%g,%g) diffs from " "expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) (mean, stddev) = ds.GetRasterBand(2).ComputeBandStats() # The difference in the stddev is outrageously large between win32 and # Linux, but I don't know why. - assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx(exp_stddev, abs=6), \ - ('mean/stddev of (%g,%g) diffs from ' - 'expected(%g,%g)' % (mean, stddev, exp_mean, - exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx( + exp_stddev, abs=6 + ), "mean/stddev of (%g,%g) diffs from " "expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" prj = ds.GetProjectionRef() - assert (not (prj.find('UTM') == -1 or prj.find('NAD27') == -1 \ - or prj.find('one 11') == -1)), 'Coordinate system not UTM 11, NAD27?' + assert not ( + prj.find("UTM") == -1 or prj.find("NAD27") == -1 or prj.find("one 11") == -1 + ), "Coordinate system not UTM 11, NAD27?" ds = None + ############################################################################### # Write the same image to NITF. @@ -318,11 +361,12 @@ def test_ecw_7(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('data/small.vrt') - drv = gdal.GetDriverByName('NITF') - drv.CreateCopy('tmp/ecw_7.ntf', ds, options=['IC=C8', 'TARGET=75'], strict=0) + ds = gdal.Open("data/small.vrt") + drv = gdal.GetDriverByName("NITF") + drv.CreateCopy("tmp/ecw_7.ntf", ds, options=["IC=C8", "TARGET=75"], strict=0) ds = None + ############################################################################### # Verify various information about our generated image. @@ -332,24 +376,42 @@ def test_ecw_8(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('tmp/ecw_7.ntf') + ds = gdal.Open("tmp/ecw_7.ntf") (exp_mean, exp_stddev) = (145.57, 43.1712) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx(exp_stddev, abs=1.0), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx( + exp_stddev, abs=1.0 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" prj = ds.GetProjectionRef() - assert prj.find('PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]') == -1 or prj.find('WGS 84') > 0, \ - 'Coordinate system not UTM 11, WGS 84?' + assert ( + prj.find( + 'PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]' + ) + == -1 + or prj.find("WGS 84") > 0 + ), "Coordinate system not UTM 11, WGS 84?" ds = None + ############################################################################### # Try writing 16bit JP2 file directly using Create(). @@ -359,22 +421,25 @@ def test_ecw_9(): pytest.skip() # This always crashes on Frank's machine - some bug in old sdk. - if os.getenv('USER') == 'warmerda' and gdaltest.ecw_drv.major_version == 3: + if os.getenv("USER") == "warmerda" and gdaltest.ecw_drv.major_version == 3: pytest.skip() - ds = gdaltest.jp2ecw_drv.Create('tmp/ecw9.jp2', 200, 100, 1, - gdal.GDT_Int16, options=['TARGET=75']) + ds = gdaltest.jp2ecw_drv.Create( + "tmp/ecw9.jp2", 200, 100, 1, gdal.GDT_Int16, options=["TARGET=75"] + ) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) - ds.SetProjection('GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]') + ds.SetProjection( + 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]' + ) - raw_data = array.array('h', list(range(200))).tobytes() + raw_data = array.array("h", list(range(200))).tobytes() for line in range(100): - ds.WriteRaster(0, line, 200, 1, raw_data, - buf_type=gdal.GDT_Int16) + ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16) ds = None + ############################################################################### # Verify previous 16bit file. @@ -384,20 +449,33 @@ def test_ecw_10(): pytest.skip() # This always crashes on Frank's machine - some bug in old sdk. - if os.getenv('USER') == 'warmerda' and gdaltest.ecw_drv.major_version == 3: + if os.getenv("USER") == "warmerda" and gdaltest.ecw_drv.major_version == 3: pytest.skip() - ds = gdal.Open('tmp/ecw9.jp2') + ds = gdal.Open("tmp/ecw9.jp2") (exp_mean, exp_stddev) = (98.49, 57.7129) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=1.1) and stddev == pytest.approx(exp_stddev, abs=0.1), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=1.1) and stddev == pytest.approx( + exp_stddev, abs=0.1 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(100, abs=0.1) + and geotransform[1] == pytest.approx(0.1, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(30, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-0.1, abs=0.001) + ), "geotransform differs from expected" + ############################################################################### # Test direct creation of an NITF/JPEG2000 file. @@ -407,18 +485,17 @@ def test_ecw_11(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - drv = gdal.GetDriverByName('NITF') - ds = drv.Create('tmp/test_11.ntf', 200, 100, 3, gdal.GDT_Byte, - ['ICORDS=G']) + drv = gdal.GetDriverByName("NITF") + ds = drv.Create("tmp/test_11.ntf", 200, 100, 3, gdal.GDT_Byte, ["ICORDS=G"]) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) my_list = list(range(200)) + list(range(20, 220)) + list(range(30, 230)) - raw_data = array.array('h', my_list).tobytes() + raw_data = array.array("h", my_list).tobytes() for line in range(100): - ds.WriteRaster(0, line, 200, 1, raw_data, - buf_type=gdal.GDT_Int16, - band_list=[1, 2, 3]) + ds.WriteRaster( + 0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1, 2, 3] + ) ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) @@ -426,6 +503,7 @@ def test_ecw_11(): ds = None + ############################################################################### # Verify previous file @@ -434,23 +512,33 @@ def test_ecw_12(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('tmp/test_11.ntf') + ds = gdal.Open("tmp/test_11.ntf") geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30.0, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ - 'geotransform differs from expected' - - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ - 'Got wrong color interpretation.' - - assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ - 'Got wrong color interpretation.' - - assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ - 'Got wrong color interpretation.' + assert ( + geotransform[0] == pytest.approx(100, abs=0.1) + and geotransform[1] == pytest.approx(0.1, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(30.0, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-0.1, abs=0.001) + ), "geotransform differs from expected" + + assert ( + ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand + ), "Got wrong color interpretation." + + assert ( + ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand + ), "Got wrong color interpretation." + + assert ( + ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand + ), "Got wrong color interpretation." ds = None + ############################################################################### # This is intended to verify that the ECWDataset::RasterIO() special case # works properly. It is used to copy subwindow into a memory dataset @@ -462,24 +550,29 @@ def test_ecw_13(): if gdaltest.jp2ecw_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/rgb16_ecwsdk.jp2') + ds = gdal.Open("data/jpeg2000/rgb16_ecwsdk.jp2") wrktype = gdal.GDT_Float32 - raw_data = ds.ReadRaster(10, 10, 40, 40, buf_type=wrktype, - band_list=[3, 2, 1]) + raw_data = ds.ReadRaster(10, 10, 40, 40, buf_type=wrktype, band_list=[3, 2, 1]) ds = None - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('workdata', 40, 40, 3, wrktype) + drv = gdal.GetDriverByName("MEM") + ds = drv.Create("workdata", 40, 40, 3, wrktype) ds.WriteRaster(0, 0, 40, 40, raw_data, buf_type=wrktype) - checksums = (ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(2).Checksum(), - ds.GetRasterBand(3).Checksum()) + checksums = ( + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(2).Checksum(), + ds.GetRasterBand(3).Checksum(), + ) ds = None - assert checksums == (19253, 17848, 19127), \ - 'Expected checksums do match expected checksums' + assert checksums == ( + 19253, + 17848, + 19127, + ), "Expected checksums do match expected checksums" + ############################################################################### # Write out image with GCPs. @@ -489,9 +582,11 @@ def test_ecw_14(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('data/rgb_gcp.vrt') - gdaltest.jp2ecw_drv.CreateCopy('tmp/rgb_gcp.jp2', ds) + ds = gdal.Open("data/rgb_gcp.vrt") + gdaltest.jp2ecw_drv.CreateCopy("tmp/rgb_gcp.jp2", ds) ds = None + + ############################################################################### # Verify various information about our generated image. @@ -501,19 +596,26 @@ def test_ecw_15(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('tmp/rgb_gcp.jp2') + ds = gdal.Open("tmp/rgb_gcp.jp2") gcp_srs = ds.GetGCPProjection() - assert (not (gcp_srs[:6] != 'GEOGCS' \ - or gcp_srs.find('WGS') == -1 \ - or gcp_srs.find('84') == -1)), 'GCP Projection not retained.' + assert not ( + gcp_srs[:6] != "GEOGCS" or gcp_srs.find("WGS") == -1 or gcp_srs.find("84") == -1 + ), "GCP Projection not retained." gcps = ds.GetGCPs() - assert len(gcps) == 4 and gcps[1].GCPPixel == 0 and gcps[1].GCPLine == 50 and gcps[1].GCPX == 0 and gcps[1].GCPY == 50 and gcps[1].GCPZ == 0, \ - 'GCPs wrong.' + assert ( + len(gcps) == 4 + and gcps[1].GCPPixel == 0 + and gcps[1].GCPLine == 50 + and gcps[1].GCPX == 0 + and gcps[1].GCPY == 50 + and gcps[1].GCPZ == 0 + ), "GCPs wrong." ds = None + ############################################################################### # Open byte.jp2 @@ -544,9 +646,10 @@ def test_ecw_16(): """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('JP2ECW', 'jpeg2000/byte.jp2', 1, 50054) + tst = gdaltest.GDALTest("JP2ECW", "jpeg2000/byte.jp2", 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Open int16.jp2 @@ -557,10 +660,10 @@ def test_ecw_17(): pytest.skip() if gdaltest.ecw_drv.major_version == 4: - pytest.skip('4.x SDK gets unreliable results for jp2') + pytest.skip("4.x SDK gets unreliable results for jp2") - ds = gdal.Open('data/jpeg2000/int16.jp2') - ds_ref = gdal.Open('data/int16.tif') + ds = gdal.Open("data/jpeg2000/int16.jp2") + ds_ref = gdal.Open("data/int16.tif") maxdiff = gdaltest.compare_ds(ds, ds_ref) @@ -568,7 +671,8 @@ def test_ecw_17(): ds_ref = None # Quite a bit of difference... - assert maxdiff <= 6, 'Image too different from reference' + assert maxdiff <= 6, "Image too different from reference" + ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) @@ -600,11 +704,14 @@ def test_ecw_18(): """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('JP2ECW', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2ECW", "/vsigzip/data/jpeg2000/byte.jp2.gz", 1, 50054, filename_absolute=1 + ) ret = tst.testOpen(check_prj=srs, check_gt=gt) - gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') + gdal.Unlink("data/jpeg2000/byte.jp2.gz.properties") return ret + ############################################################################### # Test a JPEG2000 with the 3 bands having 13bit depth and the 4th one 1 bit @@ -614,7 +721,7 @@ def test_ecw_19(): if gdaltest.jp2ecw_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') + ds = gdal.Open("data/jpeg2000/3_13bit_and_1bit.jp2") # 31324 is got with ECW SDK 5.5 on Windows that seems to promote the 1 bit # channel to 8 bit @@ -623,7 +730,8 @@ def test_ecw_19(): for i in range(4): assert ds.GetRasterBand(i + 1).Checksum() in expected_checksums[i] - assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' + assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, "unexpected data type" + ############################################################################### # Confirm that we have an overview for this image and that the statistics @@ -632,15 +740,15 @@ def test_ecw_19(): def test_ecw_20(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") band = ds.GetRasterBand(1) - assert band.GetOverviewCount() == 1, 'did not get expected number of overview' + assert band.GetOverviewCount() == 1, "did not get expected number of overview" # Both requests should go *exactly* to the same code path data_subsampled = band.ReadRaster(0, 0, 400, 400, 200, 200) data_overview = band.GetOverview(0).ReadRaster(0, 0, 200, 200) - assert data_subsampled == data_overview, 'inconsistent overview behaviour' + assert data_subsampled == data_overview, "inconsistent overview behaviour" if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (141.644, 67.2186) @@ -651,10 +759,15 @@ def test_ecw_20(): (exp_mean, exp_stddev) = (140.889, 62.742) (mean, stddev) = band.GetOverview(0).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from ' - 'expected(%g,%g)' % (mean, stddev, exp_mean, - exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from " "expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) + ############################################################################### # This test is intended to go through an optimized data path (likely @@ -665,8 +778,10 @@ def test_ecw_20(): def test_ecw_21(): - ds = gdal.Open('data/ecw/jrc.ecw') - mem_ds = gdal.GetDriverByName('MEM').CreateCopy('xxxyyy', ds, options=['INTERLEAVE=PIXEL']) + ds = gdal.Open("data/ecw/jrc.ecw") + mem_ds = gdal.GetDriverByName("MEM").CreateCopy( + "xxxyyy", ds, options=["INTERLEAVE=PIXEL"] + ) ds = None if gdaltest.ecw_drv.major_version == 3: @@ -679,8 +794,15 @@ def test_ecw_21(): (mean, stddev) = mem_ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) + ############################################################################### # This tests reading of georeferencing and coordinate system from within an @@ -689,12 +811,13 @@ def test_ecw_21(): def test_ecw_22(): - ds = gdal.Open('data/ecw/spif83.ecw') + ds = gdal.Open("data/ecw/spif83.ecw") expected_wkt = """PROJCS["L2CAL6M",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",32.7833333078095],PARAMETER["standard_parallel_2",33.8833333208765],PARAMETER["latitude_of_origin",32.166666682432],PARAMETER["central_meridian",-116.249999974595],PARAMETER["false_easting",2000000],PARAMETER["false_northing",500000],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" wkt = ds.GetProjectionRef() - assert wkt == expected_wkt, 'did not get expected SRS.' + assert wkt == expected_wkt, "did not get expected SRS." + ############################################################################### # This tests overriding the coordinate system from an .aux.xml file, while @@ -703,24 +826,31 @@ def test_ecw_22(): def test_ecw_23(): - shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') - shutil.copyfile('data/ecw/spif83_hidden.ecw.aux.xml', 'tmp/spif83.ecw.aux.xml') + shutil.copyfile("data/ecw/spif83.ecw", "tmp/spif83.ecw") + shutil.copyfile("data/ecw/spif83_hidden.ecw.aux.xml", "tmp/spif83.ecw.aux.xml") - ds = gdal.Open('tmp/spif83.ecw') + ds = gdal.Open("tmp/spif83.ecw") wkt = ds.GetProjectionRef() - assert '36 / British National Grid' in wkt - assert 'TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489]' in wkt + assert "36 / British National Grid" in wkt + assert "TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489]" in wkt assert 'AUTHORITY["EPSG","27700"]' in wkt gt = ds.GetGeoTransform() - expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, -198.32414964918371) - assert gt == expected_gt, 'did not get expected geotransform.' + expected_gt = ( + 6138559.5576418638, + 195.5116973254697, + 0.0, + 2274798.7836679211, + 0.0, + -198.32414964918371, + ) + assert gt == expected_gt, "did not get expected geotransform." try: - os.remove('tmp/spif83.ecw') - os.remove('tmp/spif83.ecw.aux.xml') + os.remove("tmp/spif83.ecw") + os.remove("tmp/spif83.ecw.aux.xml") except OSError: pass @@ -731,16 +861,20 @@ def test_ecw_23(): def test_ecw_24(): - shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') + shutil.copyfile("data/ecw/spif83.ecw", "tmp/spif83.ecw") try: - os.remove('tmp/spif83.ecw.aux.xml') + os.remove("tmp/spif83.ecw.aux.xml") except OSError: pass - ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) - if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: + ds = gdal.Open("tmp/spif83.ecw", gdal.GA_Update) + if ( + ds is None + and gdaltest.ecw_drv.major_version == 3 + and gdal.GetConfigOption("APPVEYOR") is not None + ): try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass pytest.skip() @@ -749,10 +883,9 @@ def test_ecw_24(): ds = None with pytest.raises(OSError): - os.stat('tmp/spif83.ecw.aux.xml') - + os.stat("tmp/spif83.ecw.aux.xml") - ds = gdal.Open('tmp/spif83.ecw') + ds = gdal.Open("tmp/spif83.ecw") got_gt = ds.GetGeoTransform() ds = None @@ -760,7 +893,7 @@ def test_ecw_24(): assert gt[i] == pytest.approx(got_gt[i], abs=1e-5) try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass @@ -771,20 +904,24 @@ def test_ecw_24(): def test_ecw_25(): - shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') + shutil.copyfile("data/ecw/spif83.ecw", "tmp/spif83.ecw") try: - os.remove('tmp/spif83.ecw.aux.xml') + os.remove("tmp/spif83.ecw.aux.xml") except OSError: pass - proj = 'NUTM31' - datum = 'WGS84' - units = 'FEET' + proj = "NUTM31" + datum = "WGS84" + units = "FEET" - ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) - if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: + ds = gdal.Open("tmp/spif83.ecw", gdal.GA_Update) + if ( + ds is None + and gdaltest.ecw_drv.major_version == 3 + and gdal.GetConfigOption("APPVEYOR") is not None + ): try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass pytest.skip() @@ -795,10 +932,9 @@ def test_ecw_25(): ds = None with pytest.raises(OSError): - os.stat('tmp/spif83.ecw.aux.xml') - + os.stat("tmp/spif83.ecw.aux.xml") - ds = gdal.Open('tmp/spif83.ecw') + ds = gdal.Open("tmp/spif83.ecw") got_proj = ds.GetMetadataItem("PROJ", "ECW") got_datum = ds.GetMetadataItem("DATUM", "ECW") got_units = ds.GetMetadataItem("UNITS", "ECW") @@ -812,7 +948,7 @@ def test_ecw_25(): assert wkt == got_wkt try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass @@ -823,20 +959,24 @@ def test_ecw_25(): def test_ecw_26(): - shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') + shutil.copyfile("data/ecw/spif83.ecw", "tmp/spif83.ecw") try: - os.remove('tmp/spif83.ecw.aux.xml') + os.remove("tmp/spif83.ecw.aux.xml") except OSError: pass - proj = 'NUTM31' - datum = 'WGS84' - units = 'FEET' + proj = "NUTM31" + datum = "WGS84" + units = "FEET" - ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) - if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: + ds = gdal.Open("tmp/spif83.ecw", gdal.GA_Update) + if ( + ds is None + and gdaltest.ecw_drv.major_version == 3 + and gdal.GetConfigOption("APPVEYOR") is not None + ): try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass pytest.skip() @@ -846,10 +986,9 @@ def test_ecw_26(): ds = None with pytest.raises(OSError): - os.stat('tmp/spif83.ecw.aux.xml') + os.stat("tmp/spif83.ecw.aux.xml") - - ds = gdal.Open('tmp/spif83.ecw') + ds = gdal.Open("tmp/spif83.ecw") got_proj = ds.GetMetadataItem("PROJ", "ECW") got_datum = ds.GetMetadataItem("DATUM", "ECW") got_units = ds.GetMetadataItem("UNITS", "ECW") @@ -867,7 +1006,7 @@ def test_ecw_26(): assert wkt == got_wkt try: - os.remove('tmp/spif83.ecw') + os.remove("tmp/spif83.ecw") except OSError: pass @@ -881,14 +1020,21 @@ def test_ecw_27(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') + ds = gdal.Open("data/jpeg2000/byte_without_geotransform.jp2") geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" ds = None + ############################################################################### # Check picking use case @@ -897,18 +1043,19 @@ def test_ecw_28(): x = y = 50 - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") multiband_data = ds.ReadRaster(x, y, 1, 1) ds = None - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") data1 = ds.GetRasterBand(1).ReadRaster(x, y, 1, 1) data2 = ds.GetRasterBand(2).ReadRaster(x, y, 1, 1) data3 = ds.GetRasterBand(3).ReadRaster(x, y, 1, 1) ds = None - struct.unpack('B' * 3, multiband_data) - struct.unpack('B' * 3, data1 + data2 + data3) + struct.unpack("B" * 3, multiband_data) + struct.unpack("B" * 3, data1 + data2 + data3) + ############################################################################### # Test supersampling @@ -916,31 +1063,31 @@ def test_ecw_28(): def test_ecw_29(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") data_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400) ds = None - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") data_ecw_supersampled_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400, 800, 800) ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_0.tif', 400, 400, 1) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/ecw_29_0.tif", 400, 400, 1) ds.WriteRaster(0, 0, 400, 400, data_b1) data_tiff_supersampled_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400, 800, 800) ds = None - ds1 = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_1.tif', 800, 800, 1) + ds1 = gdal.GetDriverByName("GTiff").Create("/vsimem/ecw_29_1.tif", 800, 800, 1) ds1.WriteRaster(0, 0, 800, 800, data_ecw_supersampled_b1) - ds2 = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_2.tif', 800, 800, 1) + ds2 = gdal.GetDriverByName("GTiff").Create("/vsimem/ecw_29_2.tif", 800, 800, 1) ds2.WriteRaster(0, 0, 800, 800, data_tiff_supersampled_b1) - ret = 'success' + ret = "success" if gdaltest.ecw_drv.major_version < 5: maxdiff = gdaltest.compare_ds(ds1, ds2) if maxdiff != 0: print(maxdiff) - ret = 'fail' + ret = "fail" else: # Compare the images by comparing their statistics on subwindows nvals = 0 @@ -949,8 +1096,8 @@ def test_ecw_29(): tile = 32 for j in range(2 * int((ds1.RasterYSize - tile / 2) / tile)): for i in range(2 * int((ds1.RasterXSize - tile / 2) / tile)): - tmp_ds1 = gdal.GetDriverByName('MEM').Create('', tile, tile, 1) - tmp_ds2 = gdal.GetDriverByName('MEM').Create('', tile, tile, 1) + tmp_ds1 = gdal.GetDriverByName("MEM").Create("", tile, tile, 1) + tmp_ds2 = gdal.GetDriverByName("MEM").Create("", tile, tile, 1) data1 = ds1.ReadRaster(i * int(tile / 2), j * int(tile / 2), tile, tile) data2 = ds2.ReadRaster(i * int(tile / 2), j * int(tile / 2), tile, tile) tmp_ds1.WriteRaster(0, 0, tile, tile, data1) @@ -960,31 +1107,37 @@ def test_ecw_29(): nvals = nvals + 1 sum_abs_diff_mean = sum_abs_diff_mean + abs(mean1 - mean2) sum_abs_diff_stddev = sum_abs_diff_stddev + abs(stddev1 - stddev2) - if mean1 != pytest.approx(mean2, abs=(stddev1 + stddev2) / 2) or stddev1 != pytest.approx(stddev2, abs=30): - print("%d, %d, %f, %f" % (j, i, abs(mean1 - mean2), abs(stddev1 - stddev2))) - ret = 'fail' + if mean1 != pytest.approx( + mean2, abs=(stddev1 + stddev2) / 2 + ) or stddev1 != pytest.approx(stddev2, abs=30): + print( + "%d, %d, %f, %f" + % (j, i, abs(mean1 - mean2), abs(stddev1 - stddev2)) + ) + ret = "fail" if sum_abs_diff_mean / nvals > 4 or sum_abs_diff_stddev / nvals > 3: print(sum_abs_diff_mean / nvals) print(sum_abs_diff_stddev / nvals) - ret = 'fail' + ret = "fail" ds1 = None ds2 = None - gdal.Unlink('/vsimem/ecw_29_0.tif') - gdal.Unlink('/vsimem/ecw_29_1.tif') - gdal.Unlink('/vsimem/ecw_29_2.tif') + gdal.Unlink("/vsimem/ecw_29_0.tif") + gdal.Unlink("/vsimem/ecw_29_1.tif") + gdal.Unlink("/vsimem/ecw_29_2.tif") return ret + ############################################################################### # Test IReadBlock() def test_ecw_30(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") (blockxsize, blockysize) = ds.GetRasterBand(1).GetBlockSize() data_readraster = ds.GetRasterBand(1).ReadRaster(0, 0, blockxsize, blockysize) data_readblock = ds.GetRasterBand(1).ReadBlock(0, 0) @@ -992,6 +1145,7 @@ def test_ecw_30(): assert data_readraster == data_readblock + ############################################################################### # Test async reader interface ( SDK >= 4.x ) @@ -1001,11 +1155,11 @@ def test_ecw_31(): if gdaltest.ecw_drv.major_version < 4: pytest.skip() - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") ref_buf = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) ds = None - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") asyncreader = ds.BeginAsyncReader(0, 0, ds.RasterXSize, ds.RasterYSize) while True: @@ -1016,12 +1170,12 @@ def test_ecw_31(): continue else: ds.EndAsyncReader(asyncreader) - pytest.fail('error occurred') + pytest.fail("error occurred") if result != [gdal.GARIO_COMPLETE, 0, 0, ds.RasterXSize, ds.RasterYSize]: print(result) ds.EndAsyncReader(asyncreader) - pytest.fail('wrong return values for GetNextUpdatedRegion()') + pytest.fail("wrong return values for GetNextUpdatedRegion()") async_buf = asyncreader.GetBuffer() @@ -1029,7 +1183,8 @@ def test_ecw_31(): asyncreader = None ds = None - assert async_buf == ref_buf, 'async_buf != ref_buf' + assert async_buf == ref_buf, "async_buf != ref_buf" + ############################################################################### # ECW SDK 3.3 has a bug with the ECW format when we query the @@ -1039,12 +1194,13 @@ def test_ecw_31(): def test_ecw_32(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") data_123 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[1, 2, 3]) data_321 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[3, 2, 1]) assert data_123 != data_321 - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ data/ecw/jrc.ecw @@ -1063,22 +1219,26 @@ def test_ecw_32(): 1 - """) - data_vrt = vrt_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[1, 2, 3]) + """ + ) + data_vrt = vrt_ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[1, 2, 3] + ) assert data_321 == data_vrt + ############################################################################### # Test heuristics that detect successive band reading pattern def test_ecw_33(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") multiband_data = ds.ReadRaster(100, 100, 50, 50) ds = None - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") # To feed the heuristics ds.GetRasterBand(1).ReadRaster(10, 10, 50, 50) @@ -1110,22 +1270,23 @@ def test_ecw_33(): # When heuristics is ON, returned values should be the same as # 3-band at a time reading - tab1 = struct.unpack('B' * 3 * 50 * 50, multiband_data) - tab2 = struct.unpack('B' * 3 * 50 * 50, data1_1 + data2_1 + data3_2) + tab1 = struct.unpack("B" * 3 * 50 * 50, multiband_data) + tab2 = struct.unpack("B" * 3 * 50 * 50, data1_1 + data2_1 + data3_2) assert tab1 == tab2 ds = None + ############################################################################### # Check bugfix for #5262 def test_ecw_33_bis(): - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") data_ref = ds.ReadRaster(0, 0, 50, 50) - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") # To feed the heuristics ds.GetRasterBand(1).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) @@ -1148,6 +1309,7 @@ def test_ecw_33_bis(): ds = None + ############################################################################### # Verify that an write the imagery out to a new ecw file. Source file is 16 bit. @@ -1159,20 +1321,23 @@ def test_ecw_34(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() - ds = gdal.GetDriverByName('MEM').Create('MEM:::', 128, 128, 1, gdal.GDT_UInt16) + ds = gdal.GetDriverByName("MEM").Create("MEM:::", 128, 128, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(65535) ref_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) - out_ds = gdaltest.ecw_drv.CreateCopy('tmp/UInt16_big_out.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=1']) + out_ds = gdaltest.ecw_drv.CreateCopy( + "tmp/UInt16_big_out.ecw", ds, options=["ECW_FORMAT_VERSION=3", "TARGET=1"] + ) del out_ds ds = None - ds = gdal.Open('tmp/UInt16_big_out.ecw') + ds = gdal.Open("tmp/UInt16_big_out.ecw") got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) - version = ds.GetMetadataItem('VERSION') + version = ds.GetMetadataItem("VERSION") ds = None assert got_data == ref_data - assert version == '3', 'bad VERSION' + assert version == "3", "bad VERSION" + ############################################################################### # Verify that an write the imagery out to a new JP2 file. Source file is 16 bit. @@ -1182,19 +1347,22 @@ def test_ecw_35(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - ds = gdal.GetDriverByName('MEM').Create('MEM:::', 128, 128, 1, gdal.GDT_UInt16) + ds = gdal.GetDriverByName("MEM").Create("MEM:::", 128, 128, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(65535) ref_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) - out_ds = gdaltest.jp2ecw_drv.CreateCopy('tmp/UInt16_big_out.jp2', ds, options=['TARGET=1']) + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "tmp/UInt16_big_out.jp2", ds, options=["TARGET=1"] + ) del out_ds ds = None - ds = gdal.Open('tmp/UInt16_big_out.jp2') + ds = gdal.Open("tmp/UInt16_big_out.jp2") got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) ds = None assert got_data == ref_data + ############################################################################### # Make sure that band descriptions are preserved for version 3 ECW files. @@ -1206,7 +1374,8 @@ def test_ecw_36(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Blue @@ -1228,29 +1397,52 @@ def test_ecw_36(): 2 - """) - - dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrc312.ecw', vrt_ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) - - assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, \ - ('Band 1 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(1).GetColorInterpretation())) - assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, \ - ('Band 2 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(2).GetColorInterpretation())) - assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, \ - ('Band 3 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(3).GetColorInterpretation())) + """ + ) + + dswr = gdaltest.ecw_drv.CreateCopy( + "tmp/jrc312.ecw", vrt_ds, options=["ECW_FORMAT_VERSION=3", "TARGET=75"] + ) + + assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, ( + "Band 1 color interpretation should be Blue but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(1).GetColorInterpretation() + ) + ) + assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, ( + "Band 2 color interpretation should be Red but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(2).GetColorInterpretation() + ) + ) + assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, ( + "Band 3 color interpretation should be Green but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(3).GetColorInterpretation() + ) + ) dswr = None - dsr = gdal.Open('tmp/jrc312.ecw') - - assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, \ - ('Band 1 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation())) - assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, \ - ('Band 2 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation())) - assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, \ - ('Band 3 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation())) + dsr = gdal.Open("tmp/jrc312.ecw") + + assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, ( + "Band 1 color interpretation should be Blue but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation()) + ) + assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, ( + "Band 2 color interpretation should be Red but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation()) + ) + assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, ( + "Band 3 color interpretation should be Green but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation()) + ) dsr = None + + ############################################################################### # Make sure that band descriptions are preserved for version 2 ECW files when # color space set implicitly to sRGB. @@ -1265,43 +1457,65 @@ def test_ecw_37(): ds = gdal.Open("data/ecw/jrc.ecw") - dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrc123.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) - - assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, \ - ('Band 1 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(1).GetColorInterpretation())) - assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, \ - ('Band 2 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(2).GetColorInterpretation())) - assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, \ - ('Band 3 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(3).GetColorInterpretation())) + dswr = gdaltest.ecw_drv.CreateCopy( + "tmp/jrc123.ecw", ds, options=["ECW_FORMAT_VERSION=3", "TARGET=75"] + ) + + assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, ( + "Band 1 color interpretation should be Red but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(1).GetColorInterpretation() + ) + ) + assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, ( + "Band 2 color interpretation should be Green but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(2).GetColorInterpretation() + ) + ) + assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, ( + "Band 3 color interpretation should be Blue but is : " + + gdal.GetColorInterpretationName( + dswr.GetRasterBand(3).GetColorInterpretation() + ) + ) dswr = None - dsr = gdal.Open('tmp/jrc123.ecw') - - assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, \ - ('Band 1 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation())) - assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, \ - ('Band 2 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation())) - assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, \ - ('Band 3 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation())) + dsr = gdal.Open("tmp/jrc123.ecw") + + assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, ( + "Band 1 color interpretation should be Red but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation()) + ) + assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, ( + "Band 2 color interpretation should be Green but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation()) + ) + assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, ( + "Band 3 color interpretation should be Blue but is : " + + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation()) + ) dsr = None + ############################################################################### # Check opening unicode files. def test_ecw_38(): - gdaltest.ecw_38_fname = fname = ( - 'tmp/za\u017C\u00F3\u0142\u0107g\u0119\u015Bl\u0105ja\u017A\u0144.ecw') + gdaltest.ecw_38_fname = ( + fname + ) = "tmp/za\u017C\u00F3\u0142\u0107g\u0119\u015Bl\u0105ja\u017A\u0144.ecw" if gdaltest.ecw_drv.major_version < 4: pytest.skip() - shutil.copyfile('data/ecw/jrc.ecw', fname) + shutil.copyfile("data/ecw/jrc.ecw", fname) - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") ds_ref = gdal.Open(fname) @@ -1311,12 +1525,13 @@ def test_ecw_38(): ds_ref = None # Quite a bit of difference... - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" ############################################################################### # Check writing histograms. + def test_ecw_39(): if not has_write_support(): @@ -1324,21 +1539,24 @@ def test_ecw_39(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() - ds = gdal.Open('data/ecw/jrc.ecw') + ds = gdal.Open("data/ecw/jrc.ecw") - dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrcstats.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) + dswr = gdaltest.ecw_drv.CreateCopy( + "tmp/jrcstats.ecw", ds, options=["ECW_FORMAT_VERSION=3", "TARGET=75"] + ) ds = None hist = (0, 255, 2, [3, 4]) dswr.GetRasterBand(1).SetDefaultHistogram(0, 255, [3, 4]) dswr = None - ds = gdal.Open('tmp/jrcstats.ecw') + ds = gdal.Open("tmp/jrcstats.ecw") - result = (hist == ds.GetRasterBand(1).GetDefaultHistogram(force=0)) + result = hist == ds.GetRasterBand(1).GetDefaultHistogram(force=0) ds = None - assert result, 'Default histogram written incorrectly' + assert result, "Default histogram written incorrectly" + ############################################################################### # Check reading a ECW v3 file @@ -1346,32 +1564,42 @@ def test_ecw_39(): def test_ecw_40(): - ds = gdal.Open('data/ecw/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("data/ecw/stefan_full_rgba_ecwv3_meta.ecw") if ds is None: if gdaltest.ecw_drv.major_version < 5: - if gdal.GetLastErrorMsg().find('requires ECW SDK 5.0') >= 0: + if gdal.GetLastErrorMsg().find("requires ECW SDK 5.0") >= 0: pytest.skip() - pytest.fail('explicit error message expected') + pytest.fail("explicit error message expected") pytest.fail() expected_md = [ - ('CLOCKWISE_ROTATION_DEG', '0.000000'), - ('COLORSPACE', 'RGB'), - ('COMPRESSION_DATE', '2013-04-04T09:20:03Z'), - ('COMPRESSION_RATE_ACTUAL', '3.165093'), - ('COMPRESSION_RATE_TARGET', '20'), - ('FILE_METADATA_COMPRESSION_SOFTWARE', 'python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0'), - ('FILE_METADATA_ACQUISITION_DATE', '2012-09-12'), - ('FILE_METADATA_ACQUISITION_SENSOR_NAME', 'Leica ADS-80'), - ('FILE_METADATA_ADDRESS', '2 Abbotsford Street, West Leederville WA 6007 Australia'), - ('FILE_METADATA_AUTHOR', 'Unknown'), - ('FILE_METADATA_CLASSIFICATION', 'test gdal image'), - ('FILE_METADATA_COMPANY', 'ERDAS-QA'), - ('FILE_METADATA_COMPRESSION_SOFTWARE', 'python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0'), - ('FILE_METADATA_COPYRIGHT', 'Intergraph 2013'), - ('FILE_METADATA_EMAIL', 'support@intergraph.com'), - ('FILE_METADATA_TELEPHONE', '+61 8 9388 2900'), - ('VERSION', '3')] + ("CLOCKWISE_ROTATION_DEG", "0.000000"), + ("COLORSPACE", "RGB"), + ("COMPRESSION_DATE", "2013-04-04T09:20:03Z"), + ("COMPRESSION_RATE_ACTUAL", "3.165093"), + ("COMPRESSION_RATE_TARGET", "20"), + ( + "FILE_METADATA_COMPRESSION_SOFTWARE", + "python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0", + ), + ("FILE_METADATA_ACQUISITION_DATE", "2012-09-12"), + ("FILE_METADATA_ACQUISITION_SENSOR_NAME", "Leica ADS-80"), + ( + "FILE_METADATA_ADDRESS", + "2 Abbotsford Street, West Leederville WA 6007 Australia", + ), + ("FILE_METADATA_AUTHOR", "Unknown"), + ("FILE_METADATA_CLASSIFICATION", "test gdal image"), + ("FILE_METADATA_COMPANY", "ERDAS-QA"), + ( + "FILE_METADATA_COMPRESSION_SOFTWARE", + "python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0", + ), + ("FILE_METADATA_COPYRIGHT", "Intergraph 2013"), + ("FILE_METADATA_EMAIL", "support@intergraph.com"), + ("FILE_METADATA_TELEPHONE", "+61 8 9388 2900"), + ("VERSION", "3"), + ] got_md = ds.GetMetadata() for (key, value) in expected_md: @@ -1392,13 +1620,16 @@ def test_ecw_41(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() - shutil.copy('data/ecw/stefan_full_rgba_ecwv3_meta.ecw', 'tmp/stefan_full_rgba_ecwv3_meta.ecw') + shutil.copy( + "data/ecw/stefan_full_rgba_ecwv3_meta.ecw", + "tmp/stefan_full_rgba_ecwv3_meta.ecw", + ) try: - os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') + os.remove("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") except OSError: pass - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") # Check that no statistics is already included in the file assert ds.GetRasterBand(1).GetMinimum() is None @@ -1415,9 +1646,9 @@ def test_ecw_41(): ds = None # Check that there's no .aux.xml file - assert not os.path.exists('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') + assert not os.path.exists("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 255 stats = ds.GetRasterBand(1).GetStatistics(0, 0) @@ -1426,20 +1657,282 @@ def test_ecw_41(): assert stats[i] == pytest.approx(expected_stats[i], abs=1) ds = None - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") # And compute the histogram got_hist = ds.GetRasterBand(1).GetDefaultHistogram() - expected_hist = (-0.5, 255.5, 256, [1006, 16106, 548, 99, 13, 24, 62, 118, 58, 125, 162, 180, 133, 146, 70, 81, 84, 97, 90, 60, 79, 70, 85, 77, 73, 63, 60, 64, 56, 69, 63, 73, 70, 72, 61, 66, 40, 52, 65, 44, 62, 54, 56, 55, 63, 51, 47, 39, 58, 44, 36, 43, 47, 45, 54, 28, 40, 41, 37, 36, 33, 31, 28, 34, 19, 32, 19, 23, 23, 33, 16, 34, 32, 54, 29, 33, 40, 37, 27, 34, 24, 29, 26, 21, 22, 24, 25, 19, 29, 22, 24, 14, 20, 20, 29, 28, 13, 19, 21, 19, 19, 21, 13, 19, 13, 14, 22, 15, 13, 26, 10, 13, 13, 14, 10, 17, 15, 19, 11, 18, 11, 14, 8, 12, 20, 12, 17, 10, 15, 15, 16, 14, 11, 7, 7, 10, 8, 12, 7, 8, 14, 7, 9, 12, 4, 6, 12, 5, 5, 4, 11, 8, 4, 8, 7, 10, 11, 6, 7, 5, 6, 8, 10, 10, 7, 5, 3, 5, 5, 6, 4, 10, 7, 6, 8, 4, 6, 6, 4, 6, 6, 7, 10, 4, 5, 2, 5, 6, 1, 1, 2, 6, 2, 1, 7, 4, 1, 3, 3, 2, 6, 2, 3, 3, 3, 3, 5, 5, 4, 2, 3, 2, 1, 3, 5, 5, 4, 1, 1, 2, 5, 10, 5, 9, 3, 5, 3, 5, 4, 5, 4, 4, 6, 7, 9, 17, 13, 15, 14, 13, 20, 18, 16, 27, 35, 53, 60, 51, 46, 40, 38, 50, 66, 36, 45, 13]) + expected_hist = ( + -0.5, + 255.5, + 256, + [ + 1006, + 16106, + 548, + 99, + 13, + 24, + 62, + 118, + 58, + 125, + 162, + 180, + 133, + 146, + 70, + 81, + 84, + 97, + 90, + 60, + 79, + 70, + 85, + 77, + 73, + 63, + 60, + 64, + 56, + 69, + 63, + 73, + 70, + 72, + 61, + 66, + 40, + 52, + 65, + 44, + 62, + 54, + 56, + 55, + 63, + 51, + 47, + 39, + 58, + 44, + 36, + 43, + 47, + 45, + 54, + 28, + 40, + 41, + 37, + 36, + 33, + 31, + 28, + 34, + 19, + 32, + 19, + 23, + 23, + 33, + 16, + 34, + 32, + 54, + 29, + 33, + 40, + 37, + 27, + 34, + 24, + 29, + 26, + 21, + 22, + 24, + 25, + 19, + 29, + 22, + 24, + 14, + 20, + 20, + 29, + 28, + 13, + 19, + 21, + 19, + 19, + 21, + 13, + 19, + 13, + 14, + 22, + 15, + 13, + 26, + 10, + 13, + 13, + 14, + 10, + 17, + 15, + 19, + 11, + 18, + 11, + 14, + 8, + 12, + 20, + 12, + 17, + 10, + 15, + 15, + 16, + 14, + 11, + 7, + 7, + 10, + 8, + 12, + 7, + 8, + 14, + 7, + 9, + 12, + 4, + 6, + 12, + 5, + 5, + 4, + 11, + 8, + 4, + 8, + 7, + 10, + 11, + 6, + 7, + 5, + 6, + 8, + 10, + 10, + 7, + 5, + 3, + 5, + 5, + 6, + 4, + 10, + 7, + 6, + 8, + 4, + 6, + 6, + 4, + 6, + 6, + 7, + 10, + 4, + 5, + 2, + 5, + 6, + 1, + 1, + 2, + 6, + 2, + 1, + 7, + 4, + 1, + 3, + 3, + 2, + 6, + 2, + 3, + 3, + 3, + 3, + 5, + 5, + 4, + 2, + 3, + 2, + 1, + 3, + 5, + 5, + 4, + 1, + 1, + 2, + 5, + 10, + 5, + 9, + 3, + 5, + 3, + 5, + 4, + 5, + 4, + 4, + 6, + 7, + 9, + 17, + 13, + 15, + 14, + 13, + 20, + 18, + 16, + 27, + 35, + 53, + 60, + 51, + 46, + 40, + 38, + 50, + 66, + 36, + 45, + 13, + ], + ) assert got_hist == expected_hist ds = None # Remove the .aux.xml file try: - os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') + os.remove("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") except OSError: pass - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 255 got_hist = ds.GetRasterBand(1).GetDefaultHistogram(force=0) @@ -1448,8 +1941,7 @@ def test_ecw_41(): # Check that there's no .aux.xml file with pytest.raises(OSError): - os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') - + os.stat("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") ############################################################################### @@ -1461,67 +1953,71 @@ def test_ecw_42(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() - shutil.copy('data/ecw/stefan_full_rgba_ecwv3_meta.ecw', 'tmp/stefan_full_rgba_ecwv3_meta.ecw') + shutil.copy( + "data/ecw/stefan_full_rgba_ecwv3_meta.ecw", + "tmp/stefan_full_rgba_ecwv3_meta.ecw", + ) try: - os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') + os.remove("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") except OSError: pass - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw', gdal.GA_Update) + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw", gdal.GA_Update) md = {} - md['FILE_METADATA_CLASSIFICATION'] = 'FILE_METADATA_CLASSIFICATION' - md['FILE_METADATA_ACQUISITION_DATE'] = '2013-04-04' - md['FILE_METADATA_ACQUISITION_SENSOR_NAME'] = 'FILE_METADATA_ACQUISITION_SENSOR_NAME' - md['FILE_METADATA_COMPRESSION_SOFTWARE'] = 'FILE_METADATA_COMPRESSION_SOFTWARE' - md['FILE_METADATA_AUTHOR'] = 'FILE_METADATA_AUTHOR' - md['FILE_METADATA_COPYRIGHT'] = 'FILE_METADATA_COPYRIGHT' - md['FILE_METADATA_COMPANY'] = 'FILE_METADATA_COMPANY' - md['FILE_METADATA_EMAIL'] = 'FILE_METADATA_EMAIL' - md['FILE_METADATA_ADDRESS'] = 'FILE_METADATA_ADDRESS' - md['FILE_METADATA_TELEPHONE'] = 'FILE_METADATA_TELEPHONE' + md["FILE_METADATA_CLASSIFICATION"] = "FILE_METADATA_CLASSIFICATION" + md["FILE_METADATA_ACQUISITION_DATE"] = "2013-04-04" + md[ + "FILE_METADATA_ACQUISITION_SENSOR_NAME" + ] = "FILE_METADATA_ACQUISITION_SENSOR_NAME" + md["FILE_METADATA_COMPRESSION_SOFTWARE"] = "FILE_METADATA_COMPRESSION_SOFTWARE" + md["FILE_METADATA_AUTHOR"] = "FILE_METADATA_AUTHOR" + md["FILE_METADATA_COPYRIGHT"] = "FILE_METADATA_COPYRIGHT" + md["FILE_METADATA_COMPANY"] = "FILE_METADATA_COMPANY" + md["FILE_METADATA_EMAIL"] = "FILE_METADATA_EMAIL" + md["FILE_METADATA_ADDRESS"] = "FILE_METADATA_ADDRESS" + md["FILE_METADATA_TELEPHONE"] = "FILE_METADATA_TELEPHONE" ds.SetMetadata(md) ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): - os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') - + os.stat("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") # Check item values - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") got_md = ds.GetMetadata() for item in md: assert got_md[item] == md[item] ds = None # Test unsetting all the stuff - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw', gdal.GA_Update) + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw", gdal.GA_Update) md = {} - md['FILE_METADATA_CLASSIFICATION'] = '' - md['FILE_METADATA_ACQUISITION_DATE'] = '1970-01-01' - md['FILE_METADATA_ACQUISITION_SENSOR_NAME'] = '' - md['FILE_METADATA_COMPRESSION_SOFTWARE'] = '' - md['FILE_METADATA_AUTHOR'] = '' - md['FILE_METADATA_COPYRIGHT'] = '' - md['FILE_METADATA_COMPANY'] = '' - md['FILE_METADATA_EMAIL'] = '' - md['FILE_METADATA_ADDRESS'] = '' - md['FILE_METADATA_TELEPHONE'] = '' + md["FILE_METADATA_CLASSIFICATION"] = "" + md["FILE_METADATA_ACQUISITION_DATE"] = "1970-01-01" + md["FILE_METADATA_ACQUISITION_SENSOR_NAME"] = "" + md["FILE_METADATA_COMPRESSION_SOFTWARE"] = "" + md["FILE_METADATA_AUTHOR"] = "" + md["FILE_METADATA_COPYRIGHT"] = "" + md["FILE_METADATA_COMPANY"] = "" + md["FILE_METADATA_EMAIL"] = "" + md["FILE_METADATA_ADDRESS"] = "" + md["FILE_METADATA_TELEPHONE"] = "" ds.SetMetadata(md) ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): - os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') - + os.stat("tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml") # Check item values - ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') + ds = gdal.Open("tmp/stefan_full_rgba_ecwv3_meta.ecw") got_md = ds.GetMetadata() for item in md: - assert item not in got_md or item == 'FILE_METADATA_ACQUISITION_DATE', md[item] + assert item not in got_md or item == "FILE_METADATA_ACQUISITION_DATE", md[item] ds = None + ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit # Note: only works on reversible files like this one @@ -1532,32 +2028,45 @@ def test_ecw_43(): if gdaltest.jp2ecw_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2") fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) - - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/ecw_43.tif', ds) + fourth_band.ReadRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + int(ds.RasterXSize / 16), + int(ds.RasterYSize / 16), + ) + + tmp_ds = gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/ecw_43.tif", ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) + gtiff_fourth_band_data = fourth_band.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize + ) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/ecw_43.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/ecw_43.tif") assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data - ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + ds = gdal.OpenEx( + "data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2", + open_options=["1BIT_ALPHA_PROMOTION=NO"], + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" + ############################################################################### # Test metadata retrieval from JP2 file @@ -1567,32 +2076,35 @@ def test_ecw_44(): if gdaltest.jp2ecw_drv is None: pytest.skip() - if gdaltest.ecw_drv.major_version < 5 or (gdaltest.ecw_drv.major_version == 5 and gdaltest.ecw_drv.minor_version < 1): + if gdaltest.ecw_drv.major_version < 5 or ( + gdaltest.ecw_drv.major_version == 5 and gdaltest.ecw_drv.minor_version < 1 + ): pytest.skip() - ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2") expected_md = [ - ('CODE_BLOCK_SIZE_X', '64'), - ('CODE_BLOCK_SIZE_Y', '64'), - ('GML_JP2_DATA', 'FALSE'), - ('PRECINCT_SIZE_X', '128,128'), - ('PRECINCT_SIZE_Y', '128,128'), - ('PRECISION', '8,8,8,1'), - ('PROFILE', '0'), - ('PROGRESSION_ORDER', 'RPCL'), - ('QUALITY_LAYERS', '1'), - ('RESOLUTION_LEVELS', '2'), - ('PROGRESSION_ORDER', 'RPCL'), - ('TILE_HEIGHT', '150'), - ('TILE_WIDTH', '162'), - ('TILES_X', '1'), - ('TILES_Y', '1'), - ('TRANSFORMATION_TYPE', '5x3'), - ('USE_EPH', 'TRUE'), - ('USE_SOP', 'FALSE')] - - got_md = ds.GetMetadata('JPEG2000') + ("CODE_BLOCK_SIZE_X", "64"), + ("CODE_BLOCK_SIZE_Y", "64"), + ("GML_JP2_DATA", "FALSE"), + ("PRECINCT_SIZE_X", "128,128"), + ("PRECINCT_SIZE_Y", "128,128"), + ("PRECISION", "8,8,8,1"), + ("PROFILE", "0"), + ("PROGRESSION_ORDER", "RPCL"), + ("QUALITY_LAYERS", "1"), + ("RESOLUTION_LEVELS", "2"), + ("PROGRESSION_ORDER", "RPCL"), + ("TILE_HEIGHT", "150"), + ("TILE_WIDTH", "162"), + ("TILES_X", "1"), + ("TILES_Y", "1"), + ("TRANSFORMATION_TYPE", "5x3"), + ("USE_EPH", "TRUE"), + ("USE_SOP", "FALSE"), + ] + + got_md = ds.GetMetadata("JPEG2000") for (key, value) in expected_md: assert key in got_md and got_md[key] == value @@ -1602,12 +2114,12 @@ def test_ecw_44(): def RemoveDriverMetadata(md): - if 'COMPRESSION_RATE_TARGET' in md: - del md['COMPRESSION_RATE_TARGET'] - if 'COLORSPACE' in md: - del md['COLORSPACE'] - if 'VERSION' in md: - del md['VERSION'] + if "COMPRESSION_RATE_TARGET" in md: + del md["COMPRESSION_RATE_TARGET"] + if "COLORSPACE" in md: + del md["COLORSPACE"] + if "VERSION" in md: + del md["VERSION"] return md @@ -1616,69 +2128,81 @@ def test_ecw_45(): pytest.skip() # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") md = RemoveDriverMetadata(ds.GetMetadata()) assert md == {} - gdal.Unlink('/vsimem/ecw_45.jp2') + gdal.Unlink("/vsimem/ecw_45.jp2") # Simple metadata in main domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR') - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR") + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") md = RemoveDriverMetadata(ds.GetMetadata()) - assert md == {'FOO': 'BAR'} - gdal.Unlink('/vsimem/ecw_45.jp2') + assert md == {"FOO": "BAR"} + gdal.Unlink("/vsimem/ecw_45.jp2") # Simple metadata in auxiliary domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR', 'SOME_DOMAIN') - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR", "SOME_DOMAIN") + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') - md = RemoveDriverMetadata(ds.GetMetadata('SOME_DOMAIN')) - assert md == {'FOO': 'BAR'} - gdal.Unlink('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") + md = RemoveDriverMetadata(ds.GetMetadata("SOME_DOMAIN")) + assert md == {"FOO": "BAR"} + gdal.Unlink("/vsimem/ecw_45.jp2") # Simple metadata in auxiliary XML domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:SOME_DOMAIN') - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:SOME_DOMAIN") + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') - assert ds.GetMetadata('xml:SOME_DOMAIN')[0] == '\n' - gdal.Unlink('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") + assert ds.GetMetadata("xml:SOME_DOMAIN")[0] == "\n" + gdal.Unlink("/vsimem/ecw_45.jp2") # Special xml:BOX_ metadata domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:BOX_1') - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:BOX_1") + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') - assert ds.GetMetadata('xml:BOX_0')[0] == '' - gdal.Unlink('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") + assert ds.GetMetadata("xml:BOX_0")[0] == "" + gdal.Unlink("/vsimem/ecw_45.jp2") # Special xml:XMP metadata domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:XMP') - out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:XMP") + out_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_45.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/ecw_45.jp2') - assert ds.GetMetadata('xml:XMP')[0] == '' - gdal.Unlink('/vsimem/ecw_45.jp2') + assert gdal.VSIStatL("/vsimem/ecw_45.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/ecw_45.jp2") + assert ds.GetMetadata("xml:XMP")[0] == "" + gdal.Unlink("/vsimem/ecw_45.jp2") ############################################################################### @@ -1690,19 +2214,25 @@ def test_ecw_46(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() - tmp_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_46.jp2', gdal.Open('data/int16.tif')) + tmp_ds = gdaltest.jp2ecw_drv.CreateCopy( + "/vsimem/ecw_46.jp2", gdal.Open("data/int16.tif") + ) tmp_ds = None - tmp_ds = gdal.Open('/vsimem/ecw_46.jp2') + tmp_ds = gdal.Open("/vsimem/ecw_46.jp2") full_res_data = tmp_ds.ReadRaster(0, 0, 20, 20) - upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) + upsampled_data = tmp_ds.ReadRaster( + 0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic + ) tmp_ds = None - gdal.Unlink('/vsimem/ecw_46.jp2') + gdal.Unlink("/vsimem/ecw_46.jp2") - tmp_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Int16) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 20, 20, 1, gdal.GDT_Int16) tmp_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, full_res_data) - ref_upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) + ref_upsampled_data = tmp_ds.ReadRaster( + 0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic + ) - mem_ds = gdal.GetDriverByName('MEM').Create('', 40, 40, 1, gdal.GDT_Int16) + mem_ds = gdal.GetDriverByName("MEM").Create("", 40, 40, 1, gdal.GDT_Int16) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, ref_upsampled_data) ref_cs = mem_ds.GetRasterBand(1).Checksum() mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, upsampled_data) @@ -1719,26 +2249,31 @@ def test_ecw_non_nearest_upsampling_multiband(): if gdaltest.jp2ecw_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/stefan_full_rgba.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba.jp2") full_res_data = ds.ReadRaster(0, 0, 162, 150) - upsampled_data = ds.ReadRaster(0, 0, 162, 150, 162*2, 150*2, resample_alg=gdal.GRIORA_Cubic) + upsampled_data = ds.ReadRaster( + 0, 0, 162, 150, 162 * 2, 150 * 2, resample_alg=gdal.GRIORA_Cubic + ) - tmp_ds = gdal.GetDriverByName('MEM').Create('', 162, 150, ds.RasterCount) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 162, 150, ds.RasterCount) tmp_ds.WriteRaster(0, 0, 162, 150, full_res_data) - ref_upsampled_data = tmp_ds.ReadRaster(0, 0, 162, 150, 162*2, 150*2, resample_alg=gdal.GRIORA_Cubic) + ref_upsampled_data = tmp_ds.ReadRaster( + 0, 0, 162, 150, 162 * 2, 150 * 2, resample_alg=gdal.GRIORA_Cubic + ) assert upsampled_data == ref_upsampled_data + ############################################################################### # /vsi reading with ECW (#6482) def test_ecw_47(): - data = open('data/ecw/jrc.ecw', 'rb').read() - gdal.FileFromMemBuffer('/vsimem/ecw_47.ecw', data) + data = open("data/ecw/jrc.ecw", "rb").read() + gdal.FileFromMemBuffer("/vsimem/ecw_47.ecw", data) - ds = gdal.Open('/vsimem/ecw_47.ecw') + ds = gdal.Open("/vsimem/ecw_47.ecw") assert ds is not None mean_tolerance = 0.5 @@ -1752,10 +2287,19 @@ def test_ecw_47(): (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=mean_tolerance) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx( + exp_mean, abs=mean_tolerance + ) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) + + gdal.Unlink("/vsimem/ecw_47.ecw") - gdal.Unlink('/vsimem/ecw_47.ecw') ############################################################################### # Test "Upward" orientation is forced by default @@ -1763,16 +2307,25 @@ def test_ecw_47(): def test_ecw_48(): - ecw_upward = gdal.GetConfigOption('ECW_ALWAYS_UPWARD', 'TRUE') - assert ecw_upward == 'TRUE' or ecw_upward == 'ON', \ - 'ECW_ALWAYS_UPWARD default value must be TRUE.' + ecw_upward = gdal.GetConfigOption("ECW_ALWAYS_UPWARD", "TRUE") + assert ( + ecw_upward == "TRUE" or ecw_upward == "ON" + ), "ECW_ALWAYS_UPWARD default value must be TRUE." - ds = gdal.Open('data/ecw/spif83_downward.ecw') + ds = gdal.Open("data/ecw/spif83_downward.ecw") gt = ds.GetGeoTransform() # expect Y resolution negative - expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, -198.32414964918371) - assert gt == expected_gt, 'did not get expected geotransform.' + expected_gt = ( + 6138559.5576418638, + 195.5116973254697, + 0.0, + 2274798.7836679211, + 0.0, + -198.32414964918371, + ) + assert gt == expected_gt, "did not get expected geotransform." + ############################################################################### # Test "Upward" orientation can be overridden with ECW_ALWAYS_UPWARD=FALSE @@ -1780,15 +2333,23 @@ def test_ecw_48(): def test_ecw_49(): - ecw_upward_old = gdal.GetConfigOption('ECW_ALWAYS_UPWARD', 'TRUE') - gdal.SetConfigOption('ECW_ALWAYS_UPWARD', 'FALSE') - ds = gdal.Open('data/ecw/spif83_downward.ecw') + ecw_upward_old = gdal.GetConfigOption("ECW_ALWAYS_UPWARD", "TRUE") + gdal.SetConfigOption("ECW_ALWAYS_UPWARD", "FALSE") + ds = gdal.Open("data/ecw/spif83_downward.ecw") gt = ds.GetGeoTransform() - gdal.SetConfigOption('ECW_ALWAYS_UPWARD', ecw_upward_old) + gdal.SetConfigOption("ECW_ALWAYS_UPWARD", ecw_upward_old) # expect Y resolution positive - expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, 198.32414964918371) - assert gt == expected_gt, 'did not get expected geotransform.' + expected_gt = ( + 6138559.5576418638, + 195.5116973254697, + 0.0, + 2274798.7836679211, + 0.0, + 198.32414964918371, + ) + assert gt == expected_gt, "did not get expected geotransform." + ############################################################################### # Test reading UInt32 file @@ -1796,13 +2357,21 @@ def test_ecw_49(): def test_ecw_read_uint32_jpeg2000(): - ds = gdal.OpenEx('data/jpeg2000/uint32_2x2_lossless_nbits_20.j2k', gdal.OF_RASTER) + ds = gdal.OpenEx("data/jpeg2000/uint32_2x2_lossless_nbits_20.j2k", gdal.OF_RASTER) if gdaltest.ecw_drv.major_version == 3: assert ds is not None else: if ds is None: - pytest.skip('This version of the ECW SDK has issues to decode UInt32 JPEG2000 files') - assert struct.unpack('I' * 4, ds.ReadRaster(0,0,2,2)) == (0, 1048575, 1048574, 524288) + pytest.skip( + "This version of the ECW SDK has issues to decode UInt32 JPEG2000 files" + ) + assert struct.unpack("I" * 4, ds.ReadRaster(0, 0, 2, 2)) == ( + 0, + 1048575, + 1048574, + 524288, + ) + ############################################################################### @@ -1811,18 +2380,24 @@ def test_ecw_online_1(): if gdaltest.jp2ecw_drv is None: pytest.skip() - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k", + "7sisters200.j2k", + ): pytest.skip() # checksum = 32316 on my PC - tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2ECW", "tmp/cache/7sisters200.j2k", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/7sisters200.j2k') + ds = gdal.Open("tmp/cache/7sisters200.j2k") ds.GetRasterBand(1).Checksum() ds = None + ############################################################################### @@ -1830,23 +2405,26 @@ def test_ecw_online_2(): if gdaltest.jp2ecw_drv is None: pytest.skip() - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2", "gcp.jp2" + ): pytest.skip() # checksum = 1292 on my PC - tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest("JP2ECW", "tmp/cache/gcp.jp2", 1, None, filename_absolute=1) tst.testOpen() - ds = gdal.Open('tmp/cache/gcp.jp2') + ds = gdal.Open("tmp/cache/gcp.jp2") ds.GetRasterBand(1).Checksum() - assert len(ds.GetGCPs()) == 15, 'bad number of GCP' + assert len(ds.GetGCPs()) == 15, "bad number of GCP" expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]""" - assert ds.GetGCPProjection() == expected_wkt, 'bad GCP projection' + assert ds.GetGCPProjection() == expected_wkt, "bad GCP projection" ds = None + ############################################################################### @@ -1854,20 +2432,26 @@ def ecw_online_3(): if gdaltest.jp2ecw_drv is None: pytest.skip() if gdaltest.ecw_drv.major_version == 4: - pytest.skip('4.x SDK gets unreliable results for jp2') + pytest.skip("4.x SDK gets unreliable results for jp2") - if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): + 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'): + if not gdaltest.download_file( + "http://www.openjpeg.org/samples/Bretagne1.bmp", "Bretagne1.bmp" + ): pytest.skip() # checksum = 16481 on my PC - tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2ECW", "tmp/cache/Bretagne1.j2k", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/Bretagne1.j2k') - ds_ref = gdal.Open('tmp/cache/Bretagne1.bmp') + ds = gdal.Open("tmp/cache/Bretagne1.j2k") + ds_ref = gdal.Open("tmp/cache/Bretagne1.bmp") maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) @@ -1876,7 +2460,8 @@ def ecw_online_3(): ds_ref = None # Difference between the image before and after compression - assert maxdiff <= 16, 'Image too different from reference' + assert maxdiff <= 16, "Image too different from reference" + ############################################################################### @@ -1887,39 +2472,48 @@ def test_ecw_online_4(): pytest.skip() if gdaltest.ecw_drv.major_version == 5 and gdaltest.ecw_drv.minor_version == 2: - pytest.skip('This test hangs on Linux in a mutex in the SDK 5.2.1') + pytest.skip("This test hangs on Linux in a mutex in the SDK 5.2.1") - if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): + 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'): + if not gdaltest.download_file( + "http://www.openjpeg.org/samples/Bretagne2.bmp", "Bretagne2.bmp" + ): pytest.skip() # Checksum = 53054 on my PC - tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2ECW", "tmp/cache/Bretagne2.j2k", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/Bretagne2.j2k') - ds_ref = gdal.Open('tmp/cache/Bretagne2.bmp') + ds = gdal.Open("tmp/cache/Bretagne2.j2k") + ds_ref = gdal.Open("tmp/cache/Bretagne2.bmp") maxdiff = gdaltest.compare_ds(ds, ds_ref, width=256, height=256) -# print(ds.GetRasterBand(1).Checksum()) -# print(ds_ref.GetRasterBand(1).Checksum()) + # print(ds.GetRasterBand(1).Checksum()) + # print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression - assert maxdiff <= 1, 'Image too different from reference' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### def test_ecw_online_5(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/ecw/red_flower.ecw', 'red_flower.ecw'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/ecw/red_flower.ecw", "red_flower.ecw" + ): pytest.skip() - ds = gdal.Open('tmp/cache/red_flower.ecw') + ds = gdal.Open("tmp/cache/red_flower.ecw") if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (112.801, 52.0431) @@ -1934,8 +2528,17 @@ def test_ecw_online_5(): (mean, stddev) = ds.GetRasterBand(2).ComputeBandStats() - assert mean == pytest.approx(exp_mean, abs=mean_tolerance) and stddev == pytest.approx(exp_stddev, abs=0.5), \ - ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) + assert mean == pytest.approx( + exp_mean, abs=mean_tolerance + ) and stddev == pytest.approx( + exp_stddev, abs=0.5 + ), "mean/stddev of (%g,%g) diffs from expected(%g,%g)" % ( + mean, + stddev, + exp_mean, + exp_stddev, + ) + ############################################################################### # This tests the HTTP driver in fact. To ensure if keeps the original filename, @@ -1944,15 +2547,15 @@ def test_ecw_online_5(): def test_ecw_online_6(): - drv = gdal.GetDriverByName('HTTP') + drv = gdal.GetDriverByName("HTTP") if drv is None: pytest.skip() - dods_drv = gdal.GetDriverByName('DODS') + dods_drv = gdal.GetDriverByName("DODS") if dods_drv is not None: dods_drv.Deregister() - url = 'http://download.osgeo.org/gdal/data/ecw/spif83.ecw' + url = "http://download.osgeo.org/gdal/data/ecw/spif83.ecw" ds = gdal.Open(url) if dods_drv is not None: @@ -1961,31 +2564,36 @@ def test_ecw_online_6(): if ds is None: # The ECW driver (3.3) doesn't manage to open in /vsimem, thus fallbacks # to writing to /tmp, which doesn't work on Windows - if sys.platform == 'win32': + if sys.platform == "win32": pytest.skip() conn = gdaltest.gdalurlopen(url) if conn is None: - pytest.skip('cannot open URL') + pytest.skip("cannot open URL") conn.close() pytest.fail() ds = None + ############################################################################### # ECWv2 file with alpha channel (#6028) def test_ecw_online_7(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/ecw/sandiego2m_null.ecw', 'sandiego2m_null.ecw'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/ecw/sandiego2m_null.ecw", + "sandiego2m_null.ecw", + ): pytest.skip() - ds = gdal.Open('tmp/cache/sandiego2m_null.ecw') + ds = gdal.Open("tmp/cache/sandiego2m_null.ecw") if gdaltest.ecw_drv.major_version == 3: expected_band_count = 3 else: expected_band_count = 4 - assert ds.RasterCount == expected_band_count, \ - ('Expected %d bands, got %d' % (expected_band_count, ds.RasterCount)) - + assert ds.RasterCount == expected_band_count, "Expected %d bands, got %d" % ( + expected_band_count, + ds.RasterCount, + ) diff --git a/autotest/gdrivers/eedai.py b/autotest/gdrivers/eedai.py index 4957d5d6abca..3f256e408d76 100755 --- a/autotest/gdrivers/eedai.py +++ b/autotest/gdrivers/eedai.py @@ -33,13 +33,11 @@ import struct import sys - -from osgeo import gdal - import gdaltest -import webserver import pytest +import webserver +from osgeo import gdal ############################################################################### # Find EEDAI driver @@ -47,19 +45,22 @@ def test_eedai_1(): - gdaltest.eedai_drv = gdal.GetDriverByName('EEDAI') + gdaltest.eedai_drv = gdal.GetDriverByName("EEDAI") if gdaltest.eedai_drv is None: pytest.skip() - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") + + gdaltest.EEDA_BEARER = gdal.GetConfigOption("EEDA_BEARER") + gdaltest.EEDA_URL = gdal.GetConfigOption("EEDA_URL") + gdaltest.EEDA_PRIVATE_KEY = gdal.GetConfigOption("EEDA_PRIVATE_KEY") + gdaltest.EEDA_CLIENT_EMAIL = gdal.GetConfigOption("EEDA_CLIENT_EMAIL") + gdaltest.GOOGLE_APPLICATION_CREDENTIALS = gdal.GetConfigOption( + "GOOGLE_APPLICATION_CREDENTIALS" + ) + gdal.SetConfigOption("GOOGLE_APPLICATION_CREDENTIALS", "") - gdaltest.EEDA_BEARER = gdal.GetConfigOption('EEDA_BEARER') - gdaltest.EEDA_URL = gdal.GetConfigOption('EEDA_URL') - gdaltest.EEDA_PRIVATE_KEY = gdal.GetConfigOption('EEDA_PRIVATE_KEY') - gdaltest.EEDA_CLIENT_EMAIL = gdal.GetConfigOption('EEDA_CLIENT_EMAIL') - gdaltest.GOOGLE_APPLICATION_CREDENTIALS = gdal.GetConfigOption('GOOGLE_APPLICATION_CREDENTIALS') - gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '') ############################################################################### # Nominal case @@ -70,270 +71,183 @@ def test_eedai_2(): if gdaltest.eedai_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ - 'type': 'IMAGE', - 'properties': - { - 'foo': 'bar', - 'prop_B9': 'the_prop_B9', - 'prop_BAND_2': 'the_prop_B2' - }, - 'bands': [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/image", + json.dumps( { - "id": "B1", - "dataType": { - "precision": "INT", - "range": { - "max": 65535 - } + "type": "IMAGE", + "properties": { + "foo": "bar", + "prop_B9": "the_prop_B9", + "prop_BAND_2": "the_prop_B2", }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + "bands": [ + { + "id": "B1", + "dataType": {"precision": "INT", "range": {"max": 65535}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, }, - "dimensions": { - "width": 1830, - "height": 1831 - } - } - }, - - { - "id": "B2", - "dataType": { - "precision": "INT", - "range": { - "max": 65535 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + { + "id": "B2", + "dataType": {"precision": "INT", "range": {"max": 65535}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 10980, "height": 10981}, + }, }, - "dimensions": { - "width": 10980, - "height": 10981 - } - } - }, - - { - "id": "B9", - "dataType": { - "precision": "INT", - "range": { - "max": 65535 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + { + "id": "B9", + "dataType": {"precision": "INT", "range": {"max": 65535}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, }, - "dimensions": { - "width": 1830, - "height": 1831 - } - } - }, - - ] - })) + ], + } + ), + ) # To please the unregistering of the persistent connection - gdal.FileFromMemBuffer('/vsimem/ee/', '') + gdal.FileFromMemBuffer("/vsimem/ee/", "") - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = gdal.OpenEx('EEDAI:image', open_options=['PIXEL_ENCODING=NPY']) - gdal.SetConfigOption('EEDA_URL', None) + gdal.SetConfigOption("EEDA_BEARER", "mybearer") + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") + ds = gdal.OpenEx("EEDAI:image", open_options=["PIXEL_ENCODING=NPY"]) + gdal.SetConfigOption("EEDA_URL", None) expected_info = { "metadata": { - "": { - "foo": "bar" - }, + "": {"foo": "bar"}, "SUBDATASETS": { "SUBDATASET_1_DESC": "Bands B1,B9 of image", "SUBDATASET_2_DESC": "Band B2 of image", "SUBDATASET_2_NAME": "EEDAI:image:B2", - "SUBDATASET_1_NAME": "EEDAI:image:B1,B9" + "SUBDATASET_1_NAME": "EEDAI:image:B1,B9", }, - "IMAGE_STRUCTURE": { - "INTERLEAVE": "PIXEL" - } + "IMAGE_STRUCTURE": {"INTERLEAVE": "PIXEL"}, }, - "size": [ - 1830, - 1831 - ], + "size": [1830, 1831], "driverLongName": "Earth Engine Data API Image", "bands": [ { "colorInterpretation": "Undefined", - "block": [ - 256, - 256 - ], + "block": [256, 256], "metadata": {}, "band": 1, "description": "B1", "type": "UInt16", "overviews": [ - { - "size": [ - 915, - 915 - ] - }, - { - "size": [ - 457, - 457 - ] - }, - { - "size": [ - 228, - 228 - ] - } - ] + {"size": [915, 915]}, + {"size": [457, 457]}, + {"size": [228, 228]}, + ], }, { "colorInterpretation": "Undefined", - "block": [ - 256, - 256 - ], - "metadata": { - "": { - "prop": "the_prop_B9" - } - }, + "block": [256, 256], + "metadata": {"": {"prop": "the_prop_B9"}}, "band": 2, "description": "B9", "type": "UInt16", "overviews": [ - { - "size": [ - 915, - 915 - ] - }, - { - "size": [ - 457, - 457 - ] - }, - { - "size": [ - 228, - 228 - ] - } - ] - } + {"size": [915, 915]}, + {"size": [457, 457]}, + {"size": [228, 228]}, + ], + }, ], "cornerCoordinates": { - "center": [ - 554880.0, - 4145070.0 - ], - "upperRight": [ - 609780.0, - 4200000.0 - ], - "lowerLeft": [ - 499980.0, - 4090140.0 - ], - "lowerRight": [ - 609780.0, - 4090140.0 - ], - "upperLeft": [ - 499980.0, - 4200000.0 - ] + "center": [554880.0, 4145070.0], + "upperRight": [609780.0, 4200000.0], + "lowerLeft": [499980.0, 4090140.0], + "lowerRight": [609780.0, 4090140.0], + "upperLeft": [499980.0, 4200000.0], }, "files": [], "description": "EEDAI:image", - "geoTransform": [ - 499980.0, - 60.0, - 0.0, - 4200000.0, - 0.0, - -60.0 - ] + "geoTransform": [499980.0, 60.0, 0.0, 4200000.0, 0.0, -60.0], } - info = gdal.Info(ds, format='json') + info = gdal.Info(ds, format="json") for key in expected_info: if not (key in info and info[key] == expected_info[key]): if key in info: - print('Got: ' + str(info[key])) + print("Got: " + str(info[key])) else: - print('Does not exist in got info') - print('Expected: ' + str(expected_info[key])) - print('Whole info:') + print("Does not exist in got info") + print("Expected: " + str(expected_info[key])) + print("Whole info:") print(json.dumps(info, indent=4)) - pytest.fail('Got difference for key %s' % key) + pytest.fail("Got difference for key %s" % key) - assert ds.GetProjectionRef().find('32610') >= 0 + assert ds.GetProjectionRef().find("32610") >= 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(3) is None npy_serialized = struct.pack( - 'B' * 8, 0x93, ord('N'), ord('U'), ord('M'), ord('P'), ord('Y'), 1, 0) + "B" * 8, 0x93, ord("N"), ord("U"), ord("M"), ord("P"), ord("Y"), 1, 0 + ) descr = "{'descr': [('B1', '= 0: + if gdal.GetLastErrorMsg().find("CPLRSASHA256Sign() not implemented") >= 0: pytest.skip() assert ds is not None + ############################################################################### # Test OAuth2 with GOOGLE_APPLICATION_CREDENTIALS @@ -391,39 +311,45 @@ def test_eedai_GOOGLE_APPLICATION_CREDENTIALS(): if gdaltest.eedai_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/my.json', """{ + gdal.FileFromMemBuffer( + "/vsimem/my.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": "my@email.com" - }""") - - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '/vsimem/my.json') - gdal.SetConfigOption('EEDA_PRIVATE_KEY', None) - gdal.SetConfigOption('EEDA_CLIENT_EMAIL', None) - gdal.SetConfigOption('GO2A_AUD', '/vsimem/oauth2/v4/token') - gdal.SetConfigOption('GOA2_NOW', '123456') - gdal.FileFromMemBuffer('/vsimem/oauth2/v4/token&POSTFIELDS=grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXlAZW1haWwuY29tIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZWFydGhlbmdpbmUucmVhZG9ubHkiLCAiYXVkIjogIi92c2ltZW0vb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.1W564xcQESVsqZmBEIMzj4rr0RuGa4RiUPZp5H%2FNENN9V9oPSTdacw%2BMiu3pcFf9AJv8wj0ajUeRsgTmvSicAftER49xeCQYUrs6uV122FGVsxml26kMFacNsCgRad%2Fy7xCAhMPfRJsqxS2%2BB392ssBeEzTGCSI6W3AsJg64OfA%3D', - '{ "access_token": "my_token", "token_type": "Bearer", "expires_in": 3600 }') + }""", + ) + + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") + gdal.SetConfigOption("GOOGLE_APPLICATION_CREDENTIALS", "/vsimem/my.json") + gdal.SetConfigOption("EEDA_PRIVATE_KEY", None) + gdal.SetConfigOption("EEDA_CLIENT_EMAIL", None) + gdal.SetConfigOption("GO2A_AUD", "/vsimem/oauth2/v4/token") + gdal.SetConfigOption("GOA2_NOW", "123456") + gdal.FileFromMemBuffer( + "/vsimem/oauth2/v4/token&POSTFIELDS=grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXlAZW1haWwuY29tIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZWFydGhlbmdpbmUucmVhZG9ubHkiLCAiYXVkIjogIi92c2ltZW0vb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.1W564xcQESVsqZmBEIMzj4rr0RuGa4RiUPZp5H%2FNENN9V9oPSTdacw%2BMiu3pcFf9AJv8wj0ajUeRsgTmvSicAftER49xeCQYUrs6uV122FGVsxml26kMFacNsCgRad%2Fy7xCAhMPfRJsqxS2%2BB392ssBeEzTGCSI6W3AsJg64OfA%3D", + '{ "access_token": "my_token", "token_type": "Bearer", "expires_in": 3600 }', + ) - ds = gdal.Open('EEDAI:image') + ds = gdal.Open("EEDAI:image") - gdal.Unlink('/vsimem/my.json') + gdal.Unlink("/vsimem/my.json") - gdal.SetConfigOption('EEDA_URL', None) - gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', None) - gdal.SetConfigOption('EEDA_PRIVATE_KEY', None) - gdal.SetConfigOption('EEDA_CLIENT_EMAIL', None) + gdal.SetConfigOption("EEDA_URL", None) + gdal.SetConfigOption("GOOGLE_APPLICATION_CREDENTIALS", None) + gdal.SetConfigOption("EEDA_PRIVATE_KEY", None) + gdal.SetConfigOption("EEDA_CLIENT_EMAIL", None) - if gdal.GetLastErrorMsg().find('CPLRSASHA256Sign() not implemented') >= 0: + if gdal.GetLastErrorMsg().find("CPLRSASHA256Sign() not implemented") >= 0: pytest.skip() assert ds is not None + ############################################################################### # Read credentials from simulated GCE instance -@pytest.mark.skipif(sys.platform not in ('linux', 'win32'), reason='Incorrect platform') +@pytest.mark.skipif(sys.platform not in ("linux", "win32"), reason="Incorrect platform") def test_eedai_gce_credentials(): if gdaltest.eedai_drv is None: @@ -435,54 +361,67 @@ def test_eedai_gce_credentials(): if not gdaltest.built_against_curl(): pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if gdaltest.webserver_port == 0: pytest.skip() - gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', - 'http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token' % gdaltest.webserver_port) + 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.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)) + 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'])) + 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.send_header("Content-type", "text/plain") + request.send_header("Content-Length", 3) request.end_headers() - request.wfile.write("""foo""".encode('ascii')) + request.wfile.write("""foo""".encode("ascii")) handler = webserver.SequentialHandler() - handler.add('GET', '/computeMetadata/v1/instance/service-accounts/default/token', 200, {}, - """{ + handler.add( + "GET", + "/computeMetadata/v1/instance/service-accounts/default/token", + 200, + {}, + """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, - }""") + }""", + ) with webserver.install_http_handler(handler): - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = gdal.Open('EEDAI:image') - gdal.SetConfigOption('EEDA_URL', None) + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") + ds = gdal.Open("EEDAI:image") + gdal.SetConfigOption("EEDA_URL", None) - gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', None) - gdal.SetConfigOption('CPL_GCE_CHECK_LOCAL_FILES', None) + gdal.SetConfigOption("CPL_GCE_CREDENTIALS_URL", None) + gdal.SetConfigOption("CPL_GCE_CHECK_LOCAL_FILES", None) webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) assert ds is not None + ############################################################################### # Request in PNG mode @@ -492,128 +431,112 @@ def test_eedai_4(): if gdaltest.eedai_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ - 'type': 'IMAGE', - 'bands': - [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/image", + json.dumps( { - "id": "B1", - "dataType": { - "precision": "INT", - "range": { - "max": 255 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + "type": "IMAGE", + "bands": [ + { + "id": "B1", + "dataType": {"precision": "INT", "range": {"max": 255}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, }, - "dimensions": { - "width": 1830, - "height": 1831 - } - } - }, - { - "id": "B2", - "dataType": { - "precision": "INT", - "range": { - "max": 255 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + { + "id": "B2", + "dataType": {"precision": "INT", "range": {"max": 255}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, }, - "dimensions": { - "width": 1830, - "height": 1831 - } - } - }, - { - "id": "B3", - "dataType": { - "precision": "INT", - "range": { - "max": 255 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 + { + "id": "B3", + "dataType": {"precision": "INT", "range": {"max": 255}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, }, - "dimensions": { - "width": 1830, - "height": 1831 - } - } + ], } - ] - })) + ), + ) - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = gdal.Open('EEDAI:image') - gdal.SetConfigOption('EEDA_URL', None) + gdal.SetConfigOption("EEDA_BEARER", "mybearer") + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") + ds = gdal.Open("EEDAI:image") + gdal.SetConfigOption("EEDA_URL", None) - mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 3) + mem_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 3) mem_ds.GetRasterBand(1).Fill(127) mem_ds.GetRasterBand(2).Fill(128) mem_ds.GetRasterBand(3).Fill(129) - gdal.GetDriverByName('PNG').CreateCopy('/vsimem/out.png', mem_ds) - f = gdal.VSIFOpenL('/vsimem/out.png', 'rb') + gdal.GetDriverByName("PNG").CreateCopy("/vsimem/out.png", mem_ds) + f = gdal.VSIFOpenL("/vsimem/out.png", "rb") png_data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/out.png') + gdal.Unlink("/vsimem/out.png") gdal.FileFromMemBuffer( - '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', png_data) + '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', + png_data, + ) got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - got_data = struct.unpack('B', got_data)[0] + got_data = struct.unpack("B", got_data)[0] assert got_data == 127 # Same with dataset RasterIO got_data = ds.ReadRaster(0, 0, 1, 1) - got_data = struct.unpack('B' * 3, got_data) + got_data = struct.unpack("B" * 3, got_data) assert got_data == (127, 128, 129) # Same after flushing cache ds.FlushCache() got_data = ds.ReadRaster(0, 0, 1, 1) - got_data = struct.unpack('B' * 3, got_data) + got_data = struct.unpack("B" * 3, got_data) assert got_data == (127, 128, 129) # Sub-sampled query gdal.FileFromMemBuffer( - '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 120.0, "scaleY": -120.06557377049181, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', png_data) - got_data = ds.GetRasterBand(1).ReadRaster( - 0, 0, 2, 2, buf_xsize=1, buf_ysize=1) - got_data = struct.unpack('B', got_data)[0] + '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 120.0, "scaleY": -120.06557377049181, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', + png_data, + ) + got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 2, 2, buf_xsize=1, buf_ysize=1) + got_data = struct.unpack("B", got_data)[0] assert got_data == 127 # Same after flushing cache with dataset RasterIO ds.FlushCache() got_data = ds.ReadRaster(0, 0, 2, 2, buf_xsize=1, buf_ysize=1) - got_data = struct.unpack('B' * 3, got_data) + got_data = struct.unpack("B" * 3, got_data) assert got_data == (127, 128, 129) ds = None - gdal.SetConfigOption('EEDA_BEARER', None) + gdal.SetConfigOption("EEDA_BEARER", None) + ############################################################################### # Request in AUTO GTIFF mode @@ -624,57 +547,56 @@ def test_eedai_geotiff(): if gdaltest.eedai_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ - 'type': 'IMAGE', - 'bands': - [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/image", + json.dumps( { - "id": "B1", - "dataType": { - "precision": "INT", - "range": { - "max": 65535 - } - }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 - }, - "dimensions": { - "width": 1830, - "height": 1831 + "type": "IMAGE", + "bands": [ + { + "id": "B1", + "dataType": {"precision": "INT", "range": {"max": 65535}}, + "grid": { + "crsCode": "EPSG:32610", + "affineTransform": { + "translateX": 499980, + "translateY": 4200000, + "scaleX": 60, + "scaleY": -60, + }, + "dimensions": {"width": 1830, "height": 1831}, + }, } - } + ], } - ] - })) + ), + ) - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = gdal.Open('EEDAI:image') - gdal.SetConfigOption('EEDA_URL', None) + gdal.SetConfigOption("EEDA_BEARER", "mybearer") + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") + ds = gdal.Open("EEDAI:image") + gdal.SetConfigOption("EEDA_URL", None) - mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 1, gdal.GDT_UInt16) + mem_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 1, gdal.GDT_UInt16) mem_ds.GetRasterBand(1).Fill(12345) - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', mem_ds) - f = gdal.VSIFOpenL('/vsimem/out.tif', 'rb') + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/out.tif", mem_ds) + f = gdal.VSIFOpenL("/vsimem/out.tif", "rb") data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/out.tif') + gdal.Unlink("/vsimem/out.tif") gdal.FileFromMemBuffer( - '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "GEO_TIFF", "bandIds": [ "B1" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', data) + '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "GEO_TIFF", "bandIds": [ "B1" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', + data, + ) got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - got_data = struct.unpack('H', got_data)[0] + got_data = struct.unpack("H", got_data)[0] assert got_data == 12345 ds = None - gdal.SetConfigOption('EEDA_BEARER', None) + gdal.SetConfigOption("EEDA_BEARER", None) + ############################################################################### # @@ -685,17 +607,20 @@ def test_eedai_cleanup(): if gdaltest.eedai_drv is None: pytest.skip() - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) - gdal.SetConfigOption('EEDA_BEARER', gdaltest.EEDA_BEARER) - gdal.SetConfigOption('EEDA_URL', gdaltest.EEDA_URL) - gdal.SetConfigOption('EEDA_PRIVATE_KEY', gdaltest.EEDA_PRIVATE_KEY) - gdal.SetConfigOption('EEDA_CLIENT_EMAIL', gdaltest.EEDA_CLIENT_EMAIL) - gdal.SetConfigOption('GO2A_AUD', None) - gdal.SetConfigOption('GOA2_NOW', None) - gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', gdaltest.GOOGLE_APPLICATION_CREDENTIALS) + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", None) + gdal.SetConfigOption("EEDA_BEARER", gdaltest.EEDA_BEARER) + gdal.SetConfigOption("EEDA_URL", gdaltest.EEDA_URL) + gdal.SetConfigOption("EEDA_PRIVATE_KEY", gdaltest.EEDA_PRIVATE_KEY) + gdal.SetConfigOption("EEDA_CLIENT_EMAIL", gdaltest.EEDA_CLIENT_EMAIL) + gdal.SetConfigOption("GO2A_AUD", None) + gdal.SetConfigOption("GOA2_NOW", None) + gdal.SetConfigOption( + "GOOGLE_APPLICATION_CREDENTIALS", gdaltest.GOOGLE_APPLICATION_CREDENTIALS + ) + + gdal.Unlink("/vsimem/ee/projects/earthengine-public/assets/image") + gdal.RmdirRecursive("/vsimem/ee/") - gdal.Unlink('/vsimem/ee/projects/earthengine-public/assets/image') - gdal.RmdirRecursive('/vsimem/ee/') ############################################################################### # @@ -706,24 +631,319 @@ def test_eedai_real_service(): if gdaltest.eedai_drv is None: pytest.skip() - if gdal.GetConfigOption('GOOGLE_APPLICATION_CREDENTIALS') is None: + if gdal.GetConfigOption("GOOGLE_APPLICATION_CREDENTIALS") is None: - if gdal.GetConfigOption('EEDA_PRIVATE_KEY_FILE') is None and gdal.GetConfigOption('EEDA_PRIVATE_KEY') is None: - pytest.skip('Missing EEDA_PRIVATE_KEY_FILE/EEDA_PRIVATE_KEY or GOOGLE_APPLICATION_CREDENTIALS') + if ( + gdal.GetConfigOption("EEDA_PRIVATE_KEY_FILE") is None + and gdal.GetConfigOption("EEDA_PRIVATE_KEY") is None + ): + pytest.skip( + "Missing EEDA_PRIVATE_KEY_FILE/EEDA_PRIVATE_KEY or GOOGLE_APPLICATION_CREDENTIALS" + ) - if gdal.GetConfigOption('EEDA_CLIENT_EMAIL') is None: - pytest.skip('Missing EEDA_CLIENT_EMAIL') + if gdal.GetConfigOption("EEDA_CLIENT_EMAIL") is None: + pytest.skip("Missing EEDA_CLIENT_EMAIL") - ds = gdal.Open('EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725') + ds = gdal.Open("EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725") assert ds is not None - res = gdal.Info(ds, format='json') - expected = {'files': [], 'cornerCoordinates': {'upperRight': [415016.0, 4435536.0], 'lowerLeft': [408970.0, 4427936.0], 'lowerRight': [415016.0, 4427936.0], 'upperLeft': [408970.0, 4435536.0], 'center': [411993.0, 4431736.0]}, 'wgs84Extent': {'type': 'Polygon', 'coordinates': [[[-100.067433, 40.0651671], [-100.0663662, 39.9967049], [-99.9955511, 39.9973349], [-99.9965471, 40.0657986], [-100.067433, 40.0651671]]]}, 'description': 'EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725', 'driverShortName': 'EEDAI', 'driverLongName': 'Earth Engine Data API Image', 'bands': [{'description': 'R', 'band': 1, 'colorInterpretation': 'Red', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'G', 'band': 2, 'colorInterpretation': 'Green', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'B', 'band': 3, 'colorInterpretation': 'Blue', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}], 'coordinateSystem': {'wkt': 'PROJCS["NAD83 / UTM zone 14N",\n GEOGCS["NAD83",\n DATUM["North_American_Datum_1983",\n SPHEROID["GRS 1980",6378137,298.257222101,\n AUTHORITY["EPSG","7019"]],\n TOWGS84[0,0,0,0,0,0,0],\n AUTHORITY["EPSG","6269"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4269"]],\n PROJECTION["Transverse_Mercator"],\n PARAMETER["latitude_of_origin",0],\n PARAMETER["central_meridian",-99],\n PARAMETER["scale_factor",0.9996],\n PARAMETER["false_easting",500000],\n PARAMETER["false_northing",0],\n UNIT["metre",1,\n AUTHORITY["EPSG","9001"]],\n AXIS["Easting",EAST],\n AXIS["Northing",NORTH],\n AUTHORITY["EPSG","26914"]]'}, 'geoTransform': [408970.0, 2.0, 0.0, 4435536.0, 0.0, -2.0], 'metadata': {'IMAGE_STRUCTURE': {'INTERLEAVE': 'PIXEL'}}, 'size': [3023, 3800]} + res = gdal.Info(ds, format="json") + expected = { + "files": [], + "cornerCoordinates": { + "upperRight": [415016.0, 4435536.0], + "lowerLeft": [408970.0, 4427936.0], + "lowerRight": [415016.0, 4427936.0], + "upperLeft": [408970.0, 4435536.0], + "center": [411993.0, 4431736.0], + }, + "wgs84Extent": { + "type": "Polygon", + "coordinates": [ + [ + [-100.067433, 40.0651671], + [-100.0663662, 39.9967049], + [-99.9955511, 39.9973349], + [-99.9965471, 40.0657986], + [-100.067433, 40.0651671], + ] + ], + }, + "description": "EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725", + "driverShortName": "EEDAI", + "driverLongName": "Earth Engine Data API Image", + "bands": [ + { + "description": "R", + "band": 1, + "colorInterpretation": "Red", + "overviews": [ + {"size": [1511, 1900]}, + {"size": [755, 950]}, + {"size": [377, 475]}, + {"size": [188, 237]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "G", + "band": 2, + "colorInterpretation": "Green", + "overviews": [ + {"size": [1511, 1900]}, + {"size": [755, 950]}, + {"size": [377, 475]}, + {"size": [188, 237]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "B", + "band": 3, + "colorInterpretation": "Blue", + "overviews": [ + {"size": [1511, 1900]}, + {"size": [755, 950]}, + {"size": [377, 475]}, + {"size": [188, 237]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {}, + }, + ], + "coordinateSystem": { + "wkt": 'PROJCS["NAD83 / UTM zone 14N",\n GEOGCS["NAD83",\n DATUM["North_American_Datum_1983",\n SPHEROID["GRS 1980",6378137,298.257222101,\n AUTHORITY["EPSG","7019"]],\n TOWGS84[0,0,0,0,0,0,0],\n AUTHORITY["EPSG","6269"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4269"]],\n PROJECTION["Transverse_Mercator"],\n PARAMETER["latitude_of_origin",0],\n PARAMETER["central_meridian",-99],\n PARAMETER["scale_factor",0.9996],\n PARAMETER["false_easting",500000],\n PARAMETER["false_northing",0],\n UNIT["metre",1,\n AUTHORITY["EPSG","9001"]],\n AXIS["Easting",EAST],\n AXIS["Northing",NORTH],\n AUTHORITY["EPSG","26914"]]' + }, + "geoTransform": [408970.0, 2.0, 0.0, 4435536.0, 0.0, -2.0], + "metadata": {"IMAGE_STRUCTURE": {"INTERLEAVE": "PIXEL"}}, + "size": [3023, 3800], + } assert expected == res assert ds.ReadRaster(0, 0, 1, 1) is not None - ds = gdal.Open('EEDAI:MODIS/006/MYD09GA/2017_05_24') + ds = gdal.Open("EEDAI:MODIS/006/MYD09GA/2017_05_24") assert ds is not None - res = gdal.Info(ds, format='json') - expected = {'files': [], 'cornerCoordinates': {'upperRight': [20015109.354, 10007554.677], 'lowerLeft': [-20015109.354, -10007554.677], 'lowerRight': [20015109.354, -10007554.677], 'upperLeft': [-20015109.354, 10007554.677], 'center': [9.6e-06, 6e-06]}, 'wgs84Extent': {'type': 'Polygon', 'coordinates': [[]]}, 'description': 'EEDAI:MODIS/006/MYD09GA/2017_05_24', 'driverShortName': 'EEDAI', 'driverLongName': 'Earth Engine Data API Image', 'bands': [{'description': 'num_observations_1km', 'band': 1, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {'IMAGE_STRUCTURE': {'PIXELTYPE': 'SIGNEDBYTE'}}}, {'description': 'state_1km', 'band': 2, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'UInt16', 'block': [256, 256], 'metadata': {}}, {'description': 'SensorZenith', 'band': 3, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'SensorAzimuth', 'band': 4, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'Range', 'band': 5, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'UInt16', 'block': [256, 256], 'metadata': {}}, {'description': 'SolarZenith', 'band': 6, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'SolarAzimuth', 'band': 7, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'gflags', 'band': 8, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'orbit_pnt', 'band': 9, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {'IMAGE_STRUCTURE': {'PIXELTYPE': 'SIGNEDBYTE'}}}, {'description': 'granule_pnt', 'band': 10, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}], 'coordinateSystem': {'wkt': 'PROJCS["MODIS Sinusoidal",\n GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.01745329251994328,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4326"]],\n PROJECTION["Sinusoidal"],\n PARAMETER["false_easting",0.0],\n PARAMETER["false_northing",0.0],\n PARAMETER["central_meridian",0.0],\n PARAMETER["semi_major",6371007.181],\n PARAMETER["semi_minor",6371007.181],\n UNIT["m",1.0],\n AUTHORITY["SR-ORG","6974"]]'}, 'geoTransform': [-20015109.354, 926.625433056, 0.0, 10007554.677, 0.0, -926.625433055], 'metadata': {'IMAGE_STRUCTURE': {'INTERLEAVE': 'PIXEL'}, 'SUBDATASETS': {'SUBDATASET_2_NAME': 'EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan', 'SUBDATASET_2_DESC': 'Bands num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan of MODIS/006/MYD09GA/2017_05_24', 'SUBDATASET_1_NAME': 'EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt', 'SUBDATASET_1_DESC': 'Bands num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt of MODIS/006/MYD09GA/2017_05_24'}}, 'size': [43200, 21600]} + res = gdal.Info(ds, format="json") + expected = { + "files": [], + "cornerCoordinates": { + "upperRight": [20015109.354, 10007554.677], + "lowerLeft": [-20015109.354, -10007554.677], + "lowerRight": [20015109.354, -10007554.677], + "upperLeft": [-20015109.354, 10007554.677], + "center": [9.6e-06, 6e-06], + }, + "wgs84Extent": {"type": "Polygon", "coordinates": [[]]}, + "description": "EEDAI:MODIS/006/MYD09GA/2017_05_24", + "driverShortName": "EEDAI", + "driverLongName": "Earth Engine Data API Image", + "bands": [ + { + "description": "num_observations_1km", + "band": 1, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {"IMAGE_STRUCTURE": {"PIXELTYPE": "SIGNEDBYTE"}}, + }, + { + "description": "state_1km", + "band": 2, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "UInt16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "SensorZenith", + "band": 3, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Int16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "SensorAzimuth", + "band": 4, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Int16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "Range", + "band": 5, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "UInt16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "SolarZenith", + "band": 6, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Int16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "SolarAzimuth", + "band": 7, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Int16", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "gflags", + "band": 8, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {}, + }, + { + "description": "orbit_pnt", + "band": 9, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {"IMAGE_STRUCTURE": {"PIXELTYPE": "SIGNEDBYTE"}}, + }, + { + "description": "granule_pnt", + "band": 10, + "colorInterpretation": "Undefined", + "overviews": [ + {"size": [21600, 10800]}, + {"size": [10800, 5400]}, + {"size": [5400, 2700]}, + {"size": [2700, 1350]}, + {"size": [1350, 675]}, + {"size": [675, 337]}, + {"size": [337, 168]}, + {"size": [168, 84]}, + ], + "type": "Byte", + "block": [256, 256], + "metadata": {}, + }, + ], + "coordinateSystem": { + "wkt": 'PROJCS["MODIS Sinusoidal",\n GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.01745329251994328,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4326"]],\n PROJECTION["Sinusoidal"],\n PARAMETER["false_easting",0.0],\n PARAMETER["false_northing",0.0],\n PARAMETER["central_meridian",0.0],\n PARAMETER["semi_major",6371007.181],\n PARAMETER["semi_minor",6371007.181],\n UNIT["m",1.0],\n AUTHORITY["SR-ORG","6974"]]' + }, + "geoTransform": [ + -20015109.354, + 926.625433056, + 0.0, + 10007554.677, + 0.0, + -926.625433055, + ], + "metadata": { + "IMAGE_STRUCTURE": {"INTERLEAVE": "PIXEL"}, + "SUBDATASETS": { + "SUBDATASET_2_NAME": "EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan", + "SUBDATASET_2_DESC": "Bands num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan of MODIS/006/MYD09GA/2017_05_24", + "SUBDATASET_1_NAME": "EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt", + "SUBDATASET_1_DESC": "Bands num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt of MODIS/006/MYD09GA/2017_05_24", + }, + }, + "size": [43200, 21600], + } assert expected == res assert ds.ReadRaster(0, 0, 1, 1) is not None diff --git a/autotest/gdrivers/ehdr.py b/autotest/gdrivers/ehdr.py index 6e6861103640..b9229fa8b82b 100755 --- a/autotest/gdrivers/ehdr.py +++ b/autotest/gdrivers/ehdr.py @@ -32,56 +32,57 @@ import struct -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # 16bit image. def test_ehdr_1(): - tst = gdaltest.GDALTest('EHDR', 'png/rgba16.png', 2, 2042) + tst = gdaltest.GDALTest("EHDR", "png/rgba16.png", 2, 2042) return tst.testCreate() + ############################################################################### # 8bit with geotransform and projection check. def test_ehdr_2(): - tst = gdaltest.GDALTest('EHDR', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("EHDR", "byte.tif", 1, 4672) return tst.testCreateCopy(check_gt=1, check_srs=1) + ############################################################################### # 32bit floating point (read, and createcopy). def test_ehdr_3(): - tst = gdaltest.GDALTest('EHDR', 'ehdr/float32.bil', 1, 27) + tst = gdaltest.GDALTest("EHDR", "ehdr/float32.bil", 1, 27) return tst.testCreateCopy() + ############################################################################### # create dataset with a nodata value and a color table. def test_ehdr_4(): - drv = gdal.GetDriverByName('EHdr') - ds = drv.Create('tmp/test_4.bil', 200, 100, 1, gdal.GDT_Byte) + drv = gdal.GetDriverByName("EHdr") + ds = drv.Create("tmp/test_4.bil", 200, 100, 1, gdal.GDT_Byte) - raw_data = b''.join(struct.pack('h', v) for v in range(200)) + raw_data = b"".join(struct.pack("h", v) for v in range(200)) for line in range(100): - ds.WriteRaster(0, line, 200, 1, raw_data, - buf_type=gdal.GDT_Int16) + ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) @@ -99,27 +100,32 @@ def test_ehdr_4(): ds = None + ############################################################################### # verify last dataset's colortable and nodata value. def test_ehdr_5(): - ds = gdal.Open('tmp/test_4.bil') + ds = gdal.Open("tmp/test_4.bil") band = ds.GetRasterBand(1) - assert band.GetNoDataValue() == 17, 'failed to preserve nodata value.' + assert band.GetNoDataValue() == 17, "failed to preserve nodata value." ct = band.GetRasterColorTable() - assert ct is not None and ct.GetCount() == 4 and ct.GetColorEntry(2) == (255, 0, 255, 255), \ - 'color table not persisted properly.' + assert ( + ct is not None + and ct.GetCount() == 4 + and ct.GetColorEntry(2) == (255, 0, 255, 255) + ), "color table not persisted properly." - assert not band.GetDefaultRAT(), 'did not expect RAT' + assert not band.GetDefaultRAT(), "did not expect RAT" band = None ct = None ds = None - gdal.GetDriverByName('EHdr').Delete('tmp/test_4.bil') + gdal.GetDriverByName("EHdr").Delete("tmp/test_4.bil") + ############################################################################### # Test creating an in memory copy. @@ -127,42 +133,46 @@ def test_ehdr_5(): def test_ehdr_6(): - tst = gdaltest.GDALTest('EHDR', 'ehdr/float32.bil', 1, 27) + tst = gdaltest.GDALTest("EHDR", "ehdr/float32.bil", 1, 27) return tst.testCreateCopy(vsimem=1) + ############################################################################### # 32bit integer (read, and createcopy). def test_ehdr_7(): - tst = gdaltest.GDALTest('EHDR', 'int32.tif', 1, 4672) + tst = gdaltest.GDALTest("EHDR", "int32.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Test signed 8bit integer support. (#2717) def test_ehdr_8(): - drv = gdal.GetDriverByName('EHDR') - src_ds = gdal.Open('data/ehdr/8s.vrt') - ds = drv.CreateCopy('tmp/ehdr_8.bil', src_ds) + drv = gdal.GetDriverByName("EHDR") + src_ds = gdal.Open("data/ehdr/8s.vrt") + ds = drv.CreateCopy("tmp/ehdr_8.bil", src_ds) src_ds = None - md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') - assert 'PIXELTYPE' in md and md['PIXELTYPE'] == 'SIGNEDBYTE', \ - 'Failed to detect SIGNEDBYTE' + md = ds.GetRasterBand(1).GetMetadata("IMAGE_STRUCTURE") + assert ( + "PIXELTYPE" in md and md["PIXELTYPE"] == "SIGNEDBYTE" + ), "Failed to detect SIGNEDBYTE" cs = ds.GetRasterBand(1).Checksum() expected = 4672 - assert cs == expected, 'Did not get expected image checksum.' + assert cs == expected, "Did not get expected image checksum." ds = None - drv.Delete('tmp/ehdr_8.bil') + drv.Delete("tmp/ehdr_8.bil") + ############################################################################### # Test opening worldclim .hdr files that have a few extensions fields in the @@ -173,51 +183,57 @@ def test_ehdr_8(): def test_ehdr_9(): - ds = gdal.Open('data/ehdr/wc_10m_CCCMA_A2a_2020_tmin_9.bil') + ds = gdal.Open("data/ehdr/wc_10m_CCCMA_A2a_2020_tmin_9.bil") - assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, 'wrong datatype' + assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, "wrong datatype" - assert ds.GetRasterBand(1).GetMinimum() == -191, 'wrong minimum value' + assert ds.GetRasterBand(1).GetMinimum() == -191, "wrong minimum value" wkt = ds.GetProjectionRef() - assert wkt.startswith('GEOGCS["WGS 84'), 'wrong projection' + assert wkt.startswith('GEOGCS["WGS 84'), "wrong projection" ds = None + ############################################################################### # Test detecting floating point file based on image file size (#3933) def test_ehdr_10(): - tst = gdaltest.GDALTest('EHDR', 'ehdr/ehdr10.bil', 1, 8202) + tst = gdaltest.GDALTest("EHDR", "ehdr/ehdr10.bil", 1, 8202) return tst.testOpen() + ############################################################################### # Test detecting floating point file based on .flt extension (#3933) def test_ehdr_11(): - tst = gdaltest.GDALTest('EHDR', 'ehdr/ehdr11.flt', 1, 8202) + tst = gdaltest.GDALTest("EHDR", "ehdr/ehdr11.flt", 1, 8202) return tst.testOpen() + ############################################################################### # Test CreateCopy with 1bit data def test_ehdr_12(): - src_ds = gdal.Open('../gcore/data/1bit.bmp') - ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/1bit.bil', src_ds, - options=['NBITS=1']) + src_ds = gdal.Open("../gcore/data/1bit.bmp") + ds = gdal.GetDriverByName("EHDR").CreateCopy( + "/vsimem/1bit.bil", src_ds, options=["NBITS=1"] + ) ds = None - ds = gdal.Open('/vsimem/1bit.bil') - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - 'did not get expected checksum' + ds = gdal.Open("/vsimem/1bit.bil") + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), "did not get expected checksum" ds = None src_ds = None - gdal.GetDriverByName('EHDR').Delete('/vsimem/1bit.bil') + gdal.GetDriverByName("EHDR").Delete("/vsimem/1bit.bil") + ############################################################################### # Test statistics @@ -225,38 +241,45 @@ def test_ehdr_12(): def test_ehdr_13(): - gdal.Unlink('data/byte.tif.aux.xml') + gdal.Unlink("data/byte.tif.aux.xml") - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/byte.bil', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("EHDR").CreateCopy("/vsimem/byte.bil", src_ds) ds = None src_ds = None - ds = gdal.Open('/vsimem/byte.bil') - assert ds.GetRasterBand(1).GetMinimum() is None, 'did not expected minimum' - assert ds.GetRasterBand(1).GetMaximum() is None, 'did not expected maximum' + ds = gdal.Open("/vsimem/byte.bil") + assert ds.GetRasterBand(1).GetMinimum() is None, "did not expected minimum" + assert ds.GetRasterBand(1).GetMaximum() is None, "did not expected maximum" stats = ds.GetRasterBand(1).GetStatistics(False, True) expected_stats = [74.0, 255.0, 126.765, 22.928470838675704] for i in range(4): - assert stats[i] == pytest.approx(expected_stats[i], abs=0.0001), 'did not get expected statistics' + assert stats[i] == pytest.approx( + expected_stats[i], abs=0.0001 + ), "did not get expected statistics" ds = None - f = gdal.VSIFOpenL('/vsimem/byte.stx', 'rb') - assert f is not None, 'expected .stx file' + f = gdal.VSIFOpenL("/vsimem/byte.stx", "rb") + assert f is not None, "expected .stx file" gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/byte.bil') - assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(74, abs=0.0001), \ - 'did not get expected minimum' - assert ds.GetRasterBand(1).GetMaximum() == pytest.approx(255, abs=0.0001), \ - 'did not get expected maximum' + ds = gdal.Open("/vsimem/byte.bil") + assert ds.GetRasterBand(1).GetMinimum() == pytest.approx( + 74, abs=0.0001 + ), "did not get expected minimum" + assert ds.GetRasterBand(1).GetMaximum() == pytest.approx( + 255, abs=0.0001 + ), "did not get expected maximum" stats = ds.GetRasterBand(1).GetStatistics(False, True) expected_stats = [74.0, 255.0, 126.765, 22.928470838675704] for i in range(4): - assert stats[i] == pytest.approx(expected_stats[i], abs=0.0001), 'did not get expected statistics' + assert stats[i] == pytest.approx( + expected_stats[i], abs=0.0001 + ), "did not get expected statistics" ds = None - gdal.GetDriverByName('EHDR').Delete('/vsimem/byte.bil') + gdal.GetDriverByName("EHDR").Delete("/vsimem/byte.bil") + ############################################################################### # Test optimized RasterIO() (#5438) @@ -264,24 +287,26 @@ def test_ehdr_13(): def test_ehdr_14(): - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/byte.bil', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("EHDR").CreateCopy("/vsimem/byte.bil", src_ds) src_ds = None for space in [1, 2]: - out_ds = gdal.GetDriverByName('EHDR').Create('/vsimem/byte_reduced.bil', - 10, 10) - gdal.SetConfigOption('GDAL_ONE_BIG_READ', 'YES') + out_ds = gdal.GetDriverByName("EHDR").Create("/vsimem/byte_reduced.bil", 10, 10) + gdal.SetConfigOption("GDAL_ONE_BIG_READ", "YES") data_ori = ds.GetRasterBand(1).ReadRaster( - 0, 0, 20, 20, 20, 20, buf_pixel_space=space) + 0, 0, 20, 20, 20, 20, buf_pixel_space=space + ) data = ds.GetRasterBand(1).ReadRaster( - 0, 0, 20, 20, 10, 10, buf_pixel_space=space) + 0, 0, 20, 20, 10, 10, buf_pixel_space=space + ) out_ds.GetRasterBand(1).WriteRaster( - 0, 0, 10, 10, data, 10, 10, buf_pixel_space=space) + 0, 0, 10, 10, data, 10, 10, buf_pixel_space=space + ) out_ds.FlushCache() data2 = out_ds.ReadRaster(0, 0, 10, 10, 10, 10, buf_pixel_space=space) cs1 = out_ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_ONE_BIG_READ', None) + gdal.SetConfigOption("GDAL_ONE_BIG_READ", None) out_ds.FlushCache() cs2 = out_ds.GetRasterBand(1).Checksum() @@ -289,10 +314,11 @@ def test_ehdr_14(): assert not (cs1 != 1087 and cs1 != 1192) or (cs2 != 1087 and cs2 != 1192), space - gdal.SetConfigOption('GDAL_ONE_BIG_READ', 'YES') + gdal.SetConfigOption("GDAL_ONE_BIG_READ", "YES") out_ds.GetRasterBand(1).WriteRaster( - 0, 0, 10, 10, data_ori, 20, 20, buf_pixel_space=space) - gdal.SetConfigOption('GDAL_ONE_BIG_READ', None) + 0, 0, 10, 10, data_ori, 20, 20, buf_pixel_space=space + ) + gdal.SetConfigOption("GDAL_ONE_BIG_READ", None) out_ds.FlushCache() cs3 = out_ds.GetRasterBand(1).Checksum() @@ -300,8 +326,9 @@ def test_ehdr_14(): ds = None - gdal.GetDriverByName('EHDR').Delete('/vsimem/byte.bil') - gdal.GetDriverByName('EHDR').Delete('/vsimem/byte_reduced.bil') + gdal.GetDriverByName("EHDR").Delete("/vsimem/byte.bil") + gdal.GetDriverByName("EHDR").Delete("/vsimem/byte_reduced.bil") + ############################################################################### # Test support for RAT (#3253) @@ -309,8 +336,8 @@ def test_ehdr_14(): def test_ehdr_rat(): - tmpfile = '/vsimem/rat.bil' - gdal.Translate(tmpfile, 'data/ehdr/int16_rat.bil', format='EHdr') + tmpfile = "/vsimem/rat.bil" + gdal.Translate(tmpfile, "data/ehdr/int16_rat.bil", format="EHdr") ds = gdal.Open(tmpfile) rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat is not None @@ -329,13 +356,15 @@ def test_ehdr_rat(): ds = None ds = gdal.Open(tmpfile, gdal.GA_Update) - assert not (ds.GetRasterBand(1).GetDefaultRAT() or ds.GetRasterBand(1).GetColorTable()) + assert not ( + ds.GetRasterBand(1).GetDefaultRAT() or ds.GetRasterBand(1).GetColorTable() + ) with gdaltest.error_handler(): ret = ds.GetRasterBand(1).SetDefaultRAT(gdal.RasterAttributeTable()) assert ret != 0 ds = None - gdal.GetDriverByName('EHDR').Delete(tmpfile) + gdal.GetDriverByName("EHDR").Delete(tmpfile) ############################################################################### @@ -344,39 +373,36 @@ def test_ehdr_rat(): def test_ehdr_approx_stats_flag(): - src_ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000) - src_ds.GetRasterBand(1).WriteRaster(1000, 1000, 1, 1, struct.pack('B' * 1, 20)) - tmpfile = '/vsimem/ehdr_approx_stats_flag.bil' - gdal.Translate(tmpfile, src_ds, format='EHdr') + src_ds = gdal.GetDriverByName("MEM").Create("", 2000, 2000) + src_ds.GetRasterBand(1).WriteRaster(1000, 1000, 1, 1, struct.pack("B" * 1, 20)) + tmpfile = "/vsimem/ehdr_approx_stats_flag.bil" + gdal.Translate(tmpfile, src_ds, format="EHdr") ds = gdal.Open(tmpfile, gdal.GA_Update) approx_ok = 1 force = 1 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) - assert stats == [0.0, 0.0, 0.0, 0.0], 'did not get expected stats' + assert stats == [0.0, 0.0, 0.0, 0.0], "did not get expected stats" md = ds.GetRasterBand(1).GetMetadata() - assert 'STATISTICS_APPROXIMATE' in md, 'did not get expected metadata' + assert "STATISTICS_APPROXIMATE" in md, "did not get expected metadata" approx_ok = 0 force = 0 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) - assert stats == [0.0, 0.0, 0.0, -1.0], 'did not get expected stats' + assert stats == [0.0, 0.0, 0.0, -1.0], "did not get expected stats" ds = gdal.Open(tmpfile, gdal.GA_Update) approx_ok = 0 force = 0 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) - assert stats == [0.0, 0.0, 0.0, -1.0], 'did not get expected stats' + 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' + 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' + assert "STATISTICS_APPROXIMATE" not in md, "did not get expected metadata" ds = None - gdal.GetDriverByName('EHDR').Delete(tmpfile) - - - + gdal.GetDriverByName("EHDR").Delete(tmpfile) diff --git a/autotest/gdrivers/eir.py b/autotest/gdrivers/eir.py index 2b57afe9e5aa..951fc8840493 100755 --- a/autotest/gdrivers/eir.py +++ b/autotest/gdrivers/eir.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_eir_1(): - tst = gdaltest.GDALTest('EIR', 'eir/fakeeir.hdr', 1, 1) + tst = gdaltest.GDALTest("EIR", "eir/fakeeir.hdr", 1, 1) return tst.testOpen() - - - diff --git a/autotest/gdrivers/elas.py b/autotest/gdrivers/elas.py index 4a06850fce9b..e428b1ee11e2 100755 --- a/autotest/gdrivers/elas.py +++ b/autotest/gdrivers/elas.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,17 +37,15 @@ def test_elas_1(): - tst = gdaltest.GDALTest('ELAS', 'elas/byte_elas.bin', 1, 4672) + tst = gdaltest.GDALTest("ELAS", "elas/byte_elas.bin", 1, 4672) return tst.testOpen() + ############################################################################### # Test Create() def test_elas_2(): - tst = gdaltest.GDALTest('ELAS', 'elas/byte_elas.bin', 1, 4672) + tst = gdaltest.GDALTest("ELAS", "elas/byte_elas.bin", 1, 4672) return tst.testCreate() - - - diff --git a/autotest/gdrivers/envi.py b/autotest/gdrivers/envi.py index 2e2d80ec5ba4..2a270b7420a9 100755 --- a/autotest/gdrivers/envi.py +++ b/autotest/gdrivers/envi.py @@ -32,19 +32,20 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal, osr import struct import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Perform simple read test. def test_envi_1(): - tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) + tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 14823) prj = """PROJCS["unnamed", GEOGCS["Ellipse Based", @@ -61,9 +62,10 @@ def test_envi_1(): PARAMETER["false_northing",0], UNIT["Meter",1]]""" - return tst.testOpen(check_prj=prj, - check_gt=(-936408.178, 28.5, 0.0, - 2423902.344, 0.0, -28.5)) + return tst.testOpen( + check_prj=prj, check_gt=(-936408.178, 28.5, 0.0, 2423902.344, 0.0, -28.5) + ) + ############################################################################### # Verify this can be exported losslessly. @@ -71,25 +73,27 @@ def test_envi_1(): def test_envi_2(): - tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) + tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 14823) return tst.testCreateCopy(check_gt=1) + ############################################################################### # Try the Create interface with an RGB image. def test_envi_3(): - tst = gdaltest.GDALTest('envi', 'rgbsmall.tif', 2, 21053) + tst = gdaltest.GDALTest("envi", "rgbsmall.tif", 2, 21053) return tst.testCreate() + ############################################################################### # Test LCC Projection. def test_envi_4(): - tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) + tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 24) prj = """PROJCS["unnamed", GEOGCS["NAD83", @@ -109,13 +113,14 @@ def test_envi_4(): return tst.testSetProjection(prj=prj) + ############################################################################### # Test TM Projection. def test_envi_5(): - tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) + tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 24) prj = """PROJCS["unnamed", GEOGCS["GCS_unnamed", DATUM["D_unnamed", @@ -136,13 +141,14 @@ def test_envi_5(): return tst.testSetProjection(prj=prj) + ############################################################################### # Test LAEA Projection. def test_envi_6(): - gdaltest.envi_tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) + gdaltest.envi_tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 24) prj = """PROJCS["unnamed", GEOGCS["Unknown datum based upon the Authalic Sphere", @@ -162,29 +168,32 @@ def test_envi_6(): return gdaltest.envi_tst.testSetProjection(prj=prj) + ############################################################################### # Verify VSIF*L capacity def test_envi_7(): - tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) + tst = gdaltest.GDALTest("envi", "envi/aea.dat", 1, 14823) return tst.testCreateCopy(check_gt=1, vsimem=1) + ############################################################################### # Test fix for #3751 def test_envi_8(): - ds = gdal.GetDriverByName('ENVI').Create('/vsimem/foo.bsq', 10, 10, 1) + ds = gdal.GetDriverByName("ENVI").Create("/vsimem/foo.bsq", 10, 10, 1) set_gt = (50000, 1, 0, 4500000, 0, -1) ds.SetGeoTransform(set_gt) got_gt = ds.GetGeoTransform() - assert set_gt == got_gt, 'did not get expected geotransform' + assert set_gt == got_gt, "did not get expected geotransform" ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/foo.bsq') + gdal.GetDriverByName("ENVI").Delete("/vsimem/foo.bsq") + ############################################################################### # Verify reading a compressed file @@ -192,29 +201,31 @@ def test_envi_8(): def test_envi_9(): - tst = gdaltest.GDALTest('envi', 'envi/aea_compressed.dat', 1, 14823) + tst = gdaltest.GDALTest("envi", "envi/aea_compressed.dat", 1, 14823) return tst.testCreateCopy(check_gt=1) + ############################################################################### # Test RPC reading and writing def test_envi_10(): - src_ds = gdal.Open('data/envi/envirpc.img') - out_ds = gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envirpc.img', src_ds) + src_ds = gdal.Open("data/envi/envirpc.img") + out_ds = gdal.GetDriverByName("ENVI").CreateCopy("/vsimem/envirpc.img", src_ds) src_ds = None del out_ds - gdal.Unlink('/vsimem/envirpc.img.aux.xml') + gdal.Unlink("/vsimem/envirpc.img.aux.xml") - ds = gdal.Open('/vsimem/envirpc.img') - md = ds.GetMetadata('RPC') + ds = gdal.Open("/vsimem/envirpc.img") + md = ds.GetMetadata("RPC") ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/envirpc.img') + gdal.GetDriverByName("ENVI").Delete("/vsimem/envirpc.img") + + assert md["HEIGHT_OFF"] == "3355" - assert md['HEIGHT_OFF'] == '3355' ############################################################################### # Check .sta reading @@ -222,11 +233,12 @@ def test_envi_10(): def test_envi_11(): - ds = gdal.Open('data/envi/envistat') + ds = gdal.Open("data/envi/envistat") val = ds.GetRasterBand(1).GetStatistics(0, 0) ds = None - assert val == [1.0, 3.0, 2.0, 0.5], 'bad stats' + assert val == [1.0, 3.0, 2.0, 0.5], "bad stats" + ############################################################################### # Test category names reading and writing @@ -234,25 +246,26 @@ def test_envi_11(): def test_envi_12(): - src_ds = gdal.Open('data/envi/testenviclasses') - out_ds = gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/testenviclasses', src_ds) + src_ds = gdal.Open("data/envi/testenviclasses") + out_ds = gdal.GetDriverByName("ENVI").CreateCopy("/vsimem/testenviclasses", src_ds) src_ds = None del out_ds - gdal.Unlink('/vsimem/testenviclasses.aux.xml') + gdal.Unlink("/vsimem/testenviclasses.aux.xml") - ds = gdal.Open('/vsimem/testenviclasses') + ds = gdal.Open("/vsimem/testenviclasses") category = ds.GetRasterBand(1).GetCategoryNames() ct = ds.GetRasterBand(1).GetColorTable() - assert category == ['Black', 'White'], 'bad category names' + assert category == ["Black", "White"], "bad category names" - assert ct.GetCount() == 2, 'bad color entry count' + assert ct.GetCount() == 2, "bad color entry count" - assert ct.GetColorEntry(0) == (0, 0, 0, 255), 'bad color entry' + assert ct.GetColorEntry(0) == (0, 0, 0, 255), "bad color entry" ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/testenviclasses') + gdal.GetDriverByName("ENVI").Delete("/vsimem/testenviclasses") + ############################################################################### # Test writing of metadata from the ENVI metadata domain and read it back (#4957) @@ -260,21 +273,22 @@ def test_envi_12(): def test_envi_13(): - ds = gdal.GetDriverByName('ENVI').Create('/vsimem/envi_13.dat', 1, 1) - ds.SetMetadata(['lines=100', 'sensor_type=Landsat TM', 'foo'], 'ENVI') + ds = gdal.GetDriverByName("ENVI").Create("/vsimem/envi_13.dat", 1, 1) + ds.SetMetadata(["lines=100", "sensor_type=Landsat TM", "foo"], "ENVI") ds = None - gdal.Unlink('/vsimem/envi_13.dat.aux.xml') + gdal.Unlink("/vsimem/envi_13.dat.aux.xml") - ds = gdal.Open('/vsimem/envi_13.dat') + ds = gdal.Open("/vsimem/envi_13.dat") lines = ds.RasterYSize - val = ds.GetMetadataItem('sensor_type', 'ENVI') + val = ds.GetMetadataItem("sensor_type", "ENVI") ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_13.dat') + gdal.GetDriverByName("ENVI").Delete("/vsimem/envi_13.dat") assert lines == 1 - assert val == 'Landsat TM' + assert val == "Landsat TM" + ############################################################################### # Test that the image file is at the expected size on closing (#6662) @@ -282,13 +296,14 @@ def test_envi_13(): def test_envi_14(): - gdal.GetDriverByName('ENVI').Create('/vsimem/envi_14.dat', 3, 4, 5, gdal.GDT_Int16) + gdal.GetDriverByName("ENVI").Create("/vsimem/envi_14.dat", 3, 4, 5, gdal.GDT_Int16) + + gdal.Unlink("/vsimem/envi_14.dat.aux.xml") - gdal.Unlink('/vsimem/envi_14.dat.aux.xml') + assert gdal.VSIStatL("/vsimem/envi_14.dat").size == 3 * 4 * 5 * 2 - assert gdal.VSIStatL('/vsimem/envi_14.dat').size == 3 * 4 * 5 * 2 + gdal.GetDriverByName("ENVI").Delete("/vsimem/envi_14.dat") - gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_14.dat') ############################################################################### # Test reading and writing geotransform matrix with rotation @@ -296,21 +311,32 @@ def test_envi_14(): def test_envi_15(): - src_ds = gdal.Open('data/envi/rotation.img') + src_ds = gdal.Open("data/envi/rotation.img") got_gt = src_ds.GetGeoTransform() - expected_gt = [736600.089, 1.0981889363046606, -2.4665727356350224, - 4078126.75, -2.4665727356350224, -1.0981889363046606] - assert max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) <= 1e-5, \ - 'did not get expected geotransform' - - gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envi_15.dat', src_ds) - - ds = gdal.Open('/vsimem/envi_15.dat') + expected_gt = [ + 736600.089, + 1.0981889363046606, + -2.4665727356350224, + 4078126.75, + -2.4665727356350224, + -1.0981889363046606, + ] + assert ( + max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) + <= 1e-5 + ), "did not get expected geotransform" + + gdal.GetDriverByName("ENVI").CreateCopy("/vsimem/envi_15.dat", src_ds) + + ds = gdal.Open("/vsimem/envi_15.dat") got_gt = ds.GetGeoTransform() - assert max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) <= 1e-5, \ - 'did not get expected geotransform' + assert ( + max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) + <= 1e-5 + ), "did not get expected geotransform" ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_15.dat') + gdal.GetDriverByName("ENVI").Delete("/vsimem/envi_15.dat") + ############################################################################### # Test reading a truncated ENVI dataset (see #915) @@ -318,29 +344,31 @@ def test_envi_15(): def test_envi_truncated(): - gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envi_truncated.dat', - gdal.Open('data/byte.tif')) + gdal.GetDriverByName("ENVI").CreateCopy( + "/vsimem/envi_truncated.dat", gdal.Open("data/byte.tif") + ) - f = gdal.VSIFOpenL('/vsimem/envi_truncated.dat', 'rb+') + f = gdal.VSIFOpenL("/vsimem/envi_truncated.dat", "rb+") gdal.VSIFTruncateL(f, int(20 * 20 / 2)) gdal.VSIFCloseL(f) - with gdaltest.config_option('RAW_CHECK_FILE_SIZE', 'YES'): - ds = gdal.Open('/vsimem/envi_truncated.dat') + with gdaltest.config_option("RAW_CHECK_FILE_SIZE", "YES"): + ds = gdal.Open("/vsimem/envi_truncated.dat") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_truncated.dat') + gdal.GetDriverByName("ENVI").Delete("/vsimem/envi_truncated.dat") assert cs == 2315 + ############################################################################### # Test writing & reading GCPs (#1528) def test_envi_gcp(): - filename = '/vsimem/test_envi_gcp.dat' - ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) + filename = "/vsimem/test_envi_gcp.dat" + ds = gdal.GetDriverByName("ENVI").Create(filename, 1, 1) gcp = gdal.GCP() gcp.GCPPixel = 1 gcp.GCPLine = 2 @@ -361,7 +389,8 @@ def test_envi_gcp(): assert gcp.GCPX == 3 assert gcp.GCPY == 4 - gdal.GetDriverByName('ENVI').Delete(filename) + gdal.GetDriverByName("ENVI").Delete(filename) + ############################################################################### # Test updating big endian ordered (#1796) @@ -369,16 +398,17 @@ def test_envi_gcp(): def test_envi_bigendian(): - ds = gdal.Open('data/envi/uint16_envi_bigendian.dat') + ds = gdal.Open("data/envi/uint16_envi_bigendian.dat") assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - for ext in ('dat', 'hdr'): - filename = 'uint16_envi_bigendian.' + ext - gdal.FileFromMemBuffer('/vsimem/' + filename, - open('data/envi/' + filename, 'rb').read()) + for ext in ("dat", "hdr"): + filename = "uint16_envi_bigendian." + ext + gdal.FileFromMemBuffer( + "/vsimem/" + filename, open("data/envi/" + filename, "rb").read() + ) - filename = '/vsimem/uint16_envi_bigendian.dat' + filename = "/vsimem/uint16_envi_bigendian.dat" ds = gdal.Open(filename, gdal.GA_Update) ds.SetGeoTransform([0, 2, 0, 0, 0, -2]) ds = None @@ -387,44 +417,47 @@ def test_envi_bigendian(): assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - gdal.GetDriverByName('ENVI').Delete(filename) + gdal.GetDriverByName("ENVI").Delete(filename) + ############################################################################### # Test different interleaving -@pytest.mark.parametrize('filename_suffix, expected_interleave', [('bip', 'PIXEL'), - ('bil', 'LINE'), - ('bsq', 'BAND')]) +@pytest.mark.parametrize( + "filename_suffix, expected_interleave", + [("bip", "PIXEL"), ("bil", "LINE"), ("bsq", "BAND")], +) def test_envi_interleaving(filename_suffix, expected_interleave): - filename = f'data/envi/envi_rgbsmall_{filename_suffix}.img' + filename = f"data/envi/envi_rgbsmall_{filename_suffix}.img" ds = gdal.Open(filename) assert ds, filename - assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == expected_interleave + assert ds.GetMetadataItem("INTERLEAVE", "IMAGE_STRUCTURE") == expected_interleave assert ds.GetRasterBand(1).Checksum() == 20718, filename assert ds.GetRasterBand(2).Checksum() == 20669, filename assert ds.GetRasterBand(3).Checksum() == 20895, filename ds = None + ############################################################################### # Test nodata def test_envi_nodata(): - filename = '/vsimem/test_envi_nodata.dat' - ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) + filename = "/vsimem/test_envi_nodata.dat" + ds = gdal.GetDriverByName("ENVI").Create(filename, 1, 1) ds.GetRasterBand(1).SetNoDataValue(1) ds = None - gdal.Unlink(filename + '.aux.xml') + gdal.Unlink(filename + ".aux.xml") ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == 1.0 ds = None - gdal.GetDriverByName('ENVI').Delete(filename) + gdal.GetDriverByName("ENVI").Delete(filename) ############################################################################### @@ -433,75 +466,83 @@ def test_envi_nodata(): def test_envi_rotation_180(): - filename = '/vsimem/test_envi_rotation_180.dat' - ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) - ds.SetGeoTransform([0,10,0,0,0,10]) + filename = "/vsimem/test_envi_rotation_180.dat" + ds = gdal.GetDriverByName("ENVI").Create(filename, 1, 1) + ds.SetGeoTransform([0, 10, 0, 0, 0, 10]) ds = None - gdal.Unlink(filename + '.aux.xml') + gdal.Unlink(filename + ".aux.xml") ds = gdal.Open(filename) got_gt = ds.GetGeoTransform() - assert got_gt == (0,10,0,0,0,10) + assert got_gt == (0, 10, 0, 0, 0, 10) ds = None - gdal.GetDriverByName('ENVI').Delete(filename) + gdal.GetDriverByName("ENVI").Delete(filename) + ############################################################################### # Test writing different interleaving -@pytest.mark.parametrize('interleaving', ['bip', 'bil', 'bsq']) -@pytest.mark.parametrize('explicit', [True, False]) +@pytest.mark.parametrize("interleaving", ["bip", "bil", "bsq"]) +@pytest.mark.parametrize("explicit", [True, False]) def test_envi_writing_interleaving(interleaving, explicit): - srcfilename = 'data/envi/envi_rgbsmall_' + interleaving + '.img' - dstfilename = '/vsimem/out' + srcfilename = "data/envi/envi_rgbsmall_" + interleaving + ".img" + dstfilename = "/vsimem/out" try: - creationOptions = ['INTERLEAVE=' + interleaving] if explicit else [] - gdal.Translate(dstfilename, srcfilename, - format = 'ENVI', - creationOptions=creationOptions) - ref_data = open(srcfilename, 'rb').read() - f = gdal.VSIFOpenL(dstfilename, 'rb') + creationOptions = ["INTERLEAVE=" + interleaving] if explicit else [] + gdal.Translate( + dstfilename, srcfilename, format="ENVI", creationOptions=creationOptions + ) + ref_data = open(srcfilename, "rb").read() + f = gdal.VSIFOpenL(dstfilename, "rb") if f: got_data = gdal.VSIFReadL(1, len(ref_data), f) gdal.VSIFCloseL(f) assert got_data == ref_data finally: gdal.Unlink(dstfilename) - gdal.Unlink(dstfilename + '.hdr') + gdal.Unlink(dstfilename + ".hdr") + ############################################################################### # Test writing different interleaving (larger file) -@pytest.mark.parametrize('interleaving', ['bip', 'bil', 'bsq']) +@pytest.mark.parametrize("interleaving", ["bip", "bil", "bsq"]) def test_envi_writing_interleaving_larger_file(interleaving): - dstfilename = '/vsimem/out' + dstfilename = "/vsimem/out" try: xsize = 10000 ysize = 10 bands = 100 with gdaltest.SetCacheMax(xsize * (ysize // 2)): - ds = gdal.GetDriverByName('ENVI').Create(dstfilename, xsize, ysize, bands, options = ['INTERLEAVE=' + interleaving]) + ds = gdal.GetDriverByName("ENVI").Create( + dstfilename, xsize, ysize, bands, options=["INTERLEAVE=" + interleaving] + ) ds.GetRasterBand(1).Fill(1) for i in range(bands): - v = struct.pack('B', i+1) - ds.GetRasterBand(i+1).WriteRaster(0, 0, xsize, ysize // 2, v * (xsize * (ysize // 2))) + v = struct.pack("B", i + 1) + ds.GetRasterBand(i + 1).WriteRaster( + 0, 0, xsize, ysize // 2, v * (xsize * (ysize // 2)) + ) for i in range(bands): - v = struct.pack('B', i+1) - ds.GetRasterBand(i+1).WriteRaster(0, ysize // 2, xsize, ysize // 2, v * (xsize * (ysize // 2))) + v = struct.pack("B", i + 1) + ds.GetRasterBand(i + 1).WriteRaster( + 0, ysize // 2, xsize, ysize // 2, v * (xsize * (ysize // 2)) + ) ds = None ds = gdal.Open(dstfilename) for i in range(bands): - v = struct.pack('B', i+1) - assert ds.GetRasterBand(i+1).ReadRaster() == v * (xsize * ysize) + v = struct.pack("B", i + 1) + assert ds.GetRasterBand(i + 1).ReadRaster() == v * (xsize * ysize) finally: gdal.Unlink(dstfilename) - gdal.Unlink(dstfilename + '.hdr') + gdal.Unlink(dstfilename + ".hdr") ############################################################################### @@ -545,13 +586,14 @@ def test_envi_add_hdr(): drv.Delete("/vsimem/test.int") drv.Delete("/vsimem/test.int.mph") + ############################################################################### # Test .hdr as an additional extension, not a replacement one def test_envi_edit_coordinate_system_string(): - filename = '/vsimem/test.bin' + filename = "/vsimem/test.bin" drv = gdal.GetDriverByName("ENVI") ds = drv.Create(filename, 1, 1) srs = osr.SpatialReference() @@ -565,12 +607,12 @@ def test_envi_edit_coordinate_system_string(): ds.SetSpatialRef(srs) ds = None - fp = gdal.VSIFOpenL(filename[0:-4] + '.hdr', 'rb') + fp = gdal.VSIFOpenL(filename[0:-4] + ".hdr", "rb") assert fp - content = gdal.VSIFReadL(1, 1000, fp).decode('utf-8') + content = gdal.VSIFReadL(1, 1000, fp).decode("utf-8") gdal.VSIFCloseL(fp) - assert content.count('coordinate system string') == 1 + assert content.count("coordinate system string") == 1 ds = gdal.Open(filename) assert ds.GetSpatialRef().IsProjected() diff --git a/autotest/gdrivers/envisat.py b/autotest/gdrivers/envisat.py index d5c1815be7e6..72fdc3b695fe 100755 --- a/autotest/gdrivers/envisat.py +++ b/autotest/gdrivers/envisat.py @@ -30,46 +30,46 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import os import gzip -from osgeo import gdal - +import os import gdaltest import pytest +from osgeo import gdal + def _get_mds_num(filename): mph_size = 1247 - fd = open(filename, 'rb') + fd = open(filename, "rb") mph = fd.read(mph_size) for line in mph.splitlines(): - line = line.decode('iso8859-1') - if line.startswith('SPH_SIZE'): - sph_size = int(line.split('=')[-1][:-7]) + line = line.decode("iso8859-1") + if line.startswith("SPH_SIZE"): + sph_size = int(line.split("=")[-1][:-7]) break else: return sph = fd.read(sph_size) - sph = '\n'.join(line.decode('iso8859-1').rstrip() - for line in sph.splitlines()) + sph = "\n".join(line.decode("iso8859-1").rstrip() for line in sph.splitlines()) count = 0 - for block in sph.split('\n\n'): - if block.startswith('DS_NAME'): + for block in sph.split("\n\n"): + if block.startswith("DS_NAME"): ds_type = None ds_size = 0 for line in block.splitlines(): - if line.startswith('DS_TYPE'): - ds_type = line.split('=')[-1] - elif line.startswith('DS_SIZE'): - ds_size = int(line.split('=')[-1][:-7]) - if ds_type == 'M' and ds_size > 0: + if line.startswith("DS_TYPE"): + ds_type = line.split("=")[-1] + elif line.startswith("DS_SIZE"): + ds_size = int(line.split("=")[-1][:-7]) + if ds_type == "M" and ds_size > 0: count += 1 return count + ############################################################################### # @@ -79,16 +79,20 @@ class EnvisatTestBase(object): def download_file(self): # download and decompress - if not gdaltest.download_file(self.downloadURL, os.path.basename(self.downloadURL), -1): + if not gdaltest.download_file( + self.downloadURL, os.path.basename(self.downloadURL), -1 + ): return False - filename = os.path.join('tmp', 'cache', self.fileName) + filename = os.path.join("tmp", "cache", self.fileName) if os.path.exists(filename): return True # decompress - f_in = gzip.open(os.path.join('tmp', 'cache', os.path.basename(self.downloadURL))) - f_out = open(filename, 'wb') + f_in = gzip.open( + os.path.join("tmp", "cache", os.path.basename(self.downloadURL)) + ) + f_out = open(filename, "wb") f_out.write(f_in.read()) f_in.close() f_out.close() @@ -99,21 +103,30 @@ def test_envisat_1(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - assert (ds.RasterXSize, ds.RasterYSize) == self.size, \ - ('Bad size. Expected %s, got %s' % (self.size, (ds.RasterXSize, ds.RasterYSize))) + assert ( + ds.RasterXSize, + ds.RasterYSize, + ) == self.size, "Bad size. Expected %s, got %s" % ( + self.size, + (ds.RasterXSize, ds.RasterYSize), + ) def test_envisat_2(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - assert ds.GetRasterBand(1).Checksum() == self.checksum, \ - ('Bad checksum. Expected %d, got %d' % (self.checksum, ds.GetRasterBand(1).Checksum())) + assert ( + ds.GetRasterBand(1).Checksum() == self.checksum + ), "Bad checksum. Expected %d, got %d" % ( + self.checksum, + ds.GetRasterBand(1).Checksum(), + ) def test_envisat_3(self): # Regression test for #3160 and #3709. @@ -121,31 +134,30 @@ def test_envisat_3(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None d = {} for gcp in ds.GetGCPs(): lp = (gcp.GCPLine, gcp.GCPPixel) if lp in d: - pytest.fail('Duplicate GCP coordinates.') + pytest.fail("Duplicate GCP coordinates.") else: d[lp] = (gcp.GCPX, gcp.GCPY, gcp.GCPZ) - def test_envisat_4(self): # test number of bands if not self.download_file(): pytest.skip() - filename = os.path.join('tmp', 'cache', self.fileName) + filename = os.path.join("tmp", "cache", self.fileName) mds_num = _get_mds_num(filename) ds = gdal.Open(filename) assert ds is not None - assert ds.RasterCount >= mds_num, 'Not all bands have been detected' + assert ds.RasterCount >= mds_num, "Not all bands have been detected" def test_envisat_5(self): # test metadata in RECORDS domain @@ -153,22 +165,24 @@ def test_envisat_5(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - product = ds.GetMetadataItem('MPH_PRODUCT') - record_md = ds.GetMetadata('RECORDS') + product = ds.GetMetadataItem("MPH_PRODUCT") + record_md = ds.GetMetadata("RECORDS") + + assert ( + product[:3] in ("ASA", "SAR", "MER") or not record_md + ), 'Unexpected metadata in the "RECORDS" domain.' - assert product[:3] in ('ASA', 'SAR', 'MER') or not record_md, \ - 'Unexpected metadata in the "RECORDS" domain.' ############################################################################### # class TestEnvisatASAR(EnvisatTestBase): - downloadURL = 'http://earth.esa.int/services/sample_products/asar/DS1/WS/ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1.gz' - fileName = 'ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1' + downloadURL = "http://earth.esa.int/services/sample_products/asar/DS1/WS/ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1.gz" + fileName = "ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1" size = (524, 945) checksum = 44998 @@ -178,12 +192,12 @@ def test_envisat_asar_1(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - product = ds.GetMetadataItem('MPH_PRODUCT') + product = ds.GetMetadataItem("MPH_PRODUCT") - assert product[:3] in ('ASA', 'SAR'), 'Wrong sensor ID.' + assert product[:3] in ("ASA", "SAR"), "Wrong sensor ID." def test_envisat_asar_2(self): # test metadata in RECORDS domain @@ -191,44 +205,44 @@ def test_envisat_asar_2(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - product = ds.GetMetadataItem('MPH_PRODUCT') - record_md = ds.GetMetadata('RECORDS') - - assert record_md, 'Unable to read ADS metadata from ASAR.' - - record = 'SQ_ADS' # it is present in all ASAR poducts - if product.startswith('ASA_WV'): - for field in ('ZERO_DOPPLER_TIME', - 'INPUT_MEAN', - 'INPUT_STD_DEV', - 'PHASE_CROSS_CONF'): - key0 = '%s_%s' % (record, field) - key1 = '%s_0_%s' % (record, field) - assert key0 in record_md or key1 in record_md, \ - ('No "%s" or "%s" key in "RECORDS" domain.' % - (key0, key1)) + product = ds.GetMetadataItem("MPH_PRODUCT") + record_md = ds.GetMetadata("RECORDS") + + assert record_md, "Unable to read ADS metadata from ASAR." + + record = "SQ_ADS" # it is present in all ASAR poducts + if product.startswith("ASA_WV"): + for field in ( + "ZERO_DOPPLER_TIME", + "INPUT_MEAN", + "INPUT_STD_DEV", + "PHASE_CROSS_CONF", + ): + key0 = "%s_%s" % (record, field) + key1 = "%s_0_%s" % (record, field) + assert ( + key0 in record_md or key1 in record_md + ), 'No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1) else: for mds in range(1, ds.RasterCount + 1): - for field in ('ZERO_DOPPLER_TIME', - 'INPUT_MEAN', - 'INPUT_STD_DEV'): - key0 = 'MDS%d_%s_%s' % (mds, record, field) - key1 = 'MDS%d_%s_0_%s' % (mds, record, field) - assert key0 in record_md or key1 in record_md, \ - ('No "%s" or "%s" key in "RECORDS" domain.' % - (key0, key1)) - - + for field in ("ZERO_DOPPLER_TIME", "INPUT_MEAN", "INPUT_STD_DEV"): + key0 = "MDS%d_%s_%s" % (mds, record, field) + key1 = "MDS%d_%s_0_%s" % (mds, record, field) + assert ( + key0 in record_md or key1 in record_md + ), 'No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1) + + ############################################################################### # class TestEnvisatMERIS(EnvisatTestBase): - downloadURL = 'http://earth.esa.int/services/sample_products/meris/RRC/L2/MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1.gz' - fileName = 'MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1' + downloadURL = "http://earth.esa.int/services/sample_products/meris/RRC/L2/MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1.gz" + fileName = "MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1" size = (1121, 593) checksum = 55146 @@ -238,12 +252,12 @@ def test_envisat_meris_1(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - product = ds.GetMetadataItem('MPH_PRODUCT') + product = ds.GetMetadataItem("MPH_PRODUCT") - assert product[:3] in ('MER',), 'Wrong sensor ID.' + assert product[:3] in ("MER",), "Wrong sensor ID." def test_envisat_meris_2(self): # test metadata in RECORDS domain @@ -251,30 +265,29 @@ def test_envisat_meris_2(self): if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None - record_md = ds.GetMetadata('RECORDS') + record_md = ds.GetMetadata("RECORDS") - assert record_md, 'Unable to read ADS metadata from ASAR.' + assert record_md, "Unable to read ADS metadata from ASAR." - record = 'Quality_ADS' # it is present in all MER poducts + record = "Quality_ADS" # it is present in all MER poducts - for field in ('DSR_TIME', 'ATTACH_FLAG'): - key0 = '%s_%s' % (record, field) - key1 = '%s_0_%s' % (record, field) - assert key0 in record_md or key1 in record_md, \ - ('No "%s" or "%s" key in "RECORDS" domain.' % - (key0, key1)) + for field in ("DSR_TIME", "ATTACH_FLAG"): + key0 = "%s_%s" % (record, field) + key1 = "%s_0_%s" % (record, field) + assert ( + key0 in record_md or key1 in record_md + ), 'No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1) - def test_envisat_meris_3(self): # test Flag bands if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None flags_band = None @@ -282,46 +295,48 @@ def test_envisat_meris_3(self): for bandno in range(1, ds.RasterCount + 1): band = ds.GetRasterBand(bandno) name = band.GetDescription() - if 'Flags' in name: + if "Flags" in name: flags_band = bandno - if name.startswith('Detector index'): + if name.startswith("Detector index"): detector_index_band = bandno - product = ds.GetMetadataItem('MPH_PRODUCT') + product = ds.GetMetadataItem("MPH_PRODUCT") level = product[8] - if level == '1': - assert flags_band, 'No flag band in MERIS Level 1 product.' + if level == "1": + assert flags_band, "No flag band in MERIS Level 1 product." band = ds.GetRasterBand(flags_band) - assert band.DataType == gdal.GDT_Byte, \ - ('Incorrect data type of the flag band in ' - 'MERIS Level 1 product.') + assert band.DataType == gdal.GDT_Byte, ( + "Incorrect data type of the flag band in " "MERIS Level 1 product." + ) - assert detector_index_band, ('No "detector index" band in MERIS ' - 'Level 1 product.') + assert detector_index_band, ( + 'No "detector index" band in MERIS ' "Level 1 product." + ) band = ds.GetRasterBand(detector_index_band) - assert band.DataType == gdal.GDT_Int16, ('Incorrect data type of the ' - '"detector index" band in MERIS Level 2 ' - 'product.') - elif level == '2': - assert flags_band, 'No flag band in MERIS Level 2 product.' + assert band.DataType == gdal.GDT_Int16, ( + "Incorrect data type of the " + '"detector index" band in MERIS Level 2 ' + "product." + ) + elif level == "2": + assert flags_band, "No flag band in MERIS Level 2 product." band = ds.GetRasterBand(flags_band) - assert band.DataType == gdal.GDT_UInt32, \ - ('Incorrect data type of the flag band in ' - 'MERIS Level 2 product.') + assert band.DataType == gdal.GDT_UInt32, ( + "Incorrect data type of the flag band in " "MERIS Level 2 product." + ) else: - pytest.fail('Invalid product level: %s.' % level) + pytest.fail("Invalid product level: %s." % level) - def test_envisat_meris_4(self): # test DEM corrections (see #5423) if not self.download_file(): pytest.skip() - ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) + ds = gdal.Open(os.path.join("tmp", "cache", self.fileName)) assert ds is not None gcp_values = [ @@ -330,22 +345,20 @@ def test_envisat_meris_4(self): ] ref = [ - ('1', 0.5, 0.5, 6.484722, 47.191889, 0.0), - ('2', 0.5, 16.5, 6.279611, 47.245535999999994, 0.0), - ('3', 0.5, 32.5, 6.074068, 47.298809, 0.0), - ('4', 0.5, 48.5, 5.868156999999999, 47.351724999999995, 0.0), - ('5', 0.5, 64.5, 5.661817999999999, 47.404264999999995, 0.0), - ('6', 0.5, 80.5, 5.455087999999999, 47.456436, 0.0), - ('7', 0.5, 96.5, 5.247959, 47.508236000000004, 0.0), - ('8', 0.5, 112.5, 5.04043, 47.559663, 0.0), - ('9', 0.5, 128.5, 4.8324869999999995, 47.61071, 0.0), - ('10', 0.5, 144.5, 4.624124, 47.66137499999999, 0.0), + ("1", 0.5, 0.5, 6.484722, 47.191889, 0.0), + ("2", 0.5, 16.5, 6.279611, 47.245535999999994, 0.0), + ("3", 0.5, 32.5, 6.074068, 47.298809, 0.0), + ("4", 0.5, 48.5, 5.868156999999999, 47.351724999999995, 0.0), + ("5", 0.5, 64.5, 5.661817999999999, 47.404264999999995, 0.0), + ("6", 0.5, 80.5, 5.455087999999999, 47.456436, 0.0), + ("7", 0.5, 96.5, 5.247959, 47.508236000000004, 0.0), + ("8", 0.5, 112.5, 5.04043, 47.559663, 0.0), + ("9", 0.5, 128.5, 4.8324869999999995, 47.61071, 0.0), + ("10", 0.5, 144.5, 4.624124, 47.66137499999999, 0.0), ] for r, v in zip(ref, gcp_values): for i, ri in enumerate(r): if float(ri) != pytest.approx(float(v[i]), abs=1e-10): print(r) - pytest.fail('Wrong GCP coordinates.') - - + pytest.fail("Wrong GCP coordinates.") diff --git a/autotest/gdrivers/ers.py b/autotest/gdrivers/ers.py index 827d010ea632..fe8ccd4bd246 100755 --- a/autotest/gdrivers/ers.py +++ b/autotest/gdrivers/ers.py @@ -30,35 +30,39 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr - - import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Perform simple read test. def test_ers_1(): - tst = gdaltest.GDALTest('ERS', 'ers/srtm.ers', 1, 64074) + tst = gdaltest.GDALTest("ERS", "ers/srtm.ers", 1, 64074) tst.testOpen() - ds = gdal.Open('data/ers/srtm.ers') + ds = gdal.Open("data/ers/srtm.ers") md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'STATISTICS_MEAN': '-4020.25', 'STATISTICS_MINIMUM': '-4315', 'STATISTICS_MAXIMUM': '-3744', 'STATISTICS_MEDIAN': '-4000'} + expected_md = { + "STATISTICS_MEAN": "-4020.25", + "STATISTICS_MINIMUM": "-4315", + "STATISTICS_MAXIMUM": "-3744", + "STATISTICS_MEDIAN": "-4000", + } assert md == expected_md + ############################################################################### # Create simple copy and check. def test_ers_2(): - tst = gdaltest.GDALTest('ERS', 'ehdr/float32.bil', 1, 27) - return tst.testCreateCopy(new_filename='tmp/float32.ers', - check_gt=1, vsimem=1) + tst = gdaltest.GDALTest("ERS", "ehdr/float32.bil", 1, 27) + return tst.testCreateCopy(new_filename="tmp/float32.ers", check_gt=1, vsimem=1) + ############################################################################### # Test multi-band file. @@ -66,8 +70,9 @@ def test_ers_2(): def test_ers_3(): - tst = gdaltest.GDALTest('ERS', 'rgbsmall.tif', 2, 21053) - return tst.testCreate(new_filename='tmp/rgbsmall.ers') + tst = gdaltest.GDALTest("ERS", "rgbsmall.tif", 2, 21053) + return tst.testCreate(new_filename="tmp/rgbsmall.ers") + ############################################################################### # Test HeaderOffset case. @@ -82,41 +87,44 @@ def test_ers_4(): PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" - tst = gdaltest.GDALTest('ERS', 'ers/ers_dem.ers', 1, 56588) + tst = gdaltest.GDALTest("ERS", "ers/ers_dem.ers", 1, 56588) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Confirm we can recognised signed 8bit data. def test_ers_5(): - ds = gdal.Open('data/ers/8s.ers') - md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') + ds = gdal.Open("data/ers/8s.ers") + md = ds.GetRasterBand(1).GetMetadata("IMAGE_STRUCTURE") - assert md['PIXELTYPE'] == 'SIGNEDBYTE', 'Failed to detect SIGNEDBYTE' + assert md["PIXELTYPE"] == "SIGNEDBYTE", "Failed to detect SIGNEDBYTE" ds = None + ############################################################################### # Confirm a copy preserves the signed byte info. def test_ers_6(): - drv = gdal.GetDriverByName('ERS') + drv = gdal.GetDriverByName("ERS") - src_ds = gdal.Open('data/ers/8s.ers') + src_ds = gdal.Open("data/ers/8s.ers") - ds = drv.CreateCopy('tmp/8s.ers', src_ds) + ds = drv.CreateCopy("tmp/8s.ers", src_ds) - md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') + md = ds.GetRasterBand(1).GetMetadata("IMAGE_STRUCTURE") - assert md['PIXELTYPE'] == 'SIGNEDBYTE', 'Failed to detect SIGNEDBYTE' + assert md["PIXELTYPE"] == "SIGNEDBYTE", "Failed to detect SIGNEDBYTE" ds = None - drv.Delete('tmp/8s.ers') + drv.Delete("tmp/8s.ers") + ############################################################################### # Test opening a file with everything in lower case. @@ -124,11 +132,12 @@ def test_ers_6(): def test_ers_7(): - ds = gdal.Open('data/ers/caseinsensitive.ers') + ds = gdal.Open("data/ers/caseinsensitive.ers") desc = ds.GetRasterBand(1).GetDescription() - assert desc == 'RTP 1st Vertical Derivative', 'did not get expected values.' + assert desc == "RTP 1st Vertical Derivative", "did not get expected values." + ############################################################################### # Test GCP support @@ -136,35 +145,43 @@ def test_ers_7(): def test_ers_8(): - src_ds = gdal.Open('../gcore/data/gcps.vrt') - drv = gdal.GetDriverByName('ERS') - ds = drv.CreateCopy('/vsimem/ers_8.ers', src_ds) + src_ds = gdal.Open("../gcore/data/gcps.vrt") + drv = gdal.GetDriverByName("ERS") + ds = drv.CreateCopy("/vsimem/ers_8.ers", src_ds) ds = None - gdal.Unlink('/vsimem/ers_8.ers.aux.xml') + gdal.Unlink("/vsimem/ers_8.ers.aux.xml") - ds = gdal.Open('/vsimem/ers_8.ers') + ds = gdal.Open("/vsimem/ers_8.ers") expected_gcps = src_ds.GetGCPs() gcps = ds.GetGCPs() gcp_count = ds.GetGCPCount() wkt = ds.GetGCPProjection() ds = None - assert wkt.replace(',AUTHORITY["EPSG","9122"]', '').replace(',AUTHORITY["EPSG","9108"]', '') == """PROJCS["NUTM11",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],TOWGS84[-3,142,183,0,0,0,0],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ - 'did not get expected GCP projection' + assert ( + wkt.replace(',AUTHORITY["EPSG","9122"]', "").replace( + ',AUTHORITY["EPSG","9108"]', "" + ) + == """PROJCS["NUTM11",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],TOWGS84[-3,142,183,0,0,0,0],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" + ), "did not get expected GCP projection" - assert len(gcps) == len(expected_gcps) and len(gcps) == gcp_count, \ - 'did not get expected GCP number' + assert ( + len(gcps) == len(expected_gcps) and len(gcps) == gcp_count + ), "did not get expected GCP number" for i, gcp in enumerate(gcps): - if gcp.GCPPixel != pytest.approx(expected_gcps[i].GCPPixel, abs=1e-6) or \ - gcp.GCPLine != pytest.approx(expected_gcps[i].GCPLine, abs=1e-6) or \ - gcp.GCPX != pytest.approx(expected_gcps[i].GCPX, abs=1e-6) or \ - gcp.GCPY != pytest.approx(expected_gcps[i].GCPY, abs=1e-6): + if ( + gcp.GCPPixel != pytest.approx(expected_gcps[i].GCPPixel, abs=1e-6) + or gcp.GCPLine != pytest.approx(expected_gcps[i].GCPLine, abs=1e-6) + or gcp.GCPX != pytest.approx(expected_gcps[i].GCPX, abs=1e-6) + or gcp.GCPY != pytest.approx(expected_gcps[i].GCPY, abs=1e-6) + ): print(gcps[i]) - pytest.fail('did not get expected GCP %d' % i) + pytest.fail("did not get expected GCP %d" % i) + + drv.Delete("/vsimem/ers_8.ers") - drv.Delete('/vsimem/ers_8.ers') ############################################################################### # Test NoData support (#4207) @@ -172,24 +189,25 @@ def test_ers_8(): def test_ers_9(): - drv = gdal.GetDriverByName('ERS') - ds = drv.Create('/vsimem/ers_9.ers', 1, 1) + drv = gdal.GetDriverByName("ERS") + ds = drv.Create("/vsimem/ers_9.ers", 1, 1) ds.GetRasterBand(1).SetNoDataValue(123) ds = None - f = gdal.VSIFOpenL('/vsimem/ers_9.ers.aux.xml', 'rb') + f = gdal.VSIFOpenL("/vsimem/ers_9.ers.aux.xml", "rb") if f is not None: gdal.VSIFCloseL(f) - drv.Delete('/vsimem/ers_9.ers') - pytest.fail('/vsimem/ers_9.ers.aux.xml should not exist') + drv.Delete("/vsimem/ers_9.ers") + pytest.fail("/vsimem/ers_9.ers.aux.xml should not exist") - ds = gdal.Open('/vsimem/ers_9.ers') + ds = gdal.Open("/vsimem/ers_9.ers") val = ds.GetRasterBand(1).GetNoDataValue() ds = None - drv.Delete('/vsimem/ers_9.ers') + drv.Delete("/vsimem/ers_9.ers") + + assert val == 123, "did not get expected nodata value" - assert val == 123, 'did not get expected nodata value' ############################################################################### # Test PROJ, DATUM, UNITS support (#4229) @@ -197,17 +215,22 @@ def test_ers_9(): def test_ers_10(): - drv = gdal.GetDriverByName('ERS') - ds = drv.Create('/vsimem/ers_10.ers', 1, 1, options=['DATUM=GDA94', 'PROJ=MGA55', 'UNITS=METERS']) + drv = gdal.GetDriverByName("ERS") + ds = drv.Create( + "/vsimem/ers_10.ers", + 1, + 1, + options=["DATUM=GDA94", "PROJ=MGA55", "UNITS=METERS"], + ) proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") - assert proj == 'MGA55', 'did not get expected PROJ' + assert proj == "MGA55", "did not get expected PROJ" - assert datum == 'GDA94', 'did not get expected DATUM' + assert datum == "GDA94", "did not get expected DATUM" - assert units == 'METERS', 'did not get expected UNITS' + assert units == "METERS", "did not get expected UNITS" # This should be overridden by the above values sr = osr.SpatialReference() @@ -217,21 +240,21 @@ def test_ers_10(): proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") - assert proj == 'MGA55', 'did not get expected PROJ' + assert proj == "MGA55", "did not get expected PROJ" - assert datum == 'GDA94', 'did not get expected DATUM' + assert datum == "GDA94", "did not get expected DATUM" - assert units == 'METERS', 'did not get expected UNITS' + assert units == "METERS", "did not get expected UNITS" ds = None - f = gdal.VSIFOpenL('/vsimem/ers_10.ers.aux.xml', 'rb') + f = gdal.VSIFOpenL("/vsimem/ers_10.ers.aux.xml", "rb") if f is not None: gdal.VSIFCloseL(f) - drv.Delete('/vsimem/ers_10.ers') - pytest.fail('/vsimem/ers_10.ers.aux.xml should not exist') + drv.Delete("/vsimem/ers_10.ers") + pytest.fail("/vsimem/ers_10.ers.aux.xml should not exist") - ds = gdal.Open('/vsimem/ers_10.ers') + ds = gdal.Open("/vsimem/ers_10.ers") wkt = ds.GetProjectionRef() proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") @@ -239,67 +262,67 @@ def test_ers_10(): md_ers = ds.GetMetadata("ERS") ds = None - drv.Delete('/vsimem/ers_10.ers') + drv.Delete("/vsimem/ers_10.ers") - assert proj == 'MGA55', 'did not get expected PROJ' + assert proj == "MGA55", "did not get expected PROJ" - assert datum == 'GDA94', 'did not get expected DATUM' + assert datum == "GDA94", "did not get expected DATUM" - assert units == 'METERS', 'did not get expected UNITS' + assert units == "METERS", "did not get expected UNITS" - assert md_ers["PROJ"] == proj and md_ers["DATUM"] == datum and md_ers["UNITS"] == units, \ - ('GetMetadata() not consistent with ' - 'GetMetadataItem()') + assert ( + md_ers["PROJ"] == proj and md_ers["DATUM"] == datum and md_ers["UNITS"] == units + ), ("GetMetadata() not consistent with " "GetMetadataItem()") - assert wkt.startswith("""PROJCS["MGA55"""), 'did not get expected projection' + assert wkt.startswith("""PROJCS["MGA55"""), "did not get expected projection" - ds = drv.Create('/vsimem/ers_10.ers', 1, 1, options=['DATUM=GDA94', 'PROJ=MGA55', 'UNITS=FEET']) + ds = drv.Create( + "/vsimem/ers_10.ers", 1, 1, options=["DATUM=GDA94", "PROJ=MGA55", "UNITS=FEET"] + ) ds = None # Check that we can update those values with SetProjection() - ds = gdal.Open('/vsimem/ers_10.ers', gdal.GA_Update) + ds = gdal.Open("/vsimem/ers_10.ers", gdal.GA_Update) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") - assert proj == 'GEODETIC', 'did not get expected PROJ' + assert proj == "GEODETIC", "did not get expected PROJ" - assert datum == 'WGS84', 'did not get expected DATUM' + assert datum == "WGS84", "did not get expected DATUM" - assert units == 'METERS', 'did not get expected UNITS' + assert units == "METERS", "did not get expected UNITS" ds = None - ds = gdal.Open('/vsimem/ers_10.ers') + ds = gdal.Open("/vsimem/ers_10.ers") proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") ds = None - drv.Delete('/vsimem/ers_10.ers') + drv.Delete("/vsimem/ers_10.ers") - assert proj == 'GEODETIC', 'did not get expected PROJ' + assert proj == "GEODETIC", "did not get expected PROJ" - assert datum == 'WGS84', 'did not get expected DATUM' + assert datum == "WGS84", "did not get expected DATUM" + + assert units == "METERS", "did not get expected UNITS" - assert units == 'METERS', 'did not get expected UNITS' ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8744 def test_ers_recursive_opening(): - ds = gdal.Open('/vsitar/data/ers/test_ers_recursive.tar/test.ers') + ds = gdal.Open("/vsitar/data/ers/test_ers_recursive.tar/test.ers") ds.GetFileList() + ############################################################################### # Cleanup def test_ers_cleanup(): gdaltest.clean_tmp() - - - - diff --git a/autotest/gdrivers/esric.py b/autotest/gdrivers/esric.py index 69e4d35642c2..8e25d7c18d71 100755 --- a/autotest/gdrivers/esric.py +++ b/autotest/gdrivers/esric.py @@ -29,15 +29,17 @@ # from osgeo import osr -from osgeo import gdal import gdaltest import pytest -pytestmark = pytest.mark.require_driver('ESRIC') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("ESRIC") ############################################################################### # Open the dataset + def test_esric_1(): gdaltest.esric_ds = gdal.Open("data/esric/Layers/conf.xml") @@ -47,6 +49,7 @@ def test_esric_1(): ############################################################################### # Check that the configuration was read as expected + def test_esric_2(): if gdaltest.esric_ds is None: @@ -55,25 +58,27 @@ def test_esric_2(): ds = gdaltest.esric_ds b1 = ds.GetRasterBand(1) - assert ds.RasterCount == 4 and ds.RasterXSize == 2048 and ds.RasterYSize == 2048, \ - "wrong size or band count" + assert ( + ds.RasterCount == 4 and ds.RasterXSize == 2048 and ds.RasterYSize == 2048 + ), "wrong size or band count" assert b1.GetOverviewCount() == 3, "Wrong number of overviews" wkt = ds.GetProjectionRef() - assert 'AUTHORITY["EPSG","3857"]' in wkt, 'wrong SRS' + assert 'AUTHORITY["EPSG","3857"]' in wkt, "wrong SRS" gt = ds.GetGeoTransform() - assert gt[0] == pytest.approx(-20037508, abs=1), 'wrong geolocation' - assert gt[1] == pytest.approx( 20037508 / 1024, abs=1), 'wrong geolocation' - assert gt[2] == 0 and gt[4] == 0, 'wrong geolocation' - assert gt[3] == pytest.approx( 20037508, abs=1), 'wrong geolocation' - assert gt[5] == pytest.approx(-20037508 / 1024, abs=1), 'wrong geolocation' + assert gt[0] == pytest.approx(-20037508, abs=1), "wrong geolocation" + assert gt[1] == pytest.approx(20037508 / 1024, abs=1), "wrong geolocation" + assert gt[2] == 0 and gt[4] == 0, "wrong geolocation" + assert gt[3] == pytest.approx(20037508, abs=1), "wrong geolocation" + assert gt[5] == pytest.approx(-20037508 / 1024, abs=1), "wrong geolocation" ############################################################################### # Check that the read a missing level generates black + def test_esric_3(): if gdaltest.esric_ds is None: @@ -83,18 +88,20 @@ def test_esric_3(): # There are no tiles at this level, driver will return black b1 = ds.GetRasterBand(1) cs = b1.Checksum() - assert cs == 0, 'wrong checksum from missing level' + assert cs == 0, "wrong checksum from missing level" + ############################################################################### # Check that the read of PNG tiles returns the right checksum + def test_esric_4(): if gdaltest.esric_ds is None: pytest.skip() # Check that the PNG driver is available - if not gdal.GetDriverByName('PNG'): + if not gdal.GetDriverByName("PNG"): pytest.skip() ds = gdaltest.esric_ds @@ -109,7 +116,8 @@ def test_esric_4(): cs = l1b2.Checksum() expectedcs = 46857 - assert cs == expectedcs, 'wrong data checksum' + assert cs == expectedcs, "wrong data checksum" + def test_esric_cleanup(): diff --git a/autotest/gdrivers/exr.py b/autotest/gdrivers/exr.py index 90e34ccf4c77..fc5c9d316376 100644 --- a/autotest/gdrivers/exr.py +++ b/autotest/gdrivers/exr.py @@ -28,83 +28,86 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal import gdaltest import pytest -pytestmark = pytest.mark.require_driver('EXR') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("EXR") + def test_exr_byte_createcopy(): - tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_half(): - tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=HALF']) + tst = gdaltest.GDALTest("EXR", "byte.tif", 1, 4672, options=["PIXEL_TYPE=HALF"]) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_float(): - tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=FLOAT']) + tst = gdaltest.GDALTest("EXR", "byte.tif", 1, 4672, options=["PIXEL_TYPE=FLOAT"]) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_uint(): - tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=UINT']) + tst = gdaltest.GDALTest("EXR", "byte.tif", 1, 4672, options=["PIXEL_TYPE=UINT"]) return tst.testCreateCopy(vsimem=1) def test_exr_byte_create(): - tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "byte.tif", 1, 4672) return tst.testCreate(vsimem=1) def test_exr_uint16_createcopy(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/uint16.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_uint16_create(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/uint16.tif", 1, 4672) return tst.testCreate(vsimem=1) def test_exr_uint32_createcopy(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint32.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/uint32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_uint32_create(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint32.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/uint32.tif", 1, 4672) return tst.testCreate(vsimem=1) def test_exr_float32_createcopy(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/float32.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/float32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_float32_create(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/float32.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/float32.tif", 1, 4672) return tst.testCreate(vsimem=1) def test_exr_float64_createcopy(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/float64.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/float64.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_float64_create(): - tst = gdaltest.GDALTest('EXR', '../../gcore/data/float64.tif', 1, 4672) + tst = gdaltest.GDALTest("EXR", "../../gcore/data/float64.tif", 1, 4672) return tst.testCreate(vsimem=1) def test_exr_compression_createcopy(): - src_ds = gdal.Open('data/byte.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['COMPRESS=RLE']) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'RLE' + src_ds = gdal.Open("data/byte.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["COMPRESS=RLE"] + ) + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "RLE" band = ds.GetRasterBand(1) assert band.Checksum() == 4672 ds = None @@ -112,15 +115,15 @@ def test_exr_compression_createcopy(): def test_exr_compression_create(): - src_ds = gdal.Open('data/byte.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').Create(tmpfilename, 20, 20, - options = ['COMPRESS=RLE']) - ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, - src_ds.GetRasterBand(1).ReadRaster()) + src_ds = gdal.Open("data/byte.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").Create( + tmpfilename, 20, 20, options=["COMPRESS=RLE"] + ) + ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, src_ds.GetRasterBand(1).ReadRaster()) ds = None ds = gdal.Open(tmpfilename) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'RLE' + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "RLE" band = ds.GetRasterBand(1) assert band.Checksum() == 4672 ds = None @@ -128,23 +131,24 @@ def test_exr_compression_create(): def test_exr_compression_dwa_compression_level(): - src_ds = gdal.Open('data/small_world.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['COMPRESS=DWAB', - 'DWA_COMPRESSION_LEVEL=100']) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'DWAB' + src_ds = gdal.Open("data/small_world.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["COMPRESS=DWAB", "DWA_COMPRESSION_LEVEL=100"] + ) + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "DWAB" band = ds.GetRasterBand(1) - assert band.Checksum() in (12863, 12864) # 12864 on s390x + assert band.Checksum() in (12863, 12864) # 12864 on s390x ds = None gdal.Unlink(tmpfilename) def test_exr_tiling(): - src_ds = gdal.Open('data/byte.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['TILED=YES']) + src_ds = gdal.Open("data/byte.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["TILED=YES"] + ) band = ds.GetRasterBand(1) assert band.GetBlockSize() == [256, 256] assert band.Checksum() == 4672 @@ -153,12 +157,11 @@ def test_exr_tiling(): def test_exr_tiling_custom_tile_size(): - src_ds = gdal.Open('data/byte.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['TILED=YES', - 'BLOCKXSIZE=13', - 'BLOCKYSIZE=15']) + src_ds = gdal.Open("data/byte.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["TILED=YES", "BLOCKXSIZE=13", "BLOCKYSIZE=15"] + ) band = ds.GetRasterBand(1) assert band.GetBlockSize() == [13, 15] assert band.Checksum() == 4672 @@ -167,12 +170,11 @@ def test_exr_tiling_custom_tile_size(): def test_exr_rgb_byte_tiled(): - src_ds = gdal.Open('data/small_world.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['TILED=YES', - 'BLOCKXSIZE=64', - 'BLOCKYSIZE=32']) + src_ds = gdal.Open("data/small_world.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["TILED=YES", "BLOCKXSIZE=64", "BLOCKYSIZE=32"] + ) assert ds.GetRasterBand(1).Checksum() == 12852 assert ds.GetRasterBand(2).Checksum() == 12226 assert ds.GetRasterBand(3).Checksum() == 10731 @@ -181,21 +183,24 @@ def test_exr_rgb_byte_tiled(): def test_exr_rgb_byte_strip_no_auto_rescale(): - src_ds = gdal.Open('data/small_world.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['AUTO_RESCALE=NO']) - assert [ds.GetRasterBand(i+1).Checksum() for i in range(3)] == \ - [src_ds.GetRasterBand(i+1).Checksum() for i in range(3)] + src_ds = gdal.Open("data/small_world.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["AUTO_RESCALE=NO"] + ) + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] == [ + src_ds.GetRasterBand(i + 1).Checksum() for i in range(3) + ] ds = None gdal.Unlink(tmpfilename) def test_exr_overviews(): - src_ds = gdal.Open('data/small_world.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['OVERVIEWS=YES']) + src_ds = gdal.Open("data/small_world.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["OVERVIEWS=YES"] + ) assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(1) is None @@ -205,15 +210,21 @@ def test_exr_overviews(): def test_exr_preview(): - src_ds = gdal.Open('data/small_world.tif') - tmpfilename = '/vsimem/temp.exr' - ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, - options = ['PREVIEW=YES']) + src_ds = gdal.Open("data/small_world.tif") + tmpfilename = "/vsimem/temp.exr" + ds = gdal.GetDriverByName("EXR").CreateCopy( + tmpfilename, src_ds, options=["PREVIEW=YES"] + ) assert len(ds.GetSubDatasets()) == 1 subds_name = ds.GetSubDatasets()[0][0] ds = None ds = gdal.Open(subds_name) assert ds.RasterCount == 4 - assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == [51312, 51623, 55830, 61313] + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] == [ + 51312, + 51623, + 55830, + 61313, + ] ds = None gdal.Unlink(tmpfilename) diff --git a/autotest/gdrivers/fast.py b/autotest/gdrivers/fast.py index a4421a64e4c4..fc87852bf737 100755 --- a/autotest/gdrivers/fast.py +++ b/autotest/gdrivers/fast.py @@ -29,23 +29,22 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Verify we have the driver. def test_fast_1(): - gdaltest.fast_drv = gdal.GetDriverByName('FAST') + gdaltest.fast_drv = gdal.GetDriverByName("FAST") if gdaltest.fast_drv is None: pytest.skip() - + ############################################################################### # Perform simple read test. @@ -58,10 +57,12 @@ def test_fast_2(): # Actually, the band (a placeholder) is of 0 bytes size, # so the checksum is 0 expected. - tst = gdaltest.GDALTest('fast', 'fast/L71118038_03820020111_HPN.FST', 1, 60323, - 0, 0, 5000, 1) + tst = gdaltest.GDALTest( + "fast", "fast/L71118038_03820020111_HPN.FST", 1, 60323, 0, 0, 5000, 1 + ) return tst.testOpen() + ############################################################################### # Verify metadata. @@ -71,33 +72,33 @@ def test_fast_3(): if gdaltest.fast_drv is None: pytest.skip() - gdaltest.fast_ds = gdal.Open('data/fast/L71118038_03820020111_HPN.FST') + gdaltest.fast_ds = gdal.Open("data/fast/L71118038_03820020111_HPN.FST") ds = gdaltest.fast_ds - assert ds is not None, 'Missing test dataset' + assert ds is not None, "Missing test dataset" md = ds.GetMetadata() - assert md is not None, 'Missing metadata in test dataset' + assert md is not None, "Missing metadata in test dataset" - assert md['ACQUISITION_DATE'] == '20020111', 'ACQUISITION_DATE wrong' + assert md["ACQUISITION_DATE"] == "20020111", "ACQUISITION_DATE wrong" - assert md['SATELLITE'] == 'LANDSAT7', 'SATELLITE wrong' + assert md["SATELLITE"] == "LANDSAT7", "SATELLITE wrong" - assert md['SENSOR'] == 'ETM+', 'SENSOR wrong' + assert md["SENSOR"] == "ETM+", "SENSOR wrong" # GAIN and BIAS expected values gb_expected = (-6.199999809265137, 0.775686297697179) - gain = float(md['GAIN1']) + gain = float(md["GAIN1"]) if gain != pytest.approx(gb_expected[0], abs=0.0001): - print('expected:', gb_expected[0]) - print('got:', gain) + print("expected:", gb_expected[0]) + print("got:", gain) - bias = float(md['BIAS1']) + bias = float(md["BIAS1"]) if bias != pytest.approx(gb_expected[1], abs=0.0001): - print('expected:', gb_expected[1]) - print('got:', bias) + print("expected:", gb_expected[1]) + print("got:", bias) + - ############################################################################### # Test geotransform data. @@ -108,7 +109,7 @@ def test_fast_4(): pytest.skip() ds = gdaltest.fast_ds - assert ds is not None, 'Missing test dataset' + assert ds is not None, "Missing test dataset" gt = ds.GetGeoTransform() @@ -116,22 +117,28 @@ def test_fast_4(): ds = None tolerance = 0.01 - assert (gt[0] == pytest.approx(280342.5, abs=tolerance) and gt[1] == pytest.approx(15.0, abs=tolerance) and \ - gt[2] == pytest.approx(0.0, abs=tolerance) and gt[3] == pytest.approx(3621457.5, abs=tolerance) and \ - gt[4] == pytest.approx(0.0, abs=tolerance) and abs(gt[5] + 15.0) <= tolerance), \ - 'FAST geotransform wrong' + assert ( + gt[0] == pytest.approx(280342.5, abs=tolerance) + and gt[1] == pytest.approx(15.0, abs=tolerance) + and gt[2] == pytest.approx(0.0, abs=tolerance) + and gt[3] == pytest.approx(3621457.5, abs=tolerance) + and gt[4] == pytest.approx(0.0, abs=tolerance) + and abs(gt[5] + 15.0) <= tolerance + ), "FAST geotransform wrong" ############################################################################### # Test 2 bands dataset with checking projections and geotransform. + def test_fast_5(): if gdaltest.fast_drv is None: pytest.skip() - tst = gdaltest.GDALTest('fast', 'fast/L71230079_07920021111_HTM.FST', 2, 19110, - 0, 0, 7000, 1) + tst = gdaltest.GDALTest( + "fast", "fast/L71230079_07920021111_HTM.FST", 2, 19110, 0, 0, 7000, 1 + ) # Expected parameters of the geotransform gt = (528417.25, 30.0, 0.0, 7071187.0, 0.0, -30.0) @@ -164,16 +171,23 @@ def test_fast_5(): ############################################################################### # Test Euromap LISS3 dataset + def test_fast_6(): if gdaltest.fast_drv is None: pytest.skip() - tst = gdaltest.GDALTest('fast', 'fast/n0o0y867.0fl', 1, 0, 0, 0, 2741, 1) + tst = gdaltest.GDALTest("fast", "fast/n0o0y867.0fl", 1, 0, 0, 0, 2741, 1) # Expected parameters of the geotransform - gt = (14640936.89174916, 1.008817518246492, 24.9876841746236, - 664274.3912497687, 24.98828832116786, -0.9907878581173808) + gt = ( + 14640936.89174916, + 1.008817518246492, + 24.9876841746236, + 664274.3912497687, + 24.98828832116786, + -0.9907878581173808, + ) # Expected definition of the projection proj = """LOCAL_CS["GCTP projection number 22", @@ -185,12 +199,13 @@ def test_fast_6(): ############################################################################### # Test Euromap PAN dataset + def test_fast_7(): if gdaltest.fast_drv is None: pytest.skip() - tst = gdaltest.GDALTest('fast', 'fast/h0o0y867.1ah', 1, 0, 0, 0, 5815, 1) + tst = gdaltest.GDALTest("fast", "fast/h0o0y867.1ah", 1, 0, 0, 0, 5815, 1) # Expected parameters of the geotransform gt = (676565.09, 5, 0, 5348341.5, 0, -5) @@ -213,6 +228,7 @@ def test_fast_7(): return tst.testOpen(check_gt=gt, check_prj=proj) + ############################################################################### # Test Euromap WIFS dataset @@ -222,11 +238,17 @@ def test_fast_8(): if gdaltest.fast_drv is None: pytest.skip() - tst = gdaltest.GDALTest('fast', 'fast/w0y13a4t.010', 1, 0, 0, 0, 4748, 1) + tst = gdaltest.GDALTest("fast", "fast/w0y13a4t.010", 1, 0, 0, 0, 4748, 1) # Expected parameters of the geotransform - gt = (-336965.0150603952, 176.0817495260164, -37.35662873563219, - 484122.7765089957, -37.35622603749736, -176.081791954023) + gt = ( + -336965.0150603952, + 176.0817495260164, + -37.35662873563219, + 484122.7765089957, + -37.35622603749736, + -176.081791954023, + ) # Expected definition of the projection proj = """PROJCS["unnamed", @@ -247,6 +269,7 @@ def test_fast_8(): return tst.testOpen(check_gt=gt, check_prj=proj) + ############################################################################### # Check some metadata and opening for a RevB L7 file (#3306, #3307). @@ -256,13 +279,11 @@ def test_fast_9(): if gdaltest.fast_drv is None: pytest.skip() - ds = gdal.Open('data/fast/HEADER.DAT') - assert ds.GetMetadataItem('SENSOR') == '', 'Did not get expected SENSOR value.' + ds = gdal.Open("data/fast/HEADER.DAT") + assert ds.GetMetadataItem("SENSOR") == "", "Did not get expected SENSOR value." + + assert ds.RasterCount == 7, "Did not get expected band count." - assert ds.RasterCount == 7, 'Did not get expected band count.' ############################################################################### # - - - diff --git a/autotest/gdrivers/fit.py b/autotest/gdrivers/fit.py index d5217e844577..2048cfd0f0ec 100755 --- a/autotest/gdrivers/fit.py +++ b/autotest/gdrivers/fit.py @@ -33,16 +33,16 @@ from osgeo import gdal -@pytest.mark.parametrize('filename', [ - 'byte', 'int16', 'uint16', 'int32', 'uint32', 'float32', 'float64' -]) +@pytest.mark.parametrize( + "filename", ["byte", "int16", "uint16", "int32", "uint32", "float32", "float64"] +) def test_fit(filename): - fitDriver = gdal.GetDriverByName('FIT') + fitDriver = gdal.GetDriverByName("FIT") - ds = gdal.Open('../gcore/data/' + filename + '.tif') - fitDriver.CreateCopy('tmp/' + filename + '.fit', ds, options=['PAGESIZE=2,2']) + ds = gdal.Open("../gcore/data/" + filename + ".tif") + fitDriver.CreateCopy("tmp/" + filename + ".fit", ds, options=["PAGESIZE=2,2"]) - ds2 = gdal.Open('tmp/' + filename + '.fit') + ds2 = gdal.Open("tmp/" + filename + ".fit") assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() assert ds2.GetRasterBand(1).DataType == ds.GetRasterBand(1).DataType diff --git a/autotest/gdrivers/fits.py b/autotest/gdrivers/fits.py index 3c6ff50059ec..45068036e29b 100755 --- a/autotest/gdrivers/fits.py +++ b/autotest/gdrivers/fits.py @@ -29,89 +29,91 @@ ############################################################################### import os -import pytest -from osgeo import gdal -from osgeo import ogr import gdaltest +import pytest + +from osgeo import gdal, ogr -pytestmark = pytest.mark.require_driver('FITS') +pytestmark = pytest.mark.require_driver("FITS") @pytest.mark.parametrize( - 'filename', - ['byte', 'int16', 'uint16', 'int32', 'uint32', 'float32', 'float64'] + "filename", ["byte", "int16", "uint16", "int32", "uint32", "float32", "float64"] ) def test_fits(filename): - driver = gdal.GetDriverByName('FITS') + driver = gdal.GetDriverByName("FITS") - ds = gdal.Open('../gcore/data/' + filename + '.tif') - driver.CreateCopy('tmp/' + filename + '.fits', ds, options=['PAGESIZE=2,2']) + ds = gdal.Open("../gcore/data/" + filename + ".tif") + driver.CreateCopy("tmp/" + filename + ".fits", ds, options=["PAGESIZE=2,2"]) - ds2 = gdal.Open('tmp/' + filename + '.fits') + 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') + driver.Delete("tmp/" + filename + ".fits") + def test_fits_metadata(): - driver = gdal.GetDriverByName('FITS') + driver = gdal.GetDriverByName("FITS") - ds = gdal.Open('../gcore/data/byte.tif') - ds2 = driver.CreateCopy('tmp/byte.fits', ds) - md = {'TEST': 'test_value'} + 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') + gdal.Unlink("tmp/byte.fits.aux.xml") - ds2 = gdal.Open('tmp/byte.fits') + ds2 = gdal.Open("tmp/byte.fits") md = ds2.GetMetadata() ds2 = None - assert md['TEST'] == 'test_value' + assert md["TEST"] == "test_value" - ds2 = gdal.Open('tmp/byte.fits', gdal.GA_Update) - md = {'TEST2': 'test_value2'} + 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') + gdal.Unlink("tmp/byte.fits.aux.xml") - ds2 = gdal.Open('tmp/byte.fits') + ds2 = gdal.Open("tmp/byte.fits") md = ds2.GetMetadata() ds2 = None - assert md['TEST2'] == 'test_value2' + assert md["TEST2"] == "test_value2" + def test_fits_nodata(): - driver = gdal.GetDriverByName('FITS') + driver = gdal.GetDriverByName("FITS") - ds = gdal.Open('../gcore/data/nodata_byte.tif') - ds2 = driver.CreateCopy('tmp/nodata_byte.fits', ds) + 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') + gdal.Unlink("tmp/nodata_byte.fits.aux.xml") - ds2 = gdal.Open('tmp/nodata_byte.fits') + ds2 = gdal.Open("tmp/nodata_byte.fits") nd = ds2.GetRasterBand(1).GetNoDataValue() ds2 = None - driver.Delete('tmp/nodata_byte.fits') + driver.Delete("tmp/nodata_byte.fits") assert nd == 0 + def test_fits_offscale(): - driver = gdal.GetDriverByName('FITS') + driver = gdal.GetDriverByName("FITS") - ds = gdal.Open('../gdrivers/data/fits/offscale_byte.tif') - ds2 = driver.CreateCopy('tmp/offscale_byte.fits', ds) + ds = gdal.Open("../gdrivers/data/fits/offscale_byte.tif") + ds2 = driver.CreateCopy("tmp/offscale_byte.fits", ds) ds2 = None - gdal.Unlink('tmp/offscale_byte.fits.aux.xml') + gdal.Unlink("tmp/offscale_byte.fits.aux.xml") - ds2 = gdal.Open('tmp/offscale_byte.fits') + 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') + driver.Delete("tmp/offscale_byte.fits") assert offset == -0.0039525691699605 assert scale == 1.00395256917 @@ -119,67 +121,89 @@ def test_fits_offscale(): def test_fits_read_offset_scale_no_georef(): - ds = gdal.Open('data/fits/offset_scale_no_georef.fits') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/fits/offset_scale_no_georef.fits") + assert gdal.GetLastErrorMsg() == "" assert ds.GetRasterBand(1).GetOffset() != 0 assert ds.GetRasterBand(1).GetScale() != 1 def test_fits_read_georef_merc(): - ds = gdal.Open('data/fits/byte_merc.fits') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/fits/byte_merc.fits") + assert gdal.GetLastErrorMsg() == "" wkt = ds.GetProjectionRef() - assert wkt == 'PROJCS["Mercator_Earth",GEOGCS["GCS_Earth",DATUM["D_Earth",SPHEROID["Earth",6378206.4,294.978698213898]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + assert ( + wkt + == 'PROJCS["Mercator_Earth",GEOGCS["GCS_Earth",DATUM["D_Earth",SPHEROID["Earth",6378206.4,294.978698213898]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ) gt = ds.GetGeoTransform() - assert gt == pytest.approx((-13095897.481058259, 72.23522015778646, 0.0, 3991653.2130816197, 0.0, -72.23522015778646), abs=1e-3) + assert gt == pytest.approx( + ( + -13095897.481058259, + 72.23522015778646, + 0.0, + 3991653.2130816197, + 0.0, + -72.23522015778646, + ), + abs=1e-3, + ) def test_fits_read_empty_primary_hdu(): - filename = 'data/fits/empty_primary_hdu.fits' + filename = "data/fits/empty_primary_hdu.fits" assert os.path.exists(filename) with gdaltest.error_handler(): assert gdal.Open(filename) is None + def test_fits_read_image_in_second_hdu(): - ds = gdal.Open('data/fits/image_in_second_hdu.fits') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/fits/image_in_second_hdu.fits") + assert gdal.GetLastErrorMsg() == "" assert ds is not None assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 - assert ds.GetMetadata() == {'BAR': 'BAZ ', 'FOO': 'BAR_override', 'FOO2': 'BAR2 '} + assert ds.GetMetadata() == { + "BAR": "BAZ ", + "FOO": "BAR_override", + "FOO2": "BAR2 ", + } def test_fits_read_image_in_first_and_second_hdu(): - ds = gdal.Open('data/fits/image_in_first_and_second_hdu.fits') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/fits/image_in_first_and_second_hdu.fits") + assert gdal.GetLastErrorMsg() == "" assert ds is not None assert ds.RasterCount == 0 - assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE'} + assert ds.GetMetadata() == {"EXTNAME": "FIRST_IMAGE"} sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 assert sub_ds[0][0] == 'FITS:"data/fits/image_in_first_and_second_hdu.fits":1' - assert sub_ds[0][1] == 'HDU 1 (1x2, 1 band), FIRST_IMAGE' + assert sub_ds[0][1] == "HDU 1 (1x2, 1 band), FIRST_IMAGE" assert sub_ds[1][0] == 'FITS:"data/fits/image_in_first_and_second_hdu.fits":2' - assert sub_ds[1][1] == 'HDU 2 (1x3, 1 band)' + assert sub_ds[1][1] == "HDU 2 (1x3, 1 band)" with gdaltest.error_handler(): - assert gdal.Open('FITS:') is None + assert gdal.Open("FITS:") is None assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits"') is None - assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":0') is None - assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":3') is None + assert ( + gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":0') is None + ) + assert ( + gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":3') is None + ) assert gdal.Open('FITS:"data/fits/non_existing.fits":1') is None ds = gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":1') assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 - assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE'} + assert ds.GetMetadata() == {"EXTNAME": "FIRST_IMAGE"} ds = gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":2') assert ds.GetSubDatasets() == [] @@ -190,11 +214,11 @@ def test_fits_read_image_in_first_and_second_hdu(): def test_fits_read_image_in_second_and_fourth_hdu_table_in_third(): - ds = gdal.Open('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/fits/image_in_second_and_fourth_hdu_table_in_third.fits") + assert gdal.GetLastErrorMsg() == "" assert ds is not None assert ds.RasterCount == 0 - assert ds.GetMetadata() == {'FOO': 'BAR '} + assert ds.GetMetadata() == {"FOO": "BAR "} sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 @@ -203,74 +227,80 @@ def test_fits_read_image_in_second_and_fourth_hdu_table_in_third(): assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 - assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE', 'FOO': 'BAR '} + assert ds.GetMetadata() == {"EXTNAME": "FIRST_IMAGE", "FOO": "BAR "} ds = gdal.Open(sub_ds[1][0]) assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 3 - assert ds.GetMetadata() == {'EXTNAME': 'SECOND_IMAGE', 'FOO': 'BAR '} + assert ds.GetMetadata() == {"EXTNAME": "SECOND_IMAGE", "FOO": "BAR "} # Test opening raster files in vector mode def test_fits_open_raster_only_in_vector_mode(): - filename = 'data/fits/empty_primary_hdu.fits' + filename = "data/fits/empty_primary_hdu.fits" assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None - filename = 'data/fits/byte_merc.fits' + filename = "data/fits/byte_merc.fits" assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None - assert 'but contains image' in gdal.GetLastErrorMsg() + assert "but contains image" in gdal.GetLastErrorMsg() - filename = 'data/fits/image_in_first_and_second_hdu.fits' + filename = "data/fits/image_in_first_and_second_hdu.fits" assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None - ds = gdal.OpenEx('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits', gdal.OF_VECTOR) - assert ds.GetMetadata('SUBDATASETS') == {} + ds = gdal.OpenEx( + "data/fits/image_in_second_and_fourth_hdu_table_in_third.fits", gdal.OF_VECTOR + ) + assert ds.GetMetadata("SUBDATASETS") == {} # Test opening vector files in raster mode def test_fits_open_vector_only_in_raster_mode(): - filename = 'data/fits/binary_table.fits' + filename = "data/fits/binary_table.fits" assert os.path.exists(filename) with gdaltest.error_handler(): assert gdal.Open(filename) is None - assert 'but contains binary table' in gdal.GetLastErrorMsg() + assert "but contains binary table" in gdal.GetLastErrorMsg() + # Test opening with gdal.OF_RASTER | gdal.OF_VECTOR def test_fits_open_mix_mode(): # Raster only content - ds = gdal.OpenEx('data/fits/byte_merc.fits', gdal.OF_RASTER | gdal.OF_VECTOR) + ds = gdal.OpenEx("data/fits/byte_merc.fits", gdal.OF_RASTER | gdal.OF_VECTOR) assert ds.RasterCount != 0 assert ds.GetLayerCount() == 0 # Vector only content - ds = gdal.OpenEx('data/fits/binary_table.fits', gdal.OF_RASTER | gdal.OF_VECTOR) + ds = gdal.OpenEx("data/fits/binary_table.fits", gdal.OF_RASTER | gdal.OF_VECTOR) assert ds.RasterCount == 0 assert ds.GetLayerCount() != 0 # Mix of raster and vector - ds = gdal.OpenEx('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits', gdal.OF_RASTER | gdal.OF_VECTOR) - assert ds.GetMetadata('SUBDATASETS') != {} + ds = gdal.OpenEx( + "data/fits/image_in_second_and_fourth_hdu_table_in_third.fits", + gdal.OF_RASTER | gdal.OF_VECTOR, + ) + assert ds.GetMetadata("SUBDATASETS") != {} assert ds.GetLayerCount() != 0 def test_fits_vector(): - ds = ogr.Open('data/fits/binary_table.fits') + ds = ogr.Open("data/fits/binary_table.fits") assert ds.GetLayerCount() == 1 assert ds.GetLayer(-1) is None assert ds.GetLayer(1) is None lyr = ds.GetLayer(0) - assert lyr.GetName() == 'MyTable' + assert lyr.GetName() == "MyTable" assert lyr.GetGeomType() == ogr.wkbNone assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCRandomRead) == 1 @@ -279,97 +309,112 @@ def test_fits_vector(): lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 78 mapType = {} - for x in ["ogr.OFTInteger", "ogr.OFTInteger64", "ogr.OFTReal", - "ogr.OFTString", "ogr.OFTIntegerList", "ogr.OFTInteger64List", - "ogr.OFTRealList", "ogr.OFTStringList"]: + for x in [ + "ogr.OFTInteger", + "ogr.OFTInteger64", + "ogr.OFTReal", + "ogr.OFTString", + "ogr.OFTIntegerList", + "ogr.OFTInteger64List", + "ogr.OFTRealList", + "ogr.OFTStringList", + ]: mapType[eval(x)] = x mapSubType = {} for x in ["ogr.OFSTNone", "ogr.OFSTBoolean", "ogr.OFSTFloat32", "ogr.OFSTInt16"]: mapSubType[eval(x)] = x - got = [(lyr_defn.GetFieldDefn(i).GetNameRef(), + got = [ + ( + lyr_defn.GetFieldDefn(i).GetNameRef(), mapType[lyr_defn.GetFieldDefn(i).GetType()], mapSubType[lyr_defn.GetFieldDefn(i).GetSubType()], - lyr_defn.GetFieldDefn(i).GetWidth()) for i in range(lyr_defn.GetFieldCount())] - expected = [('B_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('B_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('I_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('I_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('J_scaled_integer', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), - ('J_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('K_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('E_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('D_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('C_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('M_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('L', 'ogr.OFTInteger', 'ogr.OFSTBoolean', 0), - ('2L', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), - ('PL', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), - ('QL', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), - ('X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit2', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit3', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit4', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit5', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit6', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit7', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit8', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit9', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit10', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit11', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit12', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit13', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit14', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit15', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit16', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit17', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit18', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit19', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit20', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit21', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit22', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit23', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit24', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit25', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit26', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit27', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit28', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit29', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit30', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit31', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit32', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit33', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('B', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('2B', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('PB', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('BDIM', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('I', 'ogr.OFTInteger', 'ogr.OFSTInt16', 0), - ('2I', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), - ('PI', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), - ('J', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('2J', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('PJ', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('K', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), - ('2K', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), - ('PK', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), - ('A', 'ogr.OFTString', 'ogr.OFSTNone', 1), - ('A2', 'ogr.OFTString', 'ogr.OFSTNone', 2), - ('PA', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('ADIM', 'ogr.OFTStringList', 'ogr.OFSTNone', 2), - ('E', 'ogr.OFTReal', 'ogr.OFSTFloat32', 0), - ('2E', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), - ('PE', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), - ('D', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('2D', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), - ('PD', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), - ('C', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('2C', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), - ('PC', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), - ('M', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('2M', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), - ('PM', 'ogr.OFTStringList', 'ogr.OFSTNone', 0)] + lyr_defn.GetFieldDefn(i).GetWidth(), + ) + for i in range(lyr_defn.GetFieldCount()) + ] + expected = [ + ("B_scaled_integer", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("B_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("I_scaled_integer", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("I_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("J_scaled_integer", "ogr.OFTInteger64", "ogr.OFSTNone", 0), + ("J_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("K_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("E_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("D_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("C_scaled", "ogr.OFTString", "ogr.OFSTNone", 0), + ("M_scaled", "ogr.OFTString", "ogr.OFSTNone", 0), + ("L", "ogr.OFTInteger", "ogr.OFSTBoolean", 0), + ("2L", "ogr.OFTIntegerList", "ogr.OFSTBoolean", 0), + ("PL", "ogr.OFTIntegerList", "ogr.OFSTBoolean", 0), + ("QL", "ogr.OFTIntegerList", "ogr.OFSTBoolean", 0), + ("X_bit1", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit1", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit2", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit3", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit4", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit5", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit6", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit7", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit8", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit9", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit10", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit11", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit12", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit13", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit14", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit15", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit16", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit17", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit18", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit19", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit20", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit21", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit22", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit23", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit24", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit25", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit26", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit27", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit28", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit29", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit30", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit31", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit32", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit33", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("B", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("2B", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("PB", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("BDIM", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("I", "ogr.OFTInteger", "ogr.OFSTInt16", 0), + ("2I", "ogr.OFTIntegerList", "ogr.OFSTInt16", 0), + ("PI", "ogr.OFTIntegerList", "ogr.OFSTInt16", 0), + ("J", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("2J", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("PJ", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("K", "ogr.OFTInteger64", "ogr.OFSTNone", 0), + ("2K", "ogr.OFTInteger64List", "ogr.OFSTNone", 0), + ("PK", "ogr.OFTInteger64List", "ogr.OFSTNone", 0), + ("A", "ogr.OFTString", "ogr.OFSTNone", 1), + ("A2", "ogr.OFTString", "ogr.OFSTNone", 2), + ("PA", "ogr.OFTString", "ogr.OFSTNone", 0), + ("ADIM", "ogr.OFTStringList", "ogr.OFSTNone", 2), + ("E", "ogr.OFTReal", "ogr.OFSTFloat32", 0), + ("2E", "ogr.OFTRealList", "ogr.OFSTFloat32", 0), + ("PE", "ogr.OFTRealList", "ogr.OFSTFloat32", 0), + ("D", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("2D", "ogr.OFTRealList", "ogr.OFSTNone", 0), + ("PD", "ogr.OFTRealList", "ogr.OFSTNone", 0), + ("C", "ogr.OFTString", "ogr.OFSTNone", 0), + ("2C", "ogr.OFTStringList", "ogr.OFSTNone", 0), + ("PC", "ogr.OFTStringList", "ogr.OFSTNone", 0), + ("M", "ogr.OFTString", "ogr.OFSTNone", 0), + ("2M", "ogr.OFTStringList", "ogr.OFSTNone", 0), + ("PM", "ogr.OFTStringList", "ogr.OFSTNone", 0), + ] if got != expected: import pprint + pp = pprint.PrettyPrinter() pp.pprint(got) assert False @@ -384,11 +429,11 @@ def test_fits_vector(): -49149.5, 0, -3221225469.5, - -1.3835058055282164e+19, + -1.3835058055282164e19, 4.375, 4.375, - '4.375 + 5.875j', - '4.375 + 5.875j', + "4.375 + 5.875j", + "4.375 + 5.875j", 0, [0, 0], [1, 0], @@ -440,22 +485,23 @@ def test_fits_vector(): -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], - 'A', - 'AB', - 'AB', - ['AB', 'ab', 'Ab'], + "A", + "AB", + "AB", + ["AB", "ab", "Ab"], 1.25, [1.25, 2.25], [1.25, 2.25], 1.2534, [1.2534, 2.25], [1.2534, 2.25], - '1.25 + 2.25j', - ['1.25 + 2.25j', '2.25 + 1.25j'], - ['1.25 + 2.25j', '2.25 + 1.25j'], - '1.25340000000000007 + 2.25j', - ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], - ['1.25340000000000007 + 2.25j', '2.25 + 1.25j']] + "1.25 + 2.25j", + ["1.25 + 2.25j", "2.25 + 1.25j"], + ["1.25 + 2.25j", "2.25 + 1.25j"], + "1.25340000000000007 + 2.25j", + ["1.25340000000000007 + 2.25j", "2.25 + 1.25j"], + ["1.25340000000000007 + 2.25j", "2.25 + 1.25j"], + ] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] @@ -472,11 +518,11 @@ def test_fits_vector(): 49153.0, 4294967295, 3221225473.0, - 1.3835058055282164e+19, + 1.3835058055282164e19, 5.875, 5.875, - '2.5 + 2.5j', - '2.5 + 2.5j', + "2.5 + 2.5j", + "2.5 + 2.5j", 0, [0, 0], [0, 1, 0], @@ -528,121 +574,137 @@ def test_fits_vector(): 9223372036854775807, [9223372036854775807, -9223372036854775808], [9223372036854775807, 0, -9223372036854775808], - 'B', - 'CD', - 'CDE', - ['CD', 'cd', 'Cd'], + "B", + "CD", + "CDE", + ["CD", "cd", "Cd"], 2.25, [2.25, 1.25], [2.25, 1.25, 2.25], 2.25, [2.2534, 1.25], [2.2534, 1.25, 2.25], - '2.25 + 1.25j', - ['2.25 + 1.25j', '1.25 + 2.25j'], - ['2.25 + 1.25j', '1.25 + 2.25j', '2.25 + 1.25j'], - '2.25 + 1.25j', - ['2.25 + 1.25j', '1.25 + 2.25j'], - ['2.25 + 1.25j', '1.25 + 2.25j', '2.25 + 1.25j']] + "2.25 + 1.25j", + ["2.25 + 1.25j", "1.25 + 2.25j"], + ["2.25 + 1.25j", "1.25 + 2.25j", "2.25 + 1.25j"], + "2.25 + 1.25j", + ["2.25 + 1.25j", "1.25 + 2.25j"], + ["2.25 + 1.25j", "1.25 + 2.25j", "2.25 + 1.25j"], + ] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f2 f = lyr.GetNextFeature() - assert f.GetField('B') is None + assert f.GetField("B") is None def _check_lyr_defn_after_write(lyr_defn): assert lyr_defn.GetFieldCount() == 73 mapType = {} - for x in ["ogr.OFTInteger", "ogr.OFTInteger64", "ogr.OFTReal", - "ogr.OFTString", "ogr.OFTIntegerList", "ogr.OFTInteger64List", - "ogr.OFTRealList", "ogr.OFTStringList"]: + for x in [ + "ogr.OFTInteger", + "ogr.OFTInteger64", + "ogr.OFTReal", + "ogr.OFTString", + "ogr.OFTIntegerList", + "ogr.OFTInteger64List", + "ogr.OFTRealList", + "ogr.OFTStringList", + ]: mapType[eval(x)] = x mapSubType = {} for x in ["ogr.OFSTNone", "ogr.OFSTBoolean", "ogr.OFSTFloat32", "ogr.OFSTInt16"]: mapSubType[eval(x)] = x - got = [(lyr_defn.GetFieldDefn(i).GetNameRef(), + got = [ + ( + lyr_defn.GetFieldDefn(i).GetNameRef(), mapType[lyr_defn.GetFieldDefn(i).GetType()], mapSubType[lyr_defn.GetFieldDefn(i).GetSubType()], - lyr_defn.GetFieldDefn(i).GetWidth()) for i in range(lyr_defn.GetFieldCount())] - expected = [('B_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('B_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('I_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('I_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('J_scaled_integer', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), - ('J_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('K_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('E_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('D_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('C_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('M_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('L', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('2L', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('PL', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('QL', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit2', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit3', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit4', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit5', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit6', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit7', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit8', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit9', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit10', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit11', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit12', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit13', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit14', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit15', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit16', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit17', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit18', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit19', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit20', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit21', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit22', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit23', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit24', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit25', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit26', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit27', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit28', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit29', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit30', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit31', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit32', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('33X_bit33', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('B', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('2B', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('PB', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('BDIM', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('I', 'ogr.OFTInteger', 'ogr.OFSTInt16', 0), - ('2I', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), - ('PI', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), - ('J', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), - ('2J', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('PJ', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), - ('K', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), - ('2K', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), - ('PK', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), - ('A', 'ogr.OFTString', 'ogr.OFSTNone', 1), - ('A2', 'ogr.OFTString', 'ogr.OFSTNone', 2), - ('PA', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('E', 'ogr.OFTReal', 'ogr.OFSTFloat32', 0), - ('2E', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), - ('PE', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), - ('D', 'ogr.OFTReal', 'ogr.OFSTNone', 0), - ('2D', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), - ('PD', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), - ('C', 'ogr.OFTString', 'ogr.OFSTNone', 0), - ('M', 'ogr.OFTString', 'ogr.OFSTNone', 0)] + lyr_defn.GetFieldDefn(i).GetWidth(), + ) + for i in range(lyr_defn.GetFieldCount()) + ] + expected = [ + ("B_scaled_integer", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("B_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("I_scaled_integer", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("I_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("J_scaled_integer", "ogr.OFTInteger64", "ogr.OFSTNone", 0), + ("J_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("K_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("E_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("D_scaled", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("C_scaled", "ogr.OFTString", "ogr.OFSTNone", 0), + ("M_scaled", "ogr.OFTString", "ogr.OFSTNone", 0), + ("L", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("2L", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("PL", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("QL", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("X_bit1", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit1", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit2", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit3", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit4", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit5", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit6", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit7", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit8", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit9", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit10", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit11", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit12", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit13", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit14", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit15", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit16", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit17", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit18", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit19", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit20", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit21", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit22", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit23", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit24", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit25", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit26", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit27", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit28", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit29", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit30", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit31", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit32", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("33X_bit33", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("B", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("2B", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("PB", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("BDIM", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("I", "ogr.OFTInteger", "ogr.OFSTInt16", 0), + ("2I", "ogr.OFTIntegerList", "ogr.OFSTInt16", 0), + ("PI", "ogr.OFTIntegerList", "ogr.OFSTInt16", 0), + ("J", "ogr.OFTInteger", "ogr.OFSTNone", 0), + ("2J", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("PJ", "ogr.OFTIntegerList", "ogr.OFSTNone", 0), + ("K", "ogr.OFTInteger64", "ogr.OFSTNone", 0), + ("2K", "ogr.OFTInteger64List", "ogr.OFSTNone", 0), + ("PK", "ogr.OFTInteger64List", "ogr.OFSTNone", 0), + ("A", "ogr.OFTString", "ogr.OFSTNone", 1), + ("A2", "ogr.OFTString", "ogr.OFSTNone", 2), + ("PA", "ogr.OFTString", "ogr.OFSTNone", 0), + ("E", "ogr.OFTReal", "ogr.OFSTFloat32", 0), + ("2E", "ogr.OFTRealList", "ogr.OFSTFloat32", 0), + ("PE", "ogr.OFTRealList", "ogr.OFSTFloat32", 0), + ("D", "ogr.OFTReal", "ogr.OFSTNone", 0), + ("2D", "ogr.OFTRealList", "ogr.OFSTNone", 0), + ("PD", "ogr.OFTRealList", "ogr.OFSTNone", 0), + ("C", "ogr.OFTString", "ogr.OFSTNone", 0), + ("M", "ogr.OFTString", "ogr.OFSTNone", 0), + ] if got != expected: import pprint + pp = pprint.PrettyPrinter() pp.pprint(got) assert False @@ -650,9 +712,9 @@ def _check_lyr_defn_after_write(lyr_defn): def test_fits_vector_write_with_source_fits_metadata(): - filename = 'tmp/out.fits' + filename = "tmp/out.fits" with gdaltest.error_handler(): - gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS') + gdal.VectorTranslate(filename, "data/fits/binary_table.fits", options="-f FITS") try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) @@ -661,16 +723,16 @@ def test_fits_vector_write_with_source_fits_metadata(): _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() - assert md['TFORM13'].rstrip() == '2J' - assert md['TFORM16'].rstrip() == '1X' - assert md['TFORM17'].rstrip() == '33X' - assert md['TFORM23'].rstrip() == '2I' - assert md['TFORM29'].rstrip() == '2K' - assert md['TFORM32'].rstrip() == '2A' - assert md['TFORM35'].rstrip() == '2E' - assert md['TFORM38'].rstrip() == '2D' - assert md['TFORM40'].rstrip() == 'C' - assert md['TFORM41'].rstrip() == 'M' + assert md["TFORM13"].rstrip() == "2J" + assert md["TFORM16"].rstrip() == "1X" + assert md["TFORM17"].rstrip() == "33X" + assert md["TFORM23"].rstrip() == "2I" + assert md["TFORM29"].rstrip() == "2K" + assert md["TFORM32"].rstrip() == "2A" + assert md["TFORM35"].rstrip() == "2E" + assert md["TFORM38"].rstrip() == "2D" + assert md["TFORM40"].rstrip() == "C" + assert md["TFORM41"].rstrip() == "M" expected_f1 = [ -128, @@ -679,11 +741,11 @@ def test_fits_vector_write_with_source_fits_metadata(): -49149.5, 0, -3221225469.5, - -1.3835058055282164e+19, + -1.3835058055282164e19, 4.375, 4.375, - '4.375 + 5.875j', - '4.375 + 5.875j', + "4.375 + 5.875j", + "4.375 + 5.875j", 0, [0, 0], [1, 0], @@ -735,9 +797,9 @@ def test_fits_vector_write_with_source_fits_metadata(): -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], - 'A', - 'AB', - 'AB', + "A", + "AB", + "AB", # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25], @@ -745,10 +807,10 @@ def test_fits_vector_write_with_source_fits_metadata(): 1.2534, [1.2534, 2.25], [1.2534, 2.25], - '1.25 + 2.25j', + "1.25 + 2.25j", # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], - '1.25340000000000007 + 2.25j', + "1.25340000000000007 + 2.25j", # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] @@ -765,9 +827,11 @@ def test_fits_vector_write_with_source_fits_metadata(): def test_fits_vector_write_without_source_fits_metadata(): - filename = 'tmp/out.fits' + filename = "tmp/out.fits" with gdaltest.error_handler(): - gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd') + gdal.VectorTranslate( + filename, "data/fits/binary_table.fits", options="-f FITS -nomd" + ) try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) @@ -777,16 +841,16 @@ def test_fits_vector_write_without_source_fits_metadata(): _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() - assert md['TFORM13'].rstrip() == 'PJ(2)' - assert md['TFORM16'].rstrip() == '1X' - assert md['TFORM17'].rstrip() == '33X' - assert md['TFORM23'].rstrip() == 'PI(2)' - assert md['TFORM29'].rstrip() == 'PK(2)' - assert md['TFORM32'].rstrip() == '2A' # from field width - assert md['TFORM35'].rstrip() == 'PE(2)' - assert md['TFORM38'].rstrip() == 'PD(2)' - assert md['TFORM40'].rstrip().startswith('PA(') # not recognized as complex - assert md['TFORM41'].rstrip().startswith('PA(') # not recognized as complex + assert md["TFORM13"].rstrip() == "PJ(2)" + assert md["TFORM16"].rstrip() == "1X" + assert md["TFORM17"].rstrip() == "33X" + assert md["TFORM23"].rstrip() == "PI(2)" + assert md["TFORM29"].rstrip() == "PK(2)" + assert md["TFORM32"].rstrip() == "2A" # from field width + assert md["TFORM35"].rstrip() == "PE(2)" + assert md["TFORM38"].rstrip() == "PD(2)" + assert md["TFORM40"].rstrip().startswith("PA(") # not recognized as complex + assert md["TFORM41"].rstrip().startswith("PA(") # not recognized as complex expected_f1 = [ -128, @@ -795,11 +859,11 @@ def test_fits_vector_write_without_source_fits_metadata(): -49149.5, 0, -3221225469.5, - -1.3835058055282164e+19, + -1.3835058055282164e19, 4.375, 4.375, - '4.375 + 5.875j', - '4.375 + 5.875j', + "4.375 + 5.875j", + "4.375 + 5.875j", 0, [0, 0], [1, 0], @@ -851,9 +915,9 @@ def test_fits_vector_write_without_source_fits_metadata(): -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], - 'A', - 'AB', - 'AB', + "A", + "AB", + "AB", # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25], @@ -861,10 +925,10 @@ def test_fits_vector_write_without_source_fits_metadata(): 1.2534, [1.2534, 2.25], [1.2534, 2.25], - '1.25 + 2.25j', + "1.25 + 2.25j", # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], - '1.25340000000000007 + 2.25j', + "1.25340000000000007 + 2.25j", # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] @@ -881,9 +945,13 @@ def test_fits_vector_write_without_source_fits_metadata(): def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): - filename = 'tmp/out.fits' + filename = "tmp/out.fits" with gdaltest.error_handler(): - gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd -lco COMPUTE_REPEAT=AT_FIRST_FEATURE_CREATION -lco REPEAT_2E=3') + gdal.VectorTranslate( + filename, + "data/fits/binary_table.fits", + options="-f FITS -nomd -lco COMPUTE_REPEAT=AT_FIRST_FEATURE_CREATION -lco REPEAT_2E=3", + ) try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) @@ -892,16 +960,18 @@ def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() - assert md['TFORM13'].rstrip() == '2J' - assert md['TFORM16'].rstrip() == '1X' - assert md['TFORM17'].rstrip() == '33X' - assert md['TFORM23'].rstrip() == '2I' - assert md['TFORM29'].rstrip() == '2K' - assert md['TFORM32'].rstrip() == '2A' # from field width - assert md['TFORM35'].rstrip() == '3E' # should normally be 2E, but overridden by REPEAT_2E=3 - assert md['TFORM38'].rstrip() == '2D' - assert md['TFORM40'].rstrip().startswith('PA(') # not recognized as complex - assert md['TFORM41'].rstrip().startswith('PA(') # not recognized as complex + assert md["TFORM13"].rstrip() == "2J" + assert md["TFORM16"].rstrip() == "1X" + assert md["TFORM17"].rstrip() == "33X" + assert md["TFORM23"].rstrip() == "2I" + assert md["TFORM29"].rstrip() == "2K" + assert md["TFORM32"].rstrip() == "2A" # from field width + assert ( + md["TFORM35"].rstrip() == "3E" + ) # should normally be 2E, but overridden by REPEAT_2E=3 + assert md["TFORM38"].rstrip() == "2D" + assert md["TFORM40"].rstrip().startswith("PA(") # not recognized as complex + assert md["TFORM41"].rstrip().startswith("PA(") # not recognized as complex expected_f1 = [ -128, @@ -910,11 +980,11 @@ def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): -49149.5, 0, -3221225469.5, - -1.3835058055282164e+19, + -1.3835058055282164e19, 4.375, 4.375, - '4.375 + 5.875j', - '4.375 + 5.875j', + "4.375 + 5.875j", + "4.375 + 5.875j", 0, [0, 0], [1, 0], @@ -966,9 +1036,9 @@ def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], - 'A', - 'AB', - 'AB', + "A", + "AB", + "AB", # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25, 0], @@ -976,10 +1046,10 @@ def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): 1.2534, [1.2534, 2.25], [1.2534, 2.25], - '1.25 + 2.25j', + "1.25 + 2.25j", # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], - '1.25340000000000007 + 2.25j', + "1.25340000000000007 + 2.25j", # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] @@ -996,33 +1066,37 @@ def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): def test_fits_vector_editing(): - filename = 'tmp/out.fits' + filename = "tmp/out.fits" with gdaltest.error_handler(): - gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd') + gdal.VectorTranslate( + filename, "data/fits/binary_table.fits", options="-f FITS -nomd" + ) try: - ds = ogr.Open(filename, update = 1) + ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 f = lyr.GetNextFeature() - f['A2'] = 'XY' + f["A2"] = "XY" assert lyr.SetFeature(f) == ogr.OGRERR_NONE f = lyr.GetFeature(1) - assert f['A2'] == 'XY' + assert f["A2"] == "XY" f = None - assert lyr.CreateField(ogr.FieldDefn('new_field', ogr.OFTReal)) == ogr.OGRERR_NONE + assert ( + lyr.CreateField(ogr.FieldDefn("new_field", ogr.OFTReal)) == ogr.OGRERR_NONE + ) f = lyr.GetFeature(1) f.SetFID(-1) - f['new_field'] = 1.25 + f["new_field"] = 1.25 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert lyr.GetFeatureCount() == 4 assert f.GetFID() == 4 f = lyr.GetFeature(4) - assert f['A2'] == 'XY' - assert f['new_field'] == 1.25 + assert f["A2"] == "XY" + assert f["new_field"] == 1.25 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(0) diff --git a/autotest/gdrivers/gdalhttp.py b/autotest/gdrivers/gdalhttp.py index d6481d7ad9e2..18722a0db4a8 100755 --- a/autotest/gdrivers/gdalhttp.py +++ b/autotest/gdrivers/gdalhttp.py @@ -33,38 +33,38 @@ import os import subprocess import sys -from osgeo import gdal -from osgeo import ogr import pytest +from osgeo import gdal, ogr + try: import gdaltest except ImportError: # running as a subprocess in the windows build (see __main__ block), # so conftest.py hasn't run, so sys.path doesn't have pymod in it - sys.path.append('../pymod') + sys.path.append("../pymod") import gdaltest -pytestmark = pytest.mark.require_driver('HTTP') +pytestmark = pytest.mark.require_driver("HTTP") @pytest.fixture(autouse=True) def set_http_timeout(): - with gdaltest.config_option('GDAL_HTTP_TIMEOUT', '5'): + with gdaltest.config_option("GDAL_HTTP_TIMEOUT", "5"): yield def skip_if_unreachable(url, try_read=False): conn = gdaltest.gdalurlopen(url, timeout=4) if conn is None: - pytest.skip('cannot open URL') + pytest.skip("cannot open URL") if try_read: try: conn.read() except Exception: - pytest.skip('cannot read') + pytest.skip("cannot read") conn.close() @@ -73,36 +73,39 @@ def skip_if_unreachable(url, try_read=False): def test_http_1(): - url = 'http://gdal.org/gdalicon.png' - tst = gdaltest.GDALTest('PNG', url, 1, 7617, filename_absolute=1) + url = "http://gdal.org/gdalicon.png" + tst = gdaltest.GDALTest("PNG", url, 1, 7617, filename_absolute=1) ret = tst.testOpen() - if ret == 'fail': + if ret == "fail": skip_if_unreachable(url) pytest.fail() + ############################################################################### # Verify /vsicurl (subversion file listing) def test_http_2(): - url = 'https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gcore/data/byte.tif' - tst = gdaltest.GDALTest('GTiff', '/vsicurl/' + url, 1, 4672, filename_absolute=1) + url = "https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gcore/data/byte.tif" + tst = gdaltest.GDALTest("GTiff", "/vsicurl/" + url, 1, 4672, filename_absolute=1) ret = tst.testOpen() - if ret == 'fail': + if ret == "fail": skip_if_unreachable(url) pytest.fail() + ############################################################################### # Verify /vsicurl (apache file listing) def test_http_3(): - url = 'http://download.osgeo.org/gdal/data/ehdr/elggll.bil' - ds = gdal.Open('/vsicurl/' + url) + url = "http://download.osgeo.org/gdal/data/ehdr/elggll.bil" + ds = gdal.Open("/vsicurl/" + url) if ds is None: skip_if_unreachable(url) pytest.fail() + ############################################################################### # Verify /vsicurl (ftp) @@ -112,23 +115,27 @@ def test_http_4(): if gdaltest.skip_on_travis(): pytest.skip() - url = 'ftp://download.osgeo.org/gdal/data/gtiff/utm.tif' - ds = gdal.Open('/vsicurl/' + url) + url = "ftp://download.osgeo.org/gdal/data/gtiff/utm.tif" + ds = gdal.Open("/vsicurl/" + url) if ds is None: skip_if_unreachable(url, try_read=True) - if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: + if ( + sys.platform == "darwin" + and gdal.GetConfigOption("TRAVIS", None) is not None + ): pytest.skip("Fails on MacOSX Travis sometimes. Not sure why.") pytest.fail() filelist = ds.GetFileList() - assert '/vsicurl/ftp://download.osgeo.org/gdal/data/gtiff/utm.tif' in filelist + assert "/vsicurl/ftp://download.osgeo.org/gdal/data/gtiff/utm.tif" in filelist + ############################################################################### # Test HTTP driver with OGR driver def test_http_6(): - url = 'https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/ogr/data/poly.dbf' + url = "https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/ogr/data/poly.dbf" ds = ogr.Open(url) if ds is None: skip_if_unreachable(url, try_read=True) @@ -138,22 +145,29 @@ def test_http_6(): ############################################################################### + def test_http_ssl_verifystatus(): - with gdaltest.config_option('GDAL_HTTP_SSL_VERIFYSTATUS', 'YES'): + with gdaltest.config_option("GDAL_HTTP_SSL_VERIFYSTATUS", "YES"): with gdaltest.error_handler(): # For now this URL doesn't support OCSP stapling... - gdal.OpenEx('https://google.com', allowed_drivers=['HTTP']) + gdal.OpenEx("https://google.com", allowed_drivers=["HTTP"]) last_err = gdal.GetLastErrorMsg() - if 'timed out' in last_err: + if "timed out" in last_err: pytest.skip(last_err) - if 'No OCSP response received' not in last_err and 'libcurl too old' not in last_err: + if ( + "No OCSP response received" not in last_err + and "libcurl too old" not in last_err + ): # The test actually works on Travis Mac - if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: + if ( + sys.platform == "darwin" + and gdal.GetConfigOption("TRAVIS", None) is not None + ): pytest.skip() # The test actually works on build-windows-conda - if 'SKIP_GDAL_HTTP_SSL_VERIFYSTATUS' in os.environ: + if "SKIP_GDAL_HTTP_SSL_VERIFYSTATUS" in os.environ: pytest.skip() pytest.fail(last_err) @@ -163,27 +177,27 @@ def test_http_ssl_verifystatus(): def test_http_use_capi_store(): - if sys.platform != 'win32': + if sys.platform != "win32": with gdaltest.error_handler(): return test_http_use_capi_store_sub() # Prints this to stderr in many cases (but doesn't error) # Warning 6: GDAL_HTTP_USE_CAPI_STORE requested, but libcurl too old, non-Windows platform or OpenSSL missing. subprocess.check_call( - [sys.executable, 'gdalhttp.py', '-use_capi_store'], + [sys.executable, "gdalhttp.py", "-use_capi_store"], ) def test_http_use_capi_store_sub(): - with gdaltest.config_option('GDAL_HTTP_USE_CAPI_STORE', 'YES'): - gdal.OpenEx('https://google.com', allowed_drivers=['HTTP']) + with gdaltest.config_option("GDAL_HTTP_USE_CAPI_STORE", "YES"): + gdal.OpenEx("https://google.com", allowed_drivers=["HTTP"]) ############################################################################### # -if __name__ == '__main__': - if len(sys.argv) == 2 and sys.argv[1] == '-use_capi_store': +if __name__ == "__main__": + if len(sys.argv) == 2 and sys.argv[1] == "-use_capi_store": test_http_use_capi_store_sub() diff --git a/autotest/gdrivers/genbin.py b/autotest/gdrivers/genbin.py index 70ee371eebd5..cb4c85526abf 100755 --- a/autotest/gdrivers/genbin.py +++ b/autotest/gdrivers/genbin.py @@ -29,9 +29,9 @@ ############################################################################### +import gdaltest from osgeo import osr -import gdaltest ############################################################################### # Perform simple read test. @@ -39,18 +39,19 @@ def test_genbin_1(): - with gdaltest.config_option('RAW_CHECK_FILE_SIZE', 'NO'): - tst = gdaltest.GDALTest('GenBin', 'genbin/tm4628_96.bil', 1, 5738, - 0, 0, 500, 1) + with gdaltest.config_option("RAW_CHECK_FILE_SIZE", "NO"): + tst = gdaltest.GDALTest("GenBin", "genbin/tm4628_96.bil", 1, 5738, 0, 0, 500, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32049) - gt = (1181700.9894981384, 82.021003723042099, 0.0, - 596254.01050186157, 0.0, -82.021003723045894) + gt = ( + 1181700.9894981384, + 82.021003723042099, + 0.0, + 596254.01050186157, + 0.0, + -82.021003723045894, + ) return tst.testOpen(check_prj=sr.ExportToWkt(), check_gt=gt) - - - - diff --git a/autotest/gdrivers/generate_bag.py b/autotest/gdrivers/generate_bag.py index 222550d46373..a03e77f697a4 100755 --- a/autotest/gdrivers/generate_bag.py +++ b/autotest/gdrivers/generate_bag.py @@ -33,7 +33,7 @@ import h5py import numpy as np -f = h5py.File('test_georef_metadata.bag','w') +f = h5py.File("test_georef_metadata.bag", "w") bag_root = f.create_group("BAG_root") bag_root.attrs["Bag Version"] = "2.0.0" xml = """ @@ -264,48 +264,79 @@ """ -metadata = bag_root.create_dataset("metadata", (len(xml),), data = [x for x in xml], dtype = 'S1') +metadata = bag_root.create_dataset( + "metadata", (len(xml),), data=[x for x in xml], dtype="S1" +) -elevation = bag_root.create_dataset("elevation", (4, 6), dtype = 'float32', fillvalue = 0) -data = np.array([i for i in range(24) ]).reshape(elevation.shape) +elevation = bag_root.create_dataset("elevation", (4, 6), dtype="float32", fillvalue=0) +data = np.array([i for i in range(24)]).reshape(elevation.shape) elevation[...] = data -uncertainty = bag_root.create_dataset("uncertainty", (4, 6), dtype = 'float32') +uncertainty = bag_root.create_dataset("uncertainty", (4, 6), dtype="float32") -varres_metadata_struct_type = np.dtype([('index', 'I'), ('dimensions_x', 'I'), ('dimensions_y', 'I'), ('resolution_x', 'f4'), ('resolution_y', 'f4'), ('sw_corner_x', 'f4'), ('sw_corner_y', 'f4')]) -varres_metadata = bag_root.create_dataset("varres_metadata", (4, 6), dtype = varres_metadata_struct_type) +varres_metadata_struct_type = np.dtype( + [ + ("index", "I"), + ("dimensions_x", "I"), + ("dimensions_y", "I"), + ("resolution_x", "f4"), + ("resolution_y", "f4"), + ("sw_corner_x", "f4"), + ("sw_corner_y", "f4"), + ] +) +varres_metadata = bag_root.create_dataset( + "varres_metadata", (4, 6), dtype=varres_metadata_struct_type +) varres_metadata.attrs["min_resolution_x"] = 1.0 varres_metadata.attrs["min_resolution_y"] = 1.0 varres_metadata.attrs["max_resolution_x"] = 8.0 varres_metadata.attrs["max_resolution_y"] = 8.0 -data = np.array( [(0, 2, 2, 2, 2, 0, 0) for i in range(24)] , dtype = varres_metadata_struct_type).reshape(elevation.shape) -data[0][1] = np.array((4, 2, 2, 2, 2, 0, 0) , dtype = varres_metadata_struct_type) +data = np.array( + [(0, 2, 2, 2, 2, 0, 0) for i in range(24)], dtype=varres_metadata_struct_type +).reshape(elevation.shape) +data[0][1] = np.array((4, 2, 2, 2, 2, 0, 0), dtype=varres_metadata_struct_type) varres_metadata[...] = data -varres_refinements_struct_type = np.dtype([('depth', 'f4'), ('depth_uncrt', 'f4')]) -varres_refinements = bag_root.create_dataset("varres_refinements", (1, 8), dtype = varres_refinements_struct_type) +varres_refinements_struct_type = np.dtype([("depth", "f4"), ("depth_uncrt", "f4")]) +varres_refinements = bag_root.create_dataset( + "varres_refinements", (1, 8), dtype=varres_refinements_struct_type +) varres_refinements[...] = np.array([[0, 2, 3, 4, 5, 6, 7, 0]]) Georef_metadata = bag_root.create_group("Georef_metadata") layer = Georef_metadata.create_group("layer_with_keys_values") -keys = layer.create_dataset("keys", (4, 6), dtype = 'uint32', chunks=(2,3)) +keys = layer.create_dataset("keys", (4, 6), dtype="uint32", chunks=(2, 3)) keys[...] = np.array([np.arange(6) for i in range(4)]).reshape(elevation.shape) -varres_keys = layer.create_dataset("varres_keys", (1, 8), dtype = 'uint32') -varres_keys[...] = np.array([1, 1, 1, 0, 0, 1, 1, 1]) +varres_keys = layer.create_dataset("varres_keys", (1, 8), dtype="uint32") +varres_keys[...] = np.array([1, 1, 1, 0, 0, 1, 1, 1]) -comp_type = np.dtype([('int', 'i'), ('str', np.str_, 6), ('float64', 'f8')]) -values = layer.create_dataset("values", (6,), dtype = comp_type) -data = np.array([(i, "Val ", i + 1.25) for i in range(6) ], dtype = comp_type) +comp_type = np.dtype([("int", "i"), ("str", np.str_, 6), ("float64", "f8")]) +values = layer.create_dataset("values", (6,), dtype=comp_type) +data = np.array([(i, "Val ", i + 1.25) for i in range(6)], dtype=comp_type) values[...] = data layer = Georef_metadata.create_group("layer_with_values_only") -values = layer.create_dataset("values", (2,), dtype = comp_type) -data = np.array([(i, "Val ", i + 1.25) for i in range(2) ], dtype = comp_type) +values = layer.create_dataset("values", (2,), dtype=comp_type) +data = np.array([(i, "Val ", i + 1.25) for i in range(2)], dtype=comp_type) values[...] = data -tracking_list_struct_type = np.dtype([('row', 'I'), ('col', 'I'), ('depth', 'f4'), ('uncertainty', 'f4'), ('track_code', 'B'), ('list_series', 'h')]) -tracking_list = bag_root.create_dataset("tracking_list", (2,), dtype = tracking_list_struct_type) -tracking_list[...] = np.array([(0,1,2.5,3.5,4,5),(6,7,8.5,9.5,10,11)], dtype = tracking_list_struct_type) +tracking_list_struct_type = np.dtype( + [ + ("row", "I"), + ("col", "I"), + ("depth", "f4"), + ("uncertainty", "f4"), + ("track_code", "B"), + ("list_series", "h"), + ] +) +tracking_list = bag_root.create_dataset( + "tracking_list", (2,), dtype=tracking_list_struct_type +) +tracking_list[...] = np.array( + [(0, 1, 2.5, 3.5, 4, 5), (6, 7, 8.5, 9.5, 10, 11)], dtype=tracking_list_struct_type +) diff --git a/autotest/gdrivers/generate_fits.py b/autotest/gdrivers/generate_fits.py index 28ba68a09ad3..b2e9a2305926 100644 --- a/autotest/gdrivers/generate_fits.py +++ b/autotest/gdrivers/generate_fits.py @@ -29,150 +29,295 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import fitsio import os + +import fitsio import numpy as np -data_dir = os.path.join(os.path.dirname(__file__), 'data', 'fits') +data_dir = os.path.join(os.path.dirname(__file__), "data", "fits") -fitsio.write(os.path.join(data_dir, 'empty_primary_hdu.fits'), data=None, clobber=True) +fitsio.write(os.path.join(data_dir, "empty_primary_hdu.fits"), data=None, clobber=True) -filename = os.path.join(data_dir, 'image_in_second_hdu.fits') -with fitsio.FITS(filename,'rw',clobber=True) as fits: - fits.write(data=None, header={'FOO': 'BAR', 'FOO2': 'BAR2'}, clobber=True) +filename = os.path.join(data_dir, "image_in_second_hdu.fits") +with fitsio.FITS(filename, "rw", clobber=True) as fits: + fits.write(data=None, header={"FOO": "BAR", "FOO2": "BAR2"}, clobber=True) fits[-1].write_checksum() - img = np.arange(2,dtype='B').reshape(2,1) - fits.write(data=img, header={'FOO':'BAR_override', 'BAR':'BAZ'}) + img = np.arange(2, dtype="B").reshape(2, 1) + fits.write(data=img, header={"FOO": "BAR_override", "BAR": "BAZ"}) fits[-1].write_checksum() -filename = os.path.join(data_dir, 'image_in_first_and_second_hdu.fits') -with fitsio.FITS(filename,'rw',clobber=True) as fits: - img = np.arange(2,dtype='B').reshape(2,1) - fits.write(data=img, extname='FIRST_IMAGE') - img = np.arange(3,dtype='B').reshape(3,1) +filename = os.path.join(data_dir, "image_in_first_and_second_hdu.fits") +with fitsio.FITS(filename, "rw", clobber=True) as fits: + img = np.arange(2, dtype="B").reshape(2, 1) + fits.write(data=img, extname="FIRST_IMAGE") + img = np.arange(3, dtype="B").reshape(3, 1) fits.write(data=img) -filename = os.path.join(data_dir, 'image_in_second_and_fourth_hdu_table_in_third.fits') -with fitsio.FITS(filename,'rw',clobber=True) as fits: - fits.write(data=None, header={'FOO': 'BAR'}) +filename = os.path.join(data_dir, "image_in_second_and_fourth_hdu_table_in_third.fits") +with fitsio.FITS(filename, "rw", clobber=True) as fits: + fits.write(data=None, header={"FOO": "BAR"}) fits[-1].write_checksum() - img = np.arange(2,dtype='B').reshape(2,1) - fits.write(data=img, extname='FIRST_IMAGE') + img = np.arange(2, dtype="B").reshape(2, 1) + fits.write(data=img, extname="FIRST_IMAGE") fits[-1].write_checksum() - nrows=2 - data = np.zeros(nrows, dtype=[('int','i4'),('double','f8')]) - data['int'] = np.arange(nrows,dtype='i4') - data['double'] = np.arange(nrows,dtype='f8') + nrows = 2 + data = np.zeros(nrows, dtype=[("int", "i4"), ("double", "f8")]) + data["int"] = np.arange(nrows, dtype="i4") + data["double"] = np.arange(nrows, dtype="f8") fits.write_table(data) - img = np.arange(3,dtype='B').reshape(3,1) - fits.write(data=img, extname='SECOND_IMAGE') + img = np.arange(3, dtype="B").reshape(3, 1) + fits.write(data=img, extname="SECOND_IMAGE") fits[-1].write_checksum() from astropy.io import fits -filename = os.path.join(data_dir, 'binary_table.fits') +filename = os.path.join(data_dir, "binary_table.fits") if os.path.exists(filename): os.unlink(filename) hdr = fits.Header() -hdr['EXTNAME'] = 'MyTable' -hdu = fits.BinTableHDU.from_columns([ - fits.Column(name='B_scaled_integer', format='B',array=[0, 255, 3]), - fits.Column(name='B_scaled', format='B',array=[0, 255]), - fits.Column(name='I_scaled_integer', format='I',array=[-32768, 32767]), - fits.Column(name='I_scaled', format='I',array=[-32768, 32767]), - fits.Column(name='J_scaled_integer', format='J',array=[-2147483648, 2147483647]), - fits.Column(name='J_scaled', format='J',array=[-2147483648, 2147483647]), - fits.Column(name='K_scaled', format='K',array=[-9223372036854775808, 9223372036854775807]), - fits.Column(name='E_scaled', format='E',array=[1.25, 2.25]), - fits.Column(name='D_scaled', format='D',array=[1.25, 2.25]), - fits.Column(name='C_scaled', format='C',array=[1.25 + 2.25j]), - fits.Column(name='M_scaled', format='M',array=[1.25 + 2.25j]), - - fits.Column(name='L', format='L',array=[True, False]), - fits.Column(name='2L', format='2L',array=[[True, False], [False, True]]), - fits.Column(name='PL', format='PL()',array=[[True, False], [False, True, False], []]), - fits.Column(name='QL', format='QL()',array=[[True, False], [False, True, False], []]), - - fits.Column(name='X', format='X',array=np.array([[1], [0]], dtype=np.uint8)), - fits.Column(name='33X', format='33X',array=np.array([[1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1], - [1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1]], dtype=np.uint8)), - # PX doesn't seem to work - - fits.Column(name='B', format='B',array=[0, 255, 3],null=3), - fits.Column(name='2B', format='2B',array=[[255,0], [0,255]]), - fits.Column(name='PB', format='PB()',array=[[255,0], [0,255,0], []]), - fits.Column(name='BDIM', format='6B',dim='(3,2)',array=[[[0,255,0], [255,0,255]], [[255,255,0], [0,0,255]]]), - - fits.Column(name='I', format='I',array=[-32768, 32767]), - fits.Column(name='2I', format='2I',array=[[-32768, 32767], [32767, -32768]]), - fits.Column(name='PI', format='PI()',array=[[-32768, 32767], [32767, 0, -32768], []]), - - fits.Column(name='J', format='J',array=[-2147483648, 2147483647]), - fits.Column(name='2J', format='2J',array=[[-2147483648, 2147483647], [2147483647, -2147483648]]), - fits.Column(name='PJ', format='PJ()',array=[[-2147483648, 2147483647], [2147483647, 0, -2147483648], []]), - - fits.Column(name='K', format='K',array=[-9223372036854775808, 9223372036854775807]), - fits.Column(name='2K', format='2K',array=[[-9223372036854775808, 9223372036854775807], [9223372036854775807, -9223372036854775808]]), - fits.Column(name='PK', format='PK()',array=[[-9223372036854775808, 9223372036854775807], [9223372036854775807, 0, -9223372036854775808], []]), - - fits.Column(name='A', format='A',array=["A", "B"]), - fits.Column(name='A2', format='A2',array=["AB", "CD"]), - fits.Column(name='PA', format='PA()',array=["AB", "CDE"]), - fits.Column(name='ADIM', format='6A',dim='(2, 3)',array=[["AB", "ab", "Ab"], ["CD", "cd", "Cd"]]), - - fits.Column(name='E', format='E',array=[1.25, 2.25]), - fits.Column(name='2E', format='2E',array=[[1.25, 2.25], [2.25, 1.25]]), - fits.Column(name='PE', format='PE()',array=[[1.25, 2.25], [2.25, 1.25, 2.25],[]]), - - fits.Column(name='D', format='D',array=[1.2534, 2.25]), - fits.Column(name='2D', format='2D',array=[[1.2534, 2.25], [2.2534, 1.25]]), - fits.Column(name='PD', format='PD()',array=[[1.2534, 2.25], [2.2534, 1.25, 2.25],[]]), - - fits.Column(name='C', format='C',array=[1.25 + 2.25j, 2.25 + 1.25j]), - fits.Column(name='2C', format='2C',array=[[1.25 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j]]), - fits.Column(name='PC', format='PC',array=[[1.25 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j],[]]), - - fits.Column(name='M', format='M',array=[1.2534 + 2.25j, 2.25 + 1.25j]), - fits.Column(name='2M', format='2M',array=[[1.2534 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j]]), - fits.Column(name='PM', format='PM',array=[[1.2534 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j],[]]), -], header=hdr) +hdr["EXTNAME"] = "MyTable" +hdu = fits.BinTableHDU.from_columns( + [ + fits.Column(name="B_scaled_integer", format="B", array=[0, 255, 3]), + fits.Column(name="B_scaled", format="B", array=[0, 255]), + fits.Column(name="I_scaled_integer", format="I", array=[-32768, 32767]), + fits.Column(name="I_scaled", format="I", array=[-32768, 32767]), + fits.Column( + name="J_scaled_integer", format="J", array=[-2147483648, 2147483647] + ), + fits.Column(name="J_scaled", format="J", array=[-2147483648, 2147483647]), + fits.Column( + name="K_scaled", + format="K", + array=[-9223372036854775808, 9223372036854775807], + ), + fits.Column(name="E_scaled", format="E", array=[1.25, 2.25]), + fits.Column(name="D_scaled", format="D", array=[1.25, 2.25]), + fits.Column(name="C_scaled", format="C", array=[1.25 + 2.25j]), + fits.Column(name="M_scaled", format="M", array=[1.25 + 2.25j]), + fits.Column(name="L", format="L", array=[True, False]), + fits.Column(name="2L", format="2L", array=[[True, False], [False, True]]), + fits.Column( + name="PL", format="PL()", array=[[True, False], [False, True, False], []] + ), + fits.Column( + name="QL", format="QL()", array=[[True, False], [False, True, False], []] + ), + fits.Column(name="X", format="X", array=np.array([[1], [0]], dtype=np.uint8)), + fits.Column( + name="33X", + format="33X", + array=np.array( + [ + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + ], + ], + dtype=np.uint8, + ), + ), + # PX doesn't seem to work + fits.Column(name="B", format="B", array=[0, 255, 3], null=3), + fits.Column(name="2B", format="2B", array=[[255, 0], [0, 255]]), + fits.Column(name="PB", format="PB()", array=[[255, 0], [0, 255, 0], []]), + fits.Column( + name="BDIM", + format="6B", + dim="(3,2)", + array=[[[0, 255, 0], [255, 0, 255]], [[255, 255, 0], [0, 0, 255]]], + ), + fits.Column(name="I", format="I", array=[-32768, 32767]), + fits.Column(name="2I", format="2I", array=[[-32768, 32767], [32767, -32768]]), + fits.Column( + name="PI", format="PI()", array=[[-32768, 32767], [32767, 0, -32768], []] + ), + fits.Column(name="J", format="J", array=[-2147483648, 2147483647]), + fits.Column( + name="2J", + format="2J", + array=[[-2147483648, 2147483647], [2147483647, -2147483648]], + ), + fits.Column( + name="PJ", + format="PJ()", + array=[[-2147483648, 2147483647], [2147483647, 0, -2147483648], []], + ), + fits.Column( + name="K", format="K", array=[-9223372036854775808, 9223372036854775807] + ), + fits.Column( + name="2K", + format="2K", + array=[ + [-9223372036854775808, 9223372036854775807], + [9223372036854775807, -9223372036854775808], + ], + ), + fits.Column( + name="PK", + format="PK()", + array=[ + [-9223372036854775808, 9223372036854775807], + [9223372036854775807, 0, -9223372036854775808], + [], + ], + ), + fits.Column(name="A", format="A", array=["A", "B"]), + fits.Column(name="A2", format="A2", array=["AB", "CD"]), + fits.Column(name="PA", format="PA()", array=["AB", "CDE"]), + fits.Column( + name="ADIM", + format="6A", + dim="(2, 3)", + array=[["AB", "ab", "Ab"], ["CD", "cd", "Cd"]], + ), + fits.Column(name="E", format="E", array=[1.25, 2.25]), + fits.Column(name="2E", format="2E", array=[[1.25, 2.25], [2.25, 1.25]]), + fits.Column( + name="PE", format="PE()", array=[[1.25, 2.25], [2.25, 1.25, 2.25], []] + ), + fits.Column(name="D", format="D", array=[1.2534, 2.25]), + fits.Column(name="2D", format="2D", array=[[1.2534, 2.25], [2.2534, 1.25]]), + fits.Column( + name="PD", format="PD()", array=[[1.2534, 2.25], [2.2534, 1.25, 2.25], []] + ), + fits.Column(name="C", format="C", array=[1.25 + 2.25j, 2.25 + 1.25j]), + fits.Column( + name="2C", + format="2C", + array=[[1.25 + 2.25j, 2.25 + 1.25j], [2.25 + 1.25j, 1.25 + 2.25j]], + ), + fits.Column( + name="PC", + format="PC", + array=[ + [1.25 + 2.25j, 2.25 + 1.25j], + [2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j], + [], + ], + ), + fits.Column(name="M", format="M", array=[1.2534 + 2.25j, 2.25 + 1.25j]), + fits.Column( + name="2M", + format="2M", + array=[[1.2534 + 2.25j, 2.25 + 1.25j], [2.25 + 1.25j, 1.25 + 2.25j]], + ), + fits.Column( + name="PM", + format="PM", + array=[ + [1.2534 + 2.25j, 2.25 + 1.25j], + [2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j], + [], + ], + ), + ], + header=hdr, +) hdu.writeto(filename) # Add back zero & scal info with fitsio, since there are some issues with # astropy for integer data types -with fitsio.FITS(filename,'rw') as f: +with fitsio.FITS(filename, "rw") as f: hdu = f[-1] - hdu.write_key('TZERO1', -128) + hdu.write_key("TZERO1", -128) - hdu.write_key('TSCAL2', 1.5) - hdu.write_key('TZERO2', 2.5) + hdu.write_key("TSCAL2", 1.5) + hdu.write_key("TZERO2", 2.5) - hdu.write_key('TZERO3', 32768) + hdu.write_key("TZERO3", 32768) - hdu.write_key('TSCAL4', 1.5) - hdu.write_key('TZERO4', 2.5) + hdu.write_key("TSCAL4", 1.5) + hdu.write_key("TZERO4", 2.5) - hdu.write_key('TZERO5', 2147483648) + hdu.write_key("TZERO5", 2147483648) - hdu.write_key('TSCAL6', 1.5) - hdu.write_key('TZERO6', 2.5) + hdu.write_key("TSCAL6", 1.5) + hdu.write_key("TZERO6", 2.5) - hdu.write_key('TSCAL7', 1.5) - hdu.write_key('TZERO7', 2.5) + hdu.write_key("TSCAL7", 1.5) + hdu.write_key("TZERO7", 2.5) - hdu.write_key('TSCAL8', 1.5) - hdu.write_key('TZERO8', 2.5) + hdu.write_key("TSCAL8", 1.5) + hdu.write_key("TZERO8", 2.5) - hdu.write_key('TSCAL9', 1.5) - hdu.write_key('TZERO9', 2.5) + hdu.write_key("TSCAL9", 1.5) + hdu.write_key("TZERO9", 2.5) - hdu.write_key('TSCAL10', 1.5) - hdu.write_key('TZERO10', 2.5) + hdu.write_key("TSCAL10", 1.5) + hdu.write_key("TZERO10", 2.5) - hdu.write_key('TSCAL11', 1.5) - hdu.write_key('TZERO11', 2.5) + hdu.write_key("TSCAL11", 1.5) + hdu.write_key("TZERO11", 2.5) diff --git a/autotest/gdrivers/georaster.py b/autotest/gdrivers/georaster.py index 76e26fe7be7b..4ee369c5d61a 100755 --- a/autotest/gdrivers/georaster.py +++ b/autotest/gdrivers/georaster.py @@ -29,17 +29,17 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import ogr - import gdaltest import pytest +from osgeo import gdal, ogr pytestmark = [ - pytest.mark.skipif('OCI_DSNAME' not in os.environ, reason='no OCI_DSNAME in environment'), - pytest.mark.require_driver('GeoRaster'), + pytest.mark.skipif( + "OCI_DSNAME" not in os.environ, reason="no OCI_DSNAME in environment" + ), + pytest.mark.require_driver("GeoRaster"), ] @@ -49,12 +49,13 @@ def get_connection_str(): - oci_dsname = os.environ.get('OCI_DSNAME') + oci_dsname = os.environ.get("OCI_DSNAME") if oci_dsname is None: # TODO: Spelling - informe? - return '' - return 'geor:' + oci_dsname.split(':')[1] + return "" + return "geor:" + oci_dsname.split(":")[1] + ############################################################################### # @@ -64,15 +65,15 @@ def test_georaster_init(): gdaltest.oci_ds = None - gdaltest.georasterDriver = gdal.GetDriverByName('GeoRaster') + gdaltest.georasterDriver = gdal.GetDriverByName("GeoRaster") - gdaltest.oci_ds = ogr.Open(os.environ['OCI_DSNAME']) + gdaltest.oci_ds = ogr.Open(os.environ["OCI_DSNAME"]) if gdaltest.oci_ds is None: pytest.skip() - gdal.PushErrorHandler('CPLQuietErrorHandler') - rs = gdaltest.oci_ds.ExecuteSQL('select owner from all_sdo_geor_sysdata') + gdal.PushErrorHandler("CPLQuietErrorHandler") + rs = gdaltest.oci_ds.ExecuteSQL("select owner from all_sdo_geor_sysdata") gdal.PopErrorHandler() err_msg = gdal.GetLastErrorMsg() @@ -81,12 +82,13 @@ def test_georaster_init(): gdaltest.oci_ds.ReleaseResultSet(rs) rs = None - if err_msg != '': + if err_msg != "": gdaltest.oci_ds = None - pytest.skip('ALL_SDO_GEOR_SYSDATA inaccessible, ' - 'likely georaster unavailable.') + pytest.skip( + "ALL_SDO_GEOR_SYSDATA inaccessible, " "likely georaster unavailable." + ) + - ############################################################################### # @@ -95,21 +97,27 @@ def test_georaster_byte(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/byte.tif') + ds_src = gdal.Open("data/byte.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1001, sdo_geor.init('GDAL_TEST_RDT',1001))"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1001, sdo_geor.init('GDAL_TEST_RDT',1001))", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -120,21 +128,27 @@ def test_georaster_int16(): get_connection_str() - ds_src = gdal.Open('data/int16.tif') + ds_src = gdal.Open("data/int16.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1002, sdo_geor.init('GDAL_TEST_RDT',1002))"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1002, sdo_geor.init('GDAL_TEST_RDT',1002))", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -145,21 +159,27 @@ def test_georaster_int32(): get_connection_str() - ds_src = gdal.Open('data/int32.tif') + ds_src = gdal.Open("data/int32.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1003, sdo_geor.init('GDAL_TEST_RDT',1003))"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1003, sdo_geor.init('GDAL_TEST_RDT',1003))", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -168,22 +188,28 @@ def test_georaster_rgb_b1(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') + ds_src = gdal.Open("data/rgbsmall.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1004, sdo_geor.init('GDAL_TEST_RDT',1004))", - "BLOCKBSIZE=1"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1004, sdo_geor.init('GDAL_TEST_RDT',1004))", + "BLOCKBSIZE=1", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -192,22 +218,28 @@ def test_georaster_rgb_b2(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') + ds_src = gdal.Open("data/rgbsmall.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1005, sdo_geor.init('GDAL_TEST_RDT',1005))", - "BLOCKBSIZE=2"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1005, sdo_geor.init('GDAL_TEST_RDT',1005))", + "BLOCKBSIZE=2", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -216,22 +248,29 @@ def test_georaster_rgb_b3_bsq(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') + ds_src = gdal.Open("data/rgbsmall.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1006, sdo_geor.init('GDAL_TEST_RDT',1006))", - "BLOCKBSIZE=3", "INTERLEAVE=BSQ"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1006, sdo_geor.init('GDAL_TEST_RDT',1006))", + "BLOCKBSIZE=3", + "INTERLEAVE=BSQ", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -240,22 +279,29 @@ def test_georaster_rgb_b3_bip(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') + ds_src = gdal.Open("data/rgbsmall.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1007, sdo_geor.init('GDAL_TEST_RDT',1007))", - "BLOCKBSIZE=3", "INTERLEAVE=BIP"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1007, sdo_geor.init('GDAL_TEST_RDT',1007))", + "BLOCKBSIZE=3", + "INTERLEAVE=BIP", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -264,22 +310,29 @@ def test_georaster_rgb_b3_bil(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') + ds_src = gdal.Open("data/rgbsmall.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1008, sdo_geor.init('GDAL_TEST_RDT',1008))", - "BLOCKBSIZE=3", "INTERLEAVE=BIL"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1008, sdo_geor.init('GDAL_TEST_RDT',1008))", + "BLOCKBSIZE=3", + "INTERLEAVE=BIL", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -288,22 +341,28 @@ def test_georaster_byte_deflate(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/byte.tif') + ds_src = gdal.Open("data/byte.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1009, sdo_geor.init('GDAL_TEST_RDT',1009))", - "COMPRESS=DEFLATE"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1009, sdo_geor.init('GDAL_TEST_RDT',1009))", + "COMPRESS=DEFLATE", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -312,22 +371,30 @@ def test_georaster_rgb_deflate_b3(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/rgbsmall.tif') - - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1010, sdo_geor.init('GDAL_TEST_RDT',1010))", - "COMPRESS=DEFLATE", "BLOCKBSIZE=3", "INTERLEAVE=PIXEL"]) + ds_src = gdal.Open("data/rgbsmall.tif") + + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1010, sdo_geor.init('GDAL_TEST_RDT',1010))", + "COMPRESS=DEFLATE", + "BLOCKBSIZE=3", + "INTERLEAVE=PIXEL", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -336,22 +403,28 @@ def test_georaster_1bit(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/byte.tif') + ds_src = gdal.Open("data/byte.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1011, sdo_geor.init('GDAL_TEST_RDT',1011))", - "NBITS=1"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1011, sdo_geor.init('GDAL_TEST_RDT',1011))", + "NBITS=1", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 252, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 252, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -360,22 +433,28 @@ def test_georaster_2bit(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/byte.tif') + ds_src = gdal.Open("data/byte.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1012, sdo_geor.init('GDAL_TEST_RDT',1012))", - "NBITS=2"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1012, sdo_geor.init('GDAL_TEST_RDT',1012))", + "NBITS=2", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 718, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 718, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -384,22 +463,28 @@ def test_georaster_4bit(): if gdaltest.oci_ds is None: pytest.skip() - ds_src = gdal.Open('data/byte.tif') + ds_src = gdal.Open("data/byte.tif") - ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + - ',GDAL_TEST,RASTER', ds_src, 1, - ["DESCRIPTION=(id number, raster sdo_georaster)", - "INSERT=(1013, sdo_geor.init('GDAL_TEST_RDT',1013))", - "NBITS=4"]) + ds = gdaltest.georasterDriver.CreateCopy( + get_connection_str() + ",GDAL_TEST,RASTER", + ds_src, + 1, + [ + "DESCRIPTION=(id number, raster sdo_georaster)", + "INSERT=(1013, sdo_geor.init('GDAL_TEST_RDT',1013))", + "NBITS=4", + ], + ) ds_name = ds.GetDescription() ds = None - tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 2578, filename_absolute=1) + tst = gdaltest.GDALTest("GeoRaster", ds_name, 1, 2578, filename_absolute=1) return tst.testOpen() + ############################################################################### # @@ -408,11 +493,12 @@ def test_georaster_cleanup(): if gdaltest.oci_ds is None: pytest.skip() - gdaltest.oci_ds.ExecuteSQL('drop table GDAL_TEST') - gdaltest.oci_ds.ExecuteSQL('drop table GDAL_TEST_RDT') + gdaltest.oci_ds.ExecuteSQL("drop table GDAL_TEST") + gdaltest.oci_ds.ExecuteSQL("drop table GDAL_TEST_RDT") gdaltest.oci_ds.Destroy() gdaltest.oci_ds = None + ############################################################################### # diff --git a/autotest/gdrivers/gff.py b/autotest/gdrivers/gff.py index 926bab10453c..9c745bd51dec 100755 --- a/autotest/gdrivers/gff.py +++ b/autotest/gdrivers/gff.py @@ -28,26 +28,32 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test an extract from a real dataset def test_gff_1(): # 12088 = 2048 + 8 * 1255 - if not gdaltest.download_file('http://sandia.gov/RADAR/complex_data/MiniSAR20050519p0001image008.gff', 'MiniSAR20050519p0001image008.gff', 12088): + if not gdaltest.download_file( + "http://sandia.gov/RADAR/complex_data/MiniSAR20050519p0001image008.gff", + "MiniSAR20050519p0001image008.gff", + 12088, + ): pytest.skip() - tst = gdaltest.GDALTest('GFF', 'tmp/cache/MiniSAR20050519p0001image008.gff', 1, 29757, filename_absolute=1) - gdal.PushErrorHandler('CPLQuietErrorHandler') + tst = gdaltest.GDALTest( + "GFF", + "tmp/cache/MiniSAR20050519p0001image008.gff", + 1, + 29757, + filename_absolute=1, + ) + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = tst.testOpen() gdal.PopErrorHandler() return ret - - - diff --git a/autotest/gdrivers/gif.py b/autotest/gdrivers/gif.py index e53998c95022..7effcd9157f2 100755 --- a/autotest/gdrivers/gif.py +++ b/autotest/gdrivers/gif.py @@ -29,71 +29,78 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Get the GIF driver, and verify a few things about it. def test_gif_1(): - gdaltest.gif_drv = gdal.GetDriverByName('GIF') + gdaltest.gif_drv = gdal.GetDriverByName("GIF") if gdaltest.gif_drv is None: - gdaltest.post_reason('GIF driver not found!') - return 'false' + gdaltest.post_reason("GIF driver not found!") + return "false" # Move the BIGGIF driver after the GIF driver. - drv = gdal.GetDriverByName('BIGGIF') + drv = gdal.GetDriverByName("BIGGIF") drv.Deregister() drv.Register() drv_md = gdaltest.gif_drv.GetMetadata() - if drv_md['DMD_MIMETYPE'] != 'image/gif': - gdaltest.post_reason('mime type is wrong') - return 'false' + if drv_md["DMD_MIMETYPE"] != "image/gif": + gdaltest.post_reason("mime type is wrong") + return "false" + - ############################################################################### # Read test of simple byte reference data. def test_gif_2(): - tst = gdaltest.GDALTest('GIF', 'gif/bug407.gif', 1, 57921) + tst = gdaltest.GDALTest("GIF", "gif/bug407.gif", 1, 57921) return tst.testOpen() + ############################################################################### # Test lossless copying. def test_gif_3(): - tst = gdaltest.GDALTest('GIF', 'gif/bug407.gif', 1, 57921, - options=['INTERLACING=NO']) + tst = gdaltest.GDALTest( + "GIF", "gif/bug407.gif", 1, 57921, options=["INTERLACING=NO"] + ) return tst.testCreateCopy() + ############################################################################### # Verify the colormap, and nodata setting for test file. def test_gif_4(): - ds = gdal.Open('data/gif/bug407.gif') + ds = gdal.Open("data/gif/bug407.gif") cm = ds.GetRasterBand(1).GetRasterColorTable() - assert cm.GetCount() == 16 and cm.GetColorEntry(0) == (255, 255, 255, 255) and cm.GetColorEntry(1) == (255, 255, 208, 255), \ - 'Wrong colormap entries' + assert ( + cm.GetCount() == 16 + and cm.GetColorEntry(0) == (255, 255, 255, 255) + and cm.GetColorEntry(1) == (255, 255, 208, 255) + ), "Wrong colormap entries" cm = None - assert ds.GetRasterBand(1).GetNoDataValue() is None, 'Wrong nodata value.' + assert ds.GetRasterBand(1).GetNoDataValue() is None, "Wrong nodata value." md = ds.GetRasterBand(1).GetMetadata() - assert 'GIF_BACKGROUND' in md and md['GIF_BACKGROUND'] == '0', \ - 'background metadata missing.' + assert ( + "GIF_BACKGROUND" in md and md["GIF_BACKGROUND"] == "0" + ), "background metadata missing." + ############################################################################### # Test creating an in memory copy. @@ -101,69 +108,72 @@ def test_gif_4(): def test_gif_5(): - tst = gdaltest.GDALTest('GIF', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("GIF", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Verify nodata support def test_gif_6(): - src_ds = gdal.Open('../gcore/data/nodata_byte.tif') + src_ds = gdal.Open("../gcore/data/nodata_byte.tif") - new_ds = gdaltest.gif_drv.CreateCopy('tmp/nodata_byte.gif', src_ds) + new_ds = gdaltest.gif_drv.CreateCopy("tmp/nodata_byte.gif", src_ds) if new_ds is None: - gdaltest.post_reason('Create copy operation failure') - return 'false' + gdaltest.post_reason("Create copy operation failure") + return "false" bnd = new_ds.GetRasterBand(1) if bnd.Checksum() != 4440: - gdaltest.post_reason('Wrong checksum') - return 'false' + gdaltest.post_reason("Wrong checksum") + return "false" bnd = None new_ds = None src_ds = None - new_ds = gdal.Open('tmp/nodata_byte.gif') + new_ds = gdal.Open("tmp/nodata_byte.gif") bnd = new_ds.GetRasterBand(1) if bnd.Checksum() != 4440: - gdaltest.post_reason('Wrong checksum') - return 'false' + gdaltest.post_reason("Wrong checksum") + return "false" # NOTE - mloskot: condition may fail as nodata is a float-point number nodata = bnd.GetNoDataValue() if nodata != 0: - gdaltest.post_reason('Got unexpected nodata value.') - return 'false' + gdaltest.post_reason("Got unexpected nodata value.") + return "false" bnd = None new_ds = None - gdaltest.gif_drv.Delete('tmp/nodata_byte.gif') + gdaltest.gif_drv.Delete("tmp/nodata_byte.gif") ############################################################################### # Confirm reading with the BIGGIF driver. + def test_gif_7(): # Move the GIF driver after the BIGGIF driver. - drv = gdal.GetDriverByName('GIF') + drv = gdal.GetDriverByName("GIF") drv.Deregister() drv.Register() - tst = gdaltest.GDALTest('BIGGIF', 'gif/bug407.gif', 1, 57921) + tst = gdaltest.GDALTest("BIGGIF", "gif/bug407.gif", 1, 57921) tst.testOpen() - ds = gdal.Open('data/gif/bug407.gif') + ds = gdal.Open("data/gif/bug407.gif") assert ds is not None - assert ds.GetDriver().ShortName == 'BIGGIF' + assert ds.GetDriver().ShortName == "BIGGIF" + ############################################################################### # Confirm that BIGGIF driver is selected for huge gifs @@ -172,14 +182,15 @@ def test_gif_7(): def test_gif_8(): # Move the BIGGIF driver after the GIF driver. - drv = gdal.GetDriverByName('BIGGIF') + drv = gdal.GetDriverByName("BIGGIF") drv.Deregister() drv.Register() - ds = gdal.Open('data/gif/fakebig.gif') + ds = gdal.Open("data/gif/fakebig.gif") assert ds is not None - assert ds.GetDriver().ShortName == 'BIGGIF' + assert ds.GetDriver().ShortName == "BIGGIF" + ############################################################################### # Test writing to /vsistdout/ @@ -187,18 +198,20 @@ def test_gif_8(): def test_gif_9(): - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('GIF').CreateCopy( - '/vsistdout_redirect//vsimem/tmp.gif', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("GIF").CreateCopy( + "/vsistdout_redirect//vsimem/tmp.gif", src_ds + ) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None - ds = gdal.Open('/vsimem/tmp.gif') + ds = gdal.Open("/vsimem/tmp.gif") assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672 - gdal.Unlink('/vsimem/tmp.gif') + gdal.Unlink("/vsimem/tmp.gif") + ############################################################################### # Test interlacing @@ -206,17 +219,14 @@ def test_gif_9(): def test_gif_10(): - tst = gdaltest.GDALTest('GIF', 'byte.tif', 1, 4672, - options=['INTERLACING=YES']) + tst = gdaltest.GDALTest("GIF", "byte.tif", 1, 4672, options=["INTERLACING=YES"]) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Cleanup. def test_gif_cleanup(): gdaltest.clean_tmp() - - - diff --git a/autotest/gdrivers/gmt.py b/autotest/gdrivers/gmt.py index d73b3fa2030e..ff421d71ae62 100755 --- a/autotest/gdrivers/gmt.py +++ b/autotest/gdrivers/gmt.py @@ -28,30 +28,36 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Perform simple read test. def test_gmt_1(): - gdaltest.gmt_drv = gdal.GetDriverByName('GMT') + gdaltest.gmt_drv = gdal.GetDriverByName("GMT") if gdaltest.gmt_drv is None: pytest.skip() - tst = gdaltest.GDALTest('GMT', 'gmt/gmt_1.grd', 1, 34762) + tst = gdaltest.GDALTest("GMT", "gmt/gmt_1.grd", 1, 34762) - gt = (59.958333333333336, 0.083333333333333, 0.0, - 25.041666666666668, 0.0, -0.083333333333333) + gt = ( + 59.958333333333336, + 0.083333333333333, + 0.0, + 25.041666666666668, + 0.0, + -0.083333333333333, + ) return tst.testOpen(check_gt=gt) + ############################################################################### # Verify a simple createcopy operation with 16bit data. @@ -61,11 +67,8 @@ def test_gmt_2(): if gdaltest.gmt_drv is None: pytest.skip() - tst = gdaltest.GDALTest('GMT', 'int16.tif', 1, 4672) + tst = gdaltest.GDALTest("GMT", "int16.tif", 1, 4672) return tst.testCreateCopy(check_gt=1) -############################################################################### - - - +############################################################################### diff --git a/autotest/gdrivers/gpkg.py b/autotest/gdrivers/gpkg.py index 98385caa6ecd..7f2c007153ba 100755 --- a/autotest/gdrivers/gpkg.py +++ b/autotest/gdrivers/gpkg.py @@ -31,18 +31,20 @@ import os import sys + import pytest from test_py_scripts import samples_path # Make sure we run from the directory of the script if os.path.basename(sys.argv[0]) == os.path.basename(__file__): - if os.path.dirname(sys.argv[0]) != '': + if os.path.dirname(sys.argv[0]) != "": os.chdir(os.path.dirname(sys.argv[0])) -from osgeo import osr, gdal, ogr import gdaltest -pytestmark = pytest.mark.require_driver('GPKG') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("GPKG") ############################################################################### # Validate a geopackage @@ -56,19 +58,19 @@ def validate(filename, quiet=False): try: import validate_gpkg except ImportError: - print('Cannot import validate_gpkg') + print("Cannot import validate_gpkg") return True my_filename = filename - if my_filename.startswith('/vsimem/'): - my_filename = 'tmp/validate.gpkg' - f = gdal.VSIFOpenL(filename, 'rb') + if my_filename.startswith("/vsimem/"): + my_filename = "tmp/validate.gpkg" + f = gdal.VSIFOpenL(filename, "rb") if f is None: - print('Cannot open %s' % filename) + print("Cannot open %s" % filename) return False content = gdal.VSIFReadL(1, 10000000, f) gdal.VSIFCloseL(f) - open(my_filename, 'wb').write(content) + open(my_filename, "wb").write(content) try: validate_gpkg.check(my_filename, extra_checks=True, warning_as_error=True) except Exception as e: @@ -80,6 +82,7 @@ def validate(filename, quiet=False): os.unlink(my_filename) return True + ############################################################################### # Test if GPKG and tile drivers are available @@ -88,35 +91,43 @@ def test_gpkg_init(): gdaltest.gpkg_dr = None - gdaltest.gpkg_dr = gdal.GetDriverByName('GPKG') + gdaltest.gpkg_dr = gdal.GetDriverByName("GPKG") if gdaltest.gpkg_dr is None: pytest.skip() - gdaltest.png_dr = gdal.GetDriverByName('PNG') - gdaltest.jpeg_dr = gdal.GetDriverByName('JPEG') - gdaltest.webp_dr = gdal.GetDriverByName('WEBP') + gdaltest.png_dr = gdal.GetDriverByName("PNG") + gdaltest.jpeg_dr = gdal.GetDriverByName("JPEG") + gdaltest.webp_dr = gdal.GetDriverByName("WEBP") gdaltest.webp_supports_rgba = False - if gdaltest.webp_dr is not None and gdal.GetConfigOption("GPKG_SIMUL_WEBP_3BAND") is None: + if ( + gdaltest.webp_dr is not None + and gdal.GetConfigOption("GPKG_SIMUL_WEBP_3BAND") is None + ): md = gdaltest.webp_dr.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') >= 0: + if md["DMD_CREATIONOPTIONLIST"].find("LOSSLESS") >= 0: gdaltest.webp_supports_rgba = True # This is to speed-up the runtime of tests on EXT4 filesystems # Do not use this for production environment if you care about data safety # w.r.t system/OS crashes, unless you know what you are doing. - gdal.SetConfigOption('OGR_SQLITE_SYNCHRONOUS', 'OFF') + gdal.SetConfigOption("OGR_SQLITE_SYNCHRONOUS", "OFF") + + gdal.SetConfigOption("GPKG_DEBUG", "ON") - gdal.SetConfigOption('GPKG_DEBUG', 'ON') ############################################################################### # -def get_expected_checksums(src_ds, tile_drv, working_bands, extend_src=True, clamp_output=True): +def get_expected_checksums( + src_ds, tile_drv, working_bands, extend_src=True, clamp_output=True +): if extend_src: - mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, working_bands) + mem_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, working_bands) else: - mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) + mem_ds = gdal.GetDriverByName("MEM").Create( + "", src_ds.RasterXSize, src_ds.RasterYSize, working_bands + ) for i in range(working_bands): if src_ds.RasterCount == 2 and working_bands == 3: src_band = 1 @@ -129,39 +140,68 @@ def get_expected_checksums(src_ds, tile_drv, working_bands, extend_src=True, cla src_band = 1 else: src_band = i + 1 - data = src_ds.GetRasterBand(src_band).ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) - mem_ds.GetRasterBand(i + 1).WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) - if tile_drv.ShortName == 'PNG': + data = src_ds.GetRasterBand(src_band).ReadRaster( + 0, 0, src_ds.RasterXSize, src_ds.RasterYSize + ) + mem_ds.GetRasterBand(i + 1).WriteRaster( + 0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data + ) + if tile_drv.ShortName == "PNG": options = [] else: - options = ['QUALITY=75'] - tmp_ds = tile_drv.CreateCopy('/vsimem/tmp.' + tile_drv.ShortName, mem_ds, options=options) + options = ["QUALITY=75"] + tmp_ds = tile_drv.CreateCopy( + "/vsimem/tmp." + tile_drv.ShortName, mem_ds, options=options + ) if clamp_output: - mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) - mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, - tmp_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) - expected_cs = [mem_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] + mem_ds = gdal.GetDriverByName("MEM").Create( + "", src_ds.RasterXSize, src_ds.RasterYSize, working_bands + ) + mem_ds.WriteRaster( + 0, + 0, + src_ds.RasterXSize, + src_ds.RasterYSize, + tmp_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize), + ) + expected_cs = [ + mem_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands) + ] else: tmp_ds.FlushCache() - expected_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] + expected_cs = [ + tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands) + ] mem_ds = None tmp_ds = None - gdal.Unlink('/vsimem/tmp.' + tile_drv.ShortName) + gdal.Unlink("/vsimem/tmp." + tile_drv.ShortName) return expected_cs + ############################################################################### # -def check_tile_format(out_ds, expected_format, expected_band_count, expected_ct, row=0, col=0, zoom_level=None): +def check_tile_format( + out_ds, + expected_format, + expected_band_count, + expected_ct, + row=0, + col=0, + zoom_level=None, +): if zoom_level is None: zoom_level_str = "(SELECT MAX(zoom_level) FROM tmp)" else: zoom_level_str = str(zoom_level) - sql_lyr = out_ds.ExecuteSQL('SELECT GDAL_GetMimeType(tile_data), ' + - 'GDAL_GetBandCount(tile_data), ' + - 'GDAL_HasColorTable(tile_data) FROM tmp ' + - 'WHERE zoom_level = %s AND tile_column = %d AND tile_row = %d' % (zoom_level_str, col, row)) + sql_lyr = out_ds.ExecuteSQL( + "SELECT GDAL_GetMimeType(tile_data), " + + "GDAL_GetBandCount(tile_data), " + + "GDAL_HasColorTable(tile_data) FROM tmp " + + "WHERE zoom_level = %s AND tile_column = %d AND tile_row = %d" + % (zoom_level_str, col, row) + ) feat = sql_lyr.GetNextFeature() if feat is not None: mime_type = feat.GetField(0) @@ -179,17 +219,18 @@ def check_tile_format(out_ds, expected_format, expected_band_count, expected_ct, return pytest.fail() - if expected_format == 'PNG': - expected_mime_type = 'image/png' - elif expected_format == 'JPEG': - expected_mime_type = 'image/jpeg' - elif expected_format == 'WEBP': - expected_mime_type = 'image/x-webp' + if expected_format == "PNG": + expected_mime_type = "image/png" + elif expected_format == "JPEG": + expected_mime_type = "image/jpeg" + elif expected_format == "WEBP": + expected_mime_type = "image/x-webp" assert mime_type == expected_mime_type assert band_count == expected_band_count assert expected_ct == has_ct + ############################################################################### # Single band, PNG @@ -201,21 +242,23 @@ def test_gpkg_1(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # With padding - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = ds.GetRasterBand(1).Checksum() - clamped_expected_cs = get_expected_checksums(ds, gdaltest.png_dr, 1, clamp_output=False)[0] + clamped_expected_cs = get_expected_checksums( + ds, gdaltest.png_dr, 1, clamp_output=False + )[0] expected_gt = ds.GetGeoTransform() expected_wkt = ds.GetProjectionRef() - with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG']) + with gdaltest.config_option("CREATE_METADATA_TABLES", "NO"): + gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG"]) ds = None - assert validate('/vsimem/tmp.gpkg'), 'validation failed' + assert validate("/vsimem/tmp.gpkg"), "validation failed" - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_gt = out_ds.GetGeoTransform() for i in range(6): @@ -225,27 +268,29 @@ def test_gpkg_1(): expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 2, False) + check_tile_format(out_ds, "PNG", 2, False) # Check that there's no extensions - out_ds = gdal.Open('/vsimem/tmp.gpkg') - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") + out_ds = gdal.Open("/vsimem/tmp.gpkg") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'" + ) assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys') - assert sql_lyr.GetLayerDefn().GetFieldIndex('definition_12_063') < 0 + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys") + assert sql_lyr.GetLayerDefn().GetFieldIndex("definition_12_063") < 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=3"]) expected_cs = expected_cs[0:3] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs out_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) assert ds.RasterXSize == 256 and ds.RasterYSize == 256 expected_cs = [clamped_expected_cs, clamped_expected_cs, clamped_expected_cs, 4898] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] @@ -253,28 +298,33 @@ def test_gpkg_1(): ds = None # Test USE_TILE_EXTENT=YES with empty table - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE) - ds.ExecuteSQL('DELETE FROM tmp') + ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_UPDATE) + ds.ExecuteSQL("DELETE FROM tmp") ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", gdal.OF_RASTER, open_options=["USE_TILE_EXTENT=YES"] + ) assert ds is None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = ds.GetRasterBand(1).Checksum() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=20']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=20"] + ) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, False) + check_tile_format(out_ds, "PNG", 1, False) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Single band, JPEG @@ -287,77 +337,88 @@ def test_gpkg_2(): if gdaltest.jpeg_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # With padding - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 1)[0] - clamped_expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 3, clamp_output=False) + clamped_expected_cs = get_expected_checksums( + ds, gdaltest.jpeg_dr, 3, clamp_output=False + ) clamped_expected_cs.append(17849) - with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG']) + with gdaltest.config_option("CREATE_METADATA_TABLES", "NO"): + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=JPEG"] + ) - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'JPEG', 1, False) + check_tile_format(out_ds, "JPEG", 1, False) # Check that there's no extensions - out_ds = gdal.Open('/vsimem/tmp.gpkg') - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") + out_ds = gdal.Open("/vsimem/tmp.gpkg") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'" + ) assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == clamped_expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 1, extend_src=False)[0] - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG', 'BLOCKSIZE=20']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=JPEG", "BLOCKSIZE=20"] + ) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'JPEG', 1, False) + check_tile_format(out_ds, "JPEG", 1, False) # Try deregistering JPEG driver gdaltest.jpeg_dr.Deregister() - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") # Should give warning at pixel reading time gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") out_ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG']) + ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=JPEG"] + ) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") out_ds.FlushCache() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" out_ds = None # Re-register driver gdaltest.jpeg_dr.Register() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Single band, WEBP @@ -370,27 +431,33 @@ def test_gpkg_3(): if gdaltest.webp_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3) - clamped_expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3, clamp_output=False) + clamped_expected_cs = get_expected_checksums( + ds, gdaltest.webp_dr, 3, clamp_output=False + ) if gdaltest.webp_supports_rgba: clamped_expected_cs.append(4898) else: clamped_expected_cs.append(17849) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=WEBP']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=WEBP"] + ) out_ds = None - assert validate('/vsimem/tmp.gpkg'), 'validation failed' + assert validate("/vsimem/tmp.gpkg"), "validation failed" - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg') + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs in (expected_cs, [4736, 4734, 4736]) # Check that extension is declared - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'" + ) assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) @@ -398,47 +465,49 @@ def test_gpkg_3(): expected_band_count = 4 else: expected_band_count = 3 - check_tile_format(out_ds, 'WEBP', expected_band_count, False) + check_tile_format(out_ds, "WEBP", expected_band_count, False) out_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs in (clamped_expected_cs, [6850, 6848, 6850, 4898]) ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3, extend_src=False) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=WEBP', 'BLOCKSIZE=20']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=WEBP", "BLOCKSIZE=20"] + ) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs.append(4873) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'WEBP', 3, False) + check_tile_format(out_ds, "WEBP", 3, False) # Try deregistering WEBP driver gdaltest.webp_dr.Deregister() # Should give warning at open time since the webp extension is declared gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - out_ds = gdal.Open('/vsimem/tmp.gpkg') + gdal.PushErrorHandler("CPLQuietErrorHandler") + out_ds = gdal.Open("/vsimem/tmp.gpkg") gdal.PopErrorHandler() - if gdal.GetLastErrorMsg() == '': + if gdal.GetLastErrorMsg() == "": gdaltest.webp_dr.Register() pytest.fail() # And at pixel reading time as well gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") out_ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() - if gdal.GetLastErrorMsg() == '': + if gdal.GetLastErrorMsg() == "": gdaltest.webp_dr.Register() pytest.fail() out_ds = None @@ -446,36 +515,43 @@ def test_gpkg_3(): # Re-register driver gdaltest.webp_dr.Register() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Check updating a non-WEBP dataset with TILE_FORMAT=WEBP - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=WEBP']) - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'") + out_ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_RASTER | gdal.OF_UPDATE, + open_options=["TILE_FORMAT=WEBP"], + ) + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'" + ) assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Three band, PNG -def test_gpkg_4(tile_drv_name='PNG'): +def test_gpkg_4(tile_drv_name="PNG"): if gdaltest.gpkg_dr is None: pytest.skip() - if tile_drv_name == 'PNG': + if tile_drv_name == "PNG": tile_drv = gdaltest.png_dr working_bands = 4 - elif tile_drv_name == 'JPEG': + elif tile_drv_name == "JPEG": tile_drv = gdaltest.jpeg_dr working_bands = 3 - elif tile_drv_name == 'WEBP': + elif tile_drv_name == "WEBP": tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 @@ -484,9 +560,9 @@ def test_gpkg_4(tile_drv_name='PNG'): if tile_drv is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdal.Open('data/rgbsmall.tif') + ds = gdal.Open("data/rgbsmall.tif") expected_cs = get_expected_checksums(ds, tile_drv, 3) clamped_expected_cs = get_expected_checksums(ds, tile_drv, 3, clamp_output=False) if working_bands == 3: @@ -494,58 +570,67 @@ def test_gpkg_4(tile_drv_name='PNG'): else: clamped_expected_cs.append(30638) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=' + tile_drv_name]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=" + tile_drv_name] + ) ds = None out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs.append(30658) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] - assert got_cs in (expected_cs, - [22290, 21651, 21551, 30658], - [22286, 21645, 21764, 30658], # libwebp 1.0.3 - ) + assert got_cs in ( + expected_cs, + [22290, 21651, 21551, 30658], + [22286, 21645, 21764, 30658], # libwebp 1.0.3 + ) check_tile_format(out_ds, tile_drv_name, working_bands, False) out_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] - assert got_cs in (clamped_expected_cs, - [56886, 43228, 56508, 30638], - [30478, 31718, 31360, 30638], # libwebp 1.0.3 - ) + assert got_cs in ( + clamped_expected_cs, + [56886, 43228, 56508, 30638], + [30478, 31718, 31360, 30638], # libwebp 1.0.3 + ) ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding - ds = gdal.Open('data/rgbsmall.tif') + ds = gdal.Open("data/rgbsmall.tif") expected_cs = get_expected_checksums(ds, tile_drv, 3, extend_src=False) expected_cs.append(30658) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKSIZE=50']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=" + tile_drv_name, "BLOCKSIZE=50"] + ) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, 3, False) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Three band, JPEG def test_gpkg_5(): - return test_gpkg_4(tile_drv_name='JPEG') + return test_gpkg_4(tile_drv_name="JPEG") + ############################################################################### # Three band, WEBP def test_gpkg_6(): - return test_gpkg_4(tile_drv_name='WEBP') + return test_gpkg_4(tile_drv_name="WEBP") + ############################################################################### # 4 band, PNG @@ -553,12 +638,18 @@ def test_gpkg_6(): def get_georeferenced_rgba_ds(alpha_fully_transparent=False, alpha_fully_opaque=False): assert not (alpha_fully_transparent and alpha_fully_opaque) - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', - src_ds.RasterXSize, src_ds.RasterYSize, 4) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tmp.tif", src_ds.RasterXSize, src_ds.RasterYSize, 4 + ) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) - tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, - src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) + tmp_ds.WriteRaster( + 0, + 0, + src_ds.RasterXSize, + src_ds.RasterYSize, + src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize), + ) if alpha_fully_opaque: tmp_ds.GetRasterBand(4).Fill(255) elif alpha_fully_transparent: @@ -566,17 +657,17 @@ def get_georeferenced_rgba_ds(alpha_fully_transparent=False, alpha_fully_opaque= return tmp_ds -def test_gpkg_7(tile_drv_name='PNG'): +def test_gpkg_7(tile_drv_name="PNG"): if gdaltest.gpkg_dr is None: pytest.skip() - if tile_drv_name == 'PNG': + if tile_drv_name == "PNG": tile_drv = gdaltest.png_dr working_bands = 4 - elif tile_drv_name == 'JPEG': + elif tile_drv_name == "JPEG": tile_drv = gdaltest.jpeg_dr working_bands = 3 - elif tile_drv_name == 'WEBP': + elif tile_drv_name == "WEBP": tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 @@ -585,10 +676,12 @@ def test_gpkg_7(tile_drv_name='PNG'): if tile_drv is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") src_ds = get_georeferenced_rgba_ds() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=' + tile_drv_name]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", src_ds, options=["TILE_FORMAT=" + tile_drv_name] + ) out_ds = None expected_cs = get_expected_checksums(src_ds, tile_drv, working_bands) @@ -597,76 +690,102 @@ def test_gpkg_7(tile_drv_name='PNG'): src_ds = None gdal.Unlink(src_filename) - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, working_bands, False) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding with alpha fully opaque tmp_ds = get_georeferenced_rgba_ds(alpha_fully_opaque=True) expected_cs = get_expected_checksums(tmp_ds, tile_drv, 3, extend_src=False) tmp_filename = tmp_ds.GetDescription() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + tmp_ds, + options=[ + "TILE_FORMAT=" + tile_drv_name, + "BLOCKXSIZE=%d" % tmp_ds.RasterXSize, + "BLOCKYSIZE=%d" % tmp_ds.RasterYSize, + ], + ) out_ds = None tmp_ds = None gdal.Unlink(tmp_filename) - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, 3, False) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding with alpha fully transparent tmp_ds = get_georeferenced_rgba_ds(alpha_fully_transparent=True) tmp_filename = tmp_ds.GetDescription() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + tmp_ds, + options=[ + "TILE_FORMAT=" + tile_drv_name, + "BLOCKXSIZE=%d" % tmp_ds.RasterXSize, + "BLOCKYSIZE=%d" % tmp_ds.RasterYSize, + ], + ) out_ds = None tmp_ds = None gdal.Unlink(tmp_filename) - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") expected_cs = [0, 0, 0, 0] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, None, None, None) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # 4 band, JPEG def test_gpkg_8(): - return test_gpkg_7(tile_drv_name='JPEG') + return test_gpkg_7(tile_drv_name="JPEG") + ############################################################################### # 4 band, WEBP def test_gpkg_9(): - return test_gpkg_7(tile_drv_name='WEBP') + return test_gpkg_7(tile_drv_name="WEBP") + ############################################################################### # def get_georeferenced_ds_with_pct32(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba_pct32.png') - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', - src_ds.RasterXSize, src_ds.RasterYSize) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba_pct32.png") + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tmp.tif", src_ds.RasterXSize, src_ds.RasterYSize + ) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) tmp_ds.GetRasterBand(1).SetColorTable(src_ds.GetRasterBand(1).GetColorTable()) - tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, - src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) + tmp_ds.WriteRaster( + 0, + 0, + src_ds.RasterXSize, + src_ds.RasterYSize, + src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize), + ) return tmp_ds + ############################################################################### # Single band with 32 bit color table, PNG @@ -678,24 +797,31 @@ def test_gpkg_10(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") tmp_ds = get_georeferenced_ds_with_pct32() expected_ct = tmp_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = tmp_ds.GetRasterBand(1).Checksum() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + tmp_ds, + options=[ + "BLOCKXSIZE=%d" % tmp_ds.RasterXSize, + "BLOCKYSIZE=%d" % tmp_ds.RasterYSize, + ], + ) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None gdal.Unlink(tmp_filename) expected_cs = [10991, 57677, 34965, 10638] - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") block_size = out_ds.GetRasterBand(1).GetBlockSize() assert block_size == [out_ds.RasterXSize, out_ds.RasterYSize] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, True) + check_tile_format(out_ds, "PNG", 1, True) got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None @@ -704,12 +830,12 @@ def test_gpkg_10(): gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" out_ds = None expected_cs = [expected_cs_single_band] - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=1']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=1"]) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() @@ -720,58 +846,59 @@ def test_gpkg_10(): gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Repeated SetColorTable() - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1) out_ds.GetRasterBand(1).SetColorTable(None) gdal.ErrorReset() gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.PushErrorHandler() out_ds = None gdal.PopErrorHandler() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Partial tile tmp_ds = get_georeferenced_ds_with_pct32() expected_ct = tmp_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = tmp_ds.GetRasterBand(1).Checksum() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds) + out_ds = gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", tmp_ds) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None gdal.Unlink(tmp_filename) expected_cs = [10991, 57677, 34965, 10638] - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 4, False) + check_tile_format(out_ds, "PNG", 4, False) got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None + ############################################################################### # Single band with 32 bit color table, JPEG -def test_gpkg_11(tile_drv_name='JPEG'): +def test_gpkg_11(tile_drv_name="JPEG"): if gdaltest.gpkg_dr is None: pytest.skip() - if tile_drv_name == 'JPEG': + if tile_drv_name == "JPEG": tile_drv = gdaltest.jpeg_dr working_bands = 3 - elif tile_drv_name == 'WEBP': + elif tile_drv_name == "WEBP": tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 @@ -780,7 +907,7 @@ def test_gpkg_11(tile_drv_name='JPEG'): if tile_drv is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") rgba_xml = '' for i in range(4): @@ -790,12 +917,17 @@ def test_gpkg_11(tile_drv_name='JPEG'): 1 %d - """ % (i + 1, i + 1) - rgba_xml += '' + """ % ( + i + 1, + i + 1, + ) + rgba_xml += "" rgba_ds = gdal.Open(rgba_xml) tmp_ds = get_georeferenced_ds_with_pct32() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", tmp_ds, options=["TILE_FORMAT=" + tile_drv_name] + ) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None @@ -804,19 +936,21 @@ def test_gpkg_11(tile_drv_name='JPEG'): expected_cs = get_expected_checksums(rgba_ds, tile_drv, working_bands) rgba_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] assert got_cs == expected_cs out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Single band with 32 bit color table, WEBP def test_gpkg_12(): - return test_gpkg_11(tile_drv_name='WEBP') + return test_gpkg_11(tile_drv_name="WEBP") + ############################################################################### # Single band with 24 bit color table, PNG @@ -829,17 +963,24 @@ def test_gpkg_13(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - src_ds = gdal.Open('data/small_world_pct.tif') + src_ds = gdal.Open("data/small_world_pct.tif") expected_ct = src_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = src_ds.GetRasterBand(1).Checksum() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['BLOCKXSIZE=%d' % src_ds.RasterXSize, 'BLOCKYSIZE=%d' % src_ds.RasterYSize]) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=[ + "BLOCKXSIZE=%d" % src_ds.RasterXSize, + "BLOCKYSIZE=%d" % src_ds.RasterYSize, + ], + ) out_ds = None src_ds = None expected_cs = [63025, 48175, 12204] - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() @@ -847,31 +988,32 @@ def test_gpkg_13(): out_ds = None expected_cs = [expected_cs_single_band] - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=1']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=1"]) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert expected_ct.GetCount() == got_ct.GetCount() out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Partial tile - src_ds = gdal.Open('data/small_world_pct.tif') + src_ds = gdal.Open("data/small_world_pct.tif") expected_ct = src_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = src_ds.GetRasterBand(1).Checksum() - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds) + out_ds = gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", src_ds) out_ds = None src_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) assert ds.RasterXSize == 512 and ds.RasterYSize == 256 expected_cs = [62358, 45823, 12238, 64301] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test creation and opening options @@ -884,67 +1026,76 @@ def test_gpkg_14(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') - - src_ds = gdal.Open('data/small_world.tif') - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'RASTER_TABLE=foo', 'RASTER_IDENTIFIER=bar', 'RASTER_DESCRIPTION=baz']) + gdal.Unlink("/vsimem/tmp.gpkg") + + src_ds = gdal.Open("data/small_world.tif") + ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=[ + "TILE_FORMAT=PNG", + "RASTER_TABLE=foo", + "RASTER_IDENTIFIER=bar", + "RASTER_DESCRIPTION=baz", + ], + ) ds = None gdal.PushErrorHandler() - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['TABLE=non_existing']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["TABLE=non_existing"]) gdal.PopErrorHandler() assert ds is None - ds = gdal.Open('/vsimem/tmp.gpkg') + ds = gdal.Open("/vsimem/tmp.gpkg") sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE table_name='foo'") feat_count = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert feat_count == 1 - assert ds.GetMetadataItem('IDENTIFIER') == 'bar', ds.GetMetadata() - assert ds.GetMetadataItem('DESCRIPTION') == 'baz', ds.GetMetadata() - assert ds.GetMetadataItem('ZOOM_LEVEL') == '1', ds.GetMetadata() + assert ds.GetMetadataItem("IDENTIFIER") == "bar", ds.GetMetadata() + assert ds.GetMetadataItem("DESCRIPTION") == "baz", ds.GetMetadata() + assert ds.GetMetadataItem("ZOOM_LEVEL") == "1", ds.GetMetadata() assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None ds = None # In update mode, we expose even empty overview levels - ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert ds.GetMetadataItem('ZOOM_LEVEL') == '1', ds.GetMetadata() + ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert ds.GetMetadataItem("ZOOM_LEVEL") == "1", ds.GetMetadata() assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(0) is not None assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 0 ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=2']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["ZOOM_LEVEL=2"]) assert ds.RasterXSize == 400 ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=1']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["ZOOM_LEVEL=1"]) assert ds.RasterXSize == 400 assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None # In update mode, we expose even empty overview levels - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['ZOOM_LEVEL=1']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_UPDATE, open_options=["ZOOM_LEVEL=1"]) assert ds.RasterXSize == 400 assert ds.GetRasterBand(1).GetOverviewCount() == 1 ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=0']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["ZOOM_LEVEL=0"]) assert ds.RasterXSize == 200 assert ds.GetRasterBand(1).Checksum() == 0 ds = None - gdal.Translate('/vsimem/tmp2.gpkg', 'data/byte.tif', format='GPKG') - ds = gdal.OpenEx('/vsimem/tmp2.gpkg', gdal.OF_UPDATE) - ds.ExecuteSQL('UPDATE gpkg_contents SET min_x = NULL') + gdal.Translate("/vsimem/tmp2.gpkg", "data/byte.tif", format="GPKG") + ds = gdal.OpenEx("/vsimem/tmp2.gpkg", gdal.OF_UPDATE) + ds.ExecuteSQL("UPDATE gpkg_contents SET min_x = NULL") ds = None with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/tmp2.gpkg', open_options=['ZOOM_LEVEL=-1']) + ds = gdal.OpenEx("/vsimem/tmp2.gpkg", open_options=["ZOOM_LEVEL=-1"]) assert ds is None - gdal.Unlink('/vsimem/tmp2.gpkg') + gdal.Unlink("/vsimem/tmp2.gpkg") - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) assert ds.RasterXSize == 512 and ds.RasterYSize == 256 expected_cs = [27644, 31968, 38564, 64301] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] @@ -952,7 +1103,11 @@ def test_gpkg_14(): ds = None # Open with exactly one tile shift - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG', 'MINX=-410.4', 'MAXY=320.4']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_UPDATE, + open_options=["TILE_FORMAT=PNG", "MINX=-410.4", "MAXY=320.4"], + ) assert ds.RasterXSize == 400 + 256 and ds.RasterYSize == 200 + 256 expected_cs = [29070, 32796, 41086, 64288] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] @@ -961,7 +1116,7 @@ def test_gpkg_14(): for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Fill(0) ds.FlushCache() - sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') + sql_lyr = ds.ExecuteSQL("SELECT * FROM foo") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 @@ -969,7 +1124,11 @@ def test_gpkg_14(): ds = None # Partial tile shift (enclosing tiles) - ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) + ds = gdal.OpenEx( + "GPKG:/vsimem/tmp.gpkg:foo", + gdal.OF_UPDATE, + open_options=["MINX=-270", "MAXY=180", "MINY=-180", "MAXX=270"], + ) assert ds.RasterXSize == 600 and ds.RasterYSize == 400 expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] @@ -981,14 +1140,18 @@ def test_gpkg_14(): for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Fill(0) ds.FlushCache() - sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') + sql_lyr = ds.ExecuteSQL("SELECT * FROM foo") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) ds = None - ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) + ds = gdal.OpenEx( + "GPKG:/vsimem/tmp.gpkg:foo", + gdal.OF_UPDATE, + open_options=["MINX=-270", "MAXY=180", "MINY=-180", "MAXX=270"], + ) expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs @@ -997,14 +1160,21 @@ def test_gpkg_14(): ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) ds = None - ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) + ds = gdal.OpenEx( + "GPKG:/vsimem/tmp.gpkg:foo", + open_options=["MINX=-270", "MAXY=180", "MINY=-180", "MAXX=270"], + ) expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None # Partial tile shift (included in tiles) - ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) + ds = gdal.OpenEx( + "GPKG:/vsimem/tmp.gpkg:foo", + gdal.OF_UPDATE, + open_options=["MINX=-90", "MAXY=45", "MINY=-45", "MAXX=90"], + ) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 expected_cs = [9586, 9360, 26758, 48827] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] @@ -1015,36 +1185,53 @@ def test_gpkg_14(): ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) ds = None - ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', open_options=['MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) + ds = gdal.OpenEx( + "GPKG:/vsimem/tmp.gpkg:foo", + open_options=["MINX=-90", "MAXY=45", "MINY=-45", "MAXX=90"], + ) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 expected_cs = [9586, 9360, 26758, 48827] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['APPEND_SUBDATASET=YES', 'RASTER_TABLE=other', 'BLOCKSIZE=64', 'TILE_FORMAT=PNG']) + ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=[ + "APPEND_SUBDATASET=YES", + "RASTER_TABLE=other", + "BLOCKSIZE=64", + "TILE_FORMAT=PNG", + ], + ) ds = None - another_src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', another_src_ds, options=['APPEND_SUBDATASET=YES']) + another_src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", another_src_ds, options=["APPEND_SUBDATASET=YES"] + ) ds = None another_src_ds = None - ds = gdal.Open('/vsimem/tmp.gpkg') - md = ds.GetMetadata('SUBDATASETS') - assert md['SUBDATASET_1_NAME'] == 'GPKG:/vsimem/tmp.gpkg:foo' - assert md['SUBDATASET_1_DESC'] == 'foo - bar' - assert md['SUBDATASET_2_NAME'] == 'GPKG:/vsimem/tmp.gpkg:other' - assert md['SUBDATASET_2_DESC'] == 'other - other' - assert md['SUBDATASET_3_NAME'] == 'GPKG:/vsimem/tmp.gpkg:byte' - assert md['SUBDATASET_3_DESC'] == 'byte - byte' + ds = gdal.Open("/vsimem/tmp.gpkg") + md = ds.GetMetadata("SUBDATASETS") + assert md["SUBDATASET_1_NAME"] == "GPKG:/vsimem/tmp.gpkg:foo" + assert md["SUBDATASET_1_DESC"] == "foo - bar" + assert md["SUBDATASET_2_NAME"] == "GPKG:/vsimem/tmp.gpkg:other" + assert md["SUBDATASET_2_DESC"] == "other - other" + assert md["SUBDATASET_3_NAME"] == "GPKG:/vsimem/tmp.gpkg:byte" + assert md["SUBDATASET_3_DESC"] == "byte - byte" ds = None - ds = gdal.Open('GPKG:/vsimem/tmp.gpkg:other') + ds = gdal.Open("GPKG:/vsimem/tmp.gpkg:other") block_size = ds.GetRasterBand(1).GetBlockSize() assert block_size == [64, 64] ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['TABLE=other', 'MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + open_options=["TABLE=other", "MINX=-90", "MAXY=45", "MINY=-45", "MAXX=90"], + ) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 block_size = ds.GetRasterBand(1).GetBlockSize() assert block_size == [64, 64] @@ -1053,68 +1240,92 @@ def test_gpkg_14(): assert got_cs == expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Open and fill with an area of interest larger/containing the natural extent - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 20, 20, 1, options=['BLOCKSIZE=20']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", 20, 20, 1, options=["BLOCKSIZE=20"] + ) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'MAXX=25', 'MINY=-25', 'BAND_COUNT=1']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_UPDATE, + open_options=["MINX=-5", "MAXY=5", "MAXX=25", "MINY=-25", "BAND_COUNT=1"], + ) ds.GetRasterBand(1).Fill(255) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-10', 'MAXY=10', 'MINY=-30', 'MAXX=30']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", open_options=["MINX=-10", "MAXY=10", "MINY=-30", "MAXX=30"] + ) expected_cs = [4934, 4934, 4934, 4934] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Open and fill with an area of interest smaller/inside the natural extent # (and smaller than the block size actually) - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 20, 20, 1, options=['BLOCKSIZE=20']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", 20, 20, 1, options=["BLOCKSIZE=20"] + ) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=5', 'MAXY=-5', 'MAXX=15', 'MINY=-15', 'BAND_COUNT=1']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_UPDATE, + open_options=["MINX=5", "MAXY=-5", "MAXX=15", "MINY=-15", "BAND_COUNT=1"], + ) ds.GetRasterBand(1).Fill(255) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-10', 'MAXY=10', 'MINY=-30', 'MAXX=30']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", open_options=["MINX=-10", "MAXY=10", "MINY=-30", "MAXX=30"] + ) expected_cs = [1223, 1223, 1223, 1223] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Other corner case : the block intersects a tile at the right of the raster # size (because the raster size is smaller than the block size) - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 1) + ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 400, 200, 1) ds.SetGeoTransform([-180, 0.9, 0, 90, 0, -0.9]) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'MAXX=25', 'MINY=-25', 'BAND_COUNT=1']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_UPDATE, + open_options=["MINX=-5", "MAXY=5", "MAXX=25", "MINY=-25", "BAND_COUNT=1"], + ) ds.GetRasterBand(1).Fill(255) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg') + ds = gdal.OpenEx("/vsimem/tmp.gpkg") expected_cs = [13365, 13365, 13365, 13365] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Test reading block from partial tile database - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 512, 256, 4) + ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 512, 256, 4) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'TILE_FORMAT=PNG']) - mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_UPDATE, + open_options=["MINX=-5", "MAXY=5", "TILE_FORMAT=PNG"], + ) + mem_ds = gdal.GetDriverByName("MEM").Create("", 256, 256) mem_ds.GetRasterBand(1).Fill(255) mem_ds.FlushCache() data = mem_ds.GetRasterBand(1).ReadRaster() @@ -1127,7 +1338,7 @@ def test_gpkg_14(): gdal.SetCacheMax(0) gdal.SetCacheMax(oldSize) - sql_lyr = ds.ExecuteSQL('SELECT * FROM tmp') + sql_lyr = ds.ExecuteSQL("SELECT * FROM tmp") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 @@ -1137,29 +1348,34 @@ def test_gpkg_14(): if got_cs != expected_cs: ds.GetRasterBand(4).Fill(255) # sys.exit(0) - pytest.fail('Got %s, expected %s' % (str(got_cs), str(expected_cs))) + pytest.fail("Got %s, expected %s" % (str(got_cs), str(expected_cs))) ds = None # Overflow occurred in ComputeTileAndPixelShifts() with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-1e12', 'MAXX=-0.9999e12']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", open_options=["MINX=-1e12", "MAXX=-0.9999e12"] + ) assert ds is None # Overflow occurred in ComputeTileAndPixelShifts() with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINY=-1e12', 'MAXY=-0.9999e12']) + ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", open_options=["MINY=-1e12", "MAXY=-0.9999e12"] + ) assert ds is None # Overflow occurred in ComputeTileAndPixelShifts() - gdal.Translate('/vsimem/tmp.gpkg', 'data/byte.tif', format='GPKG') - ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE) - ds.ExecuteSQL('UPDATE gpkg_contents SET min_x=-1000000002000, max_x=-1000000000000') + gdal.Translate("/vsimem/tmp.gpkg", "data/byte.tif", format="GPKG") + ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_UPDATE) + ds.ExecuteSQL("UPDATE gpkg_contents SET min_x=-1000000002000, max_x=-1000000000000") ds = None with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/tmp.gpkg') + ds = gdal.Open("/vsimem/tmp.gpkg") assert ds is None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test error cases @@ -1170,12 +1386,12 @@ def test_gpkg_15(): if gdaltest.gpkg_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # SetGeoTransform() and SetProjection() on a non-raster GPKG - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 0, 0, 0) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 0, 0, 0) assert out_ds.GetGeoTransform(can_return_null=True) is None - assert out_ds.GetProjectionRef() == '' + assert out_ds.GetProjectionRef() == "" gdal.PushErrorHandler() ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) gdal.PopErrorHandler() @@ -1189,10 +1405,10 @@ def test_gpkg_15(): assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Repeated SetGeoTransform() - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1) ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) assert ret == 0 gdal.PushErrorHandler() @@ -1202,27 +1418,27 @@ def test_gpkg_15(): out_ds = None # Repeated SetProjection() - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) assert out_ds.GetSpatialRef().IsLocal() - assert out_ds.GetProjectionRef().find('Undefined Cartesian SRS') >= 0 + assert out_ds.GetProjectionRef().find("Undefined Cartesian SRS") >= 0 srs = osr.SpatialReference() srs.ImportFromEPSG(4326) ret = out_ds.SetProjection(srs.ExportToWkt()) assert ret == 0 - assert out_ds.GetProjectionRef().find('4326') >= 0 + assert out_ds.GetProjectionRef().find("4326") >= 0 out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert out_ds.GetProjectionRef().find('4326') >= 0 - out_ds.SetProjection('') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert out_ds.GetProjectionRef().find("4326") >= 0 + out_ds.SetProjection("") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") assert out_ds.GetSpatialRef().IsLocal() - assert out_ds.GetProjectionRef().find('Undefined Cartesian SRS') >= 0 + assert out_ds.GetProjectionRef().find("Undefined Cartesian SRS") >= 0 # Test setting on read-only dataset gdal.PushErrorHandler() - ret = out_ds.SetProjection('') + ret = out_ds.SetProjection("") gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() @@ -1231,10 +1447,10 @@ def test_gpkg_15(): assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Test SetColorInterpretation() - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_Undefined) assert ret == 0 @@ -1248,9 +1464,9 @@ def test_gpkg_15(): assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 3) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1, 3) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) assert ret == 0 @@ -1260,9 +1476,9 @@ def test_gpkg_15(): assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 2) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1, 2) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GrayIndex) assert ret == 0 @@ -1278,7 +1494,8 @@ def test_gpkg_15(): assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test block/tile caching @@ -1291,9 +1508,11 @@ def test_gpkg_16(): if gdaltest.jpeg_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 3, options=['TILE_FORMAT=JPEG']) + out_ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", 1, 1, 3, options=["TILE_FORMAT=JPEG"] + ) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) out_ds.GetRasterBand(1).Fill(255) out_ds.GetRasterBand(1).FlushCache() @@ -1304,7 +1523,7 @@ def test_gpkg_16(): out_ds.GetRasterBand(2).FlushCache() out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") val1 = ord(out_ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1)) val2 = ord(out_ds.GetRasterBand(2).ReadRaster(0, 0, 1, 1)) val3 = ord(out_ds.GetRasterBand(3).ReadRaster(0, 0, 1, 1)) @@ -1313,7 +1532,8 @@ def test_gpkg_16(): assert val1 == pytest.approx(255, abs=1) assert val2 == pytest.approx(127, abs=1) assert val3 == pytest.approx(0, abs=1) - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test overviews with single band dataset @@ -1326,118 +1546,135 @@ def test_gpkg_17(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, immediately after create copy - ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) - out_ds.BuildOverviews('NEAR', [2]) + ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=10"] + ) + out_ds.BuildOverviews("NEAR", [2]) out_ds = None ds = None - assert validate('/vsimem/tmp.gpkg'), 'validation failed' + assert validate("/vsimem/tmp.gpkg"), "validation failed" - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 - check_tile_format(out_ds, 'PNG', 1, False, zoom_level=0) + check_tile_format(out_ds, "PNG", 1, False, zoom_level=0) assert out_ds.GetRasterBand(1).GetOverview(0).GetColorTable() is None out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, after reopening, and BAND_COUNT = 1 - ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) + ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=10"] + ) out_ds = None # FIXME? Should we eventually write the driver somewhere in metadata ? - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG', 'BAND_COUNT=1']) - out_ds.BuildOverviews('NEAR', [2]) + out_ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_RASTER | gdal.OF_UPDATE, + open_options=["TILE_FORMAT=PNG", "BAND_COUNT=1"], + ) + out_ds.BuildOverviews("NEAR", [2]) out_ds = None ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 - check_tile_format(out_ds, 'PNG', 1, False, zoom_level=0) + check_tile_format(out_ds, "PNG", 1, False, zoom_level=0) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, after reopening - ds = gdal.Open('data/byte.tif') - with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) + ds = gdal.Open("data/byte.tif") + with gdaltest.config_option("CREATE_METADATA_TABLES", "NO"): + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=10"] + ) # FIXME? Should we eventually write the driver somewhere in metadata ? - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG']) - out_ds.BuildOverviews('NEAR', [2]) + out_ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", + gdal.OF_RASTER | gdal.OF_UPDATE, + open_options=["TILE_FORMAT=PNG"], + ) + out_ds.BuildOverviews("NEAR", [2]) out_ds = None ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 - check_tile_format(out_ds, 'PNG', 3, False, zoom_level=0) + check_tile_format(out_ds, "PNG", 3, False, zoom_level=0) # Check that there's no extensions - out_ds = gdal.Open('/vsimem/tmp.gpkg') - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") + out_ds = gdal.Open("/vsimem/tmp.gpkg") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'" + ) assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None # Test clearing overviews - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) - out_ds.BuildOverviews('NONE', []) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds.BuildOverviews("NONE", []) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") assert out_ds.GetRasterBand(1).GetOverviewCount() == 0 out_ds = None # Test building on an overview dataset --> error - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() - ret = out_ds.GetRasterBand(1).GetOverview(0).GetDataset().BuildOverviews('NONE', []) + ret = out_ds.GetRasterBand(1).GetOverview(0).GetDataset().BuildOverviews("NONE", []) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building overview factor 1 --> error - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() - ret = out_ds.BuildOverviews('NEAR', [1]) + ret = out_ds.BuildOverviews("NEAR", [1]) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building non-supported overview levels - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() - gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', 'NO') - ret = out_ds.BuildOverviews('NEAR', [3]) - gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', None) + gdal.SetConfigOption("ALLOW_GPKG_ZOOM_OTHER_EXTENSION", "NO") + ret = out_ds.BuildOverviews("NEAR", [3]) + gdal.SetConfigOption("ALLOW_GPKG_ZOOM_OTHER_EXTENSION", None) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building non-supported overview levels - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() - gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', 'NO') - ret = out_ds.BuildOverviews('NEAR', [2, 4]) - gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', None) + gdal.SetConfigOption("ALLOW_GPKG_ZOOM_OTHER_EXTENSION", "NO") + ret = out_ds.BuildOverviews("NEAR", [2, 4]) + gdal.SetConfigOption("ALLOW_GPKG_ZOOM_OTHER_EXTENSION", None) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building overviews on read-only dataset - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER) gdal.PushErrorHandler() - ret = out_ds.BuildOverviews('NEAR', [2]) + ret = out_ds.BuildOverviews("NEAR", [2]) gdal.PopErrorHandler() assert ret != 0 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test overviews with 3 band dataset @@ -1449,39 +1686,47 @@ def test_gpkg_18(): pytest.skip() if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, immediately after create copy - ds = gdal.Open('data/small_world.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) - out_ds.BuildOverviews('CUBIC', [2, 4]) + ds = gdal.Open("data/small_world.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + ds, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=100", "BLOCKYSIZE=100"], + ) + out_ds.BuildOverviews("CUBIC", [2, 4]) out_ds = None - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tmp.tif', ds) - tmp_ds.BuildOverviews('CUBIC', [2, 4]) - expected_cs_ov0 = [tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] - expected_cs_ov1 = [tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] + tmp_ds = gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tmp.tif", ds) + tmp_ds.BuildOverviews("CUBIC", [2, 4]) + expected_cs_ov0 = [ + tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3) + ] + expected_cs_ov1 = [ + tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3) + ] # tmp_ds.BuildOverviews('NEAR', [3]) # expected_cs_ov_factor3 = [tmp_ds.GetRasterBand(i+1).GetOverview(2).Checksum() for i in range(3)] tmp_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/tmp.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tmp.tif") ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] assert got_cs == expected_cs_ov0 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] assert got_cs == expected_cs_ov1 - check_tile_format(out_ds, 'PNG', 3, False, zoom_level=1) - check_tile_format(out_ds, 'PNG', 4, False, zoom_level=0) + check_tile_format(out_ds, "PNG", 3, False, zoom_level=1) + check_tile_format(out_ds, "PNG", 4, False, zoom_level=0) out_ds = None # Test gpkg_zoom_other extension - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) # We expect a warning gdal.PushErrorHandler() - ret = out_ds.BuildOverviews('NEAR', [3]) + ret = out_ds.BuildOverviews("NEAR", [3]) gdal.PopErrorHandler() assert ret == 0 assert out_ds.GetRasterBand(1).GetOverviewCount() == 3 @@ -1494,13 +1739,15 @@ def test_gpkg_18(): assert got_cs == expected_cs_ov1 # Check that extension is declared - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND extension_name = 'gpkg_zoom_other'") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND extension_name = 'gpkg_zoom_other'" + ) assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") assert out_ds.GetRasterBand(1).GetOverviewCount() == 3 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] assert got_cs == expected_cs_ov0 @@ -1512,33 +1759,40 @@ def test_gpkg_18(): out_ds = None # Add terminating overview - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) - ret = out_ds.BuildOverviews('NEAR', [8]) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER | gdal.OF_UPDATE) + ret = out_ds.BuildOverviews("NEAR", [8]) assert ret == 0 expected_cs = [12725, 12539, 13553] got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(3).Checksum() for i in range(3)] assert got_cs == expected_cs out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, immediately after create copy - ds = gdal.Open('data/small_world.tif') - with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) + ds = gdal.Open("data/small_world.tif") + with gdaltest.config_option("CREATE_METADATA_TABLES", "NO"): + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + ds, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=100", "BLOCKYSIZE=100"], + ) # Should not result in gpkg_zoom_other - ret = out_ds.BuildOverviews('NEAR', [8]) + ret = out_ds.BuildOverviews("NEAR", [8]) assert ret == 0 out_ds = None # Check that there's no extensions - out_ds = gdal.Open('/vsimem/tmp.gpkg') - sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") + out_ds = gdal.Open("/vsimem/tmp.gpkg") + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'" + ) assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test overviews with 24-bit color palette single band dataset @@ -1551,33 +1805,44 @@ def test_gpkg_19(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, immediately after create copy - ds = gdal.Open('data/small_world_pct.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) - out_ds.BuildOverviews('NEAR', [2, 4]) + ds = gdal.Open("data/small_world_pct.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + ds, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=100", "BLOCKYSIZE=100"], + ) + out_ds.BuildOverviews("NEAR", [2, 4]) out_ds = None - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tmp.tif', ds) - tmp_ds.BuildOverviews('NEAR', [2, 4]) - expected_cs_ov0 = [tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(1)] - expected_cs_ov1 = [tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(1)] + tmp_ds = gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/tmp.tif", ds) + tmp_ds.BuildOverviews("NEAR", [2, 4]) + expected_cs_ov0 = [ + tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(1) + ] + expected_cs_ov1 = [ + tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(1) + ] tmp_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/tmp.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/tmp.tif") ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['BAND_COUNT=1']) + out_ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", gdal.OF_RASTER, open_options=["BAND_COUNT=1"] + ) assert out_ds.GetRasterBand(1).GetOverview(0).GetColorTable() is not None got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(1)] assert got_cs == expected_cs_ov0 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(1)] assert got_cs == expected_cs_ov1 - check_tile_format(out_ds, 'PNG', 1, True, zoom_level=1) - check_tile_format(out_ds, 'PNG', 4, False, zoom_level=0) + check_tile_format(out_ds, "PNG", 1, True, zoom_level=1) + check_tile_format(out_ds, "PNG", 4, False, zoom_level=0) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test PNG8 @@ -1590,72 +1855,85 @@ def test_gpkg_20(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, with small tiles (<=256x256) - ds = gdal.Open('data/small_world.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=200']) + ds = gdal.Open("data/small_world.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG8", "BLOCKSIZE=200"] + ) out_ds = None ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [30875, 31451, 38110, 64269] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, True) + check_tile_format(out_ds, "PNG", 1, True) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, with big tiles (>256x256) - ds = gdal.Open('data/small_world.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKXSIZE=400', 'BLOCKYSIZE=200']) + ds = gdal.Open("data/small_world.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + ds, + options=["TILE_FORMAT=PNG8", "BLOCKXSIZE=400", "BLOCKYSIZE=200"], + ) out_ds = None ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [27001, 30168, 34800, 64269] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, True) + check_tile_format(out_ds, "PNG", 1, True) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # With and without padding, with small tiles - ds = gdal.Open('data/small_world.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=150']) + ds = gdal.Open("data/small_world.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG8", "BLOCKSIZE=150"] + ) out_ds = None ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [27718, 31528, 42062, 64269] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, True) - check_tile_format(out_ds, 'PNG', 4, False, row=0, col=2) + check_tile_format(out_ds, "PNG", 1, True) + check_tile_format(out_ds, "PNG", 4, False, row=0, col=2) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Without padding, with small tiles (<=256x256), but especially less # than 256 colors. - ds = gdal.GetDriverByName('MEM').Create('', 50, 50, 3) + ds = gdal.GetDriverByName("MEM").Create("", 50, 50, 3) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(2).Fill(2) ds.GetRasterBand(3).Fill(3) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=50']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", ds, options=["TILE_FORMAT=PNG8", "BLOCKSIZE=50"] + ) out_ds = None ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [2500, 5000, 7500, 30658] assert got_cs == expected_cs - check_tile_format(out_ds, 'PNG', 1, True) + check_tile_format(out_ds, "PNG", 1, True) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['BAND_COUNT=1']) + out_ds = gdal.OpenEx( + "/vsimem/tmp.gpkg", gdal.OF_RASTER, open_options=["BAND_COUNT=1"] + ) assert out_ds.GetRasterBand(1).GetColorTable().GetCount() == 1 out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Test metadata @@ -1668,93 +1946,106 @@ def test_gpkg_21(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) + out_ds = gdaltest.gpkg_dr.Create("/vsimem/tmp.gpkg", 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) mddlist = out_ds.GetMetadataDomainList() assert len(mddlist) == 3 out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) # No metadata for now - sql_lyr = out_ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'") + sql_lyr = out_ds.ExecuteSQL( + "SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'" + ) feat = sql_lyr.GetNextFeature() out_ds.ReleaseResultSet(sql_lyr) feat_is_none = feat is None assert feat_is_none # Set a metadata item now - out_ds.SetMetadataItem('foo', 'bar') + out_ds.SetMetadataItem("foo", "bar") out_ds = None - foo_value = 'bar' + foo_value = "bar" for i in range(4): - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) - assert not out_ds.GetMetadata('GEOPACKAGE') - if out_ds.GetMetadataItem('foo') != foo_value: + assert not out_ds.GetMetadata("GEOPACKAGE") + if out_ds.GetMetadataItem("foo") != foo_value: feat.DumpReadable() - pytest.fail(out_ds.GetMetadataItem('foo')) + pytest.fail(out_ds.GetMetadataItem("foo")) md = out_ds.GetMetadata() - if len(md) != 3 or md['foo'] != foo_value or \ - md['IDENTIFIER'] != 'tmp' or md['ZOOM_LEVEL'] != '0': + if ( + len(md) != 3 + or md["foo"] != foo_value + or md["IDENTIFIER"] != "tmp" + or md["ZOOM_LEVEL"] != "0" + ): feat.DumpReadable() pytest.fail(md) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata") feat = sql_lyr.GetNextFeature() - if feat.GetField('id') != 1 or feat.GetField('md_scope') != 'dataset' or \ - feat.GetField('md_standard_uri') != 'http://gdal.org' or \ - feat.GetField('mime_type') != 'text/xml' or \ - feat.GetField('metadata') != """ + if ( + feat.GetField("id") != 1 + or feat.GetField("md_scope") != "dataset" + or feat.GetField("md_standard_uri") != "http://gdal.org" + or feat.GetField("mime_type") != "text/xml" + or feat.GetField("metadata") + != """ %s -""" % foo_value: +""" + % foo_value + ): feat.DumpReadable() pytest.fail(i) out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata_reference") feat = sql_lyr.GetNextFeature() - if feat.GetField('reference_scope') != 'table' or \ - feat.GetField('table_name') != 'tmp' or \ - not feat.IsFieldNull('column_name') or \ - not feat.IsFieldNull('row_id_value') or \ - not feat.IsFieldSet('timestamp') or \ - feat.GetField('md_file_id') != 1 or \ - not feat.IsFieldNull('md_parent_id'): + if ( + feat.GetField("reference_scope") != "table" + or feat.GetField("table_name") != "tmp" + or not feat.IsFieldNull("column_name") + or not feat.IsFieldNull("row_id_value") + or not feat.IsFieldSet("timestamp") + or feat.GetField("md_file_id") != 1 + or not feat.IsFieldNull("md_parent_id") + ): feat.DumpReadable() pytest.fail(i) out_ds.ReleaseResultSet(sql_lyr) if i == 1: - out_ds.SetMetadataItem('foo', 'bar') + out_ds.SetMetadataItem("foo", "bar") elif i == 2: - out_ds.SetMetadataItem('foo', 'baz') - foo_value = 'baz' + out_ds.SetMetadataItem("foo", "baz") + foo_value = "baz" out_ds = None # Clear metadata - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) out_ds.SetMetadata(None) out_ds = None # No more metadata - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata") feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata_reference") feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() @@ -1762,22 +2053,22 @@ def test_gpkg_21(): pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - out_ds.SetMetadataItem('IDENTIFIER', 'my_identifier') - out_ds.SetMetadataItem('DESCRIPTION', 'my_description') + out_ds.SetMetadataItem("IDENTIFIER", "my_identifier") + out_ds.SetMetadataItem("DESCRIPTION", "my_description") out_ds = None # Still no metadata - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert out_ds.GetMetadataItem('IDENTIFIER') == 'my_identifier' - assert out_ds.GetMetadataItem('DESCRIPTION') == 'my_description' - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert out_ds.GetMetadataItem("IDENTIFIER") == "my_identifier" + assert out_ds.GetMetadataItem("DESCRIPTION") == "my_description" + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata") feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata_reference") feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() @@ -1786,103 +2077,134 @@ def test_gpkg_21(): out_ds.ReleaseResultSet(sql_lyr) # Write metadata in global scope - out_ds.SetMetadata({'bar': 'foo'}, 'GEOPACKAGE') + out_ds.SetMetadata({"bar": "foo"}, "GEOPACKAGE") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) - assert out_ds.GetMetadataItem('bar', 'GEOPACKAGE') == 'foo' + assert out_ds.GetMetadataItem("bar", "GEOPACKAGE") == "foo" - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata") feat = sql_lyr.GetNextFeature() - if feat.GetField('id') != 1 or feat.GetField('md_scope') != 'dataset' or \ - feat.GetField('md_standard_uri') != 'http://gdal.org' or \ - feat.GetField('mime_type') != 'text/xml' or \ - feat.GetField('metadata') != """ + if ( + feat.GetField("id") != 1 + or feat.GetField("md_scope") != "dataset" + or feat.GetField("md_standard_uri") != "http://gdal.org" + or feat.GetField("mime_type") != "text/xml" + or feat.GetField("metadata") + != """ foo -""": +""" + ): feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata_reference") feat = sql_lyr.GetNextFeature() - if feat.GetField('reference_scope') != 'geopackage' or \ - not feat.IsFieldNull('table_name') or \ - not feat.IsFieldNull('column_name') or \ - not feat.IsFieldNull('row_id_value') or \ - not feat.IsFieldSet('timestamp') or \ - feat.GetField('md_file_id') != 1 or \ - not feat.IsFieldNull('md_parent_id'): + if ( + feat.GetField("reference_scope") != "geopackage" + or not feat.IsFieldNull("table_name") + or not feat.IsFieldNull("column_name") + or not feat.IsFieldNull("row_id_value") + or not feat.IsFieldSet("timestamp") + or feat.GetField("md_file_id") != 1 + or not feat.IsFieldNull("md_parent_id") + ): feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - out_ds.SetMetadataItem('bar', 'baz', 'GEOPACKAGE') + out_ds.SetMetadataItem("bar", "baz", "GEOPACKAGE") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert out_ds.GetMetadataItem('bar', 'GEOPACKAGE') == 'baz' - out_ds.SetMetadata(None, 'GEOPACKAGE') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert out_ds.GetMetadataItem("bar", "GEOPACKAGE") == "baz" + out_ds.SetMetadata(None, "GEOPACKAGE") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert not out_ds.GetMetadata('GEOPACKAGE') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert not out_ds.GetMetadata("GEOPACKAGE") - out_ds.SetMetadataItem('1', '2') - out_ds.SetMetadataItem('3', '4', 'CUSTOM_DOMAIN') - out_ds.SetMetadataItem('6', '7', 'GEOPACKAGE') + out_ds.SetMetadataItem("1", "2") + out_ds.SetMetadataItem("3", "4", "CUSTOM_DOMAIN") + out_ds.SetMetadataItem("6", "7", "GEOPACKAGE") # Non GDAL metadata - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (10, 'dataset', 'uri', 'text/plain', 'my_metadata')") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',10,NULL)") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (11, 'dataset', 'uri', 'text/plain', 'other_metadata')") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',11,NULL)") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (12, 'dataset', 'uri', 'text/plain', 'my_metadata_local')") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',12,NULL)") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (13, 'dataset', 'uri', 'text/plain', 'other_metadata_local')") - out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',13,NULL)") + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata VALUES (10, 'dataset', 'uri', 'text/plain', 'my_metadata')" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',10,NULL)" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata VALUES (11, 'dataset', 'uri', 'text/plain', 'other_metadata')" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',11,NULL)" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata VALUES (12, 'dataset', 'uri', 'text/plain', 'my_metadata_local')" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',12,NULL)" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata VALUES (13, 'dataset', 'uri', 'text/plain', 'other_metadata_local')" + ) + out_ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',13,NULL)" + ) out_ds = None for i in range(2): - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert out_ds.GetMetadataItem('1') == '2' - assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1') == 'my_metadata_local', \ - out_ds.GetMetadata() - assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_2') == 'other_metadata_local', \ - out_ds.GetMetadata() - assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1', 'GEOPACKAGE') == 'my_metadata', \ - out_ds.GetMetadata('GEOPACKAGE') - assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_2', 'GEOPACKAGE') == 'other_metadata', \ - out_ds.GetMetadata('GEOPACKAGE') - assert out_ds.GetMetadataItem('3', 'CUSTOM_DOMAIN') == '4' - assert out_ds.GetMetadataItem('6', 'GEOPACKAGE') == '7' + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert out_ds.GetMetadataItem("1") == "2" + assert ( + out_ds.GetMetadataItem("GPKG_METADATA_ITEM_1") == "my_metadata_local" + ), out_ds.GetMetadata() + assert ( + out_ds.GetMetadataItem("GPKG_METADATA_ITEM_2") == "other_metadata_local" + ), out_ds.GetMetadata() + assert ( + out_ds.GetMetadataItem("GPKG_METADATA_ITEM_1", "GEOPACKAGE") + == "my_metadata" + ), out_ds.GetMetadata("GEOPACKAGE") + assert ( + out_ds.GetMetadataItem("GPKG_METADATA_ITEM_2", "GEOPACKAGE") + == "other_metadata" + ), out_ds.GetMetadata("GEOPACKAGE") + assert out_ds.GetMetadataItem("3", "CUSTOM_DOMAIN") == "4" + assert out_ds.GetMetadataItem("6", "GEOPACKAGE") == "7" out_ds.SetMetadata(out_ds.GetMetadata()) - out_ds.SetMetadata(out_ds.GetMetadata('GEOPACKAGE'), 'GEOPACKAGE') + out_ds.SetMetadata(out_ds.GetMetadata("GEOPACKAGE"), "GEOPACKAGE") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) out_ds.SetMetadata(None) - out_ds.SetMetadata(None, 'CUSTOM_DOMAIN') - out_ds.SetMetadata(None, 'GEOPACKAGE') + out_ds.SetMetadata(None, "CUSTOM_DOMAIN") + out_ds.SetMetadata(None, "GEOPACKAGE") out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) - assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1', 'GEOPACKAGE') == 'my_metadata', \ - out_ds.GetMetadata() - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata WHERE id < 10') + out_ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) + assert ( + out_ds.GetMetadataItem("GPKG_METADATA_ITEM_1", "GEOPACKAGE") == "my_metadata" + ), out_ds.GetMetadata() + sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_metadata WHERE id < 10") feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) - sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference WHERE md_file_id < 10') + sql_lyr = out_ds.ExecuteSQL( + "SELECT * FROM gpkg_metadata_reference WHERE md_file_id < 10" + ) feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() @@ -1891,23 +2213,30 @@ def test_gpkg_21(): out_ds.ReleaseResultSet(sql_lyr) out_ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Two band, PNG def get_georeferenced_greyalpha_ds(): - src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', - src_ds.RasterXSize, src_ds.RasterYSize, 2) + src_ds = gdal.Open("../gcore/data/stefan_full_greyalpha.tif") + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/tmp.tif", src_ds.RasterXSize, src_ds.RasterYSize, 2 + ) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) - tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, - src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) + tmp_ds.WriteRaster( + 0, + 0, + src_ds.RasterXSize, + src_ds.RasterYSize, + src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize), + ) return tmp_ds -def test_gpkg_22(tile_drv_name='PNG'): +def test_gpkg_22(tile_drv_name="PNG"): if gdaltest.gpkg_dr is None: pytest.skip() @@ -1917,15 +2246,15 @@ def test_gpkg_22(tile_drv_name='PNG'): pytest.skip() expected_cs = [2466, 10807] clamped_expected_cs = [1989, 1989, 1989, 11580] - if tile_drv_name == 'PNG': + if tile_drv_name == "PNG": tile_drv = gdaltest.png_dr expected_cs = [1970, 10807] clamped_expected_cs = [2100, 2100, 2100, 11580] - elif tile_drv_name == 'JPEG': + elif tile_drv_name == "JPEG": tile_drv = gdaltest.jpeg_dr expected_cs = [6782, 32706] clamped_expected_cs = [6538, 6538, 6538, 32744] - elif tile_drv_name == 'WEBP': + elif tile_drv_name == "WEBP": tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: expected_cs = [13112, 10807] @@ -1936,53 +2265,70 @@ def test_gpkg_22(tile_drv_name='PNG'): if tile_drv is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") tmp_ds = get_georeferenced_greyalpha_ds() if tile_drv_name: - options = ['TILE_FORMAT=' + tile_drv_name, 'BLOCKSIZE=16'] + options = ["TILE_FORMAT=" + tile_drv_name, "BLOCKSIZE=16"] else: - options = ['BLOCKSIZE=16'] - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=options) + options = ["BLOCKSIZE=16"] + out_ds = gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", tmp_ds, options=options) tmp_ds_filename = tmp_ds.GetDescription() ds = None gdal.Unlink(tmp_ds_filename) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=2']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=2"]) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(2)] if got_cs != expected_cs: - assert tile_drv_name == 'WEBP' and got_cs in ([4899, 10807], [6274, 10807], [17638, 10807]) + assert tile_drv_name == "WEBP" and got_cs in ( + [4899, 10807], + [6274, 10807], + [17638, 10807], + ) out_ds = None - out_ds = gdal.Open('/vsimem/tmp.gpkg') + out_ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [expected_cs[0], expected_cs[0], expected_cs[0], expected_cs[1]] if got_cs != expected_cs: - assert tile_drv_name == 'WEBP' and got_cs in ([4899, 4899, 4899, 10807], [4899, 4984, 4899, 10807], [6274, 6274, 6274, 10807], [17638, 17631, 17638, 10807]) + assert tile_drv_name == "WEBP" and got_cs in ( + [4899, 4899, 4899, 10807], + [4899, 4984, 4899, 10807], + [6274, 6274, 6274, 10807], + [17638, 17631, 17638, 10807], + ) out_ds = None - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["USE_TILE_EXTENT=YES"]) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] if got_cs != clamped_expected_cs: - assert tile_drv_name == 'WEBP' and got_cs in ([5266, 5266, 5266, 11580], [5266, 5310, 5266, 11580], [6436, 6436, 6436, 11580], [17007, 17000, 17007, 11580]) + assert tile_drv_name == "WEBP" and got_cs in ( + [5266, 5266, 5266, 11580], + [5266, 5310, 5266, 11580], + [6436, 6436, 6436, 11580], + [17007, 17000, 17007, 11580], + ) ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # Two band, JPEG def test_gpkg_23(): - return test_gpkg_22(tile_drv_name='JPEG') + return test_gpkg_22(tile_drv_name="JPEG") + ############################################################################### # Two band, WEBP def test_gpkg_24(): - return test_gpkg_22(tile_drv_name='WEBP') + return test_gpkg_22(tile_drv_name="WEBP") + ############################################################################### # Two band, mixed @@ -1991,6 +2337,7 @@ def test_gpkg_24(): def test_gpkg_25(): return test_gpkg_22(tile_drv_name=None) + ############################################################################### # Test TILING_SCHEME @@ -2002,75 +2349,100 @@ def test_gpkg_26(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') - - tests = [('CUSTOM', [4672, 4672, 4672, 4873], None), - ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], None), - ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['RESAMPLING=BILINEAR']), - ('GoogleCRS84Quad', [3417, 3417, 3417, 3691], ['RESAMPLING=CUBIC']), - ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['ZOOM_LEVEL_STRATEGY=AUTO']), - ('GoogleCRS84Quad', [14445, 14445, 14445, 14448], ['ZOOM_LEVEL_STRATEGY=UPPER']), - ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['ZOOM_LEVEL_STRATEGY=LOWER']), - ('GoogleMapsCompatible', [4118, 4118, 4118, 4406], None), - ('PseudoTMS_GlobalGeodetic', [3562, 3562, 3562, 3691], None), - ('PseudoTMS_GlobalMercator', [4118, 4118, 4118, 4406], None)] + gdal.Unlink("/vsimem/tmp.gpkg") + + tests = [ + ("CUSTOM", [4672, 4672, 4672, 4873], None), + ("GoogleCRS84Quad", [3562, 3562, 3562, 3691], None), + ("GoogleCRS84Quad", [3562, 3562, 3562, 3691], ["RESAMPLING=BILINEAR"]), + ("GoogleCRS84Quad", [3417, 3417, 3417, 3691], ["RESAMPLING=CUBIC"]), + ("GoogleCRS84Quad", [3562, 3562, 3562, 3691], ["ZOOM_LEVEL_STRATEGY=AUTO"]), + ( + "GoogleCRS84Quad", + [14445, 14445, 14445, 14448], + ["ZOOM_LEVEL_STRATEGY=UPPER"], + ), + ("GoogleCRS84Quad", [3562, 3562, 3562, 3691], ["ZOOM_LEVEL_STRATEGY=LOWER"]), + ("GoogleMapsCompatible", [4118, 4118, 4118, 4406], None), + ("PseudoTMS_GlobalGeodetic", [3562, 3562, 3562, 3691], None), + ("PseudoTMS_GlobalMercator", [4118, 4118, 4118, 4406], None), + ] for (scheme, expected_cs, other_options) in tests: - src_ds = gdal.Open('data/byte.tif') - options = ['TILE_FORMAT=PNG', 'TILING_SCHEME=' + scheme] + src_ds = gdal.Open("data/byte.tif") + options = ["TILE_FORMAT=PNG", "TILING_SCHEME=" + scheme] if other_options: options = options + other_options - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=options) + ds = gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", src_ds, options=options) ds = None - ds = gdal.Open('/vsimem/tmp.gpkg') - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Area' + ds = gdal.Open("/vsimem/tmp.gpkg") + assert ds.GetMetadataItem("AREA_OR_POINT") == "Area" got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] # VC12 returns [3561, 3561, 3561, 3691] for GoogleCRS84Quad # and For GoogleCRS84Quad RESAMPLING=CUBIC, got [3415, 3415, 3415, 3691] if max([abs(got_cs[i] - expected_cs[i]) for i in range(4)]) > 2: - print('For %s, got %s, expected %s' % (scheme, str(got_cs), str(expected_cs))) - assert gdal.GetConfigOption('APPVEYOR') is not None + print( + "For %s, got %s, expected %s" % (scheme, str(got_cs), str(expected_cs)) + ) + assert gdal.GetConfigOption("APPVEYOR") is not None ds = None - gdal.Unlink('/vsimem/tmp.gpkg') - - tests = [('GoogleCRS84Quad', [[42255, 47336, 24963, 35707], - [42255, 47336, 24965, 35707], - [42253, 47333, 24961, 35707], - [42253, 47334, 24963, 35707], # s390x - ], None), - ('GoogleMapsCompatible', [[35429, 36787, 20035, 17849]], None)] + gdal.Unlink("/vsimem/tmp.gpkg") + + tests = [ + ( + "GoogleCRS84Quad", + [ + [42255, 47336, 24963, 35707], + [42255, 47336, 24965, 35707], + [42253, 47333, 24961, 35707], + [42253, 47334, 24963, 35707], # s390x + ], + None, + ), + ("GoogleMapsCompatible", [[35429, 36787, 20035, 17849]], None), + ] for (scheme, expected_cs, other_options) in tests: - src_ds = gdal.Open('data/small_world.tif') - options = ['TILE_FORMAT=PNG', 'TILING_SCHEME=' + scheme] + src_ds = gdal.Open("data/small_world.tif") + options = ["TILE_FORMAT=PNG", "TILING_SCHEME=" + scheme] if other_options: options = options + other_options - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=options) + ds = gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", src_ds, options=options) ds = None - ds = gdal.Open('/vsimem/tmp.gpkg') + ds = gdal.Open("/vsimem/tmp.gpkg") got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] if got_cs not in expected_cs: - print('For %s, got %s, expected %s' % (scheme, str(got_cs), str(expected_cs))) - assert gdal.GetConfigOption('APPVEYOR') is not None + print( + "For %s, got %s, expected %s" % (scheme, str(got_cs), str(expected_cs)) + ) + assert gdal.GetConfigOption("APPVEYOR") is not None ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Test a few error cases gdal.PushErrorHandler() - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, options=['TILING_SCHEME=GoogleCRS84Quad', 'BLOCKSIZE=128']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", + 1, + 1, + 1, + options=["TILING_SCHEME=GoogleCRS84Quad", "BLOCKSIZE=128"], + ) gdal.PopErrorHandler() assert ds is None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, options=['TILING_SCHEME=GoogleCRS84Quad']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", 1, 1, 1, options=["TILING_SCHEME=GoogleCRS84Quad"] + ) # Test that implicit SRS registration works. - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 gdal.PushErrorHandler() ret = ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) gdal.PopErrorHandler() @@ -2085,42 +2457,62 @@ def test_gpkg_26(): ds = None gdal.PopErrorHandler() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Test with a .json tile matrix set - ds = gdal.Translate('/vsimem/tmp.gpkg', '../gdrivers/data/small_world.tif', - options='-of GPKG -co TILING_SCHEME=LINZAntarticaMapTileGrid -projwin -180 -50 180 -90') - assert ds.GetSpatialRef().GetAuthorityCode(None) == '5482' - assert ds.GetGeoTransform() == pytest.approx(((314023.27126670163, 28672, 0.0, 5685976.728733298, 0.0, -28672)), abs=1e-8) + ds = gdal.Translate( + "/vsimem/tmp.gpkg", + "../gdrivers/data/small_world.tif", + options="-of GPKG -co TILING_SCHEME=LINZAntarticaMapTileGrid -projwin -180 -50 180 -90", + ) + assert ds.GetSpatialRef().GetAuthorityCode(None) == "5482" + assert ds.GetGeoTransform() == pytest.approx( + ((314023.27126670163, 28672, 0.0, 5685976.728733298, 0.0, -28672)), abs=1e-8 + ) ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Unsupported TILING_SCHEME - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - assert gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=NZTM2000']) is None - gdal.Unlink('/vsimem/tmp.gpkg') + assert ( + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", src_ds, options=["TILING_SCHEME=NZTM2000"] + ) + is None + ) + gdal.Unlink("/vsimem/tmp.gpkg") # Invalid TILING_SCHEME - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - assert gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=invalid']) is None - gdal.Unlink('/vsimem/tmp.gpkg') + assert ( + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", src_ds, options=["TILING_SCHEME=invalid"] + ) + is None + ) + gdal.Unlink("/vsimem/tmp.gpkg") # Invalid target filename - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") gdal.PushErrorHandler() - ds = gdaltest.gpkg_dr.CreateCopy('/foo/tmp.gpkg', src_ds, options=['TILING_SCHEME=GoogleCRS84Quad']) + ds = gdaltest.gpkg_dr.CreateCopy( + "/foo/tmp.gpkg", src_ds, options=["TILING_SCHEME=GoogleCRS84Quad"] + ) gdal.PopErrorHandler() assert ds is None # Source is not georeferenced - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") gdal.PushErrorHandler() - ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=GoogleCRS84Quad']) + ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", src_ds, options=["TILING_SCHEME=GoogleCRS84Quad"] + ) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Test behaviour with low block cache max @@ -2132,18 +2524,23 @@ def test_gpkg_27(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) - src_ds = gdal.Open('data/small_world.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=200', 'BLOCKYSIZE=200']) + src_ds = gdal.Open("data/small_world.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=200", "BLOCKYSIZE=200"], + ) gdal.SetCacheMax(oldSize) expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs + ############################################################################### # Test that reading a block in a band doesn't wipe another band of the same # block that would have gone through the GPKG in-memory cache @@ -2156,16 +2553,22 @@ def test_gpkg_28(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") data = [] for b in range(3): data.append(src_ds.GetRasterBand(b + 1).ReadRaster()) expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] src_ds = None - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 3, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=400', 'BLOCKYSIZE=200']) + out_ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", + 400, + 200, + 3, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=400", "BLOCKYSIZE=200"], + ) out_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) out_ds.GetRasterBand(1).WriteRaster(0, 0, 400, 200, data[0]) @@ -2179,10 +2582,11 @@ def test_gpkg_28(): for b in range(2): out_ds.GetRasterBand(b + 2).WriteRaster(0, 0, 400, 200, data[b + 1]) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=3"]) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs + ############################################################################### # Variation of gpkg_28 with 2 blocks @@ -2194,9 +2598,9 @@ def test_gpkg_29(x=0): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") left = [] right = [] for b in range(3): @@ -2205,7 +2609,13 @@ def test_gpkg_29(x=0): expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] src_ds = None - out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 3, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=200', 'BLOCKYSIZE=200']) + out_ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", + 400, + 200, + 3, + options=["TILE_FORMAT=PNG", "BLOCKXSIZE=200", "BLOCKYSIZE=200"], + ) out_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) out_ds.GetRasterBand(1).WriteRaster(0, 0, 200, 200, left[0]) @@ -2219,10 +2629,11 @@ def test_gpkg_29(x=0): for b in range(3): out_ds.GetRasterBand(b + 1).WriteRaster(200, 0, 200, 200, right[b]) out_ds = None - out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) + out_ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=3"]) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs + ############################################################################### # Variation of gpkg_29 where the read is done in another block @@ -2231,6 +2642,7 @@ def test_gpkg_30(): return test_gpkg_29(x=200) + ############################################################################### # 1 band to RGBA @@ -2242,20 +2654,25 @@ def test_gpkg_31(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Force use of RGBA instead of Grey-Alpha (the natural use case is WEBP) # but here we can test losslessly - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', 'NO') - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', gdal.Open('data/byte.tif'), options=['TILE_FORMAT=PNG', 'BLOCKSIZE=21']) - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', None) - - ds = gdal.Open('/vsimem/tmp.gpkg') - check_tile_format(ds, 'PNG', 4, False) + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_2BANDS", "NO") + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + gdal.Open("data/byte.tif"), + options=["TILE_FORMAT=PNG", "BLOCKSIZE=21"], + ) + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_2BANDS", None) + + ds = gdal.Open("/vsimem/tmp.gpkg") + check_tile_format(ds, "PNG", 4, False) expected_cs = [4672, 4672, 4672, 4873] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs + ############################################################################### # grey-alpha to RGBA @@ -2267,25 +2684,30 @@ def test_gpkg_32(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Force use of RGBA instead of Grey-Alpha (the natural use case is WEBP) # but here we can test losslessly - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', 'NO') - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', get_georeferenced_greyalpha_ds(), options=['TILE_FORMAT=PNG', 'BLOCKSIZE=200']) - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', None) - - ds = gdal.Open('/vsimem/tmp.gpkg') - check_tile_format(ds, 'PNG', 4, False) + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_2BANDS", "NO") + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + get_georeferenced_greyalpha_ds(), + options=["TILE_FORMAT=PNG", "BLOCKSIZE=200"], + ) + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_2BANDS", None) + + ds = gdal.Open("/vsimem/tmp.gpkg") + check_tile_format(ds, "PNG", 4, False) expected_cs = [1970, 1970, 1970, 10807] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == expected_cs - ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=2']) + ds = gdal.OpenEx("/vsimem/tmp.gpkg", open_options=["BAND_COUNT=2"]) expected_cs = [1970, 10807] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == expected_cs + ############################################################################### # Single band with 32 bit color table -> RGBA @@ -2297,22 +2719,23 @@ def test_gpkg_33(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") # Force use of RGBA instead of color-table (the natural use case is WEBP) # but here we can test losslessly - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_CT', 'NO') + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_CT", "NO") src_ds = get_georeferenced_ds_with_pct32() - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG']) - gdal.SetConfigOption('GPKG_PNG_SUPPORTS_CT', None) + gdaltest.gpkg_dr.CreateCopy("/vsimem/tmp.gpkg", src_ds, options=["TILE_FORMAT=PNG"]) + gdal.SetConfigOption("GPKG_PNG_SUPPORTS_CT", None) gdal.Unlink(src_ds.GetDescription()) - ds = gdal.Open('/vsimem/tmp.gpkg') - check_tile_format(ds, 'PNG', 4, False) + ds = gdal.Open("/vsimem/tmp.gpkg") + check_tile_format(ds, "PNG", 4, False) expected_cs = [10991, 57677, 34965, 10638] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs + ############################################################################### # Test partial tiles with overviews (#6335) @@ -2324,20 +2747,33 @@ def test_gpkg_34(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') - - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 417) - src_ds.SetGeoTransform([-20037508.342789299786091, 2 * 20037508.342789299786091 / 512, 0, - 16213801.067584000527859, 0, -2 * 16213801.067584000527859 / 417]) + gdal.Unlink("/vsimem/tmp.gpkg") + + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 417) + src_ds.SetGeoTransform( + [ + -20037508.342789299786091, + 2 * 20037508.342789299786091 / 512, + 0, + 16213801.067584000527859, + 0, + -2 * 16213801.067584000527859 / 417, + ] + ) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) src_ds.SetProjection(srs.ExportToWkt()) - gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible']) - ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=["TILE_FORMAT=PNG", "TILING_SCHEME=GoogleMapsCompatible"], + ) + ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) gdal.ErrorReset() - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) ds = None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" + ############################################################################### # Test dirty block flushing while reading block (#6365) @@ -2350,15 +2786,27 @@ def test_gpkg_35(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') - - src_ds = gdal.GetDriverByName('MEM').Create('', 512, 417, 4) - src_ds.SetGeoTransform([-20037508.342789299786091, 2 * 20037508.342789299786091 / 512, 0, - 16213801.067584000527859, 0, -2 * 16213801.067584000527859 / 417]) + gdal.Unlink("/vsimem/tmp.gpkg") + + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 417, 4) + src_ds.SetGeoTransform( + [ + -20037508.342789299786091, + 2 * 20037508.342789299786091 / 512, + 0, + 16213801.067584000527859, + 0, + -2 * 16213801.067584000527859 / 417, + ] + ) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) src_ds.SetProjection(srs.ExportToWkt()) - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible']) + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/tmp.gpkg", + src_ds, + options=["TILE_FORMAT=PNG", "TILING_SCHEME=GoogleMapsCompatible"], + ) out_ds.GetRasterBand(1).Fill(32) out_ds.GetRasterBand(2).Fill(64) out_ds.GetRasterBand(3).Fill(128) @@ -2367,14 +2815,14 @@ def test_gpkg_35(): expected_data = out_ds.ReadRaster(0, 0, 256, height) out_ds = None - src_ds = gdal.GetDriverByName('MEM').Create('', 256, height, 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 256, height, 4) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(2).Fill(255) src_ds.GetRasterBand(3).Fill(255) src_ds.GetRasterBand(4).Fill(255) white_data = src_ds.ReadRaster(0, 0, 256, height) - ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) + ds = gdal.Open("/vsimem/tmp.gpkg", gdal.GA_Update) ds.WriteRaster(256, 0, 256, height, white_data) oldSize = gdal.GetCacheMax() @@ -2387,6 +2835,7 @@ def test_gpkg_35(): assert got_data == expected_data + ############################################################################### # Single band with 24 bit color table, PNG, GoogleMapsCompatible @@ -2398,20 +2847,29 @@ def test_gpkg_36(): if gdaltest.png_dr is None: pytest.skip() - src_ds = gdal.Open('data/small_world_pct.tif') - out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/gpkg_36.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible', 'RESAMPLING=NEAREST']) + src_ds = gdal.Open("data/small_world_pct.tif") + out_ds = gdaltest.gpkg_dr.CreateCopy( + "/vsimem/gpkg_36.gpkg", + src_ds, + options=[ + "TILE_FORMAT=PNG", + "TILING_SCHEME=GoogleMapsCompatible", + "RESAMPLING=NEAREST", + ], + ) out_ds = None src_ds = None expected_cs = [993, 50461, 64354, 17849] - out_ds = gdal.Open('/vsimem/gpkg_36.gpkg') + out_ds = gdal.Open("/vsimem/gpkg_36.gpkg") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None out_ds = None - gdal.Unlink('/vsimem/gpkg_36.gpkg') + gdal.Unlink("/vsimem/gpkg_36.gpkg") + ############################################################################### # Test that we don't crash when generating big overview factors on rasters with big dimensions @@ -2424,16 +2882,17 @@ def test_gpkg_37(): if gdaltest.gpkg_dr is None: pytest.skip() - ds = gdal.GetDriverByName('GPKG').Create('/vsimem/gpkg_37.gpkg', 205000, 200000) + ds = gdal.GetDriverByName("GPKG").Create("/vsimem/gpkg_37.gpkg", 205000, 200000) ds.SetGeoTransform([100, 0.000001, 0, 100, 0, -0.000001]) ds = None - ds = gdal.Open('/vsimem/gpkg_37.gpkg', gdal.GA_Update) - ret = ds.BuildOverviews('NONE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) - assert ret == 0 and gdal.GetLastErrorMsg() == '' + ds = gdal.Open("/vsimem/gpkg_37.gpkg", gdal.GA_Update) + ret = ds.BuildOverviews("NONE", [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) + assert ret == 0 and gdal.GetLastErrorMsg() == "" ds = None - gdal.Unlink('/vsimem/gpkg_37.gpkg') + gdal.Unlink("/vsimem/gpkg_37.gpkg") + ############################################################################### # Test generating more than 1000 tiles @@ -2445,30 +2904,37 @@ def test_gpkg_38(): pytest.skip() # Without padding, immediately after create copy - src_ds = gdal.Open('data/small_world.tif') - gdaltest.gpkg_dr.CreateCopy('/vsimem/gpkg_38.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) + src_ds = gdal.Open("data/small_world.tif") + gdaltest.gpkg_dr.CreateCopy( + "/vsimem/gpkg_38.gpkg", src_ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=8"] + ) - ds = gdal.Open('/vsimem/gpkg_38.gpkg') + ds = gdal.Open("/vsimem/gpkg_38.gpkg") assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None - filesize = gdal.VSIStatL('/vsimem/gpkg_38.gpkg').size - gdal.Unlink('/vsimem/gpkg_38.gpkg') + filesize = gdal.VSIStatL("/vsimem/gpkg_38.gpkg").size + gdal.Unlink("/vsimem/gpkg_38.gpkg") - filename = '/vsimem/||maxlength=%d||gpkg_38.gpkg' % (filesize - 100000) + filename = "/vsimem/||maxlength=%d||gpkg_38.gpkg" % (filesize - 100000) with gdaltest.error_handler(): - ds = gdaltest.gpkg_dr.CreateCopy(filename, src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) + ds = gdaltest.gpkg_dr.CreateCopy( + filename, src_ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=8"] + ) ds_is_none = ds is None ds = None gdal.Unlink(filename) - assert ds_is_none or gdal.GetLastErrorMsg() != '' + assert ds_is_none or gdal.GetLastErrorMsg() != "" - filename = '/vsimem/||maxlength=%d||gpkg_38.gpkg' % (filesize - 1) + filename = "/vsimem/||maxlength=%d||gpkg_38.gpkg" % (filesize - 1) with gdaltest.error_handler(): - ds = gdaltest.gpkg_dr.CreateCopy(filename, src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) + ds = gdaltest.gpkg_dr.CreateCopy( + filename, src_ds, options=["TILE_FORMAT=PNG", "BLOCKSIZE=8"] + ) ds_is_none = ds is None ds = None gdal.Unlink(filename) - assert ds_is_none or gdal.GetLastErrorMsg() != '' + assert ds_is_none or gdal.GetLastErrorMsg() != "" + ############################################################################### # Test tile gridded coverage data @@ -2479,29 +2945,31 @@ def test_gpkg_39(): if gdaltest.gpkg_dr is None: pytest.skip() - src_ds = gdal.Open('data/int16.tif') - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG') + src_ds = gdal.Open("data/int16.tif") + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG") - assert validate('/vsimem/gpkg_39.gpkg'), 'validation failed' + assert validate("/vsimem/gpkg_39.gpkg"), "validation failed" - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Area' - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + assert ds.GetMetadataItem("AREA_OR_POINT") == "Area" + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() - if f['scale'] != 1.0: + if f["scale"] != 1.0: f.DumpReadable() pytest.fail() - if f['offset'] != 0.0: + if f["offset"] != 0.0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('SELECT grid_cell_encoding FROM gpkg_2d_gridded_coverage_ancillary') + sql_lyr = ds.ExecuteSQL( + "SELECT grid_cell_encoding FROM gpkg_2d_gridded_coverage_ancillary" + ) f = sql_lyr.GetNextFeature() - if f['grid_cell_encoding'] != 'grid-value-is-area': + if f["grid_cell_encoding"] != "grid-value-is-area": f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) @@ -2513,15 +2981,15 @@ def test_gpkg_39(): feat_is_none = feat is None assert feat_is_none - sql_lyr = ds.ExecuteSQL('PRAGMA application_id') + sql_lyr = ds.ExecuteSQL("PRAGMA application_id") f = sql_lyr.GetNextFeature() - if f['application_id'] != 1196444487: + if f["application_id"] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('PRAGMA user_version') + sql_lyr = ds.ExecuteSQL("PRAGMA user_version") f = sql_lyr.GetNextFeature() - if f['user_version'] != 10200: + if f["user_version"] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) @@ -2532,19 +3000,26 @@ def test_gpkg_39(): ds = None # From a AREA_OR_POINT=Point dataset - gdal.Translate('/vsimem/gpkg_39.gpkg', 'data/n43.dt0', format='GPKG') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', ds.GetMetadata() - assert ds.GetRasterBand(1).GetUnitType() == 'm' + gdal.Translate("/vsimem/gpkg_39.gpkg", "data/n43.dt0", format="GPKG") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point", ds.GetMetadata() + assert ds.GetRasterBand(1).GetUnitType() == "m" ds = None # Test GRID_CELL_ENCODING=grid-value-is-corner - gdal.Translate('/vsimem/gpkg_39.gpkg', 'data/byte.tif', format='GPKG', - outputType=gdal.GDT_UInt16, - creationOptions=['GRID_CELL_ENCODING=grid-value-is-corner']) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', ds.GetMetadata() - assert ds.GetRasterBand(1).GetMetadataItem('GRID_CELL_ENCODING') == 'grid-value-is-corner' + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "data/byte.tif", + format="GPKG", + outputType=gdal.GDT_UInt16, + creationOptions=["GRID_CELL_ENCODING=grid-value-is-corner"], + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") + assert ds.GetMetadataItem("AREA_OR_POINT") == "Point", ds.GetMetadata() + assert ( + ds.GetRasterBand(1).GetMetadataItem("GRID_CELL_ENCODING") + == "grid-value-is-corner" + ) # No metadata for now sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'") @@ -2556,218 +3031,302 @@ def test_gpkg_39(): ds = None # With nodata: statistics available - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=0) + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", noData=0) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + ds = gdal.Open("/vsimem/gpkg_39.gpkg") md = ds.GetRasterBand(1).GetMetadata() - assert md == {'STATISTICS_MINIMUM': '74', 'STATISTICS_MAXIMUM': '255'} + assert md == {"STATISTICS_MINIMUM": "74", "STATISTICS_MAXIMUM": "255"} ds = None - ds = gdal.Open('/vsimem/gpkg_39.gpkg') - mdi = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') - assert mdi == '74' + ds = gdal.Open("/vsimem/gpkg_39.gpkg") + mdi = ds.GetRasterBand(1).GetMetadataItem("STATISTICS_MINIMUM") + assert mdi == "74" ds = None # Entire tile: statistics available - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', width=256, height=256) + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", width=256, height=256) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + ds = gdal.Open("/vsimem/gpkg_39.gpkg") md = ds.GetRasterBand(1).GetMetadata() - assert md == {'STATISTICS_MINIMUM': '74', 'STATISTICS_MAXIMUM': '255'} + assert md == {"STATISTICS_MINIMUM": "74", "STATISTICS_MAXIMUM": "255"} ds = None - ds = gdal.Open('/vsimem/gpkg_39.gpkg') - mdi = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') - assert mdi == '74' + ds = gdal.Open("/vsimem/gpkg_39.gpkg") + mdi = ds.GetRasterBand(1).GetMetadataItem("STATISTICS_MINIMUM") + assert mdi == "74" ds = None - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", noData=1) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=74) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", noData=74) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") cs = ds.GetRasterBand(1).Checksum() assert cs == 4649 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1, creationOptions=['TILING_SCHEME=GoogleMapsCompatible']) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + noData=1, + creationOptions=["TILING_SCHEME=GoogleMapsCompatible"], + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") cs = ds.GetRasterBand(1).Checksum() assert cs == 4118 or cs == 4077 - gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', 'YES') - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1, creationOptions=['TILING_SCHEME=GoogleMapsCompatible']) - gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', None) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.SetConfigOption("GPKG_ADD_DEFINITION_12_063", "YES") + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + noData=1, + creationOptions=["TILING_SCHEME=GoogleMapsCompatible"], + ) + gdal.SetConfigOption("GPKG_ADD_DEFINITION_12_063", None) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") cs = ds.GetRasterBand(1).Checksum() assert cs == 4118 or cs == 4077 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', width=1024, height=1024) - ds = gdal.Open('/vsimem/gpkg_39.gpkg', gdal.GA_Update) - ds.BuildOverviews('NEAR', [2, 4]) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", width=1024, height=1024 + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg", gdal.GA_Update) + ds.BuildOverviews("NEAR", [2, 4]) assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 37308 - ds.BuildOverviews('NONE', []) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + ds.BuildOverviews("NONE", []) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).GetOverviewCount() == 0 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", outputType=gdal.GDT_UInt16 + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).Checksum() == 4672 - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() - assert f['scale'] == 1.0 + assert f["scale"] == 1.0 ds.ReleaseResultSet(sql_lyr) - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16, noData=1) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + outputType=gdal.GDT_UInt16, + noData=1, + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 1.0 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16, noData=74) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + outputType=gdal.GDT_UInt16, + noData=74, + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 74.0 - src_ds = gdal.Open('data/float32.tif') - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + src_ds = gdal.Open("data/float32.tif") + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == 4672 - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() - assert f.GetField('scale') == 1.0 + assert f.GetField("scale") == 1.0 ds.ReleaseResultSet(sql_lyr) - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate("/vsimem/gpkg_39.gpkg", src_ds, format="GPKG", noData=1) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 1 - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', creationOptions=['TILE_FORMAT=PNG']) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + creationOptions=["TILE_FORMAT=PNG"], + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == 4672 - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() - assert f['scale'] != 1.0 and f.IsFieldSetAndNotNull('scale') + assert f["scale"] != 1.0 and f.IsFieldSetAndNotNull("scale") ds.ReleaseResultSet(sql_lyr) - gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=74, creationOptions=['TILE_FORMAT=PNG']) - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + src_ds, + format="GPKG", + noData=74, + creationOptions=["TILE_FORMAT=PNG"], + ) + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 - assert ds.GetRasterBand(1).GetNoDataValue() == pytest.approx(-3.4028234663852885981e+38, rel=1e-8) + assert ds.GetRasterBand(1).GetNoDataValue() == pytest.approx( + -3.4028234663852885981e38, rel=1e-8 + ) cs = ds.GetRasterBand(1).Checksum() assert cs == 4651 - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() - assert f['scale'] != 1.0 and f.IsFieldSetAndNotNull('scale') + assert f["scale"] != 1.0 and f.IsFieldSetAndNotNull("scale") ds.ReleaseResultSet(sql_lyr) # Particular case with nodata = -32768 for Int16 - gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', - """ncols 6 + gdal.FileFromMemBuffer( + "/vsimem/gpkg_39.asc", + """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value -32768 - -32768 -32767 -32766 0 32766 32767""") - gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Int16) - src_ds = gdal.Open('/vsimem/gpkg_39.asc') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') + -32768 -32767 -32766 0 32766 32767""", + ) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "/vsimem/gpkg_39.asc", + format="GPKG", + outputType=gdal.GDT_Int16, + ) + src_ds = gdal.Open("/vsimem/gpkg_39.asc") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None - gdal.Unlink('/vsimem/gpkg_39.asc') + gdal.Unlink("/vsimem/gpkg_39.asc") # Particular case with nodata = 65535 for UInt16 - gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', - """ncols 6 + gdal.FileFromMemBuffer( + "/vsimem/gpkg_39.asc", + """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value 65535 -0 1 2 65533 65534 65535""") - gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_UInt16) - src_ds = gdal.Open('/vsimem/gpkg_39.asc') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') +0 1 2 65533 65534 65535""", + ) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "/vsimem/gpkg_39.asc", + format="GPKG", + outputType=gdal.GDT_UInt16, + ) + src_ds = gdal.Open("/vsimem/gpkg_39.asc") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).GetNoDataValue() == 65535.0 - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None - gdal.Unlink('/vsimem/gpkg_39.asc') + gdal.Unlink("/vsimem/gpkg_39.asc") # Particular case with nodata = 0 for UInt16 - gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', - """ncols 6 + gdal.FileFromMemBuffer( + "/vsimem/gpkg_39.asc", + """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value 0 -0 1 2 65533 65534 65535""") - gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_UInt16) - src_ds = gdal.Open('/vsimem/gpkg_39.asc') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') +0 1 2 65533 65534 65535""", + ) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "/vsimem/gpkg_39.asc", + format="GPKG", + outputType=gdal.GDT_UInt16, + ) + src_ds = gdal.Open("/vsimem/gpkg_39.asc") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).GetNoDataValue() == 0 - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None - gdal.Unlink('/vsimem/gpkg_39.asc') + gdal.Unlink("/vsimem/gpkg_39.asc") # Test large dynamic for Float32 and TILE_FORMAT=PNG - gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', - """ncols 2 + gdal.FileFromMemBuffer( + "/vsimem/gpkg_39.asc", + """ncols 2 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 --100000 100000""") - gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Float32, creationOptions=['TILE_FORMAT=PNG']) - - assert validate('/vsimem/gpkg_39.gpkg'), 'validation failed' - - src_ds = gdal.Open('/vsimem/gpkg_39.asc') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') +-100000 100000""", + ) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "/vsimem/gpkg_39.asc", + format="GPKG", + outputType=gdal.GDT_Float32, + creationOptions=["TILE_FORMAT=PNG"], + ) + + assert validate("/vsimem/gpkg_39.gpkg"), "validation failed" + + src_ds = gdal.Open("/vsimem/gpkg_39.asc") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None - gdal.Unlink('/vsimem/gpkg_39.asc') + gdal.Unlink("/vsimem/gpkg_39.asc") # Test large dynamic for Float32 and TILE_FORMAT=PNG and nodata - gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', - """ncols 2 + gdal.FileFromMemBuffer( + "/vsimem/gpkg_39.asc", + """ncols 2 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 --100000 100000""") - gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Float32, noData=0, creationOptions=['TILE_FORMAT=PNG']) - src_ds = gdal.Open('/vsimem/gpkg_39.asc') - ds = gdal.Open('/vsimem/gpkg_39.gpkg') +-100000 100000""", + ) + gdal.Translate( + "/vsimem/gpkg_39.gpkg", + "/vsimem/gpkg_39.asc", + format="GPKG", + outputType=gdal.GDT_Float32, + noData=0, + creationOptions=["TILE_FORMAT=PNG"], + ) + src_ds = gdal.Open("/vsimem/gpkg_39.asc") + ds = gdal.Open("/vsimem/gpkg_39.gpkg") assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - ds.GetRasterBand(1).GetNoDataValue() + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None - gdal.Unlink('/vsimem/gpkg_39.asc') + gdal.Unlink("/vsimem/gpkg_39.asc") # Test that we can delete an existing tile - ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_UInt16) + ds = gdaltest.gpkg_dr.Create("/vsimem/gpkg_39.gpkg", 256, 256, 1, gdal.GDT_UInt16) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) @@ -2777,32 +3336,32 @@ def test_gpkg_39(): ds.GetRasterBand(1).FlushCache() ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(1).FlushCache() - sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') + sql_lyr = ds.ExecuteSQL("SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary") f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/gpkg_39.gpkg') + gdal.Unlink("/vsimem/gpkg_39.gpkg") # Test detecting tiles at zero (without nodata value) - ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_Float32) + ds = gdaltest.gpkg_dr.Create("/vsimem/gpkg_39.gpkg", 256, 256, 1, gdal.GDT_Float32) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(1).FlushCache() - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_39') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_39") f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/gpkg_39.gpkg') + gdal.Unlink("/vsimem/gpkg_39.gpkg") # Test detecting tiles at nodata value - ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_Float32) + ds = gdaltest.gpkg_dr.Create("/vsimem/gpkg_39.gpkg", 256, 256, 1, gdal.GDT_Float32) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) @@ -2810,14 +3369,15 @@ def test_gpkg_39(): ds.GetRasterBand(1).SetNoDataValue(2) ds.GetRasterBand(1).Fill(2) ds.GetRasterBand(1).FlushCache() - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_39') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_39") f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/gpkg_39.gpkg') - gdal.Unlink('/vsimem/gpkg_39.gpkg.aux.xml') + gdal.Unlink("/vsimem/gpkg_39.gpkg") + gdal.Unlink("/vsimem/gpkg_39.gpkg.aux.xml") + ############################################################################### # Test VERSION @@ -2828,77 +3388,85 @@ def test_gpkg_40(): if gdaltest.gpkg_dr is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") # Should default to 1.2 - gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG') - ds = gdal.Open('/vsimem/gpkg_40.gpkg') - sql_lyr = ds.ExecuteSQL('PRAGMA application_id') + gdal.Translate("/vsimem/gpkg_40.gpkg", src_ds, format="GPKG") + ds = gdal.Open("/vsimem/gpkg_40.gpkg") + sql_lyr = ds.ExecuteSQL("PRAGMA application_id") f = sql_lyr.GetNextFeature() - if f['application_id'] != 1196444487: + if f["application_id"] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('PRAGMA user_version') + sql_lyr = ds.ExecuteSQL("PRAGMA user_version") f = sql_lyr.GetNextFeature() - if f['user_version'] != 10200: + if f["user_version"] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None # Should default to 1.2 if we didn't override it. - gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', - outputType=gdal.GDT_Int16, creationOptions=['VERSION=1.0']) - ds = gdal.Open('/vsimem/gpkg_40.gpkg') - sql_lyr = ds.ExecuteSQL('PRAGMA application_id') + gdal.Translate( + "/vsimem/gpkg_40.gpkg", + src_ds, + format="GPKG", + outputType=gdal.GDT_Int16, + creationOptions=["VERSION=1.0"], + ) + ds = gdal.Open("/vsimem/gpkg_40.gpkg") + sql_lyr = ds.ExecuteSQL("PRAGMA application_id") f = sql_lyr.GetNextFeature() - if f['application_id'] != 1196437808: + if f["application_id"] != 1196437808: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('PRAGMA user_version') + sql_lyr = ds.ExecuteSQL("PRAGMA user_version") f = sql_lyr.GetNextFeature() - if f['user_version'] != 0: + if f["user_version"] != 0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', - creationOptions=['VERSION=1.1']) - ds = gdal.Open('/vsimem/gpkg_40.gpkg') - sql_lyr = ds.ExecuteSQL('PRAGMA application_id') + gdal.Translate( + "/vsimem/gpkg_40.gpkg", src_ds, format="GPKG", creationOptions=["VERSION=1.1"] + ) + ds = gdal.Open("/vsimem/gpkg_40.gpkg") + sql_lyr = ds.ExecuteSQL("PRAGMA application_id") f = sql_lyr.GetNextFeature() - if f['application_id'] != 1196437809: + if f["application_id"] != 1196437809: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('PRAGMA user_version') + sql_lyr = ds.ExecuteSQL("PRAGMA user_version") f = sql_lyr.GetNextFeature() - if f['user_version'] != 0: + if f["user_version"] != 0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', - creationOptions=['VERSION=1.2']) - ds = gdal.Open('/vsimem/gpkg_40.gpkg') - sql_lyr = ds.ExecuteSQL('PRAGMA application_id') + gdal.Translate( + "/vsimem/gpkg_40.gpkg", src_ds, format="GPKG", creationOptions=["VERSION=1.2"] + ) + ds = gdal.Open("/vsimem/gpkg_40.gpkg") + sql_lyr = ds.ExecuteSQL("PRAGMA application_id") f = sql_lyr.GetNextFeature() - if f['application_id'] != 1196444487: + if f["application_id"] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('PRAGMA user_version') + sql_lyr = ds.ExecuteSQL("PRAGMA user_version") f = sql_lyr.GetNextFeature() - if f['user_version'] != 10200: + if f["user_version"] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/gpkg_40.gpkg') + gdal.Unlink("/vsimem/gpkg_40.gpkg") + ############################################################################### # Robustness test @@ -2906,18 +3474,25 @@ def test_gpkg_40(): def test_gpkg_41(): - if gdaltest.gpkg_dr is None or gdal.GetConfigOption('TRAVIS') is not None or \ - gdal.GetConfigOption('APPVEYOR') is not None: + if ( + gdaltest.gpkg_dr is None + or gdal.GetConfigOption("TRAVIS") is not None + or gdal.GetConfigOption("APPVEYOR") is not None + ): pytest.skip() - gdal.SetConfigOption('GPKG_ALLOW_CRAZY_SETTINGS', 'YES') + gdal.SetConfigOption("GPKG_ALLOW_CRAZY_SETTINGS", "YES") with gdaltest.error_handler(): - gdal.Translate('/vsimem/gpkg_41.gpkg', 'data/gpkg/huge_line.tif', - format='GPKG', creationOptions=[ - 'BLOCKXSIZE=500000000', 'BLOCKYSIZE=1']) - gdal.SetConfigOption('GPKG_ALLOW_CRAZY_SETTINGS', None) + gdal.Translate( + "/vsimem/gpkg_41.gpkg", + "data/gpkg/huge_line.tif", + format="GPKG", + creationOptions=["BLOCKXSIZE=500000000", "BLOCKYSIZE=1"], + ) + gdal.SetConfigOption("GPKG_ALLOW_CRAZY_SETTINGS", None) + + gdal.Unlink("/vsimem/gpkg_41.gpkg") - gdal.Unlink('/vsimem/gpkg_41.gpkg') ############################################################################### # Test opening in vector mode a database without gpkg_geometry_columns @@ -2928,22 +3503,25 @@ def test_gpkg_42(): if gdaltest.gpkg_dr is None: pytest.skip() - gdal.SetConfigOption('CREATE_GEOMETRY_COLUMNS', 'NO') - gdal.Translate('/vsimem/gpkg_42.gpkg', 'data/byte.tif', format='GPKG') - gdal.SetConfigOption('CREATE_GEOMETRY_COLUMNS', None) + gdal.SetConfigOption("CREATE_GEOMETRY_COLUMNS", "NO") + gdal.Translate("/vsimem/gpkg_42.gpkg", "data/byte.tif", format="GPKG") + gdal.SetConfigOption("CREATE_GEOMETRY_COLUMNS", None) - ds = gdal.OpenEx('/vsimem/gpkg_42.gpkg', gdal.OF_VECTOR | gdal.OF_UPDATE) - sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_geometry_columns'") + ds = gdal.OpenEx("/vsimem/gpkg_42.gpkg", gdal.OF_VECTOR | gdal.OF_UPDATE) + sql_lyr = ds.ExecuteSQL( + "SELECT 1 FROM sqlite_master WHERE name = 'gpkg_geometry_columns'" + ) fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") assert lyr is not None ds.FlushCache() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - gdal.Unlink('/vsimem/gpkg_42.gpkg') + gdal.Unlink("/vsimem/gpkg_42.gpkg") + ############################################################################### # Test adding raster to a database without pre-existing raster support tables. @@ -2954,29 +3532,36 @@ def test_gpkg_43(): if gdaltest.gpkg_dr is None: pytest.skip() - gdal.SetConfigOption('CREATE_RASTER_TABLES', 'NO') - ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_43.gpkg', 0, 0, 0, gdal.GDT_Unknown) - gdal.SetConfigOption('CREATE_RASTER_TABLES', None) - ds.CreateLayer('foo') + gdal.SetConfigOption("CREATE_RASTER_TABLES", "NO") + ds = gdaltest.gpkg_dr.Create("/vsimem/gpkg_43.gpkg", 0, 0, 0, gdal.GDT_Unknown) + gdal.SetConfigOption("CREATE_RASTER_TABLES", None) + ds.CreateLayer("foo") ds = None - ds = gdal.OpenEx('/vsimem/gpkg_43.gpkg', gdal.OF_UPDATE) - sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_tile_matrix_set'") + ds = gdal.OpenEx("/vsimem/gpkg_43.gpkg", gdal.OF_UPDATE) + sql_lyr = ds.ExecuteSQL( + "SELECT 1 FROM sqlite_master WHERE name = 'gpkg_tile_matrix_set'" + ) fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds = None - gdal.Translate('/vsimem/gpkg_43.gpkg', 'data/byte.tif', - format='GPKG', creationOptions=['APPEND_SUBDATASET=YES']) - ds = gdal.OpenEx('/vsimem/gpkg_43.gpkg') + gdal.Translate( + "/vsimem/gpkg_43.gpkg", + "data/byte.tif", + format="GPKG", + creationOptions=["APPEND_SUBDATASET=YES"], + ) + ds = gdal.OpenEx("/vsimem/gpkg_43.gpkg") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetLayerCount() == 1 ds = None - assert validate('/vsimem/gpkg_43.gpkg'), 'validation failed' + assert validate("/vsimem/gpkg_43.gpkg"), "validation failed" + + gdal.Unlink("/vsimem/gpkg_43.gpkg") - gdal.Unlink('/vsimem/gpkg_43.gpkg') ############################################################################### # Test opening a .gpkg.sql file @@ -2987,11 +3572,12 @@ def test_gpkg_44(): if gdaltest.gpkg_dr is None: pytest.skip() - if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': + if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != "YES": pytest.skip() - ds = gdal.Open('data/gpkg/byte.gpkg.sql') - assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' + ds = gdal.Open("data/gpkg/byte.gpkg.sql") + assert ds.GetRasterBand(1).Checksum() == 4672, "validation failed" + ############################################################################### # Test opening a .gpkg file @@ -3002,8 +3588,9 @@ def test_gpkg_45(): if gdaltest.gpkg_dr is None: pytest.skip() - ds = gdal.Open('data/gpkg/byte.gpkg') - assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' + ds = gdal.Open("data/gpkg/byte.gpkg") + assert ds.GetRasterBand(1).Checksum() == 4672, "validation failed" + ############################################################################### # Test fix for #6932 @@ -3014,36 +3601,44 @@ def test_gpkg_46(): if gdaltest.gpkg_dr is None: pytest.skip() - ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_46.gpkg', 6698, 6698, - options=['TILING_SCHEME=GoogleMapsCompatible']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/gpkg_46.gpkg", + 6698, + 6698, + options=["TILING_SCHEME=GoogleMapsCompatible"], + ) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) ds.SetProjection(srs.ExportToWkt()) ds.SetGeoTransform([500, 0.037322767717371, 0, 750, 0, -0.037322767717371]) ds = None - ds = gdal.Open('/vsimem/gpkg_46.gpkg', gdal.GA_Update) - ds.BuildOverviews('NEAR', [2, 4, 8, 16, 32, 64, 128, 256]) + ds = gdal.Open("/vsimem/gpkg_46.gpkg", gdal.GA_Update) + ds.BuildOverviews("NEAR", [2, 4, 8, 16, 32, 64, 128, 256]) ds = None - ds = gdal.Open('/vsimem/gpkg_46.gpkg') - sql_lyr = ds.ExecuteSQL('SELECT zoom_level, matrix_width * pixel_x_size * tile_width, matrix_height * pixel_y_size * tile_height FROM gpkg_tile_matrix ORDER BY zoom_level') + ds = gdal.Open("/vsimem/gpkg_46.gpkg") + sql_lyr = ds.ExecuteSQL( + "SELECT zoom_level, matrix_width * pixel_x_size * tile_width, matrix_height * pixel_y_size * tile_height FROM gpkg_tile_matrix ORDER BY zoom_level" + ) count = 0 for f in sql_lyr: count += 1 - if f.GetField(1) != pytest.approx(40075016.6855785, abs=1e-7) or \ - f.GetField(2) != pytest.approx(40075016.6855785, abs=1e-7): + if f.GetField(1) != pytest.approx(40075016.6855785, abs=1e-7) or f.GetField( + 2 + ) != pytest.approx(40075016.6855785, abs=1e-7): f.DumpReadable() ds.ReleaseResultSet(sql_lyr) - gdal.Unlink('/vsimem/gpkg_46.gpkg') + gdal.Unlink("/vsimem/gpkg_46.gpkg") pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/gpkg_46.gpkg') + gdal.Unlink("/vsimem/gpkg_46.gpkg") assert count == 23 + ############################################################################### # Test fix for #6976 @@ -3053,10 +3648,9 @@ def test_gpkg_47(): if gdaltest.gpkg_dr is None: pytest.skip() - tmpfile = '/vsimem/gpkg_47.gpkg' - ds = gdaltest.gpkg_dr.CreateCopy(tmpfile, - gdal.Open('data/byte.tif')) - ds.ExecuteSQL('UPDATE gpkg_contents SET min_x = 1, max_x = 0') + tmpfile = "/vsimem/gpkg_47.gpkg" + ds = gdaltest.gpkg_dr.CreateCopy(tmpfile, gdal.Open("data/byte.tif")) + ds.ExecuteSQL("UPDATE gpkg_contents SET min_x = 1, max_x = 0") ds = None with gdaltest.error_handler(): ds = gdal.Open(tmpfile) @@ -3065,6 +3659,7 @@ def test_gpkg_47(): gdal.Unlink(tmpfile) + ############################################################################### # Test fix for https://issues.qgis.org/issues/16997 (opening a file with # subdatasets on Windows) @@ -3075,20 +3670,27 @@ def test_gpkg_48(): if gdaltest.gpkg_dr is None: pytest.skip() - if sys.platform == 'win32': - filename = os.path.join(os.getcwd(), 'tmp', 'byte.gpkg') + if sys.platform == "win32": + filename = os.path.join(os.getcwd(), "tmp", "byte.gpkg") else: # Test Windows code path in a weird way... - filename = 'C:\\byte.gpkg' - - gdal.Translate(filename, 'data/byte.tif', format='GPKG', creationOptions=['RASTER_TABLE=foo']) - gdal.Translate(filename, 'data/byte.tif', format='GPKG', creationOptions=['APPEND_SUBDATASET=YES', 'RASTER_TABLE=bar']) - ds = gdal.Open('GPKG:' + filename + ':foo') + filename = "C:\\byte.gpkg" + + gdal.Translate( + filename, "data/byte.tif", format="GPKG", creationOptions=["RASTER_TABLE=foo"] + ) + gdal.Translate( + filename, + "data/byte.tif", + format="GPKG", + creationOptions=["APPEND_SUBDATASET=YES", "RASTER_TABLE=bar"], + ) + ds = gdal.Open("GPKG:" + filename + ":foo") if ds is None: gdal.Unlink(filename) pytest.fail() ds = None - ds = gdal.Open('GPKG:' + filename + ':bar') + ds = gdal.Open("GPKG:" + filename + ":bar") if ds is None: gdal.Unlink(filename) pytest.fail() @@ -3096,6 +3698,7 @@ def test_gpkg_48(): gdal.Unlink(filename) + ############################################################################### @@ -3104,25 +3707,26 @@ def test_gpkg_delete_raster_layer(): if gdaltest.gpkg_dr is None: pytest.skip() - filename = '/vsimem/byte.gpkg' - gdal.Translate(filename, 'data/byte.tif', format='GPKG', - creationOptions=['RASTER_TABLE=foo']) + filename = "/vsimem/byte.gpkg" + gdal.Translate( + filename, "data/byte.tif", format="GPKG", creationOptions=["RASTER_TABLE=foo"] + ) ds = ogr.Open(filename, update=1) - ds.ExecuteSQL('DROP TABLE foo') - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_metadata') + ds.ExecuteSQL("DROP TABLE foo") + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_metadata") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) - ds.ExecuteSQL('VACUUM') + ds.ExecuteSQL("VACUUM") ds = None assert fc == 0 # Check that there is no more any reference to the layer - f = gdal.VSIFOpenL(filename, 'rb') - content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') + f = gdal.VSIFOpenL(filename, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) - assert 'foo' not in content + assert "foo" not in content gdal.Unlink(filename) @@ -3135,20 +3739,24 @@ def test_gpkg_delete_gridded_coverage_raster_layer(): if gdaltest.gpkg_dr is None: pytest.skip() - filename = '/vsimem/float32.gpkg' - gdal.Translate(filename, 'data/float32.tif', format='GPKG', - creationOptions=['RASTER_TABLE=foo']) + filename = "/vsimem/float32.gpkg" + gdal.Translate( + filename, + "data/float32.tif", + format="GPKG", + creationOptions=["RASTER_TABLE=foo"], + ) ds = ogr.Open(filename, update=1) - ds.ExecuteSQL('DROP TABLE foo') - ds.ExecuteSQL('VACUUM') + ds.ExecuteSQL("DROP TABLE foo") + ds.ExecuteSQL("VACUUM") ds = None # Check that there is no more any reference to the layer - f = gdal.VSIFOpenL(filename, 'rb') - content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') + f = gdal.VSIFOpenL(filename, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) - assert 'foo' not in content + assert "foo" not in content gdal.Unlink(filename) @@ -3160,11 +3768,12 @@ def test_gpkg_open_old_gpkg_elevation_tiles_extension(): pytest.skip() gdal.ErrorReset() - ds = gdal.Open('data/gpkg/uint16-old-elevation-extension.gpkg') - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/gpkg/uint16-old-elevation-extension.gpkg") + assert gdal.GetLastErrorMsg() == "" cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 + ############################################################################### @@ -3174,13 +3783,23 @@ def test_gpkg_GeneralCmdLineProcessor(): pytest.skip() import test_cli_utilities - if test_cli_utilities.get_gdalinfo_path() is not None and test_cli_utilities.get_ogrinfo_path() is not None: - ret_gdalinfo = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --format GPKG') - ret_ogrinfo = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --format GPKG') - assert ('' in ret_gdalinfo and \ - '' in ret_ogrinfo and \ - 'scope=' not in ret_gdalinfo and \ - 'scope=' not in ret_ogrinfo) + + if ( + test_cli_utilities.get_gdalinfo_path() is not None + and test_cli_utilities.get_ogrinfo_path() is not None + ): + ret_gdalinfo = gdaltest.runexternal( + test_cli_utilities.get_gdalinfo_path() + " --format GPKG" + ) + ret_ogrinfo = gdaltest.runexternal( + test_cli_utilities.get_ogrinfo_path() + " --format GPKG" + ) + assert ( + "" in ret_gdalinfo + and "" in ret_ogrinfo + and "scope=" not in ret_gdalinfo + and "scope=" not in ret_ogrinfo + ) ############################################################################### @@ -3191,15 +3810,17 @@ def test_gpkg_match_overview_factor(): if gdaltest.gpkg_dr is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/gpkg_match_overview_factor.gpkg', - open('data/gpkg/test_match_overview_factor.gpkg', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/gpkg_match_overview_factor.gpkg", + open("data/gpkg/test_match_overview_factor.gpkg", "rb").read(), + ) - ds = gdal.Open('/vsimem/gpkg_match_overview_factor.gpkg', gdal.GA_Update) - ret = ds.BuildOverviews('NONE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) - assert ret == 0 and gdal.GetLastErrorMsg() == '' + ds = gdal.Open("/vsimem/gpkg_match_overview_factor.gpkg", gdal.GA_Update) + ret = ds.BuildOverviews("NONE", [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) + assert ret == 0 and gdal.GetLastErrorMsg() == "" ds = None - gdal.Unlink('/vsimem/gpkg_match_overview_factor.gpkg') + gdal.Unlink("/vsimem/gpkg_match_overview_factor.gpkg") ############################################################################### @@ -3211,86 +3832,106 @@ def test_gpkg_wkt2(): pytest.skip() # WKT2-only compatible SRS with EPSG code - filename = '/vsimem/test_gpkg_wkt2.gpkg' + filename = "/vsimem/test_gpkg_wkt2.gpkg" ds = gdaltest.gpkg_dr.Create(filename, 1, 1) sr = osr.SpatialReference() - sr.ImportFromEPSG(4979) # WGS 84 3D + sr.ImportFromEPSG(4979) # WGS 84 3D sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) - ds.SetGeoTransform([2,1,0,49,0,-1]) + ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) ds = None ds = gdal.Open(filename) sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() - lyr = ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys ORDER BY srs_id') + lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys ORDER BY srs_id") f = lyr.GetNextFeature() - assert f.GetField('srs_name') == 'Undefined Cartesian SRS' - assert f.GetField('srs_id') == -1 - assert f.GetField('organization') == 'NONE' - assert f.GetField('organization_coordsys_id') == -1 - assert f.GetField('definition') == 'undefined' - assert f.GetField('description') == 'undefined Cartesian coordinate reference system' - assert f.GetField('definition_12_063') == 'undefined' + assert f.GetField("srs_name") == "Undefined Cartesian SRS" + assert f.GetField("srs_id") == -1 + assert f.GetField("organization") == "NONE" + assert f.GetField("organization_coordsys_id") == -1 + assert f.GetField("definition") == "undefined" + assert ( + f.GetField("description") == "undefined Cartesian coordinate reference system" + ) + assert f.GetField("definition_12_063") == "undefined" lyr.GetNextFeature() f = lyr.GetNextFeature() - assert f.GetField('definition').startswith('GEOGCS["WGS 84"') - assert f.GetField('definition_12_063').startswith('GEODCRS["WGS 84"') and 'ID["EPSG",4326]' in f.GetField('definition_12_063') + assert f.GetField("definition").startswith('GEOGCS["WGS 84"') + assert f.GetField("definition_12_063").startswith( + 'GEODCRS["WGS 84"' + ) and 'ID["EPSG",4326]' in f.GetField("definition_12_063") f = lyr.GetNextFeature() - assert f.GetField('definition') == 'undefined' - assert f.GetField('definition_12_063').startswith('GEODCRS["WGS 84"') and 'ID["EPSG",4979]' in f.GetField('definition_12_063') + assert f.GetField("definition") == "undefined" + assert f.GetField("definition_12_063").startswith( + 'GEODCRS["WGS 84"' + ) and 'ID["EPSG",4979]' in f.GetField("definition_12_063") ds.ReleaseResultSet(lyr) - lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE extension_name = 'gpkg_crs_wkt'") + lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_extensions WHERE extension_name = 'gpkg_crs_wkt'" + ) assert lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(lyr) ds = None # WKT2-only compatible SRS without EPSG code - ds = gdaltest.gpkg_dr.Create(filename, 1, 1, options = ['APPEND_SUBDATASET=YES', 'RASTER_TABLE=table2']) - sr.SetFromUserInput('GEODCRS["my CRS",DATUM["my datum",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]]]') + ds = gdaltest.gpkg_dr.Create( + filename, 1, 1, options=["APPEND_SUBDATASET=YES", "RASTER_TABLE=table2"] + ) + sr.SetFromUserInput( + 'GEODCRS["my CRS",DATUM["my datum",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]]]' + ) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) - ds.SetGeoTransform([2,1,0,49,0,-1]) + ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) ds = None - ds = gdal.Open('GPKG:' + filename + ':table2') + ds = gdal.Open("GPKG:" + filename + ":table2") sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() ds = None # WKT1 compatible SRS - ds = gdaltest.gpkg_dr.Create(filename, 1, 1, options = ['APPEND_SUBDATASET=YES', 'RASTER_TABLE=table3']) + ds = gdaltest.gpkg_dr.Create( + filename, 1, 1, options=["APPEND_SUBDATASET=YES", "RASTER_TABLE=table3"] + ) sr.ImportFromEPSG(32631) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) - ds.SetGeoTransform([500000,1,0,4500000,0,-1]) + ds.SetGeoTransform([500000, 1, 0, 4500000, 0, -1]) ds = None - ds = gdal.Open('GPKG:' + filename + ':table3') + ds = gdal.Open("GPKG:" + filename + ":table3") sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() - lyr = ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys WHERE srs_id = 32631') + lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_id = 32631") f = lyr.GetNextFeature() - assert f.GetField('definition').startswith('PROJCS["WGS 84 / UTM zone 31N",') and 'AUTHORITY["EPSG","32631"]' in f.GetField('definition') - assert f.GetField('definition_12_063').startswith('PROJCRS["WGS 84 / UTM zone 31N",') and 'ID["EPSG",32631]' in f.GetField('definition_12_063') + assert f.GetField("definition").startswith( + 'PROJCS["WGS 84 / UTM zone 31N",' + ) and 'AUTHORITY["EPSG","32631"]' in f.GetField("definition") + assert f.GetField("definition_12_063").startswith( + 'PROJCRS["WGS 84 / UTM zone 31N",' + ) and 'ID["EPSG",32631]' in f.GetField("definition_12_063") ds.ReleaseResultSet(lyr) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" gdal.Unlink(filename) + ############################################################################### # Test reading a 50000x25000 block uint16 + def test_gpkg_50000_25000_uint16(): if gdaltest.gpkg_dr is None: @@ -3298,25 +3939,32 @@ def test_gpkg_50000_25000_uint16(): if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: - pytest.skip('Test not available on 32 bit') + pytest.skip("Test not available on 32 bit") - ds = gdal.Open('/vsizip/data/gpkg/50000_25000_uint16.gpkg.zip/50000_25000_uint16.gpkg') + ds = gdal.Open( + "/vsizip/data/gpkg/50000_25000_uint16.gpkg.zip/50000_25000_uint16.gpkg" + ) import psutil + sizeof_uint16 = 2 sizeof_block = 50000 * 25000 * sizeof_uint16 # 2 * sizeof_block, because of GDAL block cache and GPKG internal cache if psutil.virtual_memory().available < 2 * sizeof_block: pytest.skip("Not enough virtual memory available") - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize=20, buf_ysize=20 + ) assert data - ref_ds = gdal.Open('../gcore/data/uint16.tif') + ref_ds = gdal.Open("../gcore/data/uint16.tif") assert data == ref_ds.ReadRaster() + ############################################################################### # Test reading a 50000x50000 block uint16 + def test_gpkg_50000_50000_uint16(): if gdaltest.gpkg_dr is None: @@ -3324,20 +3972,25 @@ def test_gpkg_50000_50000_uint16(): if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: - pytest.skip('Test not available on 32 bit') + pytest.skip("Test not available on 32 bit") - ds = gdal.Open('/vsizip/data/gpkg/50000_50000_uint16.gpkg.zip/50000_50000_uint16.gpkg') + ds = gdal.Open( + "/vsizip/data/gpkg/50000_50000_uint16.gpkg.zip/50000_50000_uint16.gpkg" + ) import psutil + sizeof_uint16 = 2 sizeof_block = 50000 * 50000 * sizeof_uint16 # 2 * sizeof_block, because of GDAL block cache and GPKG internal cache if psutil.virtual_memory().available < 2 * sizeof_block: pytest.skip("Not enough virtual memory available") - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize=20, buf_ysize=20 + ) assert data - ref_ds = gdal.Open('../gcore/data/uint16.tif') + ref_ds = gdal.Open("../gcore/data/uint16.tif") assert data == ref_ds.ReadRaster() @@ -3352,18 +4005,20 @@ def test_gpkg_float32_png_negative_values(): if gdaltest.png_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, gdal.GDT_Float32, options=['TILE_FORMAT=PNG']) + ds = gdaltest.gpkg_dr.Create( + "/vsimem/tmp.gpkg", 1, 1, 1, gdal.GDT_Float32, options=["TILE_FORMAT=PNG"] + ) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds.GetRasterBand(1).SetNoDataValue(-32768) ds.GetRasterBand(1).Fill(-10) ds = None - ds = gdal.Open('/vsimem/tmp.gpkg') + ds = gdal.Open("/vsimem/tmp.gpkg") assert ds.GetRasterBand(1).ComputeRasterMinMax() == (-10, -10) ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") ############################################################################### @@ -3372,9 +4027,9 @@ def test_gpkg_float32_png_negative_values(): def test_gpkg_coordinate_epoch(): - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") - ds = gdal.GetDriverByName('GPKG').Create('/vsimem/tmp.gpkg', 1, 1) + ds = gdal.GetDriverByName("GPKG").Create("/vsimem/tmp.gpkg", 1, 1) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) srs.SetCoordinateEpoch(2021.3) @@ -3382,27 +4037,27 @@ def test_gpkg_coordinate_epoch(): ds.SetSpatialRef(srs) ds = None - ds = gdal.Open('/vsimem/tmp.gpkg') + ds = gdal.Open("/vsimem/tmp.gpkg") srs = ds.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.3 ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") ############################################################################### # Test flushing only a subset of bands -@pytest.mark.parametrize('tile_format', ['PNG_JPEG', 'PNG', 'PNG8', 'JPEG', 'WEBP']) +@pytest.mark.parametrize("tile_format", ["PNG_JPEG", "PNG", "PNG8", "JPEG", "WEBP"]) def test_gpkg_flushing_not_all_bands(tile_format): drv_req_dict = { - 'PNG_JPEG': ['PNG', 'JPEG'], - 'PNG': 'PNG', - 'PNG8': 'PNG', - 'JPEG': 'JPEG', - 'WEBP': 'WEBP' + "PNG_JPEG": ["PNG", "JPEG"], + "PNG": "PNG", + "PNG8": "PNG", + "JPEG": "JPEG", + "WEBP": "WEBP", } drv_req = drv_req_dict[tile_format] if not isinstance(drv_req, list): @@ -3411,9 +4066,10 @@ def test_gpkg_flushing_not_all_bands(tile_format): if gdal.GetDriverByName(drv) is None: pytest.skip() - out_filename = '/vsimem/test.gpkg' - ds = gdal.GetDriverByName('GPKG').Create(out_filename, 256, 256, 4, - options = ['TILE_FORMAT=' + tile_format]) + out_filename = "/vsimem/test.gpkg" + ds = gdal.GetDriverByName("GPKG").Create( + out_filename, 256, 256, 4, options=["TILE_FORMAT=" + tile_format] + ) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds.GetRasterBand(1).Fill(255) ds.GetRasterBand(2).Fill(255) @@ -3423,10 +4079,13 @@ def test_gpkg_flushing_not_all_bands(tile_format): ds = None ds = gdal.Open(out_filename) - assert ([ds.GetRasterBand(i+1).ComputeRasterMinMax() for i in range(ds.RasterCount)]) == [(255.0, 255.0)] * 4 + assert ( + [ds.GetRasterBand(i + 1).ComputeRasterMinMax() for i in range(ds.RasterCount)] + ) == [(255.0, 255.0)] * 4 ds = None - gdal.Unlink('/vsimem/tmp.gpkg') + gdal.Unlink("/vsimem/tmp.gpkg") + ############################################################################### # @@ -3437,9 +4096,10 @@ def test_gpkg_cleanup(): if gdaltest.gpkg_dr is None: pytest.skip() - gdal.Unlink('/vsimem/tmp.gpkg') - gdal.Unlink('/vsimem/tmp.gpkg.aux.xml') + gdal.Unlink("/vsimem/tmp.gpkg") + gdal.Unlink("/vsimem/tmp.gpkg.aux.xml") + + gdal.SetConfigOption("GPKG_DEBUG", None) - gdal.SetConfigOption('GPKG_DEBUG', None) ############################################################################### diff --git a/autotest/gdrivers/grassasciigrid.py b/autotest/gdrivers/grassasciigrid.py index 4814a91fc80e..76b1bd76f821 100755 --- a/autotest/gdrivers/grassasciigrid.py +++ b/autotest/gdrivers/grassasciigrid.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,11 +37,9 @@ def test_grassasciigrid_1(): - tst = gdaltest.GDALTest('GRASSASCIIGrid', 'grassasciigrid/grassascii.txt', 1, 212) + tst = gdaltest.GDALTest("GRASSASCIIGrid", "grassasciigrid/grassascii.txt", 1, 212) expected_gt = [-100.0, 62.5, 0.0, 250.0, 0.0, -41.666666666666664] return tst.testOpen(check_gt=expected_gt) -############################################################################### - - +############################################################################### diff --git a/autotest/gdrivers/grib.py b/autotest/gdrivers/grib.py index a21fe58f98be..ca26e1d475d0 100755 --- a/autotest/gdrivers/grib.py +++ b/autotest/gdrivers/grib.py @@ -31,45 +31,49 @@ ############################################################################### import os -import struct import shutil -from osgeo import gdal -from osgeo import osr -import pytest +import struct import gdaltest +import pytest +from osgeo import gdal, osr -pytestmark = pytest.mark.require_driver('GRIB') +pytestmark = pytest.mark.require_driver("GRIB") def has_jp2kdrv(): for i in range(gdal.GetDriverCount()): - if gdal.GetDriver(i).ShortName.startswith('JP2'): + if gdal.GetDriver(i).ShortName.startswith("JP2"): return True return False + ############################################################################### # Do a simple checksum on our test file def test_grib_1(): - tst = gdaltest.GDALTest('GRIB', 'grib/ds.mint.bin', 2, 46927) + tst = gdaltest.GDALTest("GRIB", "grib/ds.mint.bin", 2, 46927) return tst.testOpen() ############################################################################### # Test a small GRIB 1 sample file. + def test_grib_2(): - tst = gdaltest.GDALTest('GRIB', 'grib/Sample_QuikSCAT.grb', 4, 50714) + tst = gdaltest.GDALTest("GRIB", "grib/Sample_QuikSCAT.grb", 4, 50714) tst.testOpen() - ds = gdal.Open('data/grib/Sample_QuikSCAT.grb') + ds = gdal.Open("data/grib/Sample_QuikSCAT.grb") assert ds.GetRasterBand(1).GetNoDataValue() == 9999.0 - assert ds.GetRasterBand(1).GetNoDataValue() == 9999.0 # do it again to test correct caching + assert ( + ds.GetRasterBand(1).GetNoDataValue() == 9999.0 + ) # do it again to test correct caching + ############################################################################### # This file has different raster sizes for some of the products, which @@ -78,31 +82,43 @@ def test_grib_2(): def test_grib_read_different_sizes_messages(): - tst = gdaltest.GDALTest('GRIB', 'grib/bug3246.grb', 4, 4081) - gdal.PushErrorHandler('CPLQuietErrorHandler') + tst = gdaltest.GDALTest("GRIB", "grib/bug3246.grb", 4, 4081) + gdal.PushErrorHandler("CPLQuietErrorHandler") result = tst.testOpen() gdal.PopErrorHandler() msg = gdal.GetLastErrorMsg() - if msg.find('data access may be incomplete') == -1 \ - or gdal.GetLastErrorType() != 2: - gdaltest.post_reason('did not get expected warning.') + if msg.find("data access may be incomplete") == -1 or gdal.GetLastErrorType() != 2: + gdaltest.post_reason("did not get expected warning.") return result + ############################################################################### # Check nodata def test_grib_grib2_read_nodata(): - ds = gdal.Open('data/grib/ds.mint.bin') + ds = gdal.Open("data/grib/ds.mint.bin") assert ds.GetRasterBand(1).GetNoDataValue() == 9999 assert ds.GetRasterBand(2).GetNoDataValue() == 9999 md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1203613200', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0', 'GRIB_VALID_TIME': '1203681600', 'GRIB_FORECAST_SECONDS': '68400', 'GRIB_UNIT': '[C]', 'GRIB_PDS_TEMPLATE_NUMBERS': '0 5 2 0 0 0 255 255 1 0 0 0 19 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 22 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0', 'GRIB_DISCIPLINE': '0(Meteorological)', 'GRIB_PDS_PDTN': '8', 'GRIB_COMMENT': 'Minimum temperature [C]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'MinT'} + expected_md = { + "GRIB_REF_TIME": "1203613200", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0", + "GRIB_VALID_TIME": "1203681600", + "GRIB_FORECAST_SECONDS": "68400", + "GRIB_UNIT": "[C]", + "GRIB_PDS_TEMPLATE_NUMBERS": "0 5 2 0 0 0 255 255 1 0 0 0 19 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 22 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0", + "GRIB_DISCIPLINE": "0(Meteorological)", + "GRIB_PDS_PDTN": "8", + "GRIB_COMMENT": "Minimum temperature [C]", + "GRIB_SHORT_NAME": "0-SFC", + "GRIB_ELEMENT": "MinT", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### @@ -111,29 +127,30 @@ def test_grib_grib2_read_nodata(): def test_grib_read_units(): - gdal.Unlink('tmp/ds.mint.bin.aux.xml') + gdal.Unlink("tmp/ds.mint.bin.aux.xml") - shutil.copy('data/grib/ds.mint.bin', 'tmp/ds.mint.bin') - ds = gdal.Open('tmp/ds.mint.bin') + shutil.copy("data/grib/ds.mint.bin", "tmp/ds.mint.bin") + ds = gdal.Open("tmp/ds.mint.bin") md = ds.GetRasterBand(1).GetMetadata() - assert md['GRIB_UNIT'] == '[C]' - assert md['GRIB_COMMENT'] == 'Minimum temperature [C]' + assert md["GRIB_UNIT"] == "[C]" + assert md["GRIB_COMMENT"] == "Minimum temperature [C]" ds.GetRasterBand(1).ComputeStatistics(False) assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(13, abs=1) ds = None - os.unlink('tmp/ds.mint.bin.aux.xml') + os.unlink("tmp/ds.mint.bin.aux.xml") - with gdaltest.config_option('GRIB_NORMALIZE_UNITS', 'NO'): - ds = gdal.Open('tmp/ds.mint.bin') + with gdaltest.config_option("GRIB_NORMALIZE_UNITS", "NO"): + ds = gdal.Open("tmp/ds.mint.bin") ds.GetRasterBand(1).ComputeStatistics(False) md = ds.GetRasterBand(1).GetMetadata() - assert md['GRIB_UNIT'] == '[K]' - assert md['GRIB_COMMENT'] == 'Minimum temperature [K]' + assert md["GRIB_UNIT"] == "[K]" + assert md["GRIB_COMMENT"] == "Minimum temperature [K]" assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(286, abs=1) ds = None - gdal.GetDriverByName('GRIB').Delete('tmp/ds.mint.bin') + gdal.GetDriverByName("GRIB").Delete("tmp/ds.mint.bin") + ############################################################################### # Handle geotransform for 1xn or nx1 grids. The geotransform was faulty when @@ -143,12 +160,13 @@ def test_grib_read_units(): def test_grib_read_geotransform_one_n_or_n_one(): - ds = gdal.Open('data/grib/one_one.grib2') + ds = gdal.Open("data/grib/one_one.grib2") egt = (-114.25, 0.5, 0.0, 47.250, 0.0, -0.5) gt = ds.GetGeoTransform() ds = None assert gt == egt + ############################################################################### # This is more a /vsizip/ file test than a GRIB one, but could not easily # come up with a pure /vsizip/ test case, so here's a real world use @@ -157,28 +175,36 @@ def test_grib_read_geotransform_one_n_or_n_one(): def test_grib_read_vsizip(): - ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') + ds = gdal.Open( + "/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03" + ) assert ds is not None + ############################################################################### # Write PDS numbers to all bands def test_grib_grib2_test_grib_pds_all_bands(): - ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') + ds = gdal.Open( + "/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03" + ) assert ds is not None band = ds.GetRasterBand(2) - md = band.GetMetadataItem('GRIB_PDS_TEMPLATE_NUMBERS') + md = band.GetMetadataItem("GRIB_PDS_TEMPLATE_NUMBERS") ds = None - assert md is not None, 'Failed to fetch pds numbers (#5144)' + assert md is not None, "Failed to fetch pds numbers (#5144)" - with gdaltest.config_option('GRIB_PDS_ALL_BANDS', 'OFF'): - ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') + with gdaltest.config_option("GRIB_PDS_ALL_BANDS", "OFF"): + ds = gdal.Open( + "/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03" + ) assert ds is not None band = ds.GetRasterBand(2) - md = band.GetMetadataItem('GRIB_PDS_TEMPLATE_NUMBERS') + md = band.GetMetadataItem("GRIB_PDS_TEMPLATE_NUMBERS") ds = None - assert md is None, 'Got pds numbers, when disabled (#5144)' + assert md is None, "Got pds numbers, when disabled (#5144)" + ############################################################################### # Test support for template 4.15 (#5768) @@ -187,14 +213,20 @@ def test_grib_grib2_test_grib_pds_all_bands(): def test_grib_grib2_read_template_4_15(): import test_cli_utilities + if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' data/grib/template_4_15.grb2 -checksum') + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + " data/grib/template_4_15.grb2 -checksum" + ) # This is a JPEG2000 compressed file, so just check we can open it or that we get a message saying there's no JPEG2000 driver available - assert 'Checksum=' in ret or 'Is the JPEG2000 driver available?' in err, \ - 'Could not open file' + assert ( + "Checksum=" in ret or "Is the JPEG2000 driver available?" in err + ), "Could not open file" + ############################################################################### # Test support for PNG compressed @@ -202,12 +234,13 @@ def test_grib_grib2_read_template_4_15(): def test_grib_grib2_read_png(): - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - ds = gdal.Open('data/grib/MRMS_EchoTop_18_00.50_20161015-133230.grib2') + ds = gdal.Open("data/grib/MRMS_EchoTop_18_00.50_20161015-133230.grib2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 41854, 'Could not open file' + assert cs == 41854, "Could not open file" + ############################################################################### # Test support for GRIB2 Section 4 Template 32, Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for synthetic satellite data. @@ -216,14 +249,29 @@ def test_grib_grib2_read_png(): def test_grib_grib2_read_template_4_32(): # First band extracted from http://nomads.ncep.noaa.gov/pub/data/nccf/com/hur/prod/hwrf.2017102006/twenty-se27w.2017102006.hwrfsat.core.0p02.f000.grb2 - ds = gdal.Open('data/grib/twenty-se27w.2017102006.hwrfsat.core.0p02.f000_truncated.grb2') + ds = gdal.Open( + "data/grib/twenty-se27w.2017102006.hwrfsat.core.0p02.f000_truncated.grb2" + ) cs = ds.GetRasterBand(1).Checksum() - assert cs == 48230, 'Could not open file' - assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((-9.765,2.415), 1e-3) # Reasonable range for Celcius + assert cs == 48230, "Could not open file" + assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx( + (-9.765, 2.415), 1e-3 + ) # Reasonable range for Celcius md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1508479200', 'GRIB_VALID_TIME': '1508479200', 'GRIB_FORECAST_SECONDS': '0', 'GRIB_UNIT': '[C]', 'GRIB_PDS_TEMPLATE_NUMBERS': '5 7 2 0 0 0 0 0 1 0 0 0 0 1 0 31 1 29 67 140 2 0 0 238 217', 'GRIB_PDS_PDTN': '32', 'GRIB_COMMENT': 'Brightness Temperature [C]', 'GRIB_SHORT_NAME': '0 undefined', 'GRIB_ELEMENT': 'BRTEMP', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 1 31 285 17292 2 61145'} + expected_md = { + "GRIB_REF_TIME": "1508479200", + "GRIB_VALID_TIME": "1508479200", + "GRIB_FORECAST_SECONDS": "0", + "GRIB_UNIT": "[C]", + "GRIB_PDS_TEMPLATE_NUMBERS": "5 7 2 0 0 0 0 0 1 0 0 0 0 1 0 31 1 29 67 140 2 0 0 238 217", + "GRIB_PDS_PDTN": "32", + "GRIB_COMMENT": "Brightness Temperature [C]", + "GRIB_SHORT_NAME": "0 undefined", + "GRIB_ELEMENT": "BRTEMP", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "5 7 2 0 0 0 0 1 0 1 31 285 17292 2 61145", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### @@ -233,64 +281,105 @@ def test_grib_grib2_read_template_4_32(): def test_grib_grib2_read_all_zero_data(): # From http://dd.weather.gc.ca/model_wave/great_lakes/erie/grib2/00/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2 - ds = gdal.Open('data/grib/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2') + ds = gdal.Open( + "data/grib/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2" + ) cs = ds.GetRasterBand(1).Checksum() - assert cs == 0, 'Could not open file' + assert cs == 0, "Could not open file" md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1510963200', 'GRIB_VALID_TIME': '1510963200', 'GRIB_FORECAST_SECONDS': '0', 'GRIB_UNIT': '[Proportion]', 'GRIB_PDS_TEMPLATE_NUMBERS': '2 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '0', 'GRIB_COMMENT': 'Ice cover [Proportion]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'ICEC'} + expected_md = { + "GRIB_REF_TIME": "1510963200", + "GRIB_VALID_TIME": "1510963200", + "GRIB_FORECAST_SECONDS": "0", + "GRIB_UNIT": "[Proportion]", + "GRIB_PDS_TEMPLATE_NUMBERS": "2 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 255 255 255 255 255 255", + "GRIB_PDS_PDTN": "0", + "GRIB_COMMENT": "Ice cover [Proportion]", + "GRIB_SHORT_NAME": "0-SFC", + "GRIB_ELEMENT": "ICEC", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### # GRIB1 file with rotate pole lonlat + def test_grib_grib1_read_rotated_pole_lonlat(): - ds = gdal.Open('/vsisparse/data/grib/rotated_pole.grb.xml') + ds = gdal.Open("/vsisparse/data/grib/rotated_pole.grb.xml") - assert ds.RasterXSize == 726 and ds.RasterYSize == 550, \ - 'Did not get expected dimensions' + assert ( + ds.RasterXSize == 726 and ds.RasterYSize == 550 + ), "Did not get expected dimensions" assert ds.GetRasterBand(1).GetNoDataValue() is None - assert ds.GetRasterBand(1).GetNoDataValue() is None # do it again to test correct caching + assert ( + ds.GetRasterBand(1).GetNoDataValue() is None + ) # do it again to test correct caching projection = ds.GetProjectionRef() expected_projection_proj_7 = 'GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-30,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-15,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]' expected_projection_before_proj_7 = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6367470,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +lon_0=-15 +o_proj=longlat +o_lon_p=0 +o_lat_p=30 +a=6367470 +b=6367470 +to_meter=0.0174532925199 +wktext"]]' - assert projection in (expected_projection_proj_7, expected_projection_before_proj_7), projection + assert projection in ( + expected_projection_proj_7, + expected_projection_before_proj_7, + ), projection if projection == expected_projection_proj_7: assert ds.GetSpatialRef().IsDerivedGeographic() gt = ds.GetGeoTransform() expected_gt = (-30.25, 0.1, 0.0, 24.15, 0.0, -0.1) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1503295200', 'GRIB_VALID_TIME': '1503295200', 'GRIB_FORECAST_SECONDS': '0', 'GRIB_UNIT': '[m^2/s^2]', 'GRIB_COMMENT': 'Geopotential [m^2/s^2]', 'GRIB_SHORT_NAME': '0-HTGL', 'GRIB_ELEMENT': 'GP'} + expected_md = { + "GRIB_REF_TIME": "1503295200", + "GRIB_VALID_TIME": "1503295200", + "GRIB_FORECAST_SECONDS": "0", + "GRIB_UNIT": "[m^2/s^2]", + "GRIB_COMMENT": "Geopotential [m^2/s^2]", + "GRIB_SHORT_NAME": "0-HTGL", + "GRIB_ELEMENT": "GP", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" + ############################################################################### # GRIB2 file with rotate pole lonlat + def test_grib_grib2_read_rotated_pole_lonlat(): - ds = gdal.Open('/vsisparse/data/grib/rotated_pole.grb2.xml') + ds = gdal.Open("/vsisparse/data/grib/rotated_pole.grb2.xml") assert ds.RasterXSize == 1102 and ds.RasterYSize == 1076 projection = ds.GetProjectionRef() expected_projection_proj_7 = 'GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6371229,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-31.758312,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-92.402969,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]' expected_projection_before_proj_7 = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6371229,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +lon_0=-92.4029689999999846 +o_proj=longlat +o_lon_p=0 +o_lat_p=31.7583120000000001 +a=6371229 +b=6371229 +to_meter=0.0174532925199 +wktext"]]' - assert projection in (expected_projection_proj_7, expected_projection_before_proj_7), projection + assert projection in ( + expected_projection_proj_7, + expected_projection_before_proj_7, + ), projection gt = ds.GetGeoTransform() - expected_gt = (-62.6222310049955, 0.09000000999091741, 0.0, 48.28500200186046, 0.0, -0.09000000372093023) + expected_gt = ( + -62.6222310049955, + 0.09000000999091741, + 0.0, + 48.28500200186046, + 0.0, + -0.09000000372093023, + ) assert gt == pytest.approx(expected_gt, 1e-3) + ############################################################################### # Test support for GRIB2 Section 4 Template 40, Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents @@ -303,11 +392,22 @@ def test_grib_grib2_read_template_4_40(): # First band extracted from https://download.regional.atmosphere.copernicus.eu/services/CAMS50?token=__M0bChV6QsoOFqHz31VRqnpr4GhWPtcpaRy3oeZjBNSg__&grid=0.1&model=ENSEMBLE&package=ANALYSIS_PM10_SURFACE&time=-24H-1H&referencetime=2017-09-12T00:00:00Z&format=GRIB2&licence=yes # with data nullified - ds = gdal.Open('data/grib/template_4_40.grb2') + ds = gdal.Open("data/grib/template_4_40.grb2") md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1505088000', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647', 'GRIB_VALID_TIME': '1505088000', 'GRIB_FORECAST_SECONDS': '0', 'GRIB_UNIT': '[kg/(m^3)]', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '40', 'GRIB_COMMENT': 'Mass Density (Concentration) [kg/(m^3)]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'MASSDEN'} + expected_md = { + "GRIB_REF_TIME": "1505088000", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647", + "GRIB_VALID_TIME": "1505088000", + "GRIB_FORECAST_SECONDS": "0", + "GRIB_UNIT": "[kg/(m^3)]", + "GRIB_PDS_TEMPLATE_NUMBERS": "20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", + "GRIB_PDS_PDTN": "40", + "GRIB_COMMENT": "Mass Density (Concentration) [kg/(m^3)]", + "GRIB_SHORT_NAME": "0-SFC", + "GRIB_ELEMENT": "MASSDEN", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### @@ -317,11 +417,11 @@ def test_grib_grib2_read_template_4_40(): def test_grib_grib2_read_template_4_unhandled(): with gdaltest.error_handler(): - ds = gdal.Open('data/grib/template_4_65535.grb2') + ds = gdal.Open("data/grib/template_4_65535.grb2") md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_TEMPLATE_NUMBERS': '0 1 2 3 4 5', 'GRIB_PDS_PDTN': '65535'} + expected_md = {"GRIB_PDS_TEMPLATE_NUMBERS": "0 1 2 3 4 5", "GRIB_PDS_PDTN": "65535"} for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### @@ -330,16 +430,18 @@ def test_grib_grib2_read_template_4_unhandled(): def test_grib_grib2_read_transverse_mercator(): - ds = gdal.Open('data/grib/transverse_mercator.grb2') + ds = gdal.Open("data/grib/transverse_mercator.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6367470,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" + ############################################################################### # Test reading GRIB2 Mercator grid @@ -347,16 +449,17 @@ def test_grib_grib2_read_transverse_mercator(): def test_grib_grib2_read_mercator(): - ds = gdal.Open('data/grib/mercator.grb2') + ds = gdal.Open("data/grib/mercator.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (-13095853.598139772, 72.237, 0.0, 3991876.4600486886, 0.0, -72.237) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -365,16 +468,17 @@ def test_grib_grib2_read_mercator(): def test_grib_grib2_read_mercator_2sp(): - ds = gdal.Open('data/grib/mercator_2sp.grb2') + ds = gdal.Open("data/grib/mercator_2sp.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",33.5],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (-10931598.94836207, 60.299, 0.0, 3332168.629121481, 0.0, -60.299) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -383,16 +487,17 @@ def test_grib_grib2_read_mercator_2sp(): def test_grib_grib2_read_lcc(): - ds = gdal.Open('data/grib/lambert_conformal_conic.grb2') + ds = gdal.Open("data/grib/lambert_conformal_conic.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",33.5],PARAMETER["central_meridian",117],PARAMETER["standard_parallel_1",33],PARAMETER["standard_parallel_2",34],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (8974734.737685828, 60.021, 0.0, 6235918.9698001575, 0.0, -60.021) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -401,16 +506,17 @@ def test_grib_grib2_read_lcc(): def test_grib_grib2_read_polar_stereo(): - ds = gdal.Open('data/grib/polar_stereographic.grb2') + ds = gdal.Open("data/grib/polar_stereographic.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",60],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",SOUTH],AXIS["Northing",SOUTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (-5621962.072511509, 71.86, 0.0, 2943991.8007649644, 0.0, -71.86) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -419,16 +525,17 @@ def test_grib_grib2_read_polar_stereo(): def test_grib_grib2_read_aea(): - ds = gdal.Open('data/grib/albers_equal_area.grb2') + ds = gdal.Open("data/grib/albers_equal_area.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",33.5],PARAMETER["longitude_of_center",117],PARAMETER["standard_parallel_1",33],PARAMETER["standard_parallel_2",34],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (8974979.714292033, 60.022, 0.0, 6235686.52464211, 0.0, -60.022) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -437,16 +544,17 @@ def test_grib_grib2_read_aea(): def test_grib_grib2_read_laea(): - ds = gdal.Open('data/grib/lambert_azimuthal_equal_area.grb2') + ds = gdal.Open("data/grib/lambert_azimuthal_equal_area.grb2") projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["latitude_of_center",33.5],PARAMETER["longitude_of_center",-117],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert projection == expected_projection, 'Did not get expected projection' + assert projection == expected_projection, "Did not get expected projection" gt = ds.GetGeoTransform() expected_gt = (-59384.01063035424, 60.021, 0.0, 44812.5792223211, 0.0, -60.021) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" ############################################################################### @@ -455,13 +563,13 @@ def test_grib_grib2_read_laea(): def test_grib_grib2_read_template_5_4_grid_point_ieee_floating_point(): - ds = gdal.Open('data/grib/ieee754_single.grb2') + ds = gdal.Open("data/grib/ieee754_single.grb2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 4727, 'Did not get expected checksum' + assert cs == 4727, "Did not get expected checksum" - ds = gdal.Open('data/grib/ieee754_double.grb2') + ds = gdal.Open("data/grib/ieee754_double.grb2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 4727, 'Did not get expected checksum' + assert cs == 4727, "Did not get expected checksum" ############################################################################### @@ -470,19 +578,19 @@ def test_grib_grib2_read_template_5_4_grid_point_ieee_floating_point(): def test_grib_grib2_read_section_5_nbits_zero_decimal_scaled(): - ds = gdal.Open('data/grib/simple_packing_nbits_zero_decimal_scaled.grb2') + ds = gdal.Open("data/grib/simple_packing_nbits_zero_decimal_scaled.grb2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 5, 'Did not get expected checksum' + assert cs == 5, "Did not get expected checksum" - if gdal.GetDriverByName('PNG') is not None: - ds = gdal.Open('data/grib/png_nbits_zero_decimal_scaled.grb2') + if gdal.GetDriverByName("PNG") is not None: + ds = gdal.Open("data/grib/png_nbits_zero_decimal_scaled.grb2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 5, 'Did not get expected checksum' + assert cs == 5, "Did not get expected checksum" if has_jp2kdrv(): - ds = gdal.Open('data/grib/jpeg2000_nbits_zero_decimal_scaled.grb2') + ds = gdal.Open("data/grib/jpeg2000_nbits_zero_decimal_scaled.grb2") cs = ds.GetRasterBand(1).Checksum() - assert cs == 5, 'Did not get expected checksum' + assert cs == 5, "Did not get expected checksum" ############################################################################### @@ -491,10 +599,10 @@ def test_grib_grib2_read_section_5_nbits_zero_decimal_scaled(): def test_grib_grib2_read_spatial_differencing_order_1(): - ds = gdal.Open('data/grib/spatial_differencing_order_1.grb2') + ds = gdal.Open("data/grib/spatial_differencing_order_1.grb2") cs = ds.GetRasterBand(1).Checksum() if cs != 46650: - gdaltest.post_reason('Did not get expected checksum') + gdaltest.post_reason("Did not get expected checksum") print(cs) @@ -504,257 +612,339 @@ def test_grib_grib2_read_spatial_differencing_order_1(): def test_grib_grib2_write_creation_options(): - tmpfilename = '/vsimem/out.grb2' - gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "DISCIPLINE=1", - "IDS=CENTER=85(Toulouse) SUBCENTER=2 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)", - "IDS_SUBCENTER=3", # Test that it overrides IDS - "PDS_PDTN=30", - "BAND_1_PDS_PDTN=40", # Test that it overrides PDS_PDTN - "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255" - ]) + tmpfilename = "/vsimem/out.grb2" + gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "DISCIPLINE=1", + "IDS=CENTER=85(Toulouse) SUBCENTER=2 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)", + "IDS_SUBCENTER=3", # Test that it overrides IDS + "PDS_PDTN=30", + "BAND_1_PDS_PDTN=40", # Test that it overrides PDS_PDTN + "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", + ], + ) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_IDS': 'CENTER=85(Toulouse) SUBCENTER=3 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255', 'GRIB_DISCIPLINE': '1(Hydrological)', 'GRIB_PDS_PDTN': '40'} + expected_md = { + "GRIB_IDS": "CENTER=85(Toulouse) SUBCENTER=3 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)", + "GRIB_PDS_TEMPLATE_NUMBERS": "20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", + "GRIB_DISCIPLINE": "1(Hydrological)", + "GRIB_PDS_PDTN": "40", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_NUMBERS and more elements than needed (warning) with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0extra" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0extra", + ], + ) assert out_ds is not None out_ds = None ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0'} + expected_md = { + "GRIB_PDS_PDTN": "40", + "GRIB_PDS_TEMPLATE_NUMBERS": "20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and insufficient number of elements with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255", + ], + ) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES - gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647" - ]) + gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647", + ], + ) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647'} + expected_md = { + "GRIB_PDS_PDTN": "40", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and more elements than needed (warning) with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647 0extra" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647 0extra", + ], + ) assert out_ds is not None out_ds = None ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647'} + expected_md = { + "GRIB_PDS_PDTN": "40", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and insufficient number of elements with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127", + ], + ) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements - gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=32", - "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145" - ]) + gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=32", + "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145", + ], + ) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} + expected_md = { + "GRIB_PDS_PDTN": "32", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements, and insufficient number of elements in the variable section with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=32", - "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=32", + "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2", + ], + ) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements, and extra elements with gdaltest.error_handler(): - gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=32", - "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145 0extra" - ]) + gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=32", + "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145 0extra", + ], + ) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} + expected_md = { + "GRIB_PDS_PDTN": "32", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_NUMBERS with variable number of elements - gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=32", - "PDS_TEMPLATE_NUMBERS=5 7 2 0 0 0 0 0 1 0 0 0 0 2 0 31 1 29 67 140 2 0 0 238 217 0 31 1 29 67 140 2 0 0 238 217" - ]) + gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=32", + "PDS_TEMPLATE_NUMBERS=5 7 2 0 0 0 0 0 1 0 0 0 0 2 0 31 1 29 67 140 2 0 0 238 217 0 31 1 29 67 140 2 0 0 238 217", + ], + ) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} + expected_md = { + "GRIB_PDS_PDTN": "32", + "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with unknown PDS_PDTN with PDS_TEMPLATE_NUMBERS with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=65535", - "PDS_TEMPLATE_NUMBERS=1 2 3 4 5" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=["PDS_PDTN=65535", "PDS_TEMPLATE_NUMBERS=1 2 3 4 5"], + ) assert out_ds is not None out_ds = None with gdaltest.error_handler(): ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_PDS_PDTN': '65535', 'GRIB_PDS_TEMPLATE_NUMBERS': '1 2 3 4 5'} + expected_md = {"GRIB_PDS_PDTN": "65535", "GRIB_PDS_TEMPLATE_NUMBERS": "1 2 3 4 5"} for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ds = None gdal.Unlink(tmpfilename) # Test with unknown PDS_PDTN with PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=65535", - "PDS_TEMPLATE_ASSEMBLED_VALUES=1 2 3 4 5" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=65535", + "PDS_TEMPLATE_ASSEMBLED_VALUES=1 2 3 4 5", + ], + ) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_PDTN != 0 without template numbers with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=32" - ]) + out_ds = gdal.Translate( + tmpfilename, "data/byte.tif", format="GRIB", creationOptions=["PDS_PDTN=32"] + ) assert out_ds is None gdal.Unlink(tmpfilename) # Test with invalid values in PDS_TEMPLATE_NUMBERS with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=254", - "PDS_TEMPLATE_NUMBERS=-1 256 0 0 0 0" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=["PDS_PDTN=254", "PDS_TEMPLATE_NUMBERS=-1 256 0 0 0 0"], + ) assert out_ds is not None out_ds = None gdal.Unlink(tmpfilename) # Test with invalid values in PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=44", - # {44,21,0, {1, 1, 2,1,-1, -4, -1,-4,1,1,1, 2, 1,1,-2 ,1,-1, -4,1,-1,-4} }, - "PDS_TEMPLATE_ASSEMBLED_VALUES=-1 256 -1 1 128 4000000000 -1 -4 1 1 1 65536 1 1 32768 1 -129 -4 1 -1 -4" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=44", + # {44,21,0, {1, 1, 2,1,-1, -4, -1,-4,1,1,1, 2, 1,1,-2 ,1,-1, -4,1,-1,-4} }, + "PDS_TEMPLATE_ASSEMBLED_VALUES=-1 256 -1 1 128 4000000000 -1 -4 1 1 1 65536 1 1 32768 1 -129 -4 1 -1 -4", + ], + ) assert out_ds is not None out_ds = None gdal.Unlink(tmpfilename) # Test with both PDS_TEMPLATE_NUMBERS and PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): - out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', - creationOptions=[ - "PDS_PDTN=40", - "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", - "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647" - ]) + out_ds = gdal.Translate( + tmpfilename, + "data/byte.tif", + format="GRIB", + creationOptions=[ + "PDS_PDTN=40", + "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", + "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647", + ], + ) assert out_ds is None gdal.Unlink(tmpfilename) + ############################################################################### # Test GRIB2 write support for projections def test_grib_grib2_write_projections(): - filenames = ['albers_equal_area.grb2', - 'lambert_azimuthal_equal_area.grb2', - 'lambert_conformal_conic.grb2', - 'mercator.grb2', - 'mercator_2sp.grb2', - 'polar_stereographic.grb2', - 'ieee754_single.grb2' # Longitude latitude - ] + filenames = [ + "albers_equal_area.grb2", + "lambert_azimuthal_equal_area.grb2", + "lambert_conformal_conic.grb2", + "mercator.grb2", + "mercator_2sp.grb2", + "polar_stereographic.grb2", + "ieee754_single.grb2", # Longitude latitude + ] for filename in filenames: - filename = 'data/grib/' + filename + filename = "data/grib/" + filename src_ds = gdal.Open(filename) - tmpfilename = '/vsimem/out.grb2' - gdal.Translate(tmpfilename, filename, format='GRIB') + tmpfilename = "/vsimem/out.grb2" + gdal.Translate(tmpfilename, filename, format="GRIB") out_ds = gdal.Open(tmpfilename) - assert src_ds.GetProjectionRef() == out_ds.GetProjectionRef(), \ - ('did not get expected projection for %s' % filename) + assert src_ds.GetProjectionRef() == out_ds.GetProjectionRef(), ( + "did not get expected projection for %s" % filename + ) expected_gt = src_ds.GetGeoTransform() got_gt = out_ds.GetGeoTransform() - assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ - ('did not get expected geotransform for %s' % filename) + assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, ( + "did not get expected geotransform for %s" % filename + ) out_ds = None gdal.Unlink(tmpfilename) # Test writing GRS80 - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, gdal.GDT_Float32) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) - src_ds.SetProjection("""GEOGCS["GRS 1980(IUGG, 1980)", + src_ds.SetProjection( + """GEOGCS["GRS 1980(IUGG, 1980)", DATUM["unknown", SPHEROID["GRS80",6378137,298.257222101]], PRIMEM["Greenwich",0], - UNIT["degree",0.0174532925199433]]""") - tmpfilename = '/vsimem/out.grb2' + UNIT["degree",0.0174532925199433]]""" + ) + tmpfilename = "/vsimem/out.grb2" out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds) wkt = out_ds.GetProjectionRef() out_ds = None @@ -762,7 +952,11 @@ def test_grib_grib2_write_projections(): assert 'SPHEROID["GRS80",6378137,298.257222101]' in wkt # Test writing Mercator_1SP with scale != 1 (will be read as Mercator_2SP) - src_ds = gdal.Warp('', 'data/byte.tif', format='MEM', dstSRS="""PROJCS["unnamed", + src_ds = gdal.Warp( + "", + "data/byte.tif", + format="MEM", + dstSRS="""PROJCS["unnamed", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, @@ -779,9 +973,10 @@ def test_grib_grib2_write_projections(): PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, - AUTHORITY["EPSG","9001"]]]""") - tmpfilename = '/vsimem/out.grb2' - gdal.Translate(tmpfilename, src_ds, format='GRIB') + AUTHORITY["EPSG","9001"]]]""", + ) + tmpfilename = "/vsimem/out.grb2" + gdal.Translate(tmpfilename, src_ds, format="GRIB") out_ds = gdal.Open(tmpfilename) expected_wkt = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Spheroid imported from GRIB file",6378206.4,294.978698213911]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",33.500986],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' got_sr = osr.SpatialReference() @@ -790,16 +985,21 @@ def test_grib_grib2_write_projections(): expected_sr.SetFromUserInput(expected_wkt) if got_sr.IsSame(expected_sr) == 0: print(out_ds.GetProjectionRef()) - pytest.fail('did not get expected projection for Mercator_1SP') + pytest.fail("did not get expected projection for Mercator_1SP") expected_gt = (-10931635.565066436, 60.297, 0.0, 3331982.221608528, 0.0, -60.297) got_gt = out_ds.GetGeoTransform() - assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ - 'did not get expected geotransform for Mercator_1SP' + assert ( + max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5 + ), "did not get expected geotransform for Mercator_1SP" out_ds = None gdal.Unlink(tmpfilename) # Test writing LCC_1SP (will be read as LCC_2SP) - src_ds = gdal.Warp('', 'data/byte.tif', format='MEM', dstSRS="""PROJCS["unnamed", + src_ds = gdal.Warp( + "", + "data/byte.tif", + format="MEM", + dstSRS="""PROJCS["unnamed", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, @@ -816,9 +1016,10 @@ def test_grib_grib2_write_projections(): PARAMETER["scale_factor",0.9999], PARAMETER["false_easting",0], PARAMETER["false_northing",0], - UNIT["metre",1]]""") - tmpfilename = '/vsimem/out.grb2' - gdal.Translate(tmpfilename, src_ds, format='GRIB') + UNIT["metre",1]]""", + ) + tmpfilename = "/vsimem/out.grb2" + gdal.Translate(tmpfilename, src_ds, format="GRIB") out_ds = gdal.Open(tmpfilename) expected_wkt = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Spheroid imported from GRIB file",6378206.4,294.978698213911]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",33.5],PARAMETER["central_meridian",117],PARAMETER["standard_parallel_1",34.310911],PARAMETER["standard_parallel_2",32.686501],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' got_sr = osr.SpatialReference() @@ -827,20 +1028,22 @@ def test_grib_grib2_write_projections(): expected_sr.SetFromUserInput(expected_wkt) if got_sr.IsSame(expected_sr) == 0: print(out_ds.GetProjectionRef()) - pytest.fail('did not get expected projection for LCC_1SP') + pytest.fail("did not get expected projection for LCC_1SP") expected_gt = (8974472.884926716, 60.017, 0.0, 6235685.688523474, 0.0, -60.017) got_gt = out_ds.GetGeoTransform() - assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ - 'did not get expected geotransform for LCC_1SP' + assert ( + max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5 + ), "did not get expected geotransform for LCC_1SP" out_ds = None gdal.Unlink(tmpfilename) + ############################################################################### def _grib_read_section(filename, sect_num_to_read): - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f is None: return None # Ignore Sect 0 @@ -850,17 +1053,22 @@ def _grib_read_section(filename, sect_num_to_read): sect_size_bytes = gdal.VSIFReadL(1, 4, f) if not sect_size_bytes: break - sect_size_num = struct.unpack('>I', sect_size_bytes)[0] + sect_size_num = struct.unpack(">I", sect_size_bytes)[0] sect_num_bytes = gdal.VSIFReadL(1, 1, f) sect_num = ord(sect_num_bytes) if sect_num == sect_num_to_read: - ret = sect_size_bytes + sect_num_bytes + gdal.VSIFReadL(1, sect_size_num - 5, f) + ret = ( + sect_size_bytes + + sect_num_bytes + + gdal.VSIFReadL(1, sect_size_num - 5, f) + ) break gdal.VSIFSeekL(f, sect_size_num - 5, 1) gdal.VSIFCloseL(f) return ret + ############################################################################### # Test GRIB2 write support for data encodings @@ -876,114 +1084,269 @@ def test_grib_grib2_write_data_encodings(): GS5_PNG = 41 tests = [] - tests += [['data/byte.tif', [], 4672, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING'], 4672, GS5_SIMPLE]] - - tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] - - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=8'], 4672, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=9'], 4672, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=7'], 4484, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=5', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_SIMPLE]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], 4855, GS5_SIMPLE]] - - tests += [['data/grib/ds.mint.bin', ['PDS_PDTN=8', 'PDS_TEMPLATE_ASSEMBLED_VALUES=0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0'], 46650, GS5_CMPLX]] # has nodata, hence complex packing - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING'], 4672, GS5_CMPLX]] - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=0'], 4672, GS5_CMPLX]] - tests += [['data/byte.tif', ['SPATIAL_DIFFERENCING_ORDER=1'], 4672, GS5_CMPLXSEC]] - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=1'], 4672, GS5_CMPLXSEC]] - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=2'], 4672, GS5_CMPLXSEC]] - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_CMPLX]] - tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'NBITS=7'], 4484, GS5_CMPLX]] - - if gdal.GetDriverByName('PNG') is not None: - tests += [['data/byte.tif', ['DATA_ENCODING=PNG'], 4672, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=8'], 4672, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], 4855, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=9'], 4672, GS5_PNG]] # rounded to 16 bit - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=7'], 4672, GS5_PNG]] # rounded to 8 bit - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=4'], 5103, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=3'], 5103, GS5_PNG]] # rounded to 4 bit - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=2'], 5103, GS5_PNG]] - tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=1'], 5103, GS5_PNG]] - tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=PNG'], 4672, GS5_PNG]] + tests += [["data/byte.tif", [], 4672, GS5_SIMPLE]] + tests += [["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING"], 4672, GS5_SIMPLE]] + + tests += [["data/byte.tif", ["DATA_ENCODING=IEEE_FLOATING_POINT"], 4672, GS5_IEEE]] + + tests += [ + ["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING", "NBITS=8"], 4672, GS5_SIMPLE] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING", "NBITS=9"], 4672, GS5_SIMPLE] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING", "NBITS=7"], 4484, GS5_SIMPLE] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=SIMPLE_PACKING", "DECIMAL_SCALE_FACTOR=-1"], + 4820, + GS5_SIMPLE, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=SIMPLE_PACKING", "NBITS=5", "DECIMAL_SCALE_FACTOR=-1"], + 4820, + GS5_SIMPLE, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=SIMPLE_PACKING", "NBITS=8", "DECIMAL_SCALE_FACTOR=-1"], + 4855, + GS5_SIMPLE, + ] + ] + + tests += [ + [ + "data/grib/ds.mint.bin", + [ + "PDS_PDTN=8", + "PDS_TEMPLATE_ASSEMBLED_VALUES=0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0", + ], + 46650, + GS5_CMPLX, + ] + ] # has nodata, hence complex packing + tests += [["data/byte.tif", ["DATA_ENCODING=COMPLEX_PACKING"], 4672, GS5_CMPLX]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=COMPLEX_PACKING", "SPATIAL_DIFFERENCING_ORDER=0"], + 4672, + GS5_CMPLX, + ] + ] + tests += [["data/byte.tif", ["SPATIAL_DIFFERENCING_ORDER=1"], 4672, GS5_CMPLXSEC]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=COMPLEX_PACKING", "SPATIAL_DIFFERENCING_ORDER=1"], + 4672, + GS5_CMPLXSEC, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=COMPLEX_PACKING", "SPATIAL_DIFFERENCING_ORDER=2"], + 4672, + GS5_CMPLXSEC, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=COMPLEX_PACKING", "DECIMAL_SCALE_FACTOR=-1"], + 4820, + GS5_CMPLX, + ] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=COMPLEX_PACKING", "NBITS=7"], 4484, GS5_CMPLX] + ] + + if gdal.GetDriverByName("PNG") is not None: + tests += [["data/byte.tif", ["DATA_ENCODING=PNG"], 4672, GS5_PNG]] + tests += [["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=8"], 4672, GS5_PNG]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=PNG", "DECIMAL_SCALE_FACTOR=-1"], + 4820, + GS5_PNG, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=PNG", "NBITS=8", "DECIMAL_SCALE_FACTOR=-1"], + 4855, + GS5_PNG, + ] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=9"], 4672, GS5_PNG] + ] # rounded to 16 bit + tests += [ + ["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=7"], 4672, GS5_PNG] + ] # rounded to 8 bit + tests += [["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=4"], 5103, GS5_PNG]] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=3"], 5103, GS5_PNG] + ] # rounded to 4 bit + tests += [["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=2"], 5103, GS5_PNG]] + tests += [["data/byte.tif", ["DATA_ENCODING=PNG", "NBITS=1"], 5103, GS5_PNG]] + tests += [["../gcore/data/float32.tif", ["DATA_ENCODING=PNG"], 4672, GS5_PNG]] found_j2k_drivers = [] - for drvname in ['JP2KAK', 'JP2OPENJPEG', 'JPEG2000', 'JP2ECW']: + for drvname in ["JP2KAK", "JP2OPENJPEG", "JPEG2000", "JP2ECW"]: if gdal.GetDriverByName(drvname) is not None: - if drvname != 'JP2ECW': + if drvname != "JP2ECW": found_j2k_drivers.append(drvname) else: import ecw + if ecw.has_write_support(): found_j2k_drivers.append(drvname) if found_j2k_drivers: - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000'], 4672, GS5_JPEG2000]] - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'COMPRESSION_RATIO=2'], 4672, GS5_JPEG2000]] # COMPRESSION_RATIO ignored in that case - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=8'], 4672, GS5_JPEG2000]] - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'DECIMAL_SCALE_FACTOR=-1'], (4820, 4722), GS5_JPEG2000]] - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], (4855, 4795), GS5_JPEG2000]] - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=9'], 4672, GS5_JPEG2000]] + tests += [["data/byte.tif", ["DATA_ENCODING=JPEG2000"], 4672, GS5_JPEG2000]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=JPEG2000", "COMPRESSION_RATIO=2"], + 4672, + GS5_JPEG2000, + ] + ] # COMPRESSION_RATIO ignored in that case + tests += [ + ["data/byte.tif", ["DATA_ENCODING=JPEG2000", "NBITS=8"], 4672, GS5_JPEG2000] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=JPEG2000", "DECIMAL_SCALE_FACTOR=-1"], + (4820, 4722), + GS5_JPEG2000, + ] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=JPEG2000", "NBITS=8", "DECIMAL_SCALE_FACTOR=-1"], + (4855, 4795), + GS5_JPEG2000, + ] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=JPEG2000", "NBITS=9"], 4672, GS5_JPEG2000] + ] # 4899 for JP2ECW, 4440 for JP2OPENJPEG - tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=7'], (4484, 4899, 4440), GS5_JPEG2000]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=JPEG2000", "NBITS=7"], + (4484, 4899, 4440), + GS5_JPEG2000, + ] + ] for drvname in found_j2k_drivers: - tests += [['data/byte.tif', ['JPEG2000_DRIVER=' + drvname], 4672, GS5_JPEG2000]] - tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=JPEG2000'], 4672, GS5_JPEG2000]] - - tests += [['../gcore/data/int16.tif', [], 4672, GS5_SIMPLE]] - tests += [['../gcore/data/uint16.tif', [], 4672, GS5_SIMPLE]] - tests += [['../gcore/data/int32.tif', [], 4672, GS5_SIMPLE]] - tests += [['../gcore/data/uint32.tif', [], 4672, GS5_SIMPLE]] - tests += [['../gcore/data/float32.tif', [], 4672, GS5_IEEE]] - tests += [['../gcore/data/float64.tif', [], 4672, GS5_IEEE]] - tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] - tests += [['../gcore/data/float64.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] - tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=COMPLEX_PACKING'], 4672, GS5_CMPLX]] - - one_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + tests += [ + ["data/byte.tif", ["JPEG2000_DRIVER=" + drvname], 4672, GS5_JPEG2000] + ] + tests += [ + [ + "../gcore/data/float32.tif", + ["DATA_ENCODING=JPEG2000"], + 4672, + GS5_JPEG2000, + ] + ] + + tests += [["../gcore/data/int16.tif", [], 4672, GS5_SIMPLE]] + tests += [["../gcore/data/uint16.tif", [], 4672, GS5_SIMPLE]] + tests += [["../gcore/data/int32.tif", [], 4672, GS5_SIMPLE]] + tests += [["../gcore/data/uint32.tif", [], 4672, GS5_SIMPLE]] + tests += [["../gcore/data/float32.tif", [], 4672, GS5_IEEE]] + tests += [["../gcore/data/float64.tif", [], 4672, GS5_IEEE]] + tests += [ + [ + "../gcore/data/float32.tif", + ["DATA_ENCODING=IEEE_FLOATING_POINT"], + 4672, + GS5_IEEE, + ] + ] + tests += [ + [ + "../gcore/data/float64.tif", + ["DATA_ENCODING=IEEE_FLOATING_POINT"], + 4672, + GS5_IEEE, + ] + ] + tests += [ + [ + "../gcore/data/float32.tif", + ["DATA_ENCODING=COMPLEX_PACKING"], + 4672, + GS5_CMPLX, + ] + ] + + one_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) one_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") one_ds.SetProjection(sr.ExportToWkt()) one_ds.GetRasterBand(1).Fill(1) tests += [[one_ds, [], 1, GS5_SIMPLE]] - tests += [[one_ds, ['DATA_ENCODING=COMPLEX_PACKING'], 1, GS5_CMPLX]] - if gdal.GetDriverByName('PNG') is not None: - tests += [[one_ds, ['DATA_ENCODING=PNG'], 1, GS5_PNG]] + tests += [[one_ds, ["DATA_ENCODING=COMPLEX_PACKING"], 1, GS5_CMPLX]] + if gdal.GetDriverByName("PNG") is not None: + tests += [[one_ds, ["DATA_ENCODING=PNG"], 1, GS5_PNG]] if found_j2k_drivers: - tests += [[one_ds, ['DATA_ENCODING=JPEG2000'], 1, GS5_JPEG2000]] + tests += [[one_ds, ["DATA_ENCODING=JPEG2000"], 1, GS5_JPEG2000]] - nodata_never_hit_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + nodata_never_hit_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) nodata_never_hit_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) nodata_never_hit_ds.SetProjection(sr.ExportToWkt()) nodata_never_hit_ds.GetRasterBand(1).SetNoDataValue(1) tests += [[nodata_never_hit_ds, [], 0, GS5_SIMPLE]] - all_nodata_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + all_nodata_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) all_nodata_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) all_nodata_ds.SetProjection(sr.ExportToWkt()) all_nodata_ds.GetRasterBand(1).SetNoDataValue(0) - tests += [[all_nodata_ds, ['DATA_ENCODING=COMPLEX_PACKING'], 0, GS5_CMPLX]] + tests += [[all_nodata_ds, ["DATA_ENCODING=COMPLEX_PACKING"], 0, GS5_CMPLX]] for (filename, options, expected_cs, expected_section5_template_number) in tests: - tmpfilename = '/vsimem/out.grb2' + tmpfilename = "/vsimem/out.grb2" gdal.ErrorReset() - gdal.Translate(tmpfilename, filename, format='GRIB', - creationOptions=options) + gdal.Translate(tmpfilename, filename, format="GRIB", creationOptions=options) error_msg = gdal.GetLastErrorMsg() - assert error_msg == '', \ - ('did not expect error for %s, %s' % (str(filename), str(options))) + assert error_msg == "", "did not expect error for %s, %s" % ( + str(filename), + str(options), + ) section5 = _grib_read_section(tmpfilename, 5) - section5_template_number = struct.unpack('>h', section5[9:11])[0] - assert section5_template_number == expected_section5_template_number, \ - ('did not get expected section 5 template number for %s, %s' % (str(filename), str(options))) + section5_template_number = struct.unpack(">h", section5[9:11])[0] + assert ( + section5_template_number == expected_section5_template_number + ), "did not get expected section 5 template number for %s, %s" % ( + str(filename), + str(options), + ) out_ds = gdal.Open(tmpfilename) cs = out_ds.GetRasterBand(1).Checksum() @@ -992,8 +1355,10 @@ def test_grib_grib2_write_data_encodings(): gdal.Unlink(tmpfilename) if not isinstance(expected_cs, tuple): expected_cs = (expected_cs,) - assert cs in expected_cs, \ - ('did not get expected checksum for %s, %s' % (str(filename), str(options))) + assert cs in expected_cs, "did not get expected checksum for %s, %s" % ( + str(filename), + str(options), + ) if section5_template_number in (GS5_CMPLX, GS5_CMPLXSEC): if isinstance(filename, str): @@ -1001,95 +1366,138 @@ def test_grib_grib2_write_data_encodings(): else: ref_ds = filename expected_nd = ref_ds.GetRasterBand(1).GetNoDataValue() - assert nd == expected_nd, \ - ('did not get expected nodata for %s, %s' % (str(filename), str(options))) + assert nd == expected_nd, "did not get expected nodata for %s, %s" % ( + str(filename), + str(options), + ) # Test floating point data with dynamic < 1 - test_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) + test_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, gdal.GDT_Float32) test_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) test_ds.SetProjection(sr.ExportToWkt()) - test_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 1.23, 1.45, 1.56, 1.78)) + test_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * "f", 1.23, 1.45, 1.56, 1.78)) - encodings = ['SIMPLE_PACKING', 'COMPLEX_PACKING', 'IEEE_FLOATING_POINT'] - if gdal.GetDriverByName('PNG') is not None: - encodings += ['PNG'] + encodings = ["SIMPLE_PACKING", "COMPLEX_PACKING", "IEEE_FLOATING_POINT"] + if gdal.GetDriverByName("PNG") is not None: + encodings += ["PNG"] # JPEG2000 doesn't result in an appropriate result - if found_j2k_drivers and found_j2k_drivers != ['JPEG2000'] and found_j2k_drivers != ['JPEG2000', 'JP2ECW']: - encodings += ['JPEG2000'] + if ( + found_j2k_drivers + and found_j2k_drivers != ["JPEG2000"] + and found_j2k_drivers != ["JPEG2000", "JP2ECW"] + ): + encodings += ["JPEG2000"] for encoding in encodings: - tmpfilename = '/vsimem/out.grb2' + tmpfilename = "/vsimem/out.grb2" gdal.ErrorReset() - options = ['DATA_ENCODING=' + encoding] - if encoding == 'COMPLEX_PACKING': + options = ["DATA_ENCODING=" + encoding] + if encoding == "COMPLEX_PACKING": with gdaltest.error_handler(): - success = gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=options) - assert not success, \ - ('expected error for %s, %s' % ('floating point data with dynamic < 1', str(options))) + success = gdal.Translate( + tmpfilename, test_ds, format="GRIB", creationOptions=options + ) + assert not success, "expected error for %s, %s" % ( + "floating point data with dynamic < 1", + str(options), + ) else: - gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=options) + gdal.Translate(tmpfilename, test_ds, format="GRIB", creationOptions=options) error_msg = gdal.GetLastErrorMsg() - assert error_msg == '', \ - ('did not expect error for %s, %s' % ('floating point data with dynamic < 1', str(options))) + assert error_msg == "", "did not expect error for %s, %s" % ( + "floating point data with dynamic < 1", + str(options), + ) out_ds = gdal.Open(tmpfilename) - got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) + got_vals = struct.unpack(4 * "d", out_ds.ReadRaster()) out_ds = None - if encoding == 'IEEE_FLOATING_POINT': + if encoding == "IEEE_FLOATING_POINT": expected_vals = (1.23, 1.45, 1.56, 1.78) else: - expected_vals = (1.2300000190734863, 1.4487500190734863, 1.5581250190734863, 1.7807812690734863) - assert max([abs(got_vals[i] - expected_vals[i]) for i in range(4)]) <= 1e-7, \ - 'did not get expected values' + expected_vals = ( + 1.2300000190734863, + 1.4487500190734863, + 1.5581250190734863, + 1.7807812690734863, + ) + assert ( + max([abs(got_vals[i] - expected_vals[i]) for i in range(4)]) <= 1e-7 + ), "did not get expected values" gdal.Unlink(tmpfilename) test_ds = None # Test floating point data with very large dynamic - test_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) + test_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, gdal.GDT_Float32) test_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) test_ds.SetProjection(sr.ExportToWkt()) - test_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 1.23e10, -2.45e10, 1.23e10, -2.45e10)) + test_ds.WriteRaster( + 0, 0, 2, 2, struct.pack(4 * "f", 1.23e10, -2.45e10, 1.23e10, -2.45e10) + ) - encodings = ['SIMPLE_PACKING'] - if gdal.GetDriverByName('PNG') is not None: - encodings += ['PNG'] + encodings = ["SIMPLE_PACKING"] + if gdal.GetDriverByName("PNG") is not None: + encodings += ["PNG"] # JP2ECW doesn't manage to compress such a small file - if found_j2k_drivers and found_j2k_drivers != ['JP2ECW'] and found_j2k_drivers != ['JPEG2000', 'JP2ECW']: - encodings += ['JPEG2000'] + if ( + found_j2k_drivers + and found_j2k_drivers != ["JP2ECW"] + and found_j2k_drivers != ["JPEG2000", "JP2ECW"] + ): + encodings += ["JPEG2000"] for encoding in encodings: - tmpfilename = '/vsimem/out.grb2' - if encoding != 'SIMPLE_PACKING': + tmpfilename = "/vsimem/out.grb2" + if encoding != "SIMPLE_PACKING": gdal.PushErrorHandler() - gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=['DATA_ENCODING=' + encoding]) - if encoding != 'SIMPLE_PACKING': + gdal.Translate( + tmpfilename, + test_ds, + format="GRIB", + creationOptions=["DATA_ENCODING=" + encoding], + ) + if encoding != "SIMPLE_PACKING": gdal.PopErrorHandler() out_ds = gdal.Open(tmpfilename) - assert out_ds is not None, ('failed to re-open dataset for ' + encoding) - got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) + assert out_ds is not None, "failed to re-open dataset for " + encoding + got_vals = struct.unpack(4 * "d", out_ds.ReadRaster()) out_ds = None gdal.Unlink(tmpfilename) expected_vals = (1.23e10, -2.45e10, 1.23e10, -2.45e10) - assert max([abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) for i in range(4)]) <= 1e-4, \ - ('did not get expected values for ' + encoding) + assert ( + max( + [ + abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) + for i in range(4) + ] + ) + <= 1e-4 + ), ("did not get expected values for " + encoding) test_ds = None # Test lossy J2K compression for drvname in found_j2k_drivers: - tmpfilename = '/vsimem/out.grb2' + tmpfilename = "/vsimem/out.grb2" gdal.ErrorReset() - gdal.Translate(tmpfilename, 'data/utm.tif', format='GRIB', - creationOptions=['JPEG2000_DRIVER=' + drvname, - 'COMPRESSION_RATIO=20']) + gdal.Translate( + tmpfilename, + "data/utm.tif", + format="GRIB", + creationOptions=["JPEG2000_DRIVER=" + drvname, "COMPRESSION_RATIO=20"], + ) error_msg = gdal.GetLastErrorMsg() - assert error_msg == '', \ - ('did not expect error for %s, %s' % (str(filename), str(options))) + assert error_msg == "", "did not expect error for %s, %s" % ( + str(filename), + str(options), + ) out_ds = gdal.Open(tmpfilename) cs = out_ds.GetRasterBand(1).Checksum() out_ds = None gdal.Unlink(tmpfilename) if cs == 0 or cs == 50235: # 50235: lossless checksum - gdaltest.post_reason('did not get expected checksum for lossy JPEG2000 with ' + drvname) + gdaltest.post_reason( + "did not get expected checksum for lossy JPEG2000 with " + drvname + ) print(cs) @@ -1101,26 +1509,54 @@ def test_grib_grib2_write_data_encodings_warnings_and_errors(): # Cases where warnings are expected tests = [] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'DECIMAL_SCALE_FACTOR=1'], 4672]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'JPEG2000_DRIVER=FOO'], 4672]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'JPEG2000_DRIVER=FOO'], 4672]] - tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'SPATIAL_DIFFERENCING_ORDER=1'], 4672]] - tests += [['data/grib/ds.mint.bin', ['DATA_ENCODING=SIMPLE_PACKING'], 41640]] # should warn since simple packing doesn't support nodata - tests += [['data/byte.tif', ['NBITS=32'], 4672]] - tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT', 'NBITS=8'], 4672]] - tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT', 'DECIMAL_SCALE_FACTOR=-1'], 4672]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=SIMPLE_PACKING", "DECIMAL_SCALE_FACTOR=1"], + 4672, + ] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING", "JPEG2000_DRIVER=FOO"], 4672] + ] + tests += [ + ["data/byte.tif", ["DATA_ENCODING=SIMPLE_PACKING", "JPEG2000_DRIVER=FOO"], 4672] + ] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=SIMPLE_PACKING", "SPATIAL_DIFFERENCING_ORDER=1"], + 4672, + ] + ] + tests += [ + ["data/grib/ds.mint.bin", ["DATA_ENCODING=SIMPLE_PACKING"], 41640] + ] # should warn since simple packing doesn't support nodata + tests += [["data/byte.tif", ["NBITS=32"], 4672]] + tests += [["data/byte.tif", ["DATA_ENCODING=IEEE_FLOATING_POINT", "NBITS=8"], 4672]] + tests += [ + [ + "data/byte.tif", + ["DATA_ENCODING=IEEE_FLOATING_POINT", "DECIMAL_SCALE_FACTOR=-1"], + 4672, + ] + ] for (filename, options, expected_cs) in tests: - tmpfilename = '/vsimem/out.grb2' + tmpfilename = "/vsimem/out.grb2" src_ds = gdal.Open(filename) gdal.ErrorReset() with gdaltest.error_handler(): out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) error_msg = gdal.GetLastErrorMsg() - assert error_msg != '', \ - ('expected warning for %s, %s' % (str(filename), str(options))) - assert out_ds is not None, \ - ('did not expect null return for %s, %s' % (str(filename), str(options))) + assert error_msg != "", "expected warning for %s, %s" % ( + str(filename), + str(options), + ) + assert out_ds is not None, "did not expect null return for %s, %s" % ( + str(filename), + str(options), + ) cs = out_ds.GetRasterBand(1).Checksum() @@ -1128,43 +1564,59 @@ def test_grib_grib2_write_data_encodings_warnings_and_errors(): gdal.Unlink(tmpfilename) if not isinstance(expected_cs, tuple): expected_cs = (expected_cs,) - assert cs in expected_cs, \ - ('did not get expected checksum for %s, %s' % (str(filename), str(options))) + assert cs in expected_cs, "did not get expected checksum for %s, %s" % ( + str(filename), + str(options), + ) # Cases where errors are expected tests = [] - tests += [['data/byte.tif', ['DATA_ENCODING=FOO']]] # invalid DATA_ENCODING - tests += [['data/byte.tif', ['JPEG2000_DRIVER=FOO', 'SPATIAL_DIFFERENCING_ORDER=BAR']]] # both cannot be used together - tests += [['data/byte.tif', ['SPATIAL_DIFFERENCING_ORDER=3']]] - tests += [['data/byte.tif', ['JPEG2000_DRIVER=THIS_IS_NOT_A_J2K_DRIVER']]] # non-existing driver - tests += [['data/byte.tif', ['JPEG2000_DRIVER=DERIVED']]] # Read-only driver - tests += [['../gcore/data/cfloat32.tif', []]] # complex data type - tests += [['data/aaigrid/float64.asc', []]] # no projection - tests += [['data/test_nosrs.vrt', []]] # no geotransform - tests += [['data/envi/rotation.img', []]] # geotransform with rotation terms - gdal.GetDriverByName('GTiff').Create('/vsimem/huge.tif', 65535, 65535, 1, options=['SPARSE_OK=YES']) - tests += [['/vsimem/huge.tif', []]] # too many pixels - - for (filename, options,) in tests: - tmpfilename = '/vsimem/out.grb2' + tests += [["data/byte.tif", ["DATA_ENCODING=FOO"]]] # invalid DATA_ENCODING + tests += [ + ["data/byte.tif", ["JPEG2000_DRIVER=FOO", "SPATIAL_DIFFERENCING_ORDER=BAR"]] + ] # both cannot be used together + tests += [["data/byte.tif", ["SPATIAL_DIFFERENCING_ORDER=3"]]] + tests += [ + ["data/byte.tif", ["JPEG2000_DRIVER=THIS_IS_NOT_A_J2K_DRIVER"]] + ] # non-existing driver + tests += [["data/byte.tif", ["JPEG2000_DRIVER=DERIVED"]]] # Read-only driver + tests += [["../gcore/data/cfloat32.tif", []]] # complex data type + tests += [["data/aaigrid/float64.asc", []]] # no projection + tests += [["data/test_nosrs.vrt", []]] # no geotransform + tests += [["data/envi/rotation.img", []]] # geotransform with rotation terms + gdal.GetDriverByName("GTiff").Create( + "/vsimem/huge.tif", 65535, 65535, 1, options=["SPARSE_OK=YES"] + ) + tests += [["/vsimem/huge.tif", []]] # too many pixels + + for ( + filename, + options, + ) in tests: + tmpfilename = "/vsimem/out.grb2" src_ds = gdal.Open(filename) gdal.ErrorReset() with gdaltest.error_handler(): out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) error_msg = gdal.GetLastErrorMsg() - assert error_msg != '', \ - ('expected warning for %s, %s' % (str(filename), str(options))) - assert out_ds is None, \ - ('expected null return for %s, %s' % (str(filename), str(options))) + assert error_msg != "", "expected warning for %s, %s" % ( + str(filename), + str(options), + ) + assert out_ds is None, "expected null return for %s, %s" % ( + str(filename), + str(options), + ) out_ds = None gdal.Unlink(tmpfilename) - gdal.Unlink('/vsimem/huge.tif') + gdal.Unlink("/vsimem/huge.tif") with gdaltest.error_handler(): - out_ds = gdal.Translate('/i/do_not/exist.grb2', 'data/byte.tif', format='GRIB') - assert out_ds is None, 'expected null return' + out_ds = gdal.Translate("/i/do_not/exist.grb2", "data/byte.tif", format="GRIB") + assert out_ds is None, "expected null return" + ############################################################################### # Test writing temperatures with automatic Celsius -> Kelvin conversion @@ -1173,86 +1625,107 @@ def test_grib_grib2_write_data_encodings_warnings_and_errors(): def test_grib_grib2_write_temperatures(): for (src_type, data_encoding, input_unit) in [ - (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', None), - (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', 'C'), - (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', 'K'), - (gdal.GDT_Float64, 'IEEE_FLOATING_POINT', None), - (gdal.GDT_Float32, 'SIMPLE_PACKING', None)]: - - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, src_type) + (gdal.GDT_Float32, "IEEE_FLOATING_POINT", None), + (gdal.GDT_Float32, "IEEE_FLOATING_POINT", "C"), + (gdal.GDT_Float32, "IEEE_FLOATING_POINT", "K"), + (gdal.GDT_Float64, "IEEE_FLOATING_POINT", None), + (gdal.GDT_Float32, "SIMPLE_PACKING", None), + ]: + + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, src_type) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") src_ds.SetProjection(sr.ExportToWkt()) - src_ds.WriteRaster(0, 0, 2, 2, - struct.pack(4 * 'f', 25.0, 25.1, 25.1, 25.2), - buf_type=gdal.GDT_Float32) - - tmpfilename = '/vsimem/out.grb2' + src_ds.WriteRaster( + 0, + 0, + 2, + 2, + struct.pack(4 * "f", 25.0, 25.1, 25.1, 25.2), + buf_type=gdal.GDT_Float32, + ) + + tmpfilename = "/vsimem/out.grb2" options = [ - 'DATA_ENCODING=' + data_encoding, - 'PDS_PDTN=8', - 'PDS_TEMPLATE_NUMBERS=0 5 2 0 0 0 255 255 1 0 0 0 43 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 23 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0' + "DATA_ENCODING=" + data_encoding, + "PDS_PDTN=8", + "PDS_TEMPLATE_NUMBERS=0 5 2 0 0 0 255 255 1 0 0 0 43 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 23 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0", ] if input_unit is not None: - options += ['INPUT_UNIT=' + input_unit] + options += ["INPUT_UNIT=" + input_unit] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) out_ds = gdal.Open(tmpfilename) - got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) + got_vals = struct.unpack(4 * "d", out_ds.ReadRaster()) out_ds = None gdal.Unlink(tmpfilename) - if input_unit != 'K': + if input_unit != "K": expected_vals = (25.0, 25.1, 25.1, 25.2) else: expected_vals = (25.0 - 273.15, 25.1 - 273.15, 25.1 - 273.15, 25.2 - 273.15) - assert max([abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) for i in range(4)]) <= 1e-4, \ - ('fail with data_encoding = %s and type = %s' % (data_encoding, str(src_type))) + assert ( + max( + [ + abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) + for i in range(4) + ] + ) + <= 1e-4 + ), "fail with data_encoding = %s and type = %s" % (data_encoding, str(src_type)) ############################################################################### -@pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) + +@pytest.mark.parametrize( + "datatype", [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName +) def test_grib_grib2_write_nodata(datatype): - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(123) - tmpfilename = '/vsimem/out.grb2' - options = [ - 'DATA_ENCODING=COMPLEX_PACKING' - ] + tmpfilename = "/vsimem/out.grb2" + options = ["DATA_ENCODING=COMPLEX_PACKING"] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 - got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) + got_vals = struct.unpack(4 * "d", ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) for i in range(4): assert got_vals[i] == 0.0 + ############################################################################### -@pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) + +@pytest.mark.parametrize( + "datatype", [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName +) def test_grib_grib2_write_nodata_only(datatype): - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(12.3) - src_ds.WriteRaster(0, 0, 2, 2, - struct.pack(4 * 'f', 12.3, 12.3, 12.3, 12.3), - buf_type=gdal.GDT_Float32) - tmpfilename = '/vsimem/out.grb2' - options = [ - 'DATA_ENCODING=COMPLEX_PACKING' - ] + src_ds.WriteRaster( + 0, + 0, + 2, + 2, + struct.pack(4 * "f", 12.3, 12.3, 12.3, 12.3), + buf_type=gdal.GDT_Float32, + ) + tmpfilename = "/vsimem/out.grb2" + options = ["DATA_ENCODING=COMPLEX_PACKING"] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) @@ -1260,7 +1733,7 @@ def test_grib_grib2_write_nodata_only(datatype): assert ds.GetRasterBand(1).GetNoDataValue() == 12 else: assert ds.GetRasterBand(1).GetNoDataValue() == pytest.approx(12.3, rel=1e-4) - got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) + got_vals = struct.unpack(4 * "d", ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) if datatype == gdal.GDT_Byte: @@ -1269,56 +1742,66 @@ def test_grib_grib2_write_nodata_only(datatype): expected_vals = (12.3, 12.3, 12.3, 12.3) assert got_vals == pytest.approx(expected_vals, rel=1e-4) + ############################################################################### -@pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) + +@pytest.mark.parametrize( + "datatype", [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName +) def test_grib_grib2_write_full_OneData(datatype): - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(123) - src_ds.WriteRaster(0, 0, 2, 2, - struct.pack(4 * 'f', 25.4, 25.4, 25.4, 25.4), - buf_type=gdal.GDT_Float32) - tmpfilename = '/vsimem/out.grb2' - options = [ - 'DATA_ENCODING=COMPLEX_PACKING' - ] + src_ds.WriteRaster( + 0, + 0, + 2, + 2, + struct.pack(4 * "f", 25.4, 25.4, 25.4, 25.4), + buf_type=gdal.GDT_Float32, + ) + tmpfilename = "/vsimem/out.grb2" + options = ["DATA_ENCODING=COMPLEX_PACKING"] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 - got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) + got_vals = struct.unpack(4 * "d", ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) - if (datatype == gdal.GDT_Byte): + if datatype == gdal.GDT_Byte: expected_vals = (25, 25, 25, 25) else: expected_vals = (25.4, 25.4, 25.4, 25.4) assert got_vals == pytest.approx(expected_vals, rel=1e-4) + ############################################################################### + def test_grib_grib2_write_mix_nodata_and_a_single_data(): - src_ds = gdal.Open('data/grib/one_value_and_nodata_points.grb2') - tmpfilename = '/vsimem/out.grb2' + src_ds = gdal.Open("data/grib/one_value_and_nodata_points.grb2") + tmpfilename = "/vsimem/out.grb2" options = [ - 'DATA_ENCODING=COMPLEX_PACKING', + "DATA_ENCODING=COMPLEX_PACKING", ] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) src_ds = None ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 9999 - got_vals = struct.unpack(400 * 'd', ds.ReadRaster()) + got_vals = struct.unpack(400 * "d", ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) assert got_vals[0] == 9999 assert got_vals[6] == pytest.approx(0.01, rel=1e-4) + ############################################################################### # Test GRIB2 file with JPEG2000 codestream on a single line (#6719) @@ -1328,63 +1811,82 @@ def test_grib_online_grib2_jpeg2000_single_line(): if not has_jp2kdrv(): pytest.skip() - filename = 'CMC_hrdps_continental_PRATE_SFC_0_ps2.5km_2017111712_P001-00.grib2' - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/grib/' + filename): + filename = "CMC_hrdps_continental_PRATE_SFC_0_ps2.5km_2017111712_P001-00.grib2" + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/grib/" + filename + ): pytest.skip() - ds = gdal.Open('tmp/cache/' + filename) + ds = gdal.Open("tmp/cache/" + filename) cs = ds.GetRasterBand(1).Checksum() - assert cs != 0, 'Could not open file' + assert cs != 0, "Could not open file" nd = ds.GetRasterBand(1).GetNoDataValue() - assert nd == 9999, 'Bad nodata value' + assert nd == 9999, "Bad nodata value" md = ds.GetRasterBand(1).GetMetadata() - expected_md = {'GRIB_REF_TIME': '1510920000', 'GRIB_VALID_TIME': '1510923600', 'GRIB_FORECAST_SECONDS': '3600', 'GRIB_UNIT': '[kg/(m^2 s)]', 'GRIB_PDS_TEMPLATE_NUMBERS': '1 7 2 50 50 0 0 0 0 0 0 0 60 1 0 0 0 0 0 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '0', 'GRIB_COMMENT': 'Precipitation rate [kg/(m^2 s)]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'PRATE'} + expected_md = { + "GRIB_REF_TIME": "1510920000", + "GRIB_VALID_TIME": "1510923600", + "GRIB_FORECAST_SECONDS": "3600", + "GRIB_UNIT": "[kg/(m^2 s)]", + "GRIB_PDS_TEMPLATE_NUMBERS": "1 7 2 50 50 0 0 0 0 0 0 0 60 1 0 0 0 0 0 255 255 255 255 255 255", + "GRIB_PDS_PDTN": "0", + "GRIB_COMMENT": "Precipitation rate [kg/(m^2 s)]", + "GRIB_SHORT_NAME": "0-SFC", + "GRIB_ELEMENT": "PRATE", + } for k in expected_md: - assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' - + assert k in md and md[k] == expected_md[k], "Did not get expected metadata" ############################################################################### # Template 4.12 with Derived forecast = spread. Do not do unit conversion ! + def test_grib_grib2_derived_forecast_spread(): - ds = gdal.Open('data/grib/template_4_12_spread.grb2') + ds = gdal.Open("data/grib/template_4_12_spread.grb2") band = ds.GetRasterBand(1) - assert band.GetMetadataItem('GRIB_UNIT') == '[spread]' + assert band.GetMetadataItem("GRIB_UNIT") == "[spread]" assert band.ComputeRasterMinMax() == (0.24296024441719055, 0.24296024441719055) - out_ds = gdaltest.grib_drv.CreateCopy('/vsimem/out.grb2', ds) + out_ds = gdaltest.grib_drv.CreateCopy("/vsimem/out.grb2", ds) band = out_ds.GetRasterBand(1) - assert band.GetMetadataItem('GRIB_UNIT') == '[spread]' + assert band.GetMetadataItem("GRIB_UNIT") == "[spread]" assert band.ComputeRasterMinMax() == (0.24296024441719055, 0.24296024441719055) out_ds = None - gdal.Unlink('/vsimem/out.grb2') - + gdal.Unlink("/vsimem/out.grb2") ############################################################################### # Template 4.48 with Optical Properties of Aerosol + def test_grib_grib2_template_4_48(): - ds = gdal.Open('data/grib/template_4_48.grb2') + ds = gdal.Open("data/grib/template_4_48.grb2") band = ds.GetRasterBand(1) - assert band.GetMetadataItem('GRIB_UNIT') == '[1/kg]' - assert band.GetMetadataItem('GRIB_ELEMENT') == 'ASNCON' - assert band.GetMetadataItem('GRIB_SHORT_NAME') == '0-EATM' - + assert band.GetMetadataItem("GRIB_UNIT") == "[1/kg]" + assert band.GetMetadataItem("GRIB_ELEMENT") == "ASNCON" + assert band.GetMetadataItem("GRIB_SHORT_NAME") == "0-EATM" ############################################################################### # Test reading product whose scan flag is not 64 + def test_grib_grib2_scan_flag_not_64(): - ds = gdal.Open('/vsisparse/data/grib/blend.t17z.master.f001.co.grib2.sparse.xml') + ds = gdal.Open("/vsisparse/data/grib/blend.t17z.master.f001.co.grib2.sparse.xml") gt = ds.GetGeoTransform() - expected_gt = (-3272421.457337171, 2539.703, 0.0, 3790842.1060354356, 0.0, -2539.703) + expected_gt = ( + -3272421.457337171, + 2539.703, + 0.0, + 3790842.1060354356, + 0.0, + -2539.703, + ) assert gt == pytest.approx(expected_gt, rel=1e-6) @@ -1399,24 +1901,31 @@ def test_grib_grib2_read_subgrids(): # gdal_translate ../autotest/gcore/data/byte.tif band2.tif -scale 0 255 255 0 # gdalbuildvrt -separate tmp.vrt band1.tif band2.tif # gdal_translate tmp.vrt ../autotest/gdrivers/data/grib/subgrids.grib2 -co "BAND_1_PDS_TEMPLATE_ASSEMBLED_VALUES=2 2 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "BAND_2_PDS_TEMPLATE_ASSEMBLED_VALUES=2 3 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "IDS=CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" -co WRITE_SUBGRIDS=YES - ds = gdal.Open('data/grib/subgrids.grib2') + ds = gdal.Open("data/grib/subgrids.grib2") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(2).Checksum() == 4563 expected_ids = "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=0 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" - assert ds.GetRasterBand(1).GetMetadataItem('GRIB_IDS') == expected_ids - assert ds.GetRasterBand(2).GetMetadataItem('GRIB_IDS') == expected_ids - assert ds.GetRasterBand(1).GetMetadataItem('GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES') == '2 2 2 0 84 0 0 1 0 220 0 0 255 0 0' - assert ds.GetRasterBand(2).GetMetadataItem('GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES') == '2 3 2 0 84 0 0 1 0 220 0 0 255 0 0' + assert ds.GetRasterBand(1).GetMetadataItem("GRIB_IDS") == expected_ids + assert ds.GetRasterBand(2).GetMetadataItem("GRIB_IDS") == expected_ids + assert ( + ds.GetRasterBand(1).GetMetadataItem("GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES") + == "2 2 2 0 84 0 0 1 0 220 0 0 255 0 0" + ) + assert ( + ds.GetRasterBand(2).GetMetadataItem("GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES") + == "2 3 2 0 84 0 0 1 0 220 0 0 255 0 0" + ) ############################################################################### # Test reading message with subgrids with second subgrid reusing the bitmap from the first one # Fixes https://github.com/OSGeo/gdal/issues/3099 + def test_grib_grib2_read_subgrids_reuse_bitmap(): # File generated with gdal_translate ../autotest/gdrivers/data/grib/subgrids.grib2 ../autotest/gdrivers/data/grib/subgrids_reuse_bitmap.grib2 --config GRIB_WRITE_BITMAP_TEST YES -co "BAND_1_PDS_TEMPLATE_ASSEMBLED_VALUES=2 2 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "BAND_2_PDS_TEMPLATE_ASSEMBLED_VALUES=2 3 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "IDS=CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" -co WRITE_SUBGRIDS=YES -co "DATA_ENCODING=SIMPLE_PACKING" - ds = gdal.Open('data/grib/subgrids_reuse_bitmap.grib2') + ds = gdal.Open("data/grib/subgrids_reuse_bitmap.grib2") assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(2).Checksum() == 4563 @@ -1425,42 +1934,68 @@ def test_grib_grib2_read_subgrids_reuse_bitmap(): # Test reading and writing GRIBv2 with 0-360 longitudes # Fixes https://github.com/OSGeo/gdal/issues/4524 -@pytest.mark.parametrize('test', [ + +@pytest.mark.parametrize( + "test", + [ # Only the full globe can use split&swap - { 'file': 'data/grib/gfs.t06z.pgrb2.1p0.grib2', 'geo': (-185.0, 10.0, 0.0, 90.125, 0.0, -10.0), 'band1csum': 7514 }, + { + "file": "data/grib/gfs.t06z.pgrb2.1p0.grib2", + "geo": (-185.0, 10.0, 0.0, 90.125, 0.0, -10.0), + "band1csum": 7514, + }, # This one is very unorthodox and likely to trigger bugs - { 'file': 'data/grib/gfs.t06z.pgrb2.1p0.partial_across_am.grib2', 'geo': (24.875, 10.0, 0.0, 90.125, 0.0, -10.0), 'band1csum': 5060 }, + { + "file": "data/grib/gfs.t06z.pgrb2.1p0.partial_across_am.grib2", + "geo": (24.875, 10.0, 0.0, 90.125, 0.0, -10.0), + "band1csum": 5060, + }, # This one should have only the longitudes translation - { 'file': 'data/grib/gfs.t06z.pgrb2.1p0.partial_east_of_am.grib2', 'geo': (-60.125, 10.0, 0.0, 90.125, 0.0, -10.0), 'band1csum': 698 }, + { + "file": "data/grib/gfs.t06z.pgrb2.1p0.partial_east_of_am.grib2", + "geo": (-60.125, 10.0, 0.0, 90.125, 0.0, -10.0), + "band1csum": 698, + }, # This one should be identical with and without the translation - { 'file': 'data/grib/gfs.t06z.pgrb2.1p0.partial_west_of_am.grib2', 'geo': (24.875, 10.0, 0.0, 90.125, 0.0, -10.0), 'band1csum': 601 }, + { + "file": "data/grib/gfs.t06z.pgrb2.1p0.partial_west_of_am.grib2", + "geo": (24.875, 10.0, 0.0, 90.125, 0.0, -10.0), + "band1csum": 601, + }, # This one should have split&swap enabled even if the longitude range slightly exceeds 360° - { 'file': 'data/grib/gfswave-11.t00z.global.0p25.f000.grib2', 'geo': (-180.125, 0.25, 0.0, 90.125, 0.0, -0.25), 'band1csum': 52492 } -], ids=lambda x: x['file']) + { + "file": "data/grib/gfswave-11.t00z.global.0p25.f000.grib2", + "geo": (-180.125, 0.25, 0.0, 90.125, 0.0, -0.25), + "band1csum": 52492, + }, + ], + ids=lambda x: x["file"], +) def test_grib_grib2_split_and_swap(test): - tmpfilename = '/vsimem/out.grb2' + tmpfilename = "/vsimem/out.grb2" - ds = gdal.Open(test['file']) + ds = gdal.Open(test["file"]) gt = ds.GetGeoTransform() - assert gt == pytest.approx(test['geo'], rel=1e-6) - assert ds.GetRasterBand(1).Checksum() == test['band1csum'] + assert gt == pytest.approx(test["geo"], rel=1e-6) + assert ds.GetRasterBand(1).Checksum() == test["band1csum"] out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, ds) gt = out_ds.GetGeoTransform() - assert gt == pytest.approx(test['geo'], rel=1e-6) - assert out_ds.GetRasterBand(1).Checksum() == test['band1csum'] + assert gt == pytest.approx(test["geo"], rel=1e-6) + assert out_ds.GetRasterBand(1).Checksum() == test["band1csum"] out_ds = None gdal.Unlink(tmpfilename) ds = None + def test_grib_grib2_disable_split_and_swap(): - with gdaltest.config_option('GRIB_ADJUST_LONGITUDE_RANGE', 'NO'): - tmpfilename = '/vsimem/out.grb2' + with gdaltest.config_option("GRIB_ADJUST_LONGITUDE_RANGE", "NO"): + tmpfilename = "/vsimem/out.grb2" # This the untranslated range expected_gt = (-0.125, 10.0, 0.0, 90.125, 0.0, -10.0) - ds = gdal.Open('data/grib/gfs.t06z.pgrb2.1p0.grib2') + ds = gdal.Open("data/grib/gfs.t06z.pgrb2.1p0.grib2") gt = ds.GetGeoTransform() assert gt == pytest.approx(expected_gt, rel=1e-6) assert ds.GetRasterBand(1).Checksum() == 7674 @@ -1474,11 +2009,12 @@ def test_grib_grib2_disable_split_and_swap(): gdal.Unlink(tmpfilename) ds = None + # https://github.com/OSGeo/gdal/issues/4611 def test_grib_grib2_split_and_swap_offset_am(): - tempFilename = '/vsimem/temp.grb2' - outFilename = '/vsimem/out.grb2' - ds = gdal.Open('data/grib/gfs.t06z.pgrb2.1p0.grib2') + tempFilename = "/vsimem/temp.grb2" + outFilename = "/vsimem/out.grb2" + ds = gdal.Open("data/grib/gfs.t06z.pgrb2.1p0.grib2") geo = (119.975, 10.0, 0.0, 90.125, 0.0, -10.0) temp_ds = gdaltest.grib_drv.CreateCopy(tempFilename, ds) @@ -1493,60 +2029,112 @@ def test_grib_grib2_split_and_swap_offset_am(): gdal.Unlink(tempFilename) gdal.Unlink(outFilename) + # Test sidecar file support # https://github.com/OSGeo/gdal/issues/3799 + def test_grib_grib2_sidecar(): - ds_idx = gdal.Open('data/grib/gfs.t06z.pgrb2.10p0.f010.grib2') + ds_idx = gdal.Open("data/grib/gfs.t06z.pgrb2.10p0.f010.grib2") assert ds_idx.RasterCount == 6 - assert ds_idx.GetRasterBand(6).GetDescription() == 'VGRD:planetary boundary layer:10 hour fcst', 'Description does not match, sidecar index is probably ignored' - assert ds_idx.GetRasterBand(2).GetMetadataItem('GRIB_ELEMENT') == 'REFD' - assert ds_idx.GetRasterBand(3).GetMetadataItem('GRIB_ELEMENT') == 'REFC' - assert ds_idx.GetRasterBand(6).GetMetadataItem('GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES') == '2 3 2 0 96 0 0 1 10 220 0 0 255 0 0' - assert ds_idx.GetRasterBand(6).GetMetadataItem('GRIB_REF_TIME') == '1631944800' - assert ds_idx.GetRasterBand(6).GetMetadataItem('GRIB_VALID_TIME') == '1631980800' - assert ds_idx.GetRasterBand(6).GetMetadataItem('GRIB_FORECAST_SECONDS') == '36000' + assert ( + ds_idx.GetRasterBand(6).GetDescription() + == "VGRD:planetary boundary layer:10 hour fcst" + ), "Description does not match, sidecar index is probably ignored" + assert ds_idx.GetRasterBand(2).GetMetadataItem("GRIB_ELEMENT") == "REFD" + assert ds_idx.GetRasterBand(3).GetMetadataItem("GRIB_ELEMENT") == "REFC" + assert ( + ds_idx.GetRasterBand(6).GetMetadataItem("GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES") + == "2 3 2 0 96 0 0 1 10 220 0 0 255 0 0" + ) + assert ds_idx.GetRasterBand(6).GetMetadataItem("GRIB_REF_TIME") == "1631944800" + assert ds_idx.GetRasterBand(6).GetMetadataItem("GRIB_VALID_TIME") == "1631980800" + assert ds_idx.GetRasterBand(6).GetMetadataItem("GRIB_FORECAST_SECONDS") == "36000" assert ds_idx.GetRasterBand(1).Checksum() == 59985 assert ds_idx.GetRasterBand(2).Checksum() == 59986 assert ds_idx.GetRasterBand(6).Checksum() == 206 - ds_no_idx = gdal.OpenEx('data/grib/gfs.t06z.pgrb2.10p0.f010.grib2', gdal.GA_ReadOnly, open_options=['USE_IDX=NO']) + ds_no_idx = gdal.OpenEx( + "data/grib/gfs.t06z.pgrb2.10p0.f010.grib2", + gdal.GA_ReadOnly, + open_options=["USE_IDX=NO"], + ) assert ds_no_idx.RasterCount == ds_idx.RasterCount - assert ds_no_idx.GetRasterBand(6).GetDescription() == '0[-] RESERVED(220) (Reserved for local use)', 'Description does not match, sidecar index is probably loaded' + assert ( + ds_no_idx.GetRasterBand(6).GetDescription() + == "0[-] RESERVED(220) (Reserved for local use)" + ), "Description does not match, sidecar index is probably loaded" for i in range(1, ds_no_idx.RasterCount): - assert ds_no_idx.GetRasterBand(i).Checksum() == ds_idx.GetRasterBand(i).Checksum() - assert ds_no_idx.GetRasterBand(i).GetMetadata().keys() == ds_idx.GetRasterBand(i).GetMetadata().keys() + assert ( + ds_no_idx.GetRasterBand(i).Checksum() == ds_idx.GetRasterBand(i).Checksum() + ) + assert ( + ds_no_idx.GetRasterBand(i).GetMetadata().keys() + == ds_idx.GetRasterBand(i).GetMetadata().keys() + ) for key in ds_no_idx.GetRasterBand(i).GetMetadata().keys(): - assert ds_no_idx.GetRasterBand(i).GetMetadataItem(key) == ds_idx.GetRasterBand(i).GetMetadataItem(key) + assert ds_no_idx.GetRasterBand(i).GetMetadataItem( + key + ) == ds_idx.GetRasterBand(i).GetMetadataItem(key) + # Test reading a (broken) mix of GRIBv2/GRIBv1 bands + def test_grib_grib1_2_mix_sidecar(): - ds_idx = gdal.Open('data/grib/broken_combined_grib2_grib1.grb2') + ds_idx = gdal.Open("data/grib/broken_combined_grib2_grib1.grb2") assert ds_idx.RasterCount == 18 - assert ds_idx.GetRasterBand(6).GetDescription() == 'VGRD:planetary boundary layer:10 hour fcst', 'Description does not match, sidecar index is probably ignored' - assert ds_idx.GetRasterBand(18).GetDescription() == 'DIRSW:Ground or water surface:anl', 'Description does not match, sidecar index is probably ignored' - assert ds_idx.GetRasterBand(2).GetMetadataItem('GRIB_ELEMENT') == 'REFD' - assert ds_idx.GetRasterBand(18).GetMetadataItem('GRIB_ELEMENT') == 'DIRSW' + assert ( + ds_idx.GetRasterBand(6).GetDescription() + == "VGRD:planetary boundary layer:10 hour fcst" + ), "Description does not match, sidecar index is probably ignored" + assert ( + ds_idx.GetRasterBand(18).GetDescription() == "DIRSW:Ground or water surface:anl" + ), "Description does not match, sidecar index is probably ignored" + assert ds_idx.GetRasterBand(2).GetMetadataItem("GRIB_ELEMENT") == "REFD" + assert ds_idx.GetRasterBand(18).GetMetadataItem("GRIB_ELEMENT") == "DIRSW" assert ds_idx.GetRasterBand(1).Checksum() == 59985 assert ds_idx.GetRasterBand(18).Checksum() == 4794 - ds_no_idx = gdal.OpenEx('data/grib/broken_combined_grib2_grib1.grb2', gdal.GA_ReadOnly, open_options=['USE_IDX=NO']) + ds_no_idx = gdal.OpenEx( + "data/grib/broken_combined_grib2_grib1.grb2", + gdal.GA_ReadOnly, + open_options=["USE_IDX=NO"], + ) assert ds_no_idx.RasterCount == ds_idx.RasterCount - assert ds_no_idx.GetRasterBand(6).GetDescription() == '0[-] RESERVED(220) (Reserved for local use)', 'Description does not match, sidecar index is probably loaded' - assert ds_no_idx.GetRasterBand(18).GetDescription() == '1[-] SFC (Ground or water surface)', 'Description does not match, sidecar index is probably ignored' + assert ( + ds_no_idx.GetRasterBand(6).GetDescription() + == "0[-] RESERVED(220) (Reserved for local use)" + ), "Description does not match, sidecar index is probably loaded" + assert ( + ds_no_idx.GetRasterBand(18).GetDescription() + == "1[-] SFC (Ground or water surface)" + ), "Description does not match, sidecar index is probably ignored" for i in range(1, ds_no_idx.RasterCount): - assert ds_no_idx.GetRasterBand(i).Checksum() == ds_idx.GetRasterBand(i).Checksum() - assert ds_no_idx.GetRasterBand(i).GetMetadata().keys() == ds_idx.GetRasterBand(i).GetMetadata().keys() + assert ( + ds_no_idx.GetRasterBand(i).Checksum() == ds_idx.GetRasterBand(i).Checksum() + ) + assert ( + ds_no_idx.GetRasterBand(i).GetMetadata().keys() + == ds_idx.GetRasterBand(i).GetMetadata().keys() + ) for key in ds_no_idx.GetRasterBand(i).GetMetadata().keys(): - assert ds_no_idx.GetRasterBand(i).GetMetadataItem(key) == ds_idx.GetRasterBand(i).GetMetadataItem(key) + assert ds_no_idx.GetRasterBand(i).GetMetadataItem( + key + ) == ds_idx.GetRasterBand(i).GetMetadataItem(key) # Test reading a parameter that is only in WMO tables and not DEGRIB ones def test_grib_grib2_parameter_in_wmo_tables_only(): - ds = gdal.Open('data/grib/parameter_in_wmo_tables_only.grb2') - assert ds.GetRasterBand(1).GetMetadataItem('GRIB_COMMENT') == 'Latent heat net flux due to evaporation [W m-2]' - assert ds.GetRasterBand(1).GetMetadataItem('GRIB_ELEMENT') == 'Latent heat net flux due to evaporation' + ds = gdal.Open("data/grib/parameter_in_wmo_tables_only.grb2") + assert ( + ds.GetRasterBand(1).GetMetadataItem("GRIB_COMMENT") + == "Latent heat net flux due to evaporation [W m-2]" + ) + assert ( + ds.GetRasterBand(1).GetMetadataItem("GRIB_ELEMENT") + == "Latent heat net flux due to evaporation" + ) diff --git a/autotest/gdrivers/gribmultidim.py b/autotest/gdrivers/gribmultidim.py index 731b0cfe652e..2a757581a1bf 100755 --- a/autotest/gdrivers/gribmultidim.py +++ b/autotest/gdrivers/gribmultidim.py @@ -28,104 +28,152 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -import pytest import struct -pytestmark = pytest.mark.require_driver('GRIB') +import pytest + +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("GRIB") ############################################################################### def test_grib_multidim_grib2_3d_same_ref_time_different_forecast_time(): - ds = gdal.OpenEx('data/grib/ds.mint.bin', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/grib/ds.mint.bin", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() - assert not rg.OpenGroup('non_existing') - assert rg.GetMDArrayNames() == ['Y', 'X', 'TIME', 'MinT_0-SFC'] - assert not rg.OpenMDArray('non_existing') + assert not rg.OpenGroup("non_existing") + assert rg.GetMDArrayNames() == ["Y", "X", "TIME", "MinT_0-SFC"] + assert not rg.OpenMDArray("non_existing") dims = rg.GetDimensions() assert len(dims) == 3 - ar = rg.OpenMDArray('MinT_0-SFC') + ar = rg.OpenMDArray("MinT_0-SFC") assert ar attrs = ar.GetAttributes() assert len(attrs) == 13 - assert ar.GetAttribute('name').Read() == 'MinT' - assert ar.GetAttribute('long_name').Read() == 'Minimum temperature [C]' - assert ar.GetAttribute('first_level').Read() == '0-SFC' - assert ar.GetAttribute('discipline_code').Read() == 0 - assert ar.GetAttribute('discipline_name').Read() == 'Meteorological' - assert ar.GetAttribute('center_code').Read() == 8 - assert ar.GetAttribute('center_name').Read() == 'US-NWSTG' - assert ar.GetAttribute('signification_of_ref_time').Read() == 'Start of Forecast' - assert ar.GetAttribute('reference_time_iso8601').Read() == '2008-02-21T17:00:00Z' - assert ar.GetAttribute('production_status').Read() == 'Operational' - assert ar.GetAttribute('type').Read() == 'Forecast' - assert ar.GetAttribute('product_definition_template_number').Read() == 8 - assert ar.GetAttribute('product_definition_numbers').Read() == ( - 0, 5, 2, 0, 0, 255, 255, 1, 19, 1, 0, 0, 255, 4294967295, 2147483649, 2008, 2, 22, 12, 0, 0, 1, 0, 3, 255, 1, 12, 1, 0) + assert ar.GetAttribute("name").Read() == "MinT" + assert ar.GetAttribute("long_name").Read() == "Minimum temperature [C]" + assert ar.GetAttribute("first_level").Read() == "0-SFC" + assert ar.GetAttribute("discipline_code").Read() == 0 + assert ar.GetAttribute("discipline_name").Read() == "Meteorological" + assert ar.GetAttribute("center_code").Read() == 8 + assert ar.GetAttribute("center_name").Read() == "US-NWSTG" + assert ar.GetAttribute("signification_of_ref_time").Read() == "Start of Forecast" + assert ar.GetAttribute("reference_time_iso8601").Read() == "2008-02-21T17:00:00Z" + assert ar.GetAttribute("production_status").Read() == "Operational" + assert ar.GetAttribute("type").Read() == "Forecast" + assert ar.GetAttribute("product_definition_template_number").Read() == 8 + assert ar.GetAttribute("product_definition_numbers").Read() == ( + 0, + 5, + 2, + 0, + 0, + 255, + 255, + 1, + 19, + 1, + 0, + 0, + 255, + 4294967295, + 2147483649, + 2008, + 2, + 22, + 12, + 0, + 0, + 1, + 0, + 3, + 255, + 1, + 12, + 1, + 0, + ) dims = ar.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/TIME' + assert dims[0].GetFullName() == "/TIME" assert dims[0].GetSize() == 2 - assert struct.unpack('d' * 2, dims[0].GetIndexingVariable().Read()) == pytest.approx((1203681600.0, 1203768000.0)) - assert dims[1].GetFullName() == '/Y' + assert struct.unpack( + "d" * 2, dims[0].GetIndexingVariable().Read() + ) == pytest.approx((1203681600.0, 1203768000.0)) + assert dims[1].GetFullName() == "/Y" assert dims[1].GetSize() == 129 - assert struct.unpack('d' * 129, dims[1].GetIndexingVariable().Read())[0:2] == pytest.approx((1784311.461394906, 1786811.461394906)) - assert dims[2].GetFullName() == '/X' + assert struct.unpack("d" * 129, dims[1].GetIndexingVariable().Read())[ + 0:2 + ] == pytest.approx((1784311.461394906, 1786811.461394906)) + assert dims[2].GetFullName() == "/X" assert dims[2].GetSize() == 177 - assert struct.unpack('d' * 177, dims[2].GetIndexingVariable().Read())[0:2] == pytest.approx((-7125887.299303299, -7123387.299303299)) + assert struct.unpack("d" * 177, dims[2].GetIndexingVariable().Read())[ + 0:2 + ] == pytest.approx((-7125887.299303299, -7123387.299303299)) assert ar.GetSpatialRef() - assert ar.GetUnit() == 'C' + assert ar.GetUnit() == "C" assert ar.GetNoDataValueAsDouble() == 9999 data = ar.Read() assert len(data) == 2 * 129 * 177 * 8 - data = struct.unpack('d' * 2 * 129 * 177, data) + data = struct.unpack("d" * 2 * 129 * 177, data) assert data[0] == 9999 assert data[20 * 177 + 20] == 24.950006103515648 - data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)) + data = ar.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert len(data) == 2 * 129 * 177 * 4 - data = struct.unpack('f' * 2 * 129 * 177, data) + data = struct.unpack("f" * 2 * 129 * 177, data) assert data[0] == 9999 - assert data[20 * 177 + 20] == struct.unpack('f', struct.pack('f', 24.950006103515648))[0] + assert ( + data[20 * 177 + 20] + == struct.unpack("f", struct.pack("f", 24.950006103515648))[0] + ) + ############################################################################### def test_grib_multidim_grib1_2d(): - ds = gdal.OpenEx('data/grib/Sample_QuikSCAT.grb', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/grib/Sample_QuikSCAT.grb", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() - assert not rg.OpenGroup('non_existing') - assert rg.GetMDArrayNames() == ['Y', 'X', 'CRAIN_0-SFC', 'USCT_0-SFC', 'VSCT_0-SFC', 'TSEC_0-SFC'] + assert not rg.OpenGroup("non_existing") + assert rg.GetMDArrayNames() == [ + "Y", + "X", + "CRAIN_0-SFC", + "USCT_0-SFC", + "VSCT_0-SFC", + "TSEC_0-SFC", + ] dims = rg.GetDimensions() assert len(dims) == 2 - ar = rg.OpenMDArray('CRAIN_0-SFC') + ar = rg.OpenMDArray("CRAIN_0-SFC") assert ar dims = ar.GetDimensions() assert len(dims) == 2 - assert dims[0].GetFullName() == '/Y' + assert dims[0].GetFullName() == "/Y" assert dims[0].GetSize() == 74 - assert dims[1].GetFullName() == '/X' + assert dims[1].GetFullName() == "/X" assert dims[1].GetSize() == 66 data = ar.Read() assert len(data) == 74 * 66 * 8 - data = struct.unpack('d' * 74 * 66, data) + data = struct.unpack("d" * 74 * 66, data) assert data[0] == 0 assert data[20] == 9999 - data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)) + data = ar.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert len(data) == 74 * 66 * 4 - data = struct.unpack('f' * 74 * 66, data) + data = struct.unpack("f" * 74 * 66, data) assert data[0] == 0 assert data[20] == 9999 @@ -136,24 +184,43 @@ def test_grib_multidim_grib1_2d(): def test_grib_multidim_different_sizes_messages(): - ds = gdal.OpenEx('data/grib/bug3246.grb', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/grib/bug3246.grb", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert rg.GetMDArrayNames() == [ - 'Y', 'X', 'UOGRD_1-SFC', 'VOGRD_1-SFC', - 'Y2', 'X2', 'PRMSL_0-MSL', 'UGRD_10-HTGL', 'VGRD_10-HTGL', - 'Y3', 'X3', 'HTSGW_1-SFC', 'WVPER_1-SFC', 'WVDIR_1-SFC', 'PERPW_1-SFC', 'DIRPW_1-SFC', 'PERSW_1-SFC', 'DIRSW_1-SFC'] + "Y", + "X", + "UOGRD_1-SFC", + "VOGRD_1-SFC", + "Y2", + "X2", + "PRMSL_0-MSL", + "UGRD_10-HTGL", + "VGRD_10-HTGL", + "Y3", + "X3", + "HTSGW_1-SFC", + "WVPER_1-SFC", + "WVDIR_1-SFC", + "PERPW_1-SFC", + "DIRPW_1-SFC", + "PERSW_1-SFC", + "DIRSW_1-SFC", + ] dims = rg.GetDimensions() assert len(dims) == 6 + ############################################################################### # Test reading file with .idx sidecar file (that we don't use in the multidim API) def test_grib_multidim_grib2_sidecar(): - ds = gdal.OpenEx('data/grib/gfs.t06z.pgrb2.10p0.f010.grib2', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "data/grib/gfs.t06z.pgrb2.10p0.f010.grib2", gdal.OF_MULTIDIM_RASTER + ) assert ds rg = ds.GetRootGroup() assert rg diff --git a/autotest/gdrivers/gsc.py b/autotest/gdrivers/gsc.py index 12582b92dcb2..77183b84dc32 100755 --- a/autotest/gdrivers/gsc.py +++ b/autotest/gdrivers/gsc.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_gsc_1(): - tst = gdaltest.GDALTest('GSC', 'gsc/fakegsc.gsc', 1, 0) + tst = gdaltest.GDALTest("GSC", "gsc/fakegsc.gsc", 1, 0) return tst.testOpen() - - - diff --git a/autotest/gdrivers/gsg.py b/autotest/gdrivers/gsg.py index 2017b4d13200..8d0ba7c35420 100755 --- a/autotest/gdrivers/gsg.py +++ b/autotest/gdrivers/gsg.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,61 +37,59 @@ def test_gsg_1(): - tst = gdaltest.GDALTest('gsbg', 'gsg/gsg_binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gsbg", "gsg/gsg_binary.grd", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_gsg_2(): - tst = gdaltest.GDALTest('gsag', 'gsg/gsg_ascii.grd', 1, 4672) + tst = gdaltest.GDALTest("gsag", "gsg/gsg_ascii.grd", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_gsg_3(): - tst = gdaltest.GDALTest('gs7bg', 'gsg/gsg_7binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gs7bg", "gsg/gsg_7binary.grd", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) + ############################################################################### # Create simple copy and check. def test_gsg_4(): - tst = gdaltest.GDALTest('gsbg', 'gsg/gsg_binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gsbg", "gsg/gsg_binary.grd", 1, 4672) return tst.testCreateCopy(check_gt=1) def test_gsg_5(): - tst = gdaltest.GDALTest('gsag', 'gsg/gsg_ascii.grd', 1, 4672) + tst = gdaltest.GDALTest("gsag", "gsg/gsg_ascii.grd", 1, 4672) return tst.testCreateCopy(check_gt=1) def test_gsg_6(): - tst = gdaltest.GDALTest('gsbg', 'gsg/gsg_binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gsbg", "gsg/gsg_binary.grd", 1, 4672) return tst.testCreate(out_bands=1) def test_gsg_7(): - tst = gdaltest.GDALTest('gs7bg', 'gsg/gsg_7binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gs7bg", "gsg/gsg_7binary.grd", 1, 4672) return tst.testCreate(out_bands=1) def test_gsg_8(): - tst = gdaltest.GDALTest('gs7bg', 'gsg/gsg_7binary.grd', 1, 4672) + tst = gdaltest.GDALTest("gs7bg", "gsg/gsg_7binary.grd", 1, 4672) return tst.testCreateCopy(check_gt=1) -############################################################################### - - - +############################################################################### diff --git a/autotest/gdrivers/gta.py b/autotest/gdrivers/gta.py index db8cf6b8f7f2..4cdcdf445ec2 100755 --- a/autotest/gdrivers/gta.py +++ b/autotest/gdrivers/gta.py @@ -29,26 +29,26 @@ ############################################################################### +import gdaltest import pytest -import gdaltest from osgeo import gdal - init_list = [ - ('byte.tif', 4672), - ('gtiff/byte_signed.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), - ('rgbsmall.tif', 21212)] + ("byte.tif", 4672), + ("gtiff/byte_signed.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), + ("rgbsmall.tif", 21212), +] ############################################################################### # Verify we have the driver. @@ -56,11 +56,11 @@ def test_gta_1(): - gdaltest.gta_drv = gdal.GetDriverByName('GTA') + gdaltest.gta_drv = gdal.GetDriverByName("GTA") if gdaltest.gta_drv is None: pytest.skip() - + ############################################################################### # Test updating existing dataset, check srs, check gt @@ -70,26 +70,26 @@ def test_gta_2(): if gdaltest.gta_drv is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.gta_drv.CreateCopy('/vsimem/byte.gta', src_ds) + src_ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.gta_drv.CreateCopy("/vsimem/byte.gta", src_ds) out_ds = None - out_ds = gdal.Open('/vsimem/byte.gta', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/byte.gta", gdal.GA_Update) out_ds.GetRasterBand(1).Fill(0) out_ds = None - out_ds = gdal.Open('/vsimem/byte.gta') + out_ds = gdal.Open("/vsimem/byte.gta") cs = out_ds.GetRasterBand(1).Checksum() - assert cs == 0, 'did not get expected checksum' + assert cs == 0, "did not get expected checksum" out_ds = None - out_ds = gdal.Open('/vsimem/byte.gta', gdal.GA_Update) + out_ds = gdal.Open("/vsimem/byte.gta", gdal.GA_Update) out_ds.WriteRaster(0, 0, 20, 20, src_ds.ReadRaster(0, 0, 20, 20)) out_ds = None - out_ds = gdal.Open('/vsimem/byte.gta') + out_ds = gdal.Open("/vsimem/byte.gta") cs = out_ds.GetRasterBand(1).Checksum() - assert cs == src_ds.GetRasterBand(1).Checksum(), 'did not get expected checksum' + assert cs == src_ds.GetRasterBand(1).Checksum(), "did not get expected checksum" gt = out_ds.GetGeoTransform() wkt = out_ds.GetProjectionRef() @@ -97,11 +97,14 @@ def test_gta_2(): expected_gt = src_ds.GetGeoTransform() for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=1e-6), 'did not get expected wkt' + assert gt[i] == pytest.approx( + expected_gt[i], abs=1e-6 + ), "did not get expected wkt" + + assert wkt == src_ds.GetProjectionRef(), "did not get expected wkt" - assert wkt == src_ds.GetProjectionRef(), 'did not get expected wkt' + gdaltest.gta_drv.Delete("/vsimem/byte.gta") - gdaltest.gta_drv.Delete('/vsimem/byte.gta') ############################################################################### # Test writing and readings GCPs @@ -112,28 +115,36 @@ def test_gta_3(): if gdaltest.gta_drv is None: pytest.skip() - src_ds = gdal.Open('../gcore/data/gcps.vrt') + src_ds = gdal.Open("../gcore/data/gcps.vrt") - new_ds = gdaltest.gta_drv.CreateCopy('/vsimem/gta_3.gta', src_ds) + new_ds = gdaltest.gta_drv.CreateCopy("/vsimem/gta_3.gta", src_ds) new_ds = None - new_ds = gdal.Open('/vsimem/gta_3.gta') + new_ds = gdal.Open("/vsimem/gta_3.gta") - assert new_ds.GetGeoTransform() == (0.0, 1.0, 0.0, 0.0, 0.0, 1.0), \ - 'GeoTransform not set properly.' + assert new_ds.GetGeoTransform() == ( + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 1.0, + ), "GeoTransform not set properly." - assert new_ds.GetProjectionRef() == '', 'Projection not set properly.' + assert new_ds.GetProjectionRef() == "", "Projection not set properly." - assert new_ds.GetGCPProjection() == src_ds.GetGCPProjection(), \ - 'GCP Projection not set properly.' + assert ( + new_ds.GetGCPProjection() == src_ds.GetGCPProjection() + ), "GCP Projection not set properly." gcps = new_ds.GetGCPs() expected_gcps = src_ds.GetGCPs() - assert len(gcps) == len(expected_gcps), 'GCP count wrong.' + assert len(gcps) == len(expected_gcps), "GCP count wrong." new_ds = None - gdaltest.gta_drv.Delete('/vsimem/gta_3.gta') + gdaltest.gta_drv.Delete("/vsimem/gta_3.gta") + ############################################################################### # Test band metadata @@ -144,41 +155,42 @@ def test_gta_4(): if gdaltest.gta_drv is None: pytest.skip() - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 17) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 17) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(1).ComputeStatistics(False) src_ds.GetRasterBand(1).SetNoDataValue(123) - src_ds.GetRasterBand(1).SetCategoryNames(['a', 'b']) + src_ds.GetRasterBand(1).SetCategoryNames(["a", "b"]) src_ds.GetRasterBand(1).SetOffset(2) src_ds.GetRasterBand(1).SetScale(3) - src_ds.GetRasterBand(1).SetUnitType('custom') - src_ds.GetRasterBand(1).SetDescription('description') + src_ds.GetRasterBand(1).SetUnitType("custom") + src_ds.GetRasterBand(1).SetDescription("description") for i in range(17): if i != gdal.GCI_PaletteIndex: src_ds.GetRasterBand(i + 1).SetColorInterpretation(i) - new_ds = gdaltest.gta_drv.CreateCopy('/vsimem/gta_4.gta', src_ds) + new_ds = gdaltest.gta_drv.CreateCopy("/vsimem/gta_4.gta", src_ds) new_ds = None - new_ds = gdal.Open('/vsimem/gta_4.gta') + new_ds = gdal.Open("/vsimem/gta_4.gta") band = new_ds.GetRasterBand(1) - assert band.GetNoDataValue() == 123, 'did not get expected nodata value' - assert band.GetMinimum() == 255, 'did not get expected minimum value' - assert band.GetMaximum() == 255, 'did not get expected maximum value' - assert band.GetCategoryNames() == ['a', 'b'], 'did not get expected category names' - assert band.GetOffset() == 2, 'did not get expected offset value' - assert band.GetScale() == 3, 'did not get expected scale value' - assert band.GetUnitType() == 'custom', 'did not get expected unit value' - assert band.GetDescription() == 'description', 'did not get expected description' + assert band.GetNoDataValue() == 123, "did not get expected nodata value" + assert band.GetMinimum() == 255, "did not get expected minimum value" + assert band.GetMaximum() == 255, "did not get expected maximum value" + assert band.GetCategoryNames() == ["a", "b"], "did not get expected category names" + assert band.GetOffset() == 2, "did not get expected offset value" + assert band.GetScale() == 3, "did not get expected scale value" + assert band.GetUnitType() == "custom", "did not get expected unit value" + assert band.GetDescription() == "description", "did not get expected description" for i in range(17): if i != gdal.GCI_PaletteIndex: - assert new_ds.GetRasterBand(i + 1).GetColorInterpretation() == i, \ - ('did not get expected color interpretation ' - 'for band %d' % (i + 1)) + assert ( + new_ds.GetRasterBand(i + 1).GetColorInterpretation() == i + ), "did not get expected color interpretation " "for band %d" % (i + 1) new_ds = None - gdaltest.gta_drv.Delete('/vsimem/gta_4.gta') + gdaltest.gta_drv.Delete("/vsimem/gta_4.gta") + ############################################################################### # Test compression algorithms @@ -189,40 +201,41 @@ def test_gta_5(): if gdaltest.gta_drv is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') - - compress_list = ['NONE', - 'BZIP2', - "XZ", - "ZLIB", - "ZLIB1", - "ZLIB2", - "ZLIB3", - "ZLIB4", - "ZLIB5", - "ZLIB6", - "ZLIB7", - "ZLIB8", - "ZLIB9"] + src_ds = gdal.Open("data/byte.tif") + + compress_list = [ + "NONE", + "BZIP2", + "XZ", + "ZLIB", + "ZLIB1", + "ZLIB2", + "ZLIB3", + "ZLIB4", + "ZLIB5", + "ZLIB6", + "ZLIB7", + "ZLIB8", + "ZLIB9", + ] for compress in compress_list: - out_ds = gdaltest.gta_drv.CreateCopy('/vsimem/gta_5.gta', src_ds, options=['COMPRESS=' + compress]) + out_ds = gdaltest.gta_drv.CreateCopy( + "/vsimem/gta_5.gta", src_ds, options=["COMPRESS=" + compress] + ) del out_ds - gdaltest.gta_drv.Delete('/vsimem/gta_5.gta') + gdaltest.gta_drv.Delete("/vsimem/gta_5.gta") @pytest.mark.parametrize( - 'filename,checksum', + "filename,checksum", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) -@pytest.mark.require_driver('GTA') +@pytest.mark.require_driver("GTA") def test_gta_create(filename, checksum): - if filename != 'gtiff/byte_signed.tif': - filename = '../../gcore/data/' + filename - ut = gdaltest.GDALTest('GTA', filename, 1, checksum, options=[]) + if filename != "gtiff/byte_signed.tif": + filename = "../../gcore/data/" + filename + ut = gdaltest.GDALTest("GTA", filename, 1, checksum, options=[]) ut.testCreateCopy() - - - diff --git a/autotest/gdrivers/gtx.py b/autotest/gdrivers/gtx.py index 92aa39315abb..d1a8ed9f7bd7 100755 --- a/autotest/gdrivers/gtx.py +++ b/autotest/gdrivers/gtx.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,9 +37,6 @@ def test_gtx_1(): - tst = gdaltest.GDALTest('GTX', 'gtx/hydroc1.gtx', 1, 64183) + tst = gdaltest.GDALTest("GTX", "gtx/hydroc1.gtx", 1, 64183) gt = (276.725, 0.05, 0.0, 42.775, 0.0, -0.05) - return tst.testOpen(check_gt=gt, check_prj='WGS84') - - - + return tst.testOpen(check_gt=gt, check_prj="WGS84") diff --git a/autotest/gdrivers/gxf.py b/autotest/gdrivers/gxf.py index ccc20fbe8f78..fc1117312af4 100755 --- a/autotest/gdrivers/gxf.py +++ b/autotest/gdrivers/gxf.py @@ -30,30 +30,29 @@ ############################################################################### +import gdaltest import pytest from osgeo import gdal - -import gdaltest - ############################################################################### # Test a small GXF sample def test_gxf_1(): - tst = gdaltest.GDALTest('GXF', 'gxf/small.gxf', 1, 90) + tst = gdaltest.GDALTest("GXF", "gxf/small.gxf", 1, 90) return tst.testOpen() + ############################################################################### # Test an other GXF sample (with continuous line) def test_gxf_2(): - tst = gdaltest.GDALTest('GXF', 'gxf/small2.gxf', 1, 65042) + tst = gdaltest.GDALTest("GXF", "gxf/small2.gxf", 1, 65042) wkt = """PROJCS["NAD27 / Ohio North", GEOGCS["NAD27", DATUM["NAD27", @@ -72,28 +71,28 @@ def test_gxf_2(): gxf_list = [ - ('http://download.osgeo.org/gdal/data/gxf', 'SAMPLE.GXF', 24068, -1), - ('http://download.osgeo.org/gdal/data/gxf', 'gxf_compressed.gxf', 20120, -1), - ('http://download.osgeo.org/gdal/data/gxf', 'gxf_text.gxf', 20265, -1), - ('http://download.osgeo.org/gdal/data/gxf', 'gxf_ul_r.gxf', 19930, -1), - ('http://download.osgeo.org/gdal/data/gxf', 'latlong.gxf', 12243, -1), - ('http://download.osgeo.org/gdal/data/gxf', 'spif83.gxf', 28752, -1), + ("http://download.osgeo.org/gdal/data/gxf", "SAMPLE.GXF", 24068, -1), + ("http://download.osgeo.org/gdal/data/gxf", "gxf_compressed.gxf", 20120, -1), + ("http://download.osgeo.org/gdal/data/gxf", "gxf_text.gxf", 20265, -1), + ("http://download.osgeo.org/gdal/data/gxf", "gxf_ul_r.gxf", 19930, -1), + ("http://download.osgeo.org/gdal/data/gxf", "latlong.gxf", 12243, -1), + ("http://download.osgeo.org/gdal/data/gxf", "spif83.gxf", 28752, -1), ] @pytest.mark.parametrize( - 'downloadURL,fileName,checksum,download_size', + "downloadURL,fileName,checksum,download_size", gxf_list, ids=[tup[1] for tup in gxf_list], ) def test_gxf(downloadURL, fileName, checksum, download_size): - if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): + if not gdaltest.download_file( + downloadURL + "/" + fileName, fileName, download_size + ): pytest.skip() - ds = gdal.Open('tmp/cache/' + fileName) - - assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) - - - + ds = gdal.Open("tmp/cache/" + fileName) + assert ( + ds.GetRasterBand(1).Checksum() == checksum + ), "Bad checksum. Expected %d, got %d" % (checksum, ds.GetRasterBand(1).Checksum()) diff --git a/autotest/gdrivers/hdf5.py b/autotest/gdrivers/hdf5.py index 8dca72b83ebe..adb159ad80e9 100755 --- a/autotest/gdrivers/hdf5.py +++ b/autotest/gdrivers/hdf5.py @@ -31,20 +31,17 @@ import shutil +import gdaltest import pytest +from uffd import uffd_compare from osgeo import gdal - -import gdaltest - -from uffd import uffd_compare - ############################################################################### # Test if HDF5 driver is present -pytestmark = pytest.mark.require_driver('HDF5') +pytestmark = pytest.mark.require_driver("HDF5") @pytest.fixture(autouse=True) @@ -54,7 +51,7 @@ def check_no_file_leaks(): yield diff = len(gdaltest.get_opened_files()) - num_files - assert diff == 0, 'Leak of file handles: %d leaked' % diff + assert diff == 0, "Leak of file handles: %d leaked" % diff ############################################################################### @@ -62,18 +59,23 @@ def check_no_file_leaks(): def test_hdf5_2(): - ds = gdal.Open('data/hdf5/groups.h5') + ds = gdal.Open("data/hdf5/groups.h5") - sds_list = ds.GetMetadata('SUBDATASETS') + sds_list = ds.GetMetadata("SUBDATASETS") - assert len(sds_list) == 4, 'Did not get expected subdataset count.' + assert len(sds_list) == 4, "Did not get expected subdataset count." - assert sds_list['SUBDATASET_1_NAME'] == 'HDF5:"data/hdf5/groups.h5"://MyGroup/Group_A/dset2' and sds_list['SUBDATASET_2_NAME'] == 'HDF5:"data/hdf5/groups.h5"://MyGroup/dset1', \ - 'did not get expected subdatasets.' + assert ( + sds_list["SUBDATASET_1_NAME"] + == 'HDF5:"data/hdf5/groups.h5"://MyGroup/Group_A/dset2' + and sds_list["SUBDATASET_2_NAME"] + == 'HDF5:"data/hdf5/groups.h5"://MyGroup/dset1' + ), "did not get expected subdatasets." ds = None - assert not gdaltest.is_file_open('data/hdf5/groups.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/groups.h5"), "file still opened." + ############################################################################### # Confirm that single variable files can be accessed directly without @@ -85,11 +87,12 @@ def test_hdf5_3(): ds = gdal.Open('HDF5:"data/hdf5/u8be.h5"://TestArray') cs = ds.GetRasterBand(1).Checksum() - assert cs == 135, 'did not get expected checksum' + assert cs == 135, "did not get expected checksum" ds = None - assert not gdaltest.is_file_open('data/hdf5/u8be.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/u8be.h5"), "file still opened." + ############################################################################### # Confirm subdataset access, and checksum. @@ -100,7 +103,8 @@ def test_hdf5_4(): ds = gdal.Open('HDF5:"data/hdf5/u8be.h5"://TestArray') cs = ds.GetRasterBand(1).Checksum() - assert cs == 135, 'did not get expected checksum' + assert cs == 135, "did not get expected checksum" + ############################################################################### # Similar check on a 16bit dataset. @@ -111,7 +115,8 @@ def test_hdf5_5(): ds = gdal.Open('HDF5:"data/hdf5/groups.h5"://MyGroup/dset1') cs = ds.GetRasterBand(1).Checksum() - assert cs == 18, 'did not get expected checksum' + assert cs == 18, "did not get expected checksum" + ############################################################################### # Test generating an overview on a subdataset. @@ -119,87 +124,102 @@ def test_hdf5_5(): def test_hdf5_6(): - shutil.copyfile('data/hdf5/groups.h5', 'tmp/groups.h5') + shutil.copyfile("data/hdf5/groups.h5", "tmp/groups.h5") ds = gdal.Open('HDF5:"tmp/groups.h5"://MyGroup/dset1') ds.BuildOverviews(overviewlist=[2]) ds = None - assert not gdaltest.is_file_open('tmp/groups.h5'), 'file still opened.' + assert not gdaltest.is_file_open("tmp/groups.h5"), "file still opened." ds = gdal.Open('HDF5:"tmp/groups.h5"://MyGroup/dset1') - assert ds.GetRasterBand(1).GetOverviewCount() == 1, 'failed to find overview' + assert ds.GetRasterBand(1).GetOverviewCount() == 1, "failed to find overview" ds = None # confirm that it works with a different path. (#3290) ds = gdal.Open('HDF5:"data/../tmp/groups.h5"://MyGroup/dset1') - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'failed to find overview with alternate path' - ovfile = ds.GetMetadataItem('OVERVIEW_FILE', 'OVERVIEWS') - assert ovfile[:11] == 'data/../tmp', 'did not get expected OVERVIEW_FILE.' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "failed to find overview with alternate path" + ovfile = ds.GetMetadataItem("OVERVIEW_FILE", "OVERVIEWS") + assert ovfile[:11] == "data/../tmp", "did not get expected OVERVIEW_FILE." ds = None gdaltest.clean_tmp() + ############################################################################### # Coarse metadata check (regression test for #2412). def test_hdf5_7(): - ds = gdal.Open('data/hdf5/metadata.h5') + ds = gdal.Open("data/hdf5/metadata.h5") metadata = ds.GetMetadata() metadataList = ds.GetMetadata_List() ds = None - assert not gdaltest.is_file_open('data/hdf5/metadata.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/metadata.h5"), "file still opened." - assert len(metadata) == len(metadataList), 'error in metadata dictionary setup' + assert len(metadata) == len(metadataList), "error in metadata dictionary setup" - metadataList = [item.split('=', 1)[0] for item in metadataList] + metadataList = [item.split("=", 1)[0] for item in metadataList] for key in metadataList: try: metadata.pop(key) except KeyError: pytest.fail('unable to find "%s" key' % key) - + + ############################################################################### # Test metadata names. def test_hdf5_8(): - ds = gdal.Open('data/hdf5/metadata.h5') + ds = gdal.Open("data/hdf5/metadata.h5") metadata = ds.GetMetadata() ds = None - assert metadata, 'no metadata found' + assert metadata, "no metadata found" - h5groups = ['G1', 'Group with spaces', 'Group_with_underscores', - 'Group with spaces_and_underscores'] - h5datasets = ['D1', 'Dataset with spaces', 'Dataset_with_underscores', - 'Dataset with spaces_and_underscores'] + h5groups = [ + "G1", + "Group with spaces", + "Group_with_underscores", + "Group with spaces_and_underscores", + ] + h5datasets = [ + "D1", + "Dataset with spaces", + "Dataset_with_underscores", + "Dataset with spaces_and_underscores", + ] attributes = { - 'attribute': 'value', - 'attribute with spaces': 0, - 'attribute_with underscores': 0, - 'attribute with spaces_and_underscores': .1, + "attribute": "value", + "attribute with spaces": 0, + "attribute_with underscores": 0, + "attribute with spaces_and_underscores": 0.1, } def scanMetadata(parts): for attr in attributes: - name = '_'.join(parts + [attr]) - name = name.replace(' ', '_') - assert name in metadata, ('unable to find metadata: "%s"' % name) + name = "_".join(parts + [attr]) + name = name.replace(" ", "_") + assert name in metadata, 'unable to find metadata: "%s"' % name value = metadata.pop(name) - value = value.strip(' d') + value = value.strip(" d") value = type(attributes[attr])(value) - assert value == attributes[attr], ('incorrect metadata value for "%s": ' - '"%s" != "%s"' % (name, value, - attributes[attr])) + assert ( + value == attributes[attr] + ), 'incorrect metadata value for "%s": ' '"%s" != "%s"' % ( + name, + value, + attributes[attr], + ) # level0 assert scanMetadata([]) is None @@ -216,43 +236,51 @@ def scanMetadata(parts): for h5dataset in h5datasets: assert scanMetadata([h5group, h5dataset]) is None - + ############################################################################### # Variable length string metadata check (regression test for #4228). def test_hdf5_9(): - if int(gdal.VersionInfo('VERSION_NUM')) < 1900: - pytest.skip('would crash') + if int(gdal.VersionInfo("VERSION_NUM")) < 1900: + pytest.skip("would crash") - ds = gdal.Open('data/hdf5/vlstr_metadata.h5') + ds = gdal.Open("data/hdf5/vlstr_metadata.h5") metadata = ds.GetRasterBand(1).GetMetadata() ds = None - assert not gdaltest.is_file_open('data/hdf5/vlstr_metadata.h5'), 'file still opened.' + assert not gdaltest.is_file_open( + "data/hdf5/vlstr_metadata.h5" + ), "file still opened." ref_metadata = { - 'TEST_BANDNAMES': 'SAA', - 'TEST_CODING': '0.6666666667 0.0000000000 TRUE', - 'TEST_FLAGS': '255=noValue', - 'TEST_MAPPING': 'Geographic Lat/Lon 0.5000000000 0.5000000000 27.3154761905 -5.0833333333 0.0029761905 0.0029761905 WGS84 Degrees', - 'TEST_NOVALUE': '255', - 'TEST_RANGE': '0 255 0 255', + "TEST_BANDNAMES": "SAA", + "TEST_CODING": "0.6666666667 0.0000000000 TRUE", + "TEST_FLAGS": "255=noValue", + "TEST_MAPPING": "Geographic Lat/Lon 0.5000000000 0.5000000000 27.3154761905 -5.0833333333 0.0029761905 0.0029761905 WGS84 Degrees", + "TEST_NOVALUE": "255", + "TEST_RANGE": "0 255 0 255", } - assert len(metadata) == len(ref_metadata), ('incorrect number of metadata: ' - 'expected %d, got %d' % (len(ref_metadata), - len(metadata))) + assert len(metadata) == len( + ref_metadata + ), "incorrect number of metadata: " "expected %d, got %d" % ( + len(ref_metadata), + len(metadata), + ) for key in metadata: - assert key in ref_metadata, ('unexpected metadata key "%s"' % key) + assert key in ref_metadata, 'unexpected metadata key "%s"' % key + + assert ( + metadata[key] == ref_metadata[key] + ), 'incorrect metadata value for key "%s": ' 'expected "%s", got "%s" ' % ( + key, + ref_metadata[key], + metadata[key], + ) - assert metadata[key] == ref_metadata[key], \ - ('incorrect metadata value for key "%s": ' - 'expected "%s", got "%s" ' % - (key, ref_metadata[key], metadata[key])) - ############################################################################### # Test CSK_DGM.h5 (#4160) @@ -262,7 +290,7 @@ def test_hdf5_10(): # Try opening the QLK subdataset to check that no error is generated gdal.ErrorReset() ds = gdal.Open('HDF5:"data/hdf5/CSK_DGM.h5"://S01/QLK') - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" ds = None ds = gdal.Open('HDF5:"data/hdf5/CSK_DGM.h5"://S01/SBI') @@ -272,11 +300,16 @@ def test_hdf5_10(): got_gcps = ds.GetGCPs() assert len(got_gcps) == 4 - assert (got_gcps[0].GCPPixel == pytest.approx(0, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0, abs=1e-5) and \ - got_gcps[0].GCPX == pytest.approx(12.2395902509238, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(44.7280047434954, abs=1e-5)) + assert ( + got_gcps[0].GCPPixel == pytest.approx(0, abs=1e-5) + and got_gcps[0].GCPLine == pytest.approx(0, abs=1e-5) + and got_gcps[0].GCPX == pytest.approx(12.2395902509238, abs=1e-5) + and got_gcps[0].GCPY == pytest.approx(44.7280047434954, abs=1e-5) + ) ds = None - assert not gdaltest.is_file_open('data/hdf5/CSK_DGM.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/CSK_DGM.h5"), "file still opened." + ############################################################################### # Test CSK_GEC.h5 (#4160) @@ -287,12 +320,14 @@ def test_hdf5_11(): # Try opening the QLK subdataset to check that no error is generated gdal.ErrorReset() ds = gdal.Open('HDF5:"data/hdf5/CSK_GEC.h5"://S01/QLK') - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" ds = None ds = gdal.Open('HDF5:"data/hdf5/CSK_GEC.h5"://S01/SBI') got_projection = ds.GetProjection() - assert got_projection.startswith('PROJCS["Transverse_Mercator",GEOGCS["WGS 84",DATUM["WGS_1984"') + assert got_projection.startswith( + 'PROJCS["Transverse_Mercator",GEOGCS["WGS 84",DATUM["WGS_1984"' + ) got_gt = ds.GetGeoTransform() expected_gt = (275592.5, 2.5, 0.0, 4998152.5, 0.0, -2.5) @@ -301,7 +336,8 @@ def test_hdf5_11(): ds = None - assert not gdaltest.is_file_open('data/hdf5/CSK_GEC.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/CSK_GEC.h5"), "file still opened." + ############################################################################### # Test ODIM_H5 (#5032) @@ -309,34 +345,55 @@ def test_hdf5_11(): def test_hdf5_12(): - if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/5032/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf', 'norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf'): + if not gdaltest.download_file( + "http://trac.osgeo.org/gdal/raw-attachment/ticket/5032/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf", + "norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf", + ): pytest.skip() - ds = gdal.Open('tmp/cache/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf') + ds = gdal.Open("tmp/cache/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf") got_projection = ds.GetProjection() - assert 'Azimuthal_Equidistant' in got_projection + assert "Azimuthal_Equidistant" in got_projection got_gt = ds.GetGeoTransform() - expected_gt = (-239999.9823595533, 997.9165855496311, 0.0, 239000.03320328312, 0.0, -997.9167782264051) + expected_gt = ( + -239999.9823595533, + 997.9165855496311, + 0.0, + 239000.03320328312, + 0.0, + -997.9167782264051, + ) assert max([abs(got_gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-5, got_gt + ############################################################################### # Test MODIS L2 HDF5 GCPs (#6666) def test_hdf5_13(): - if not gdaltest.download_file('http://oceandata.sci.gsfc.nasa.gov/cgi/getfile/A2016273115000.L2_LAC_OC.nc', 'A2016273115000.L2_LAC_OC.nc'): + if not gdaltest.download_file( + "http://oceandata.sci.gsfc.nasa.gov/cgi/getfile/A2016273115000.L2_LAC_OC.nc", + "A2016273115000.L2_LAC_OC.nc", + ): pytest.skip() - ds = gdal.Open('HDF5:"tmp/cache/A2016273115000.L2_LAC_OC.nc"://geophysical_data/Kd_490') + ds = gdal.Open( + 'HDF5:"tmp/cache/A2016273115000.L2_LAC_OC.nc"://geophysical_data/Kd_490' + ) got_gcps = ds.GetGCPs() assert len(got_gcps) == 3030 - assert (got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) and \ - got_gcps[0].GCPX == pytest.approx(33.1655693, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(39.3207207, abs=1e-5)) + assert ( + got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) + and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) + and got_gcps[0].GCPX == pytest.approx(33.1655693, abs=1e-5) + and got_gcps[0].GCPY == pytest.approx(39.3207207, abs=1e-5) + ) + ############################################################################### # Test complex data subsets @@ -344,17 +401,21 @@ def test_hdf5_13(): def test_hdf5_14(): - ds = gdal.Open('data/hdf5/complex.h5') - sds_list = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("data/hdf5/complex.h5") + sds_list = ds.GetMetadata("SUBDATASETS") - assert len(sds_list) == 6, 'Did not get expected complex subdataset count.' + assert len(sds_list) == 6, "Did not get expected complex subdataset count." - assert sds_list['SUBDATASET_1_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f16' and sds_list['SUBDATASET_2_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f32' and sds_list['SUBDATASET_3_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f64', \ - 'did not get expected subdatasets.' + assert ( + sds_list["SUBDATASET_1_NAME"] == 'HDF5:"data/hdf5/complex.h5"://f16' + and sds_list["SUBDATASET_2_NAME"] == 'HDF5:"data/hdf5/complex.h5"://f32' + and sds_list["SUBDATASET_3_NAME"] == 'HDF5:"data/hdf5/complex.h5"://f64' + ), "did not get expected subdatasets." ds = None - assert not gdaltest.is_file_open('data/hdf5/complex.h5'), 'file still opened.' + assert not gdaltest.is_file_open("data/hdf5/complex.h5"), "file still opened." + ############################################################################### # Confirm complex subset data access and checksum @@ -366,7 +427,8 @@ def test_hdf5_15(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f32') cs = ds.GetRasterBand(1).Checksum() - assert cs == 523, 'did not get expected checksum' + assert cs == 523, "did not get expected checksum" + # Repeat for Float64 @@ -376,7 +438,8 @@ def test_hdf5_16(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f64') cs = ds.GetRasterBand(1).Checksum() - assert cs == 511, 'did not get expected checksum' + assert cs == 511, "did not get expected checksum" + # Repeat for Float16 @@ -386,7 +449,7 @@ def test_hdf5_17(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f16') cs = ds.GetRasterBand(1).Checksum() - assert cs == 412, 'did not get expected checksum' + assert cs == 412, "did not get expected checksum" def test_hdf5_single_char_varname(): @@ -394,65 +457,85 @@ def test_hdf5_single_char_varname(): ds = gdal.Open('HDF5:"data/hdf5/single_char_varname.h5"://e') assert ds is not None + def test_hdf5_attr_all_datatypes(): - ds = gdal.Open('data/hdf5/attr_all_datatypes.h5') + ds = gdal.Open("data/hdf5/attr_all_datatypes.h5") assert ds is not None - assert ds.GetMetadata() == {'attr_float16': '125 ', - 'attr_float32': '125 ', - 'attr_float64': '125 ', - 'attr_int16': '125 ', - 'attr_int32': '125 ', - 'attr_int8': '125 ', - 'attr_uint16': '125 ', - 'attr_uint32': '125 ', - 'attr_uint8': '125 '} - + assert ds.GetMetadata() == { + "attr_float16": "125 ", + "attr_float32": "125 ", + "attr_float64": "125 ", + "attr_int16": "125 ", + "attr_int32": "125 ", + "attr_int8": "125 ", + "attr_uint16": "125 ", + "attr_uint32": "125 ", + "attr_uint8": "125 ", + } def test_hdf5_virtual_file(): hdf5_files = [ - 'hdf5/CSK_GEC.h5', - 'hdf5/vlstr_metadata.h5', - 'hdf5/groups.h5', - 'hdf5/complex.h5', - 'hdf5/single_char_varname.h5', - 'hdf5/CSK_DGM.h5', - 'hdf5/u8be.h5', - 'hdf5/metadata.h5' + "hdf5/CSK_GEC.h5", + "hdf5/vlstr_metadata.h5", + "hdf5/groups.h5", + "hdf5/complex.h5", + "hdf5/single_char_varname.h5", + "hdf5/CSK_DGM.h5", + "hdf5/u8be.h5", + "hdf5/metadata.h5", ] for hdf5_file in hdf5_files: assert uffd_compare(hdf5_file) is True - # FIXME: This FTP server seems to have disappeared. Replace with something else? hdf5_list = [ - ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert', 'C1979091.h5', - 'HDF4_PALGROUP/HDF4_PALETTE_2', 7488, -1), - ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert', 'C1979091.h5', - 'Raster_Image_#0', 3661, -1), - ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/geospatial/DEM', 'half_moon_bay.grid', - 'HDFEOS/GRIDS/DEMGRID/Data_Fields/Elevation', 30863, -1), + ( + "ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert", + "C1979091.h5", + "HDF4_PALGROUP/HDF4_PALETTE_2", + 7488, + -1, + ), + ( + "ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert", + "C1979091.h5", + "Raster_Image_#0", + 3661, + -1, + ), + ( + "ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/geospatial/DEM", + "half_moon_bay.grid", + "HDFEOS/GRIDS/DEMGRID/Data_Fields/Elevation", + 30863, + -1, + ), ] @pytest.mark.parametrize( - 'downloadURL,fileName,subdatasetname,checksum,download_size', + "downloadURL,fileName,subdatasetname,checksum,download_size", hdf5_list, ids=['HDF5:"' + item[1] + '"://' + item[2] for item in hdf5_list], ) def test_hdf5(downloadURL, fileName, subdatasetname, checksum, download_size): - if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): - pytest.skip('no download') + if not gdaltest.download_file( + downloadURL + "/" + fileName, fileName, download_size + ): + pytest.skip("no download") ds = gdal.Open('HDF5:"tmp/cache/' + fileName + '"://' + subdatasetname) - assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) + assert ( + ds.GetRasterBand(1).Checksum() == checksum + ), "Bad checksum. Expected %d, got %d" % (checksum, ds.GetRasterBand(1).Checksum()) def test_hdf5_dimension_labels_with_null(): - assert gdal.Open('data/hdf5/dimension_labels_with_null.h5') + assert gdal.Open("data/hdf5/dimension_labels_with_null.h5") def test_hdf5_recursive_groups(): @@ -470,19 +553,19 @@ def test_hdf5_recursive_groups(): # group['ext_link_to_self_root'] = h5py.ExternalLink("hdf5/recursive_groups.h5", "/") # f.close() - ds = gdal.Open('data/hdf5/recursive_groups.h5') + ds = gdal.Open("data/hdf5/recursive_groups.h5") assert ds is not None ds.GetSubDatasets() def test_hdf5_family_driver(): - assert gdal.Open('data/hdf5/test_family_0.h5') + assert gdal.Open("data/hdf5/test_family_0.h5") def test_hdf5_single_dim(): - ds = gdal.Open('HDF5:data/netcdf/byte_chunked_multiple.nc://x') + ds = gdal.Open("HDF5:data/netcdf/byte_chunked_multiple.nc://x") assert ds b = ds.GetRasterBand(1) assert b.YSize == 1 @@ -497,9 +580,10 @@ def test_hdf5_single_dim(): def test_hdf5_signature_not_at_beginning(): - filename = '/vsimem/test.h5' - gdal.FileFromMemBuffer(filename, - open('data/netcdf/byte_hdf5_starting_at_offset_1024.nc', 'rb').read()) + filename = "/vsimem/test.h5" + gdal.FileFromMemBuffer( + filename, open("data/netcdf/byte_hdf5_starting_at_offset_1024.nc", "rb").read() + ) ds = gdal.Open(filename) assert ds is not None gdal.Unlink(filename) diff --git a/autotest/gdrivers/hdf5multidim.py b/autotest/gdrivers/hdf5multidim.py index 339d9694a6ed..545ebcae03c5 100755 --- a/autotest/gdrivers/hdf5multidim.py +++ b/autotest/gdrivers/hdf5multidim.py @@ -28,265 +28,366 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import struct + import gdaltest import pytest -import struct from osgeo import gdal -pytestmark = pytest.mark.require_driver('HDF5') +pytestmark = pytest.mark.require_driver("HDF5") def test_hdf5_multidim_basic(): - ds = gdal.OpenEx('data/hdf5/u8be.h5', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/hdf5/u8be.h5", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() - assert not rg.OpenGroup('non_existing') - assert rg.GetMDArrayNames() == [ 'TestArray' ] - assert not rg.OpenMDArray('non_existing') - ar = rg.OpenMDArray('TestArray') + assert not rg.OpenGroup("non_existing") + assert rg.GetMDArrayNames() == ["TestArray"] + assert not rg.OpenMDArray("non_existing") + ar = rg.OpenMDArray("TestArray") assert ar - assert not ar.GetAttribute('non_existing') + assert not ar.GetAttribute("non_existing") dims = ar.GetDimensions() assert len(dims) == 2 assert dims[0].GetSize() == 6 assert dims[1].GetSize() == 5 assert ar.GetDataType().GetNumericDataType() == gdal.GDT_Byte - got_data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + got_data = ar.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert len(got_data) == 30 * 2 - assert struct.unpack('H' * 30, got_data) == (0, 1, 2, 3, 4, - 1, 2, 3, 4, 5, - 2, 3, 4, 5, 6, - 3, 4, 5, 6, 7, - 4, 5, 6, 7, 8, - 5, 6, 7, 8, 9) - - got_data = ar.Read( array_start_idx = [2, 1], - count = [3, 2], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + assert struct.unpack("H" * 30, got_data) == ( + 0, + 1, + 2, + 3, + 4, + 1, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 6, + 3, + 4, + 5, + 6, + 7, + 4, + 5, + 6, + 7, + 8, + 5, + 6, + 7, + 8, + 9, + ) + + got_data = ar.Read( + array_start_idx=[2, 1], + count=[3, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) assert len(got_data) == 6 * 2 - assert struct.unpack('H' * 6, got_data) == (3, 4, - 4, 5, - 5, 6) - - - got_data = ar.Read( array_start_idx = [2, 1], - count = [3, 2], - array_step = [-1, -1], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + assert struct.unpack("H" * 6, got_data) == (3, 4, 4, 5, 5, 6) + + got_data = ar.Read( + array_start_idx=[2, 1], + count=[3, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) assert len(got_data) == 6 * 2 - assert struct.unpack('H' * 6, got_data) == (3, 2, - 2, 1, - 1, 0) - - with gdaltest.config_option('GDAL_HDF5_TEMP_ARRAY_ALLOC_SIZE', '0'): - got_data = ar.Read( array_start_idx = [2, 1], - count = [3, 2], - array_step = [-1, -1], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + assert struct.unpack("H" * 6, got_data) == (3, 2, 2, 1, 1, 0) + + with gdaltest.config_option("GDAL_HDF5_TEMP_ARRAY_ALLOC_SIZE", "0"): + got_data = ar.Read( + array_start_idx=[2, 1], + count=[3, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) assert len(got_data) == 6 * 2 - assert struct.unpack('H' * 6, got_data) == (3, 2, - 2, 1, - 1, 0) + assert struct.unpack("H" * 6, got_data) == (3, 2, 2, 1, 1, 0) def test_hdf5_multidim_var_alldatatypes(): - ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - expected_vars = [ #('char_var', gdal.GDT_Byte, (ord('x'),ord('y'))), - ('ubyte_var', gdal.GDT_Byte, (255, 254)), - ('byte_var', gdal.GDT_Int16, (-128,-127)), - ('byte_unsigned_false_var', gdal.GDT_Int16, (-128,-127)), - #('byte_unsigned_true_var', gdal.GDT_Byte, (128, 129)), - ('ushort_var', gdal.GDT_UInt16, (65534, 65533)), - ('short_var', gdal.GDT_Int16, (-32768, -32767)), - ('uint_var', gdal.GDT_UInt32, (4294967294, 4294967293)), - ('int_var', gdal.GDT_Int32, (-2147483648, -2147483647)), - ('uint64_var', gdal.GDT_UInt64, (18446744073709551613, 18446744073709551612)), - ('int64_var', gdal.GDT_Int64, (-9223372036854775808, -9223372036854775807)), - ('float_var', gdal.GDT_Float32, (1.25, 2.25)), - ('double_var', gdal.GDT_Float64, (1.25125, 2.25125)), - ('complex_int16_var', gdal.GDT_CInt16, (-32768, -32767, -32766, -32765)), - ('complex_int32_var', gdal.GDT_CInt32, (-2147483648, -2147483647, -2147483646, -2147483645)), - ('complex64_var', gdal.GDT_CFloat32, (1.25, 2.5, 2.25, 3.5)), - ('complex128_var', gdal.GDT_CFloat64, (1.25125, 2.25125, 3.25125, 4.25125)), - ] + expected_vars = [ # ('char_var', gdal.GDT_Byte, (ord('x'),ord('y'))), + ("ubyte_var", gdal.GDT_Byte, (255, 254)), + ("byte_var", gdal.GDT_Int16, (-128, -127)), + ("byte_unsigned_false_var", gdal.GDT_Int16, (-128, -127)), + # ('byte_unsigned_true_var', gdal.GDT_Byte, (128, 129)), + ("ushort_var", gdal.GDT_UInt16, (65534, 65533)), + ("short_var", gdal.GDT_Int16, (-32768, -32767)), + ("uint_var", gdal.GDT_UInt32, (4294967294, 4294967293)), + ("int_var", gdal.GDT_Int32, (-2147483648, -2147483647)), + ("uint64_var", gdal.GDT_UInt64, (18446744073709551613, 18446744073709551612)), + ("int64_var", gdal.GDT_Int64, (-9223372036854775808, -9223372036854775807)), + ("float_var", gdal.GDT_Float32, (1.25, 2.25)), + ("double_var", gdal.GDT_Float64, (1.25125, 2.25125)), + ("complex_int16_var", gdal.GDT_CInt16, (-32768, -32767, -32766, -32765)), + ( + "complex_int32_var", + gdal.GDT_CInt32, + (-2147483648, -2147483647, -2147483646, -2147483645), + ), + ("complex64_var", gdal.GDT_CFloat32, (1.25, 2.5, 2.25, 3.5)), + ("complex128_var", gdal.GDT_CFloat64, (1.25125, 2.25125, 3.25125, 4.25125)), + ] for var_name, dt, val in expected_vars: var = rg.OpenMDArray(var_name) assert var assert var.GetDataType().GetClass() == gdal.GEDTC_NUMERIC, var_name assert var.GetDataType().GetNumericDataType() == dt, var_name if dt == gdal.GDT_Byte: - assert struct.unpack('B' * len(val), var.Read()) == val + assert struct.unpack("B" * len(val), var.Read()) == val if dt == gdal.GDT_UInt16: - assert struct.unpack('H' * len(val), var.Read()) == val + assert struct.unpack("H" * len(val), var.Read()) == val if dt == gdal.GDT_Int16: - assert struct.unpack('h' * len(val), var.Read()) == val + assert struct.unpack("h" * len(val), var.Read()) == val if dt == gdal.GDT_UInt32: - assert struct.unpack('I' * len(val), var.Read()) == val + assert struct.unpack("I" * len(val), var.Read()) == val if dt == gdal.GDT_Int32: - assert struct.unpack('i' * len(val), var.Read()) == val + assert struct.unpack("i" * len(val), var.Read()) == val if dt == gdal.GDT_UInt64: - assert struct.unpack('Q' * len(val), var.Read()) == val + assert struct.unpack("Q" * len(val), var.Read()) == val if dt == gdal.GDT_Int64: - assert struct.unpack('q' * len(val), var.Read()) == val + assert struct.unpack("q" * len(val), var.Read()) == val if dt == gdal.GDT_Float32: - assert struct.unpack('f' * len(val), var.Read()) == val + assert struct.unpack("f" * len(val), var.Read()) == val if dt == gdal.GDT_Float64: - assert struct.unpack('d' * len(val), var.Read()) == val + assert struct.unpack("d" * len(val), var.Read()) == val if dt == gdal.GDT_CInt16: - assert struct.unpack('h' * len(val), var.Read()) == val + assert struct.unpack("h" * len(val), var.Read()) == val if dt == gdal.GDT_CInt32: - assert struct.unpack('i' * len(val), var.Read()) == val + assert struct.unpack("i" * len(val), var.Read()) == val if dt == gdal.GDT_CFloat32: - assert struct.unpack('f' * len(val), var.Read()) == val + assert struct.unpack("f" * len(val), var.Read()) == val if dt == gdal.GDT_CFloat64: - assert struct.unpack('d' * len(val), var.Read()) == val + assert struct.unpack("d" * len(val), var.Read()) == val - var = rg.OpenMDArray('custom_type_2_elts_var') + var = rg.OpenMDArray("custom_type_2_elts_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 8 - assert dt.GetName() == 'custom_type_2_elts' + assert dt.GetName() == "custom_type_2_elts" comps = dt.GetComponents() assert len(comps) == 2 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 data = var.Read() assert len(data) == 2 * 8 - assert struct.unpack('ihihh', data) == (1, 2, 3, 4, 0) + assert struct.unpack("ihihh", data) == (1, 2, 3, 4, 0) - assert struct.unpack('i' * 2, var['x'].Read()) == (1, 3) - assert struct.unpack('h' * 2, var['y'].Read()) == (2, 4) + assert struct.unpack("i" * 2, var["x"].Read()) == (1, 3) + assert struct.unpack("h" * 2, var["y"].Read()) == (2, 4) - var = rg.OpenMDArray('custom_type_3_elts_var') + var = rg.OpenMDArray("custom_type_3_elts_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 12 comps = dt.GetComponents() assert len(comps) == 3 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 - assert comps[2].GetName() == 'z' + assert comps[2].GetName() == "z" assert comps[2].GetOffset() == 8 assert comps[2].GetType().GetNumericDataType() == gdal.GDT_Float32 data = var.Read() assert len(data) == 2 * 12 - assert struct.unpack('ihf' * 2, data) == (1, 2, 3.5, 4, 5, 6.5) + assert struct.unpack("ihf" * 2, data) == (1, 2, 3.5, 4, 5, 6.5) - var = rg.OpenMDArray('string_var') + var = rg.OpenMDArray("string_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_STRING - assert var.Read() == ['abcd', 'ef'] + assert var.Read() == ["abcd", "ef"] def test_hdf5_multidim_read_array(): - ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() # 0D - var = rg.OpenMDArray('ubyte_no_dim_var') + var = rg.OpenMDArray("ubyte_no_dim_var") assert var - assert struct.unpack('B', var.Read()) == (2,) - assert struct.unpack('H', var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16))) == (2,) + assert struct.unpack("B", var.Read()) == (2,) + assert struct.unpack( + "H", var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ) == (2,) # 1D - var = rg.OpenMDArray('ubyte_x2_var') - data = var.Read(array_start_idx = [1], count = [2], array_step = [2]) + var = rg.OpenMDArray("ubyte_x2_var") + data = var.Read(array_start_idx=[1], count=[2], array_step=[2]) got_data_ref = (2, 4) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1], count = [2], array_step = [2], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1], + count=[2], + array_step=[2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [2], count = [2], array_step = [-2]) + data = var.Read(array_start_idx=[2], count=[2], array_step=[-2]) got_data_ref = (3, 1) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref # 2D - var = rg.OpenMDArray('ubyte_y2_x2_var') - data = var.Read(count = [2, 3], array_step = [2, 1]) + var = rg.OpenMDArray("ubyte_y2_x2_var") + data = var.Read(count=[2, 3], array_step=[2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(count = [2, 3], array_step = [2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + count=[2, 3], + array_step=[2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [1, 2], count = [2, 2]) + data = var.Read(array_start_idx=[1, 2], count=[2, 2]) got_data_ref = (7, 8, 11, 12) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1, 2], count = [2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1, 2], + count=[2, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref # 3D - var = rg.OpenMDArray('ubyte_z2_y2_x2_var') - data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1]) + var = rg.OpenMDArray("ubyte_z2_y2_x2_var") + data = var.Read(count=[3, 2, 3], array_step=[1, 2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + count=[3, 2, 3], + array_step=[1, 2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2]) + data = var.Read(array_start_idx=[1, 1, 1], count=[3, 2, 2]) got_data_ref = (7, 8, 11, 12, 8, 9, 12, 1, 9, 10, 1, 2) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1, 1, 1], + count=[3, 2, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref # Test reading from slice (most optimized path) - data = var.Read(array_start_idx = [3, 0, 0], count = [1, 2, 3]) - data_from_slice = var[3].Read(count = [2, 3]) + data = var.Read(array_start_idx=[3, 0, 0], count=[1, 2, 3]) + data_from_slice = var[3].Read(count=[2, 3]) assert data_from_slice == data # Test reading from slice (slow path) - data = var.Read(array_start_idx = [3, 0 + (2-1) * 2, 0 + (3-1) * 1], count = [1, 2, 3], array_step = [1, -2, -1]) - data_from_slice = var[3].Read(array_start_idx = [0 + (2-1) * 2, 0 + (3-1) * 1], count = [2, 3], array_step = [-2, -1]) + data = var.Read( + array_start_idx=[3, 0 + (2 - 1) * 2, 0 + (3 - 1) * 1], + count=[1, 2, 3], + array_step=[1, -2, -1], + ) + data_from_slice = var[3].Read( + array_start_idx=[0 + (2 - 1) * 2, 0 + (3 - 1) * 1], + count=[2, 3], + array_step=[-2, -1], + ) assert data_from_slice == data # 4D - var = rg.OpenMDArray('ubyte_t2_z2_y2_x2_var') - data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1]) - got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 4, 5, 6, 12, 1, 2) - assert struct.unpack('B' * len(data), data) == got_data_ref - - data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + var = rg.OpenMDArray("ubyte_t2_z2_y2_x2_var") + data = var.Read(count=[2, 3, 2, 3], array_step=[1, 1, 2, 1]) + got_data_ref = ( + 1, + 2, + 3, + 9, + 10, + 11, + 2, + 3, + 4, + 10, + 11, + 12, + 3, + 4, + 5, + 11, + 12, + 1, + 2, + 3, + 4, + 10, + 11, + 12, + 3, + 4, + 5, + 11, + 12, + 1, + 4, + 5, + 6, + 12, + 1, + 2, + ) + assert struct.unpack("B" * len(data), data) == got_data_ref + + data = var.Read( + count=[2, 3, 2, 3], + array_step=[1, 1, 2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref def test_hdf5_multidim_attr_alldatatypes(): - ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() attrs = rg.GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'global_attr' + assert attrs[0].GetName() == "global_attr" - attrs = rg.OpenGroup('group').GetAttributes() + attrs = rg.OpenGroup("group").GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'group_global_attr' + assert attrs[0].GetName() == "group_global_attr" - var = rg.OpenMDArray('ubyte_var') + var = rg.OpenMDArray("ubyte_var") assert var attrs = var.GetAttributes() assert len(attrs) == 30 @@ -294,87 +395,103 @@ def test_hdf5_multidim_attr_alldatatypes(): for attr in attrs: map_attrs[attr.GetName()] = attr - attr = map_attrs['attr_byte'] + attr = map_attrs["attr_byte"] assert attr.GetDimensionCount() == 0 assert len(attr.GetDimensionsSize()) == 0 assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Int16 assert attr.Read() == -128 - assert map_attrs['attr_ubyte'].Read() == 255 + assert map_attrs["attr_ubyte"].Read() == 255 - assert map_attrs['attr_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_char'].GetDimensionCount() == 0 - assert map_attrs['attr_char'].Read() == 'x' - assert map_attrs['attr_char'].ReadAsStringArray() == ['x'] + assert map_attrs["attr_char"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_char"].GetDimensionCount() == 0 + assert map_attrs["attr_char"].Read() == "x" + assert map_attrs["attr_char"].ReadAsStringArray() == ["x"] with gdaltest.error_handler(): - assert not map_attrs['attr_char'].ReadAsRaw() + assert not map_attrs["attr_char"].ReadAsRaw() - assert map_attrs['attr_string_as_repeated_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_string_as_repeated_char'].GetDimensionCount() == 0 - assert map_attrs['attr_string_as_repeated_char'].Read() == 'xy' - assert map_attrs['attr_string_as_repeated_char'].ReadAsStringArray() == ['xy'] + assert ( + map_attrs["attr_string_as_repeated_char"].GetDataType().GetClass() + == gdal.GEDTC_STRING + ) + assert map_attrs["attr_string_as_repeated_char"].GetDimensionCount() == 0 + assert map_attrs["attr_string_as_repeated_char"].Read() == "xy" + assert map_attrs["attr_string_as_repeated_char"].ReadAsStringArray() == ["xy"] - assert map_attrs['attr_empty_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_empty_char'].GetDimensionCount() == 0 - assert map_attrs['attr_empty_char'].Read() == '' + assert map_attrs["attr_empty_char"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_empty_char"].GetDimensionCount() == 0 + assert map_attrs["attr_empty_char"].Read() == "" - assert map_attrs['attr_two_strings'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_two_strings'].GetDimensionCount() == 1 - assert map_attrs['attr_two_strings'].GetDimensionsSize()[0] == 2 - assert map_attrs['attr_two_strings'].Read() == ['ab', 'cd'] - assert map_attrs['attr_two_strings'].ReadAsString() == 'ab' + assert map_attrs["attr_two_strings"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_two_strings"].GetDimensionCount() == 1 + assert map_attrs["attr_two_strings"].GetDimensionsSize()[0] == 2 + assert map_attrs["attr_two_strings"].Read() == ["ab", "cd"] + assert map_attrs["attr_two_strings"].ReadAsString() == "ab" - assert map_attrs['attr_int'].Read() == -2147483647 + assert map_attrs["attr_int"].Read() == -2147483647 - assert map_attrs['attr_float'].Read() == 1.25 + assert map_attrs["attr_float"].Read() == 1.25 - assert map_attrs['attr_double'].Read() == 1.25125 - assert map_attrs['attr_double'].ReadAsDoubleArray() == (1.25125,) + assert map_attrs["attr_double"].Read() == 1.25125 + assert map_attrs["attr_double"].ReadAsDoubleArray() == (1.25125,) - assert map_attrs['attr_int64'].Read() == -9.223372036854776e+18 + assert map_attrs["attr_int64"].Read() == -9.223372036854776e18 - assert map_attrs['attr_uint64'].Read() == 1.8446744073709552e+19 + assert map_attrs["attr_uint64"].Read() == 1.8446744073709552e19 - assert map_attrs['attr_complex_int16'].GetDataType().GetNumericDataType() == gdal.GDT_CInt16 - assert struct.unpack('H'* 2, map_attrs['attr_complex_int16'].ReadAsRaw()) == (1, 2) - assert map_attrs['attr_complex_int16'].Read() == 1.0 - assert map_attrs['attr_complex_int16'].ReadAsString() == '1+2j' + assert ( + map_attrs["attr_complex_int16"].GetDataType().GetNumericDataType() + == gdal.GDT_CInt16 + ) + assert struct.unpack("H" * 2, map_attrs["attr_complex_int16"].ReadAsRaw()) == (1, 2) + assert map_attrs["attr_complex_int16"].Read() == 1.0 + assert map_attrs["attr_complex_int16"].ReadAsString() == "1+2j" - assert map_attrs['attr_two_bytes'].Read() == (-128, -127) + assert map_attrs["attr_two_bytes"].Read() == (-128, -127) - assert map_attrs['attr_two_ints'].Read() == (-2147483648, -2147483647) + assert map_attrs["attr_two_ints"].Read() == (-2147483648, -2147483647) - assert map_attrs['attr_two_doubles'].GetDataType().GetNumericDataType() == gdal.GDT_Float64 - assert map_attrs['attr_two_doubles'].GetDimensionCount() == 1 - assert map_attrs['attr_two_doubles'].GetDimensionsSize()[0] == 2 - assert map_attrs['attr_two_doubles'].Read() == (1.25125, 2.125125) - assert map_attrs['attr_two_doubles'].ReadAsDouble() == 1.25125 + assert ( + map_attrs["attr_two_doubles"].GetDataType().GetNumericDataType() + == gdal.GDT_Float64 + ) + assert map_attrs["attr_two_doubles"].GetDimensionCount() == 1 + assert map_attrs["attr_two_doubles"].GetDimensionsSize()[0] == 2 + assert map_attrs["attr_two_doubles"].Read() == (1.25125, 2.125125) + assert map_attrs["attr_two_doubles"].ReadAsDouble() == 1.25125 - assert map_attrs['attr_enum_ubyte'].GetDataType().GetNumericDataType() == gdal.GDT_Byte - assert map_attrs['attr_enum_ubyte'].Read() == 1 + assert ( + map_attrs["attr_enum_ubyte"].GetDataType().GetNumericDataType() == gdal.GDT_Byte + ) + assert map_attrs["attr_enum_ubyte"].Read() == 1 - assert map_attrs['attr_enum_int'].GetDataType().GetNumericDataType() == gdal.GDT_Int32 - assert map_attrs['attr_enum_int'].Read() == 1000000001 + assert ( + map_attrs["attr_enum_int"].GetDataType().GetNumericDataType() == gdal.GDT_Int32 + ) + assert map_attrs["attr_enum_int"].Read() == 1000000001 - assert len(map_attrs['attr_custom_type_2_elts'].ReadAsRaw()) == 8 + assert len(map_attrs["attr_custom_type_2_elts"].ReadAsRaw()) == 8 # Compound type contains a string with gdaltest.error_handler(): - assert not map_attrs['attr_custom_with_string'].ReadAsRaw() + assert not map_attrs["attr_custom_with_string"].ReadAsRaw() def test_hdf5_multidim_nodata_unit(): - ds = gdal.OpenEx('HDF5:data/netcdf/trmm-nc4.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/trmm-nc4.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('pcp') - assert struct.unpack('f', ar.GetNoDataValueAsRaw())[0] == struct.unpack('f', struct.pack('f', -9999.9))[0] - assert ar.GetUnit() == '' + ar = rg.OpenMDArray("pcp") + assert ( + struct.unpack("f", ar.GetNoDataValueAsRaw())[0] + == struct.unpack("f", struct.pack("f", -9999.9))[0] + ) + assert ar.GetUnit() == "" - ar = rg.OpenMDArray('longitude') + ar = rg.OpenMDArray("longitude") assert ar.GetNoDataValueAsRaw() is None - assert ar.GetUnit() == 'degrees_east' + assert ar.GetUnit() == "degrees_east" def test_hdf5_multidim_recursive_groups(): @@ -392,159 +509,159 @@ def test_hdf5_multidim_recursive_groups(): # group['ext_link_to_self_root'] = h5py.ExternalLink("hdf5/recursive_groups.h5", "/") # f.close() - ds = gdal.OpenEx('data/hdf5/recursive_groups.h5', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/hdf5/recursive_groups.h5", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['subgroup'] + assert rg.GetGroupNames() == ["subgroup"] def test_hdf5_netcdf_dimensions(): - ds = gdal.OpenEx('HDF5:data/netcdf/trmm-nc4.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/trmm-nc4.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - assert rg.GetAttribute('CDI') + assert rg.GetAttribute("CDI") dims = rg.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/latitude' - assert dims[0].GetName() == 'latitude' + assert dims[0].GetFullName() == "/latitude" + assert dims[0].GetName() == "latitude" assert dims[0].GetSize() == 40 var = dims[0].GetIndexingVariable() assert var - assert var.GetName() == 'latitude' + assert var.GetName() == "latitude" - assert dims[1].GetFullName() == '/longitude' - assert dims[1].GetName() == 'longitude' + assert dims[1].GetFullName() == "/longitude" + assert dims[1].GetName() == "longitude" assert dims[1].GetSize() == 40 var = dims[1].GetIndexingVariable() assert var - assert dims[2].GetFullName() == '/time' - assert dims[2].GetName() == 'time' + assert dims[2].GetFullName() == "/time" + assert dims[2].GetName() == "time" assert dims[2].GetSize() == 1 var = dims[2].GetIndexingVariable() assert var - ar = rg.OpenMDArray('latitude') + ar = rg.OpenMDArray("latitude") dims = ar.GetDimensions() assert len(dims) == 1 - assert dims[0].GetName() == 'latitude' + assert dims[0].GetName() == "latitude" assert dims[0].GetIndexingVariable() - assert dims[0].GetIndexingVariable().GetName() == 'latitude' + assert dims[0].GetIndexingVariable().GetName() == "latitude" - ar = rg.OpenMDArray('pcp') + ar = rg.OpenMDArray("pcp") dims = ar.GetDimensions() assert len(dims) == 3 - assert dims[0].GetName() == 'time' + assert dims[0].GetName() == "time" assert dims[0].GetIndexingVariable() - assert dims[0].GetIndexingVariable().GetName() == 'time' + assert dims[0].GetIndexingVariable().GetName() == "time" def test_hdf5_multidim_netcdf_dimensions_complex_case(): - ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() assert len(dims) == 6 - dim = next((x for x in dims if x.GetName() == 'X'), None) + dim = next((x for x in dims if x.GetName() == "X"), None) assert dim - assert dim.GetFullName() == '/X' + assert dim.GetFullName() == "/X" assert dim.GetSize() == 2 assert dim.GetIndexingVariable() - assert dim.GetIndexingVariable().GetFullName() == '/X' + assert dim.GetIndexingVariable().GetFullName() == "/X" - dim = next((x for x in dims if x.GetName() == 'Y'), None) + dim = next((x for x in dims if x.GetName() == "Y"), None) assert dim - assert dim.GetFullName() == '/Y' + assert dim.GetFullName() == "/Y" assert dim.GetSize() == 1 assert dim.GetIndexingVariable() - assert dim.GetIndexingVariable().GetFullName() == '/Y' + assert dim.GetIndexingVariable().GetFullName() == "/Y" - dim = next((x for x in dims if x.GetName() == 'X2'), None) + dim = next((x for x in dims if x.GetName() == "X2"), None) assert dim - assert dim.GetFullName() == '/X2' + assert dim.GetFullName() == "/X2" assert dim.GetSize() == 4 assert not dim.GetIndexingVariable() - assert 'X' in rg.GetMDArrayNames() - assert 'X2' not in rg.GetMDArrayNames() + assert "X" in rg.GetMDArrayNames() + assert "X2" not in rg.GetMDArrayNames() - subgroup = rg.OpenGroup('group') + subgroup = rg.OpenGroup("group") assert subgroup dims = subgroup.GetDimensions() assert len(dims) == 2 - dim = next((x for x in dims if x.GetName() == 'X'), None) + dim = next((x for x in dims if x.GetName() == "X"), None) assert dim - assert dim.GetFullName() == '/group/X' + assert dim.GetFullName() == "/group/X" assert dim.GetSize() == 3 assert not dim.GetIndexingVariable() - dim = next((x for x in dims if x.GetName() == 'Y'), None) + dim = next((x for x in dims if x.GetName() == "Y"), None) assert dim - assert dim.GetFullName() == '/group/Y' + assert dim.GetFullName() == "/group/Y" assert dim.GetSize() == 2 assert not dim.GetIndexingVariable() - ar = subgroup.OpenMDArray('char_var') + ar = subgroup.OpenMDArray("char_var") assert ar dims = ar.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/Y' + assert dims[0].GetFullName() == "/Y" assert dims[0].GetSize() == 1 assert dims[0].GetIndexingVariable() - assert dims[1].GetFullName() == '/group/Y' + assert dims[1].GetFullName() == "/group/Y" assert dims[1].GetSize() == 2 assert not dims[1].GetIndexingVariable() - assert dims[2].GetFullName() == '/group/X' + assert dims[2].GetFullName() == "/group/X" assert dims[2].GetSize() == 3 assert not dims[2].GetIndexingVariable() - ar = rg.OpenMDArray('ubyte_z2_y2_x2_var') + ar = rg.OpenMDArray("ubyte_z2_y2_x2_var") assert ar dims = ar.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/Z2' + assert dims[0].GetFullName() == "/Z2" assert not dims[0].GetIndexingVariable() def test_hdf5_multidim_dimension_labels_with_null(): - ds = gdal.OpenEx('data/hdf5/dimension_labels_with_null.h5', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/hdf5/dimension_labels_with_null.h5", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('data') - attr = ar.GetAttribute('DIMENSION_LABELS') - assert attr.ReadAsStringArray() == ['', '', 'x'] + ar = rg.OpenMDArray("data") + attr = ar.GetAttribute("DIMENSION_LABELS") + assert attr.ReadAsStringArray() == ["", "", "x"] - ds = gdal.OpenEx('data/hdf5/dimension_labels_with_null.h5', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/hdf5/dimension_labels_with_null.h5", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('data') + ar = rg.OpenMDArray("data") dims = ar.GetDimensions() assert len(dims) == 3 - assert dims[0].GetName() == 'dim0' - assert dims[1].GetName() == 'dim1' - assert dims[2].GetName() == 'x' + assert dims[0].GetName() == "dim0" + assert dims[1].GetName() == "dim1" + assert dims[2].GetName() == "x" def test_hdf5_multidim_family_driver(): - assert gdal.OpenEx('data/hdf5/test_family_0.h5', gdal.OF_MULTIDIM_RASTER) + assert gdal.OpenEx("data/hdf5/test_family_0.h5", gdal.OF_MULTIDIM_RASTER) def test_hdf5_multidim_read_transposed(): - ds = gdal.OpenEx('HDF5:data/netcdf/trmm-nc4.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("HDF5:data/netcdf/trmm-nc4.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('pcp') + ar = rg.OpenMDArray("pcp") dims = ar.GetDimensions() y_size = dims[-2].GetSize() x_size = dims[-1].GetSize() transposed_ar = ar.Transpose([0, 2, 1]) - data = list(struct.unpack('f' * (y_size * x_size), ar.Read())) - transposed_data = list(struct.unpack('f' * (y_size * x_size), transposed_ar.Read())) + data = list(struct.unpack("f" * (y_size * x_size), ar.Read())) + transposed_data = list(struct.unpack("f" * (y_size * x_size), transposed_ar.Read())) manually_transposed_data = [] for x in range(x_size): for y in range(y_size): diff --git a/autotest/gdrivers/heif.py b/autotest/gdrivers/heif.py index d35f90dbcd79..0dfdf551971f 100644 --- a/autotest/gdrivers/heif.py +++ b/autotest/gdrivers/heif.py @@ -29,22 +29,29 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import gdaltest import pytest -import gdaltest from osgeo import gdal -pytestmark = pytest.mark.require_driver('HEIF') +pytestmark = pytest.mark.require_driver("HEIF") + def get_version(): - return [int(x) for x in gdal.GetDriverByName('HEIF').GetMetadataItem('LIBHEIF_VERSION').split('.')] + return [ + int(x) + for x in gdal.GetDriverByName("HEIF") + .GetMetadataItem("LIBHEIF_VERSION") + .split(".") + ] + -@pytest.mark.parametrize('endianness', ['big_endian', 'little_endian']) +@pytest.mark.parametrize("endianness", ["big_endian", "little_endian"]) def test_heif_exif_endian(endianness): - filename = 'data/heif/byte_exif_%s.heic' % endianness + filename = "data/heif/byte_exif_%s.heic" % endianness gdal.ErrorReset() ds = gdal.Open(filename) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" assert ds assert ds.RasterXSize == 64 assert ds.RasterYSize == 64 @@ -60,17 +67,17 @@ def test_heif_exif_endian(endianness): assert ds.GetRasterBand(1).GetOverviewCount() == 0 if get_version() >= [1, 4, 0]: - assert 'EXIF' in ds.GetMetadataDomainList() - assert 'xml:XMP' in ds.GetMetadataDomainList() - assert len(ds.GetMetadata('EXIF')) > 0 - assert 'xpacket' in ds.GetMetadata('xml:XMP')[0] + assert "EXIF" in ds.GetMetadataDomainList() + assert "xml:XMP" in ds.GetMetadataDomainList() + assert len(ds.GetMetadata("EXIF")) > 0 + assert "xpacket" in ds.GetMetadata("xml:XMP")[0] ds = None - gdal.Unlink(filename + '.aux.xml') + gdal.Unlink(filename + ".aux.xml") def test_heif_thumbnail(): - ds = gdal.Open('data/heif/byte_thumbnail.heic') + ds = gdal.Open("data/heif/byte_thumbnail.heic") assert ds assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -89,19 +96,19 @@ def test_heif_rgb_16bit(): if get_version() < [1, 4, 0]: pytest.skip() - ds = gdal.Open('data/heif/small_world_16.heic') + ds = gdal.Open("data/heif/small_world_16.heic") assert ds assert ds.RasterXSize == 400 assert ds.RasterYSize == 200 assert ds.RasterCount == 3 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 - assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '10' - assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((0,1023), abs=2) + assert ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "10" + assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((0, 1023), abs=2) def test_heif_rgba(): - ds = gdal.Open('data/heif/stefan_full_rgba.heic') + ds = gdal.Open("data/heif/stefan_full_rgba.heic") assert ds assert ds.RasterCount == 4 assert ds.RasterXSize == 162 @@ -118,7 +125,7 @@ def test_heif_rgba_16bit(): if get_version() < [1, 4, 0]: pytest.skip() - ds = gdal.Open('data/heif/stefan_full_rgba_16.heic') + ds = gdal.Open("data/heif/stefan_full_rgba_16.heic") assert ds assert ds.RasterCount == 4 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 @@ -126,7 +133,7 @@ def test_heif_rgba_16bit(): def test_heif_subdatasets(): - ds = gdal.Open('data/heif/subdatasets.heic') + ds = gdal.Open("data/heif/subdatasets.heic") assert ds assert len(ds.GetSubDatasets()) == 2 subds1_name = ds.GetSubDatasets()[0][0] @@ -141,9 +148,9 @@ def test_heif_subdatasets(): assert ds.RasterXSize == 162 with gdaltest.error_handler(): - assert gdal.Open('HEIF:0:data/heif/subdatasets.heic') is None - assert gdal.Open('HEIF:3:data/heif/subdatasets.heic') is None - assert gdal.Open('HEIF:1:non_existing.heic') is None - assert gdal.Open('HEIF:') is None - assert gdal.Open('HEIF:1') is None - assert gdal.Open('HEIF:1:') is None + assert gdal.Open("HEIF:0:data/heif/subdatasets.heic") is None + assert gdal.Open("HEIF:3:data/heif/subdatasets.heic") is None + assert gdal.Open("HEIF:1:non_existing.heic") is None + assert gdal.Open("HEIF:") is None + assert gdal.Open("HEIF:1") is None + assert gdal.Open("HEIF:1:") is None diff --git a/autotest/gdrivers/hf2.py b/autotest/gdrivers/hf2.py index d688a0dbba02..0bc7e3ec1674 100755 --- a/autotest/gdrivers/hf2.py +++ b/autotest/gdrivers/hf2.py @@ -30,7 +30,6 @@ import os - import gdaltest ############################################################################### @@ -39,8 +38,12 @@ def test_hf2_1(): - tst = gdaltest.GDALTest('HF2', 'byte.tif', 1, 4672) - return tst.testCreateCopy(vsimem=1, check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) + tst = gdaltest.GDALTest("HF2", "byte.tif", 1, 4672) + return tst.testCreateCopy( + vsimem=1, + check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333), + ) + ############################################################################### # Test CreateCopy() of byte.tif with options @@ -48,32 +51,37 @@ def test_hf2_1(): def test_hf2_2(): - tst = gdaltest.GDALTest('HF2', 'byte.tif', 1, 4672, options=['COMPRESS=YES', 'BLOCKSIZE=10']) - ret = tst.testCreateCopy(new_filename='tmp/hf2_2.hfz') + tst = gdaltest.GDALTest( + "HF2", "byte.tif", 1, 4672, options=["COMPRESS=YES", "BLOCKSIZE=10"] + ) + ret = tst.testCreateCopy(new_filename="tmp/hf2_2.hfz") try: - os.remove('tmp/hf2_2.hfz.properties') + os.remove("tmp/hf2_2.hfz.properties") except OSError: pass return ret + ############################################################################### # Test CreateCopy() of float.img def test_hf2_3(): - tst = gdaltest.GDALTest('HF2', 'hfa/float.img', 1, 23529) + tst = gdaltest.GDALTest("HF2", "hfa/float.img", 1, 23529) return tst.testCreateCopy(check_minmax=0) + ############################################################################### # Test CreateCopy() of n43.dt0 def test_hf2_4(): - tst = gdaltest.GDALTest('HF2', 'n43.dt0', 1, 49187) + tst = gdaltest.GDALTest("HF2", "n43.dt0", 1, 49187) return tst.testCreateCopy() + ############################################################################### # Cleanup @@ -81,5 +89,3 @@ def test_hf2_4(): def test_hf2_cleanup(): pass - - diff --git a/autotest/gdrivers/hfa.py b/autotest/gdrivers/hfa.py index ae0eca4c4e4a..94a365c6fe23 100755 --- a/autotest/gdrivers/hfa.py +++ b/autotest/gdrivers/hfa.py @@ -31,36 +31,39 @@ import os import struct -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Verify we can read the special histogram metadata from a provided image. def test_hfa_histread(): - ds = gdal.Open('../gcore/data/utmsmall.img') + ds = gdal.Open("../gcore/data/utmsmall.img") md = ds.GetRasterBand(1).GetMetadata() ds = None - assert md['STATISTICS_MINIMUM'] == '8', 'STATISTICS_MINIMUM is wrong.' + assert md["STATISTICS_MINIMUM"] == "8", "STATISTICS_MINIMUM is wrong." - assert md['STATISTICS_MEDIAN'] == '148', 'STATISTICS_MEDIAN is wrong.' + assert md["STATISTICS_MEDIAN"] == "148", "STATISTICS_MEDIAN is wrong." - assert md['STATISTICS_HISTOMAX'] == '255', 'STATISTICS_HISTOMAX is wrong.' + assert md["STATISTICS_HISTOMAX"] == "255", "STATISTICS_HISTOMAX is wrong." - assert md['STATISTICS_HISTOBINVALUES'] == '0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|', \ - 'STATISTICS_HISTOBINVALUES is wrong.' + assert ( + md["STATISTICS_HISTOBINVALUES"] + == "0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|" + ), "STATISTICS_HISTOBINVALUES is wrong." - assert md['STATISTICS_SKIPFACTORX'] == '1', 'STATISTICS_SKIPFACTORX is wrong.' + assert md["STATISTICS_SKIPFACTORX"] == "1", "STATISTICS_SKIPFACTORX is wrong." - assert md['STATISTICS_SKIPFACTORY'] == '1', 'STATISTICS_SKIPFACTORY is wrong.' + assert md["STATISTICS_SKIPFACTORY"] == "1", "STATISTICS_SKIPFACTORY is wrong." + + assert md["STATISTICS_EXCLUDEDVALUES"] == "0", "STATISTICS_EXCLUDEDVALUE is wrong." - assert md['STATISTICS_EXCLUDEDVALUES'] == '0', 'STATISTICS_EXCLUDEDVALUE is wrong.' ############################################################################### # Verify that if we copy this test image to a new Imagine file the histogram @@ -69,31 +72,34 @@ def test_hfa_histread(): def test_hfa_histwrite(): - drv = gdal.GetDriverByName('HFA') - ds_src = gdal.Open('../gcore/data/utmsmall.img') - out_ds = drv.CreateCopy('tmp/work.img', ds_src) + drv = gdal.GetDriverByName("HFA") + ds_src = gdal.Open("../gcore/data/utmsmall.img") + out_ds = drv.CreateCopy("tmp/work.img", ds_src) del out_ds ds_src = None # Remove .aux.xml file as histogram can be written in it - tmpAuxXml = 'tmp/work.img.aux.xml' + tmpAuxXml = "tmp/work.img.aux.xml" if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) - ds = gdal.Open('tmp/work.img') + ds = gdal.Open("tmp/work.img") md = ds.GetRasterBand(1).GetMetadata() ds = None - drv.Delete('tmp/work.img') + drv.Delete("tmp/work.img") + + assert md["STATISTICS_MINIMUM"] == "8", "STATISTICS_MINIMUM is wrong." - assert md['STATISTICS_MINIMUM'] == '8', 'STATISTICS_MINIMUM is wrong.' + assert md["STATISTICS_MEDIAN"] == "148", "STATISTICS_MEDIAN is wrong." - assert md['STATISTICS_MEDIAN'] == '148', 'STATISTICS_MEDIAN is wrong.' + assert md["STATISTICS_HISTOMAX"] == "255", "STATISTICS_HISTOMAX is wrong." - assert md['STATISTICS_HISTOMAX'] == '255', 'STATISTICS_HISTOMAX is wrong.' + assert ( + md["STATISTICS_HISTOBINVALUES"] + == "0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|" + ), "STATISTICS_HISTOBINVALUES is wrong." - assert md['STATISTICS_HISTOBINVALUES'] == '0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|', \ - 'STATISTICS_HISTOBINVALUES is wrong.' ############################################################################### # Verify that if we copy this test image to a new Imagine file and then re-write the @@ -102,36 +108,37 @@ def test_hfa_histwrite(): def test_hfa_histrewrite(): - drv = gdal.GetDriverByName('HFA') - ds_src = gdal.Open('../gcore/data/utmsmall.img') - out_ds = drv.CreateCopy('tmp/work.img', ds_src) + drv = gdal.GetDriverByName("HFA") + ds_src = gdal.Open("../gcore/data/utmsmall.img") + out_ds = drv.CreateCopy("tmp/work.img", ds_src) del out_ds ds_src = None # Remove .aux.xml file as histogram can be written in it - tmpAuxXml = 'tmp/work.img.aux.xml' + tmpAuxXml = "tmp/work.img.aux.xml" if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) # A new histogram which is different to what is in the file. It won't match the data, # but we are just testing the re-writing of the histogram, so we don't mind. - newHist = '8|23|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|' + newHist = "8|23|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|" - ds = gdal.Open('tmp/work.img', gdal.GA_Update) + ds = gdal.Open("tmp/work.img", gdal.GA_Update) band = ds.GetRasterBand(1) - band.SetMetadataItem('STATISTICS_HISTOBINVALUES', newHist) + band.SetMetadataItem("STATISTICS_HISTOBINVALUES", newHist) ds = None if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) - ds = gdal.Open('tmp/work.img') - histStr = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_HISTOBINVALUES') + ds = gdal.Open("tmp/work.img") + histStr = ds.GetRasterBand(1).GetMetadataItem("STATISTICS_HISTOBINVALUES") ds = None - drv.Delete('tmp/work.img') + drv.Delete("tmp/work.img") + + assert histStr == newHist, "Rewritten STATISTICS_HISTOBINVALUES is wrong." - assert histStr == newHist, 'Rewritten STATISTICS_HISTOBINVALUES is wrong.' ############################################################################### # Verify we can read metadata of int.img. @@ -139,23 +146,24 @@ def test_hfa_histrewrite(): def test_hfa_int_stats_1(): - ds = gdal.Open('data/hfa/int.img') + ds = gdal.Open("data/hfa/int.img") md = ds.GetRasterBand(1).GetMetadata() ds = None - assert md['STATISTICS_MINIMUM'] == '40918', 'STATISTICS_MINIMUM is wrong.' + assert md["STATISTICS_MINIMUM"] == "40918", "STATISTICS_MINIMUM is wrong." - assert md['STATISTICS_MAXIMUM'] == '41134', 'STATISTICS_MAXIMUM is wrong.' + assert md["STATISTICS_MAXIMUM"] == "41134", "STATISTICS_MAXIMUM is wrong." - assert md['STATISTICS_MEDIAN'] == '41017', 'STATISTICS_MEDIAN is wrong.' + assert md["STATISTICS_MEDIAN"] == "41017", "STATISTICS_MEDIAN is wrong." - assert md['STATISTICS_MODE'] == '41013', 'STATISTICS_MODE is wrong.' + assert md["STATISTICS_MODE"] == "41013", "STATISTICS_MODE is wrong." - assert md['STATISTICS_HISTOMIN'] == '40918', 'STATISTICS_HISTOMIN is wrong.' + assert md["STATISTICS_HISTOMIN"] == "40918", "STATISTICS_HISTOMIN is wrong." - assert md['STATISTICS_HISTOMAX'] == '41134', 'STATISTICS_HISTOMAX is wrong.' + assert md["STATISTICS_HISTOMAX"] == "41134", "STATISTICS_HISTOMAX is wrong." + + assert md["LAYER_TYPE"] == "athematic", "LAYER_TYPE is wrong." - assert md['LAYER_TYPE'] == 'athematic', 'LAYER_TYPE is wrong.' ############################################################################### # Verify we can read band statistics of int.img. @@ -163,19 +171,24 @@ def test_hfa_int_stats_1(): def test_hfa_int_stats_2(): - ds = gdal.Open('data/hfa/int.img') + ds = gdal.Open("data/hfa/int.img") stats = ds.GetRasterBand(1).GetStatistics(False, True) ds = None tolerance = 0.0001 - assert stats[0] == pytest.approx(40918.0, abs=tolerance), 'Minimum value is wrong.' + assert stats[0] == pytest.approx(40918.0, abs=tolerance), "Minimum value is wrong." + + assert stats[1] == pytest.approx(41134.0, abs=tolerance), "Maximum value is wrong." - assert stats[1] == pytest.approx(41134.0, abs=tolerance), 'Maximum value is wrong.' + assert stats[2] == pytest.approx( + 41019.784218148, abs=tolerance + ), "Mean value is wrong." - assert stats[2] == pytest.approx(41019.784218148, abs=tolerance), 'Mean value is wrong.' + assert stats[3] == pytest.approx( + 44.637237445468, abs=tolerance + ), "StdDev value is wrong." - assert stats[3] == pytest.approx(44.637237445468, abs=tolerance), 'StdDev value is wrong.' ############################################################################### # Verify we can read metadata of float.img. @@ -183,31 +196,44 @@ def test_hfa_int_stats_2(): def test_hfa_float_stats_1(): - ds = gdal.Open('data/hfa/float.img') + ds = gdal.Open("data/hfa/float.img") md = ds.GetRasterBand(1).GetMetadata() ds = None tolerance = 0.0001 - mini = float(md['STATISTICS_MINIMUM']) - assert mini == pytest.approx(40.91858291626, abs=tolerance), 'STATISTICS_MINIMUM is wrong.' + mini = float(md["STATISTICS_MINIMUM"]) + assert mini == pytest.approx( + 40.91858291626, abs=tolerance + ), "STATISTICS_MINIMUM is wrong." - maxi = float(md['STATISTICS_MAXIMUM']) - assert maxi == pytest.approx(41.134323120117, abs=tolerance), 'STATISTICS_MAXIMUM is wrong.' + maxi = float(md["STATISTICS_MAXIMUM"]) + assert maxi == pytest.approx( + 41.134323120117, abs=tolerance + ), "STATISTICS_MAXIMUM is wrong." - median = float(md['STATISTICS_MEDIAN']) - assert median == pytest.approx(41.017182931304, abs=tolerance), 'STATISTICS_MEDIAN is wrong.' + median = float(md["STATISTICS_MEDIAN"]) + assert median == pytest.approx( + 41.017182931304, abs=tolerance + ), "STATISTICS_MEDIAN is wrong." - mod = float(md['STATISTICS_MODE']) - assert mod == pytest.approx(41.0104410499, abs=tolerance), 'STATISTICS_MODE is wrong.' + mod = float(md["STATISTICS_MODE"]) + assert mod == pytest.approx( + 41.0104410499, abs=tolerance + ), "STATISTICS_MODE is wrong." - histMin = float(md['STATISTICS_HISTOMIN']) - assert histMin == pytest.approx(40.91858291626, abs=tolerance), 'STATISTICS_HISTOMIN is wrong.' + histMin = float(md["STATISTICS_HISTOMIN"]) + assert histMin == pytest.approx( + 40.91858291626, abs=tolerance + ), "STATISTICS_HISTOMIN is wrong." - histMax = float(md['STATISTICS_HISTOMAX']) - assert histMax == pytest.approx(41.134323120117, abs=tolerance), 'STATISTICS_HISTOMAX is wrong.' + histMax = float(md["STATISTICS_HISTOMAX"]) + assert histMax == pytest.approx( + 41.134323120117, abs=tolerance + ), "STATISTICS_HISTOMAX is wrong." + + assert md["LAYER_TYPE"] == "athematic", "LAYER_TYPE is wrong." - assert md['LAYER_TYPE'] == 'athematic', 'LAYER_TYPE is wrong.' ############################################################################### # Verify we can read band statistics of float.img. @@ -215,19 +241,28 @@ def test_hfa_float_stats_1(): def test_hfa_float_stats_2(): - ds = gdal.Open('data/hfa/float.img') + ds = gdal.Open("data/hfa/float.img") stats = ds.GetRasterBand(1).GetStatistics(False, True) ds = None tolerance = 0.0001 - assert stats[0] == pytest.approx(40.91858291626, abs=tolerance), 'Minimum value is wrong.' + assert stats[0] == pytest.approx( + 40.91858291626, abs=tolerance + ), "Minimum value is wrong." + + assert stats[1] == pytest.approx( + 41.134323120117, abs=tolerance + ), "Maximum value is wrong." - assert stats[1] == pytest.approx(41.134323120117, abs=tolerance), 'Maximum value is wrong.' + assert stats[2] == pytest.approx( + 41.020284249223, abs=tolerance + ), "Mean value is wrong." - assert stats[2] == pytest.approx(41.020284249223, abs=tolerance), 'Mean value is wrong.' + assert stats[3] == pytest.approx( + 0.044636441749041, abs=tolerance + ), "StdDev value is wrong." - assert stats[3] == pytest.approx(0.044636441749041, abs=tolerance), 'StdDev value is wrong.' ############################################################################### # Verify we can read image data. @@ -235,13 +270,14 @@ def test_hfa_float_stats_2(): def test_hfa_int_read(): - ds = gdal.Open('data/hfa/int.img') + ds = gdal.Open("data/hfa/int.img") band = ds.GetRasterBand(1) cs = band.Checksum() band.ReadRaster(100, 100, 1, 1) ds = None - assert cs == 6691, 'Checksum value is wrong.' + assert cs == 6691, "Checksum value is wrong." + ############################################################################### # Verify we can read image data. @@ -249,19 +285,23 @@ def test_hfa_int_read(): def test_hfa_float_read(): - ds = gdal.Open('data/hfa/float.img') + ds = gdal.Open("data/hfa/float.img") band = ds.GetRasterBand(1) cs = band.Checksum() data = band.ReadRaster(100, 100, 1, 1) ds = None - assert cs == 23529, 'Checksum value is wrong.' + assert cs == 23529, "Checksum value is wrong." # Read raw data into tuple of float numbers import struct - value = struct.unpack('f' * 1, data)[0] - assert value == pytest.approx(41.021659851074219, abs=0.0001), 'Pixel value is wrong.' + value = struct.unpack("f" * 1, data)[0] + + assert value == pytest.approx( + 41.021659851074219, abs=0.0001 + ), "Pixel value is wrong." + ############################################################################### # verify we can read PE_STRING coordinate system. @@ -269,11 +309,12 @@ def test_hfa_float_read(): def test_hfa_pe_read(): - ds = gdal.Open('data/hfa/87test.img') + ds = gdal.Open("data/hfa/87test.img") wkt = ds.GetProjectionRef() expected = 'PROJCS["World_Cube",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Cube"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",0],PARAMETER["Option",1],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' - assert wkt == expected, 'failed to read pe string as expected.' + assert wkt == expected, "failed to read pe string as expected." + ############################################################################### # Verify we can write PE_STRING nodes. @@ -281,23 +322,24 @@ def test_hfa_pe_read(): def test_hfa_pe_write(): - drv = gdal.GetDriverByName('HFA') - ds_src = gdal.Open('data/hfa/87test.img') - out_ds = drv.CreateCopy('tmp/87test.img', ds_src) + drv = gdal.GetDriverByName("HFA") + ds_src = gdal.Open("data/hfa/87test.img") + out_ds = drv.CreateCopy("tmp/87test.img", ds_src) del out_ds ds_src = None expected = 'PROJCS["World_Cube",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Cube"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",0],PARAMETER["Option",1],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' - ds = gdal.Open('tmp/87test.img') + ds = gdal.Open("tmp/87test.img") wkt = ds.GetProjectionRef() if wkt != expected: - print('') - pytest.fail('failed to write pe string as expected.') + print("") + pytest.fail("failed to write pe string as expected.") ds = None - drv.Delete('tmp/87test.img') + drv.Delete("tmp/87test.img") + ############################################################################### # Verify we can write and read large metadata items. @@ -305,19 +347,20 @@ def test_hfa_pe_write(): def test_hfa_metadata_1(): - drv = gdal.GetDriverByName('HFA') - ds = drv.Create('tmp/md_1.img', 100, 150, 1, gdal.GDT_Byte) + drv = gdal.GetDriverByName("HFA") + ds = drv.Create("tmp/md_1.img", 100, 150, 1, gdal.GDT_Byte) - md_val = '0123456789' * 60 - md = {'test': md_val} + md_val = "0123456789" * 60 + md = {"test": md_val} ds.GetRasterBand(1).SetMetadata(md) ds = None - ds = gdal.Open('tmp/md_1.img') + ds = gdal.Open("tmp/md_1.img") md = ds.GetRasterBand(1).GetMetadata() - assert md['test'] == md_val, 'got wrong metadata back' + assert md["test"] == md_val, "got wrong metadata back" ds = None + ############################################################################### # Verify that writing metadata multiple times does not result in duplicate # nodes. @@ -325,21 +368,22 @@ def test_hfa_metadata_1(): def test_hfa_metadata_2(): - ds = gdal.Open('tmp/md_1.img', gdal.GA_Update) + ds = gdal.Open("tmp/md_1.img", gdal.GA_Update) md = ds.GetRasterBand(1).GetMetadata() - md['test'] = '0123456789' - md['xxx'] = '123' + md["test"] = "0123456789" + md["xxx"] = "123" ds.GetRasterBand(1).SetMetadata(md) ds = None - ds = gdal.Open('tmp/md_1.img') + ds = gdal.Open("tmp/md_1.img") md = ds.GetRasterBand(1).GetMetadata() - assert 'xxx' in md, 'metadata rewrite seems not to have worked' + assert "xxx" in md, "metadata rewrite seems not to have worked" - assert md['xxx'] == '123' and md['test'] == '0123456789', 'got wrong metadata back' + assert md["xxx"] == "123" and md["test"] == "0123456789", "got wrong metadata back" ds = None - gdal.GetDriverByName('HFA').Delete('tmp/md_1.img') + gdal.GetDriverByName("HFA").Delete("tmp/md_1.img") + ############################################################################### # Verify we can grow the RRD list in cases where this requires @@ -350,22 +394,23 @@ def test_hfa_grow_rrdlist(): import shutil - shutil.copyfile('data/hfa/bug_1109.img', 'tmp/bug_1109.img') + shutil.copyfile("data/hfa/bug_1109.img", "tmp/bug_1109.img") # os.system("copy data\\bug_1109.img tmp") # Add two overview levels. - ds = gdal.Open('tmp/bug_1109.img', gdal.GA_Update) + ds = gdal.Open("tmp/bug_1109.img", gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[4, 8]) ds = None - assert result == 0, 'BuildOverviews failed.' + assert result == 0, "BuildOverviews failed." # Verify overviews are now findable. - ds = gdal.Open('tmp/bug_1109.img') - assert ds.GetRasterBand(1).GetOverviewCount() == 3, 'Overview count wrong.' + ds = gdal.Open("tmp/bug_1109.img") + assert ds.GetRasterBand(1).GetOverviewCount() == 3, "Overview count wrong." ds = None - gdal.GetDriverByName('HFA').Delete('tmp/bug_1109.img') + gdal.GetDriverByName("HFA").Delete("tmp/bug_1109.img") + ############################################################################### # Make sure an old .ige file is deleted when creating a new dataset. (#1784) @@ -375,40 +420,40 @@ def test_hfa_clean_ige(): # Create an imagine file, forcing creation of an .ige file. - drv = gdal.GetDriverByName('HFA') - src_ds = gdal.Open('data/byte.tif') + drv = gdal.GetDriverByName("HFA") + src_ds = gdal.Open("data/byte.tif") - out_ds = drv.CreateCopy('tmp/igetest.img', src_ds, - options=['USE_SPILL=YES']) + out_ds = drv.CreateCopy("tmp/igetest.img", src_ds, options=["USE_SPILL=YES"]) out_ds = None try: - open('tmp/igetest.ige') + open("tmp/igetest.ige") except IOError: - pytest.fail('ige file not created with USE_SPILL=YES') + pytest.fail("ige file not created with USE_SPILL=YES") # confirm ige shows up in file list. - ds = gdal.Open('tmp/igetest.img') + ds = gdal.Open("tmp/igetest.img") filelist = ds.GetFileList() ds = None found = 0 for item in filelist: - if item[-11:] == 'igetest.ige': + if item[-11:] == "igetest.ige": found = 1 if not found: print(filelist) - pytest.fail('no igetest.ige in file list!') + pytest.fail("no igetest.ige in file list!") # Create a file without a spill file, and verify old ige cleaned up. - out_ds = drv.CreateCopy('tmp/igetest.img', src_ds) + out_ds = drv.CreateCopy("tmp/igetest.img", src_ds) del out_ds - assert not os.path.exists('tmp/igetest.ige') + assert not os.path.exists("tmp/igetest.ige") + + drv.Delete("tmp/igetest.img") - drv.Delete('tmp/igetest.img') ############################################################################### # Verify that we can read this corrupt .aux file without hanging (#1907) @@ -419,17 +464,20 @@ def test_hfa_corrupt_aux(): # NOTE: we depend on being able to open .aux files as a weak sort of # dataset. - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/hfa/F0116231.aux') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("data/hfa/F0116231.aux") gdal.PopErrorHandler() - assert ds.RasterXSize == 1104, 'did not get expected dataset characteristics' + assert ds.RasterXSize == 1104, "did not get expected dataset characteristics" - assert gdal.GetLastErrorType() == 2 and gdal.GetLastErrorMsg().find('Corrupt (looping)') != -1, \ - 'Did not get expected warning.' + assert ( + gdal.GetLastErrorType() == 2 + and gdal.GetLastErrorMsg().find("Corrupt (looping)") != -1 + ), "Did not get expected warning." ds = None + ############################################################################### # support MapInformation for units (#1967) @@ -439,8 +487,8 @@ def test_hfa_mapinformation_units(): # NOTE: we depend on being able to open .aux files as a weak sort of # dataset. - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/hfa/fg118-91.aux') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("data/hfa/fg118-91.aux") gdal.PopErrorHandler() wkt = ds.GetProjectionRef() @@ -450,54 +498,60 @@ def test_hfa_mapinformation_units(): return pytest.fail() + ############################################################################### # Write nodata value. def test_hfa_nodata_write(): - drv = gdal.GetDriverByName('HFA') - ds = drv.Create('tmp/nodata.img', 7, 7, 1, gdal.GDT_Byte) + drv = gdal.GetDriverByName("HFA") + ds = drv.Create("tmp/nodata.img", 7, 7, 1, gdal.GDT_Byte) p = [1, 2, 1, 4, 1, 2, 1] - raw_data = b''.join(struct.pack('h', x) for x in p) + raw_data = b"".join(struct.pack("h", x) for x in p) for line in range(7): - ds.WriteRaster(0, line, 7, 1, raw_data, - buf_type=gdal.GDT_Int16) + ds.WriteRaster(0, line, 7, 1, raw_data, buf_type=gdal.GDT_Int16) b = ds.GetRasterBand(1) b.SetNoDataValue(1) ds = None + ############################################################################### # Verify written nodata value. def test_hfa_nodata_read(): - ds = gdal.Open('tmp/nodata.img') + ds = gdal.Open("tmp/nodata.img") b = ds.GetRasterBand(1) - assert b.GetNoDataValue() == 1, 'failed to preserve nodata value' + assert b.GetNoDataValue() == 1, "failed to preserve nodata value" stats = b.GetStatistics(False, True) tolerance = 0.0001 - assert stats[0] == pytest.approx(2, abs=tolerance), 'Minimum value is wrong.' + assert stats[0] == pytest.approx(2, abs=tolerance), "Minimum value is wrong." - assert stats[1] == pytest.approx(4, abs=tolerance), 'Maximum value is wrong.' + assert stats[1] == pytest.approx(4, abs=tolerance), "Maximum value is wrong." - assert stats[2] == pytest.approx(2.6666666666667, abs=tolerance), 'Mean value is wrong.' + assert stats[2] == pytest.approx( + 2.6666666666667, abs=tolerance + ), "Mean value is wrong." - assert stats[3] == pytest.approx(0.94280904158206, abs=tolerance), 'StdDev value is wrong.' + assert stats[3] == pytest.approx( + 0.94280904158206, abs=tolerance + ), "StdDev value is wrong." b = None ds = None - gdal.GetDriverByName('HFA').Delete('tmp/nodata.img') + gdal.GetDriverByName("HFA").Delete("tmp/nodata.img") + ############################################################################### # Verify we read simple affine geotransforms properly. @@ -505,23 +559,30 @@ def test_hfa_nodata_read(): def test_hfa_rotated_read(): - ds = gdal.Open('data/hfa/fg118-91.aux') + ds = gdal.Open("data/hfa/fg118-91.aux") - check_gt = (11856857.07898215, 0.895867662235625, 0.02684252936279331, - 7041861.472946444, 0.01962103617166367, -0.9007880319529181) + check_gt = ( + 11856857.07898215, + 0.895867662235625, + 0.02684252936279331, + 7041861.472946444, + 0.01962103617166367, + -0.9007880319529181, + ) gt_epsilon = (abs(check_gt[1]) + abs(check_gt[2])) / 100.0 new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=gt_epsilon): - print('') - print('old = ', check_gt) - print('new = ', new_gt) - pytest.fail('Geotransform differs.') + print("") + print("old = ", check_gt) + print("new = ", new_gt) + pytest.fail("Geotransform differs.") ds = None + ############################################################################### # Verify we can write affine geotransforms. @@ -530,15 +591,21 @@ def test_hfa_rotated_write(): # make sure we aren't preserving info in .aux.xml file try: - os.remove('tmp/rot.img.aux.xml') + os.remove("tmp/rot.img.aux.xml") except OSError: pass - drv = gdal.GetDriverByName('HFA') - ds = drv.Create('tmp/rot.img', 100, 150, 1, gdal.GDT_Byte) + drv = gdal.GetDriverByName("HFA") + ds = drv.Create("tmp/rot.img", 100, 150, 1, gdal.GDT_Byte) - check_gt = (11856857.07898215, 0.895867662235625, 0.02684252936279331, - 7041861.472946444, 0.01962103617166367, -0.9007880319529181) + check_gt = ( + 11856857.07898215, + 0.895867662235625, + 0.02684252936279331, + 7041861.472946444, + 0.01962103617166367, + -0.9007880319529181, + ) expected_wkt = """PROJCS["NAD83 / Virginia North", GEOGCS["NAD83", @@ -571,34 +638,36 @@ def test_hfa_rotated_write(): ds = None - ds = gdal.Open('tmp/rot.img') + ds = gdal.Open("tmp/rot.img") gt_epsilon = (abs(check_gt[1]) + abs(check_gt[2])) / 100.0 new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=gt_epsilon): - print('') - print('old = ', check_gt) - print('new = ', new_gt) - pytest.fail('Geotransform differs.') + print("") + print("old = ", check_gt) + print("new = ", new_gt) + pytest.fail("Geotransform differs.") wkt = ds.GetProjection() assert gdaltest.equal_srs_from_wkt(expected_wkt, wkt) ds = None - gdal.GetDriverByName('HFA').Delete('tmp/rot.img') + gdal.GetDriverByName("HFA").Delete("tmp/rot.img") ############################################################################### # Test creating an in memory copy. + def test_hfa_vsimem(): - tst = gdaltest.GDALTest('HFA', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("HFA", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test that PROJCS[] names are preserved as the mapinfo.proName in # the .img file. (#2422) @@ -606,32 +675,32 @@ def test_hfa_vsimem(): def test_hfa_proName(): - drv = gdal.GetDriverByName('HFA') - src_ds = gdal.Open('data/hfa/stateplane.vrt') - dst_ds = drv.CreateCopy('tmp/proname.img', src_ds) + drv = gdal.GetDriverByName("HFA") + src_ds = gdal.Open("data/hfa/stateplane.vrt") + dst_ds = drv.CreateCopy("tmp/proname.img", src_ds) del dst_ds src_ds = None # Make sure we don't have interference from an .aux.xml try: - os.remove('tmp/proname.img.aux.xml') + os.remove("tmp/proname.img.aux.xml") except OSError: pass - ds = gdal.Open('tmp/proname.img') + ds = gdal.Open("tmp/proname.img") srs = ds.GetProjectionRef() if srs.find('PROJCS["NAD83 / Ohio South (ftUS)",') != 0: - gdaltest.post_reason('did not get expected PROJCS name.') + gdaltest.post_reason("did not get expected PROJCS name.") print(srs) - result = 'fail' + result = "fail" else: - result = 'success' + result = "success" ds = None - drv.Delete('tmp/proname.img') + drv.Delete("tmp/proname.img") return result @@ -639,42 +708,48 @@ def test_hfa_proName(): ############################################################################### # Read a compressed file where no block has been written (#2523) + def test_hfa_read_empty_compressed(): - drv = gdal.GetDriverByName('HFA') - ds = drv.Create('tmp/emptycompressed.img', 64, 64, 1, options=['COMPRESSED=YES']) + drv = gdal.GetDriverByName("HFA") + ds = drv.Create("tmp/emptycompressed.img", 64, 64, 1, options=["COMPRESSED=YES"]) ds = None - ds = gdal.Open('tmp/emptycompressed.img') + ds = gdal.Open("tmp/emptycompressed.img") if ds.GetRasterBand(1).Checksum() != 0: - result = 'fail' + result = "fail" else: - result = 'success' + result = "success" ds = None - drv.Delete('tmp/emptycompressed.img') + drv.Delete("tmp/emptycompressed.img") return result + ############################################################################### # Verify "unique values" based color table (#2419) def test_hfa_unique_values_color_table(): - ds = gdal.Open('data/hfa/i8u_c_i.img') + ds = gdal.Open("data/hfa/i8u_c_i.img") ct = ds.GetRasterBand(1).GetRasterColorTable() - assert ct.GetCount() == 256, 'got wrong color count' + assert ct.GetCount() == 256, "got wrong color count" - assert ct.GetColorEntry(253) == (0, 0, 0, 0) and ct.GetColorEntry(254) == (255, 255, 170, 255) and ct.GetColorEntry(255) == (255, 255, 255, 255), \ - 'Got wrong colors' + assert ( + ct.GetColorEntry(253) == (0, 0, 0, 0) + and ct.GetColorEntry(254) == (255, 255, 170, 255) + and ct.GetColorEntry(255) == (255, 255, 255, 255) + ), "Got wrong colors" ct = None ds = None + ############################################################################### # Verify "unique values" based histogram. @@ -686,82 +761,97 @@ def test_hfa_unique_values_hist(): except: pytest.skip() - ds = gdal.Open('data/hfa/i8u_c_i.img') + ds = gdal.Open("data/hfa/i8u_c_i.img") md = ds.GetRasterBand(1).GetMetadata() - expected = '12603|1|0|0|45|1|0|0|0|0|656|177|0|0|5026|1062|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|75|1|0|0|207|158|0|0|8|34|0|0|0|0|538|57|0|10|214|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|31|0|0|9|625|67|0|0|118|738|117|3004|1499|491|187|1272|513|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|3|0|0|283|123|5|1931|835|357|332|944|451|80|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|5|0|0|535|1029|118|0|33|246|342|0|0|10|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|439|0|0|6|990|329|0|0|120|295|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|42|0|0|570|966|0|0|18|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|106|0|0|16|16517|' - assert md['STATISTICS_HISTOBINVALUES'] == expected, 'Unexpected HISTOBINVALUES.' + expected = "12603|1|0|0|45|1|0|0|0|0|656|177|0|0|5026|1062|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|75|1|0|0|207|158|0|0|8|34|0|0|0|0|538|57|0|10|214|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|31|0|0|9|625|67|0|0|118|738|117|3004|1499|491|187|1272|513|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|3|0|0|283|123|5|1931|835|357|332|944|451|80|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|5|0|0|535|1029|118|0|33|246|342|0|0|10|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|439|0|0|6|990|329|0|0|120|295|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|42|0|0|570|966|0|0|18|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|106|0|0|16|16517|" + assert md["STATISTICS_HISTOBINVALUES"] == expected, "Unexpected HISTOBINVALUES." - assert md['STATISTICS_HISTOMIN'] == '0' and md['STATISTICS_HISTOMAX'] == '255', \ - "unexpected histomin/histomax value." + assert ( + md["STATISTICS_HISTOMIN"] == "0" and md["STATISTICS_HISTOMAX"] == "255" + ), "unexpected histomin/histomax value." # lets also check the RAT to ensure it has the BinValues column added. rat = ds.GetRasterBand(1).GetDefaultRAT() - assert rat.GetColumnCount() == 6 and rat.GetTypeOfCol(0) == gdal.GFT_Real and rat.GetUsageOfCol(0) == gdal.GFU_MinMax, \ - 'BinValues column wrong.' + assert ( + rat.GetColumnCount() == 6 + and rat.GetTypeOfCol(0) == gdal.GFT_Real + and rat.GetUsageOfCol(0) == gdal.GFU_MinMax + ), "BinValues column wrong." - assert rat.GetValueAsInt(2, 0) == 4, 'BinValues value wrong.' + assert rat.GetValueAsInt(2, 0) == 4, "BinValues value wrong." rat = None ds = None + ############################################################################### # Verify reading of 3rd order XFORM polynomials. def test_hfa_xforms_3rd(): - ds = gdal.Open('data/hfa/42BW_420730_VT2.aux') + ds = gdal.Open("data/hfa/42BW_420730_VT2.aux") check_list = [ - ('XFORM_STEPS', 2), - ('XFORM0_POLYCOEFMTX[3]', -0.151286406053458), - ('XFORM0_POLYCOEFVECTOR[1]', 401692.559078924), - ('XFORM1_ORDER', 3), - ('XFORM1_FWD_POLYCOEFMTX[0]', -0.560405515080768), - ('XFORM1_FWD_POLYCOEFMTX[17]', -1.01593898110617e-08), - ('XFORM1_REV_POLYCOEFMTX[17]', 4.01319402177037e-09), - ('XFORM1_REV_POLYCOEFVECTOR[0]', 2605.41812438735)] - - xform_md = ds.GetMetadata('XFORMS') + ("XFORM_STEPS", 2), + ("XFORM0_POLYCOEFMTX[3]", -0.151286406053458), + ("XFORM0_POLYCOEFVECTOR[1]", 401692.559078924), + ("XFORM1_ORDER", 3), + ("XFORM1_FWD_POLYCOEFMTX[0]", -0.560405515080768), + ("XFORM1_FWD_POLYCOEFMTX[17]", -1.01593898110617e-08), + ("XFORM1_REV_POLYCOEFMTX[17]", 4.01319402177037e-09), + ("XFORM1_REV_POLYCOEFVECTOR[0]", 2605.41812438735), + ] + + xform_md = ds.GetMetadata("XFORMS") for check_item in check_list: try: value = float(xform_md[check_item[0]]) except (TypeError, ValueError): - pytest.fail('metadata item %d missing' % check_item[0]) + pytest.fail("metadata item %d missing" % check_item[0]) - assert value == pytest.approx(check_item[1], abs=abs(value / 100000.0)), \ - ('metadata item %s has wrong value: %.15g' % - (check_item[0], value)) + assert value == pytest.approx( + check_item[1], abs=abs(value / 100000.0) + ), "metadata item %s has wrong value: %.15g" % (check_item[0], value) # Check that the GCPs are as expected implying that the evaluation # function for XFORMs if working ok. gcps = ds.GetGCPs() - assert gcps[0].GCPPixel == 0.5 and gcps[0].GCPLine == 0.5 and gcps[0].GCPX == pytest.approx(1667635.007, abs=0.001) and gcps[0].GCPY == pytest.approx(2620003.171, abs=0.001), \ - 'GCP 0 value wrong.' + assert ( + gcps[0].GCPPixel == 0.5 + and gcps[0].GCPLine == 0.5 + and gcps[0].GCPX == pytest.approx(1667635.007, abs=0.001) + and gcps[0].GCPY == pytest.approx(2620003.171, abs=0.001) + ), "GCP 0 value wrong." - assert gcps[14].GCPPixel == pytest.approx(1769.7, abs=0.1) and gcps[14].GCPLine == pytest.approx(2124.9, abs=0.1) and gcps[14].GCPX == pytest.approx(1665221.064, abs=0.001) and gcps[14].GCPY == pytest.approx(2632414.379, abs=0.001), \ - 'GCP 14 value wrong.' + assert ( + gcps[14].GCPPixel == pytest.approx(1769.7, abs=0.1) + and gcps[14].GCPLine == pytest.approx(2124.9, abs=0.1) + and gcps[14].GCPX == pytest.approx(1665221.064, abs=0.001) + and gcps[14].GCPY == pytest.approx(2632414.379, abs=0.001) + ), "GCP 14 value wrong." ds = None + ############################################################################### # Verify that we can clear an existing color table def test_hfa_delete_colortable(): # copy a file to tmp dir to modify. - open('tmp/i8u.img', 'wb').write(open('data/hfa/i8u_c_i.img', 'rb').read()) + open("tmp/i8u.img", "wb").write(open("data/hfa/i8u_c_i.img", "rb").read()) # clear color table. - ds = gdal.Open('tmp/i8u.img', gdal.GA_Update) + ds = gdal.Open("tmp/i8u.img", gdal.GA_Update) try: ds.GetRasterBand(1).SetColorTable @@ -770,19 +860,20 @@ def test_hfa_delete_colortable(): # SetRasterColorTable, it doesn't work either as None isn't a valid # value for them ds = None - gdal.GetDriverByName('HFA').Delete('tmp/i8u.img') + gdal.GetDriverByName("HFA").Delete("tmp/i8u.img") pytest.skip() ds.GetRasterBand(1).SetColorTable(None) ds = None # check color table gone. - ds = gdal.Open('tmp/i8u.img') - assert ds.GetRasterBand(1).GetColorTable() is None, 'failed to remove color table' + ds = gdal.Open("tmp/i8u.img") + assert ds.GetRasterBand(1).GetColorTable() is None, "failed to remove color table" ds = None - gdal.GetDriverByName('HFA').Delete('tmp/i8u.img') + gdal.GetDriverByName("HFA").Delete("tmp/i8u.img") + ############################################################################### # Verify that we can clear an existing color table (#2842) @@ -791,13 +882,15 @@ def test_hfa_delete_colortable(): def test_hfa_delete_colortable2(): # copy a file to tmp dir to modify. - src_ds = gdal.Open('../gcore/data/8bit_pal.bmp') - ds = gdal.GetDriverByName('HFA').CreateCopy('tmp/hfa_delete_colortable2.img', src_ds) + src_ds = gdal.Open("../gcore/data/8bit_pal.bmp") + ds = gdal.GetDriverByName("HFA").CreateCopy( + "tmp/hfa_delete_colortable2.img", src_ds + ) src_ds = None ds = None # clear color table. - ds = gdal.Open('tmp/hfa_delete_colortable2.img', gdal.GA_Update) + ds = gdal.Open("tmp/hfa_delete_colortable2.img", gdal.GA_Update) try: ds.GetRasterBand(1).SetColorTable @@ -806,19 +899,20 @@ def test_hfa_delete_colortable2(): # SetRasterColorTable, it doesn't work either as None isn't a valid # value for them ds = None - gdal.GetDriverByName('HFA').Delete('tmp/hfa_delete_colortable2.img') + gdal.GetDriverByName("HFA").Delete("tmp/hfa_delete_colortable2.img") pytest.skip() ds.GetRasterBand(1).SetColorTable(None) ds = None # check color table gone. - ds = gdal.Open('tmp/hfa_delete_colortable2.img') - assert ds.GetRasterBand(1).GetColorTable() is None, 'failed to remove color table' + ds = gdal.Open("tmp/hfa_delete_colortable2.img") + assert ds.GetRasterBand(1).GetColorTable() is None, "failed to remove color table" ds = None - gdal.GetDriverByName('HFA').Delete('tmp/hfa_delete_colortable2.img') + gdal.GetDriverByName("HFA").Delete("tmp/hfa_delete_colortable2.img") + ############################################################################### # Verify we can read the special histogram metadata from a provided image. @@ -826,12 +920,14 @@ def test_hfa_delete_colortable2(): def test_hfa_excluded_values(): - ds = gdal.Open('data/hfa/dem10.img') + ds = gdal.Open("data/hfa/dem10.img") md = ds.GetRasterBand(1).GetMetadata() ds = None - assert md['STATISTICS_EXCLUDEDVALUES'] == '0,8,9', \ - 'STATISTICS_EXCLUDEDVALUE is wrong.' + assert ( + md["STATISTICS_EXCLUDEDVALUES"] == "0,8,9" + ), "STATISTICS_EXCLUDEDVALUE is wrong." + ############################################################################### # verify that we propagate nodata to overviews in .hfa/.rrd format. @@ -839,34 +935,36 @@ def test_hfa_excluded_values(): def test_hfa_ov_nodata(): - drv = gdal.GetDriverByName('HFA') - src_ds = gdal.Open('data/aaigrid/nodata_int.asc') - wrk_ds = drv.CreateCopy('/vsimem/ov_nodata.img', src_ds) + drv = gdal.GetDriverByName("HFA") + src_ds = gdal.Open("data/aaigrid/nodata_int.asc") + wrk_ds = drv.CreateCopy("/vsimem/ov_nodata.img", src_ds) src_ds = None wrk_ds.BuildOverviews(overviewlist=[2]) wrk_ds = None - wrk2_ds = gdal.Open('/vsimem/ov_nodata.img') + wrk2_ds = gdal.Open("/vsimem/ov_nodata.img") ovb = wrk2_ds.GetRasterBand(1).GetOverview(0) - assert ovb.GetNoDataValue() == -99999, 'nodata not propagated to .img overview.' + assert ovb.GetNoDataValue() == -99999, "nodata not propagated to .img overview." - assert ovb.GetMaskFlags() == gdal.GMF_NODATA, 'mask flag not as expected.' + assert ovb.GetMaskFlags() == gdal.GMF_NODATA, "mask flag not as expected." # Confirm that a .ovr file was *not* produced. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") try: - wrk3_ds = gdal.Open('/vsimem/ov_nodata.img.ovr') + wrk3_ds = gdal.Open("/vsimem/ov_nodata.img.ovr") except: wrk3_ds = None gdal.PopErrorHandler() - assert wrk3_ds is None, \ - 'this test result is invalid since .ovr file was created, why?' + assert ( + wrk3_ds is None + ), "this test result is invalid since .ovr file was created, why?" wrk2_ds = None - drv.Delete('/vsimem/ov_nodata.img') + drv.Delete("/vsimem/ov_nodata.img") + ############################################################################### # Confirm that we can read 8bit grayscale overviews for 1bit images. @@ -874,15 +972,17 @@ def test_hfa_ov_nodata(): def test_hfa_read_bit2grayscale(): - ds = gdal.Open('data/hfa/small1bit.img') + ds = gdal.Open("data/hfa/small1bit.img") band = ds.GetRasterBand(1) ov = band.GetOverview(0) - assert ov.Checksum() == 4247, 'did not get expected overview checksum' + assert ov.Checksum() == 4247, "did not get expected overview checksum" ds_md = ds.GetMetadata() - assert ds_md['PyramidResamplingType'] == 'AVERAGE_BIT2GRAYSCALE', \ - 'wrong pyramid resampling type metadata.' + assert ( + ds_md["PyramidResamplingType"] == "AVERAGE_BIT2GRAYSCALE" + ), "wrong pyramid resampling type metadata." + ############################################################################### # Confirm that we can create overviews in rrd format for an .img file with @@ -893,29 +993,29 @@ def test_hfa_write_bit2grayscale(): import shutil - shutil.copyfile('data/hfa/small1bit.img', 'tmp/small1bit.img') - shutil.copyfile('data/hfa/small1bit.rrd', 'tmp/small1bit.rrd') + shutil.copyfile("data/hfa/small1bit.img", "tmp/small1bit.img") + shutil.copyfile("data/hfa/small1bit.rrd", "tmp/small1bit.rrd") - gdal.SetConfigOption('USE_RRD', 'YES') - gdal.SetConfigOption('HFA_USE_RRD', 'YES') + gdal.SetConfigOption("USE_RRD", "YES") + gdal.SetConfigOption("HFA_USE_RRD", "YES") - ds = gdal.Open('tmp/small1bit.img', gdal.GA_Update) - ds.BuildOverviews(resampling='average_bit2grayscale', - overviewlist=[2]) + ds = gdal.Open("tmp/small1bit.img", gdal.GA_Update) + ds.BuildOverviews(resampling="average_bit2grayscale", overviewlist=[2]) ov = ds.GetRasterBand(1).GetOverview(1) - assert ov.Checksum() == 57325, 'wrong checksum for greyscale overview.' + assert ov.Checksum() == 57325, "wrong checksum for greyscale overview." ds = None - gdal.GetDriverByName('HFA').Delete('tmp/small1bit.img') + gdal.GetDriverByName("HFA").Delete("tmp/small1bit.img") - gdal.SetConfigOption('USE_RRD', 'NO') - gdal.SetConfigOption('HFA_USE_RRD', 'NO') + gdal.SetConfigOption("USE_RRD", "NO") + gdal.SetConfigOption("HFA_USE_RRD", "NO") # as an aside, confirm the .rrd file was deleted. - assert not os.path.exists('tmp/small1bit.rrd') + assert not os.path.exists("tmp/small1bit.rrd") + ############################################################################### # Verify handling of camera model metadata (#2675) @@ -923,33 +1023,38 @@ def test_hfa_write_bit2grayscale(): def test_hfa_camera_md(): - ds = gdal.Open('/vsisparse/data/hfa/251_sparse.xml') + ds = gdal.Open("/vsisparse/data/hfa/251_sparse.xml") - md = ds.GetMetadata('CAMERA_MODEL') + md = ds.GetMetadata("CAMERA_MODEL") - check_list = [('direction', 'EMOD_FORWARD'), - ('forSrcAffine[0]', '0.025004093931786'), - ('invDstAffine[0]', '1'), - ('coeffs[1]', '-0.008'), - ('elevationType', 'EPRJ_ELEVATION_TYPE_HEIGHT')] + check_list = [ + ("direction", "EMOD_FORWARD"), + ("forSrcAffine[0]", "0.025004093931786"), + ("invDstAffine[0]", "1"), + ("coeffs[1]", "-0.008"), + ("elevationType", "EPRJ_ELEVATION_TYPE_HEIGHT"), + ] for check_item in check_list: try: value = md[check_item[0]] except IndexError: - pytest.fail('metadata item %d missing' % check_item[0]) + pytest.fail("metadata item %d missing" % check_item[0]) - assert value == check_item[1], ('metadata item %s has wrong value: %s' % - (check_item[0], value)) + assert value == check_item[1], "metadata item %s has wrong value: %s" % ( + check_item[0], + value, + ) # Check that the SRS is reasonable. - srs_wkt = md['outputProjection'] + srs_wkt = md["outputProjection"] exp_wkt = 'PROJCS["UTM Zone 17, Northern Hemisphere",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],TOWGS84[-10,158,187,0,0,0,0],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-81],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1],AUTHORITY["EPSG","26717"]]' - assert gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt), 'wrong outputProjection' + assert gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt), "wrong outputProjection" ds = None + ############################################################################### # Verify dataset's projection matches expected @@ -958,61 +1063,75 @@ def hfa_verify_dataset_projection(dataset_path, exp_wkt): ds = gdal.Open(dataset_path) srs_wkt = ds.GetProjectionRef() - assert gdaltest.equal_srs_from_wkt(exp_wkt, srs_wkt), 'wrong outputProjection' + assert gdaltest.equal_srs_from_wkt(exp_wkt, srs_wkt), "wrong outputProjection" ds = None + ############################################################################### # Verify can read Transverse Mercator (South Orientated) projections def test_hfa_read_tmso_projection(): exp_wkt = 'PROJCS["Transverse Mercator (South Orientated)",GEOGCS["Cape-1",DATUM["Cape-1",SPHEROID["Clarke 1880 Arc",6378249.145,293.4663077168331],TOWGS84[-136,-108,-292,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",21],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1]]' - return hfa_verify_dataset_projection('../gcore/data/22281.aux', exp_wkt) + return hfa_verify_dataset_projection("../gcore/data/22281.aux", exp_wkt) + ############################################################################### # Verify can write Transverse Mercator (South Orientated) projections to aux files def test_hfa_write_tmso_projection(): - dataset_path = 'tmp/tmso.img' - out_ds = gdal.GetDriverByName('HFA').Create(dataset_path, 1, 1) + dataset_path = "tmp/tmso.img" + out_ds = gdal.GetDriverByName("HFA").Create(dataset_path, 1, 1) gt = (0, 1, 0, 0, 0, 1) out_ds.SetGeoTransform(gt) - out_ds.SetProjection('PROJCS["Hartebeesthoek94 / Lo15",GEOGCS["Hartebeesthoek94",DATUM["Hartebeesthoek94",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6148"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4148"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","2046"],AXIS["Y",WEST],AXIS["X",SOUTH]]') + out_ds.SetProjection( + 'PROJCS["Hartebeesthoek94 / Lo15",GEOGCS["Hartebeesthoek94",DATUM["Hartebeesthoek94",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6148"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4148"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","2046"],AXIS["Y",WEST],AXIS["X",SOUTH]]' + ) out_ds = None exp_wkt = 'PROJCS["Hartebeesthoek94 / Lo15",GEOGCS["Hartebeesthoek94",DATUM["Hartebeesthoek94",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6148"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4148"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","2046"],AXIS["Y",WEST],AXIS["X",SOUTH]]' ret = hfa_verify_dataset_projection(dataset_path, exp_wkt) - gdal.GetDriverByName('HFA').Delete(dataset_path) + gdal.GetDriverByName("HFA").Delete(dataset_path) return ret + ############################################################################### # Verify can read Hotine Oblique Mercator (Variant A) projections def test_hfa_read_homva_projection(): exp_wkt = 'PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM 2000",DATUM["Geodetic_Datum_of_Malaysia_2000",SPHEROID["GRS 1980",6378137,298.257222096042],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.1301023611111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' - ds = gdal.Open('../gcore/data/3376.tif') + ds = gdal.Open("../gcore/data/3376.tif") srs_wkt = ds.GetProjectionRef() - assert gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt, verbose=False) or \ - gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt.replace('Geodetic_Datum_of_Malaysia_2000', 'GDM 2000'), verbose=False), srs_wkt + assert gdaltest.equal_srs_from_wkt( + srs_wkt, exp_wkt, verbose=False + ) or gdaltest.equal_srs_from_wkt( + srs_wkt, + exp_wkt.replace("Geodetic_Datum_of_Malaysia_2000", "GDM 2000"), + verbose=False, + ), srs_wkt + ############################################################################### # Verify can write Hotine Oblique Mercator (Variant A) projections to aux files def test_hfa_write_homva_projection(): - dataset_path = 'tmp/homva.img' - out_ds = gdal.GetDriverByName('HFA').Create(dataset_path, 1, 1) + dataset_path = "tmp/homva.img" + out_ds = gdal.GetDriverByName("HFA").Create(dataset_path, 1, 1) gt = (0, 1, 0, 0, 0, 1) out_ds.SetGeoTransform(gt) - out_ds.SetProjection('PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM 2000",DATUM["GDM_2000",SPHEROID["GRS 1980",6378137,298.2572220960422],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.13010236111111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1]]') + out_ds.SetProjection( + 'PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM 2000",DATUM["GDM_2000",SPHEROID["GRS 1980",6378137,298.2572220960422],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.13010236111111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1]]' + ) out_ds = None exp_wkt = 'PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM_2000",DATUM["GDM_2000",SPHEROID["GRS 1980",6378137,298.257222096042],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.1301023611111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ret = hfa_verify_dataset_projection(dataset_path, exp_wkt) - gdal.GetDriverByName('HFA').Delete(dataset_path) + gdal.GetDriverByName("HFA").Delete(dataset_path) return ret + ############################################################################### # Check that overviews with an .rde file are properly supported in file list, # and fetching actual overviews. @@ -1022,24 +1141,30 @@ def test_hfa_rde_overviews(): # Create an imagine file, forcing creation of an .ige file. - ds = gdal.Open('data/hfa/spill.img') + ds = gdal.Open("data/hfa/spill.img") exp_cs = 1631 cs = ds.GetRasterBand(1).Checksum() - assert exp_cs == cs, 'did not get expected band checksum' + assert exp_cs == cs, "did not get expected band checksum" exp_cs = 340 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert exp_cs == cs, 'did not get expected overview checksum' + assert exp_cs == cs, "did not get expected overview checksum" filelist = ds.GetFileList() - exp_filelist = ['data/hfa/spill.img', 'data/hfa/spill.ige', 'data/hfa/spill.rrd', 'data/hfa/spill.rde'] - assert [x.replace('\\', '/') for x in filelist] == exp_filelist + exp_filelist = [ + "data/hfa/spill.img", + "data/hfa/spill.ige", + "data/hfa/spill.rrd", + "data/hfa/spill.rde", + ] + assert [x.replace("\\", "/") for x in filelist] == exp_filelist ds = None + ############################################################################### # Check that we can copy and rename a complex file set, and that the internal filenames # in the .img and .rrd seem to be updated properly. @@ -1047,54 +1172,66 @@ def test_hfa_rde_overviews(): def test_hfa_copyfiles(): - drv = gdal.GetDriverByName('HFA') - drv.CopyFiles('tmp/newnamexxx_after_copy.img', 'data/hfa/spill.img') + drv = gdal.GetDriverByName("HFA") + drv.CopyFiles("tmp/newnamexxx_after_copy.img", "data/hfa/spill.img") - drv.Rename('tmp/newnamexxx.img', 'tmp/newnamexxx_after_copy.img') + drv.Rename("tmp/newnamexxx.img", "tmp/newnamexxx_after_copy.img") - ds = gdal.Open('tmp/newnamexxx.img') + ds = gdal.Open("tmp/newnamexxx.img") exp_cs = 340 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert exp_cs == cs, 'did not get expected overview checksum' + assert exp_cs == cs, "did not get expected overview checksum" filelist = ds.GetFileList() - exp_filelist = ['tmp/newnamexxx.img', 'tmp/newnamexxx.ige', 'tmp/newnamexxx.rrd', 'tmp/newnamexxx.rde'] - exp_filelist_win32 = ['tmp/newnamexxx.img', 'tmp\\newnamexxx.ige', 'tmp\\newnamexxx.rrd', 'tmp\\newnamexxx.rde'] - assert filelist == exp_filelist or filelist == exp_filelist_win32, \ - 'did not get expected file list.' + exp_filelist = [ + "tmp/newnamexxx.img", + "tmp/newnamexxx.ige", + "tmp/newnamexxx.rrd", + "tmp/newnamexxx.rde", + ] + exp_filelist_win32 = [ + "tmp/newnamexxx.img", + "tmp\\newnamexxx.ige", + "tmp\\newnamexxx.rrd", + "tmp\\newnamexxx.rde", + ] + assert ( + filelist == exp_filelist or filelist == exp_filelist_win32 + ), "did not get expected file list." ds = None # Check that the filenames in the actual files seem to have been updated. - img = open('tmp/newnamexxx.img', 'rb').read() + img = open("tmp/newnamexxx.img", "rb").read() img = str(img) - assert img.find('newnamexxx.rrd') != -1, 'RRDNames not updated?' + assert img.find("newnamexxx.rrd") != -1, "RRDNames not updated?" - assert img.find('newnamexxx.ige') != -1, 'spill file not updated?' + assert img.find("newnamexxx.ige") != -1, "spill file not updated?" - rrd = open('tmp/newnamexxx.rrd', 'rb').read() + rrd = open("tmp/newnamexxx.rrd", "rb").read() rrd = str(rrd) - assert rrd.find('newnamexxx.img') != -1, 'DependentFile not updated?' + assert rrd.find("newnamexxx.img") != -1, "DependentFile not updated?" - assert rrd.find('newnamexxx.rde') != -1, 'overview spill file not updated?' + assert rrd.find("newnamexxx.rde") != -1, "overview spill file not updated?" - drv.Delete('tmp/newnamexxx.img') + drv.Delete("tmp/newnamexxx.img") ############################################################################### # Test the ability to write a RAT (#999) + def test_hfa_write_rat(): - drv = gdal.GetDriverByName('HFA') + drv = gdal.GetDriverByName("HFA") - src_ds = gdal.Open('data/hfa/i8u_c_i.img') + src_ds = gdal.Open("data/hfa/i8u_c_i.img") rat = src_ds.GetRasterBand(1).GetDefaultRAT() - dst_ds = drv.Create('tmp/write_rat.img', 100, 100, 1, gdal.GDT_Byte) + dst_ds = drv.Create("tmp/write_rat.img", 100, 100, 1, gdal.GDT_Byte) dst_ds.GetRasterBand(1).SetDefaultRAT(rat) @@ -1103,20 +1240,24 @@ def test_hfa_write_rat(): rat = None - ds = gdal.Open('tmp/write_rat.img') + ds = gdal.Open("tmp/write_rat.img") rat = ds.GetRasterBand(1).GetDefaultRAT() - assert rat.GetColumnCount() == 6 and rat.GetTypeOfCol(0) == gdal.GFT_Real and rat.GetUsageOfCol(0) == gdal.GFU_Generic, \ - 'BinValues column wrong.' + assert ( + rat.GetColumnCount() == 6 + and rat.GetTypeOfCol(0) == gdal.GFT_Real + and rat.GetUsageOfCol(0) == gdal.GFU_Generic + ), "BinValues column wrong." - assert rat.GetValueAsInt(2, 0) == 4, 'BinValues value wrong.' + assert rat.GetValueAsInt(2, 0) == 4, "BinValues value wrong." - assert rat.GetValueAsInt(4, 5) == 656, 'Histogram value wrong.' + assert rat.GetValueAsInt(4, 5) == 656, "Histogram value wrong." rat = None ds = None - drv.Delete('tmp/write_rat.img') + drv.Delete("tmp/write_rat.img") + ############################################################################### # Test STATISTICS creation option @@ -1124,27 +1265,30 @@ def test_hfa_write_rat(): def test_hfa_createcopy_statistics(): - tmpAuxXml = '../gcore/data/byte.tif.aux.xml' + tmpAuxXml = "../gcore/data/byte.tif.aux.xml" try: os.remove(tmpAuxXml) except OSError: pass - ds_src = gdal.Open('../gcore/data/byte.tif') - out_ds = gdal.GetDriverByName('HFA').CreateCopy('/vsimem/byte.img', ds_src, options=['STATISTICS=YES']) + ds_src = gdal.Open("../gcore/data/byte.tif") + out_ds = gdal.GetDriverByName("HFA").CreateCopy( + "/vsimem/byte.img", ds_src, options=["STATISTICS=YES"] + ) del out_ds ds_src = None if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) - gdal.Unlink('/vsimem/byte.img.aux.xml') + gdal.Unlink("/vsimem/byte.img.aux.xml") - ds = gdal.Open('/vsimem/byte.img') + ds = gdal.Open("/vsimem/byte.img") md = ds.GetRasterBand(1).GetMetadata() ds = None - gdal.GetDriverByName('HFA').Delete('/vsimem/byte.img') + gdal.GetDriverByName("HFA").Delete("/vsimem/byte.img") + + assert md["STATISTICS_MINIMUM"] == "74", "STATISTICS_MINIMUM is wrong." - assert md['STATISTICS_MINIMUM'] == '74', 'STATISTICS_MINIMUM is wrong.' ############################################################################### # Test GetUnitType() @@ -1152,23 +1296,21 @@ def test_hfa_createcopy_statistics(): def test_hfa_read_elevation_units(): - ds = gdal.Open('../gcore/data/erdas_cm.img') + ds = gdal.Open("../gcore/data/erdas_cm.img") unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == 'cm', 'Failed to read elevation units' + assert unittype == "cm", "Failed to read elevation units" ds = None - ds = gdal.Open('../gcore/data/erdas_feet.img') + ds = gdal.Open("../gcore/data/erdas_feet.img") unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == 'feet', 'Failed to read elevation units' + assert unittype == "feet", "Failed to read elevation units" ds = None - ds = gdal.Open('../gcore/data/erdas_m.img') + ds = gdal.Open("../gcore/data/erdas_m.img") unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == 'meters', 'Failed to read elevation units' + assert unittype == "meters", "Failed to read elevation units" ds = None + ############################################################################### # - - - diff --git a/autotest/gdrivers/idrisi.py b/autotest/gdrivers/idrisi.py index 9603d74efb80..b9cd86240fa6 100755 --- a/autotest/gdrivers/idrisi.py +++ b/autotest/gdrivers/idrisi.py @@ -31,7 +31,6 @@ import os - import gdaltest ############################################################################### @@ -40,27 +39,30 @@ def test_idrisi_1(): - tst = gdaltest.GDALTest('RST', 'rst/byte.rst', 1, 5044) + tst = gdaltest.GDALTest("RST", "rst/byte.rst", 1, 5044) return tst.testOpen() + ############################################################################### # Read test of byte file. def test_idrisi_2(): - tst = gdaltest.GDALTest('RST', 'rst/real.rst', 1, 5275) + tst = gdaltest.GDALTest("RST", "rst/real.rst", 1, 5275) return tst.testOpen() + ############################################################################### # def test_idrisi_3(): - tst = gdaltest.GDALTest('RST', 'ehdr/float32.bil', 1, 27) + tst = gdaltest.GDALTest("RST", "ehdr/float32.bil", 1, 27) + + return tst.testCreate(new_filename="tmp/float32.rst", out_bands=1, vsimem=1) - return tst.testCreate(new_filename='tmp/float32.rst', out_bands=1, vsimem=1) ############################################################################### # @@ -68,10 +70,12 @@ def test_idrisi_3(): def test_idrisi_4(): - tst = gdaltest.GDALTest('RST', 'rgbsmall.tif', 2, 21053) + tst = gdaltest.GDALTest("RST", "rgbsmall.tif", 2, 21053) + + return tst.testCreateCopy( + check_gt=1, check_srs=1, new_filename="tmp/rgbsmall_cc.rst", vsimem=1 + ) - return tst.testCreateCopy(check_gt=1, check_srs=1, - new_filename='tmp/rgbsmall_cc.rst', vsimem=1) ############################################################################### # Cleanup. @@ -80,13 +84,10 @@ def test_idrisi_4(): def test_idrisi_cleanup(): gdaltest.clean_tmp() try: - os.unlink('data/rgbsmall.tif.aux.xml') - os.unlink('data/rst/real.rst.aux.xml') - os.unlink('data/frmt09.cot.aux.xml') - os.unlink('data/rst/byte.rst.aux.xml') - print('FIXME?: data/rgbsmall.tif.aux.xml is produced by those tests') + os.unlink("data/rgbsmall.tif.aux.xml") + os.unlink("data/rst/real.rst.aux.xml") + os.unlink("data/frmt09.cot.aux.xml") + os.unlink("data/rst/byte.rst.aux.xml") + print("FIXME?: data/rgbsmall.tif.aux.xml is produced by those tests") except OSError: pass - - - diff --git a/autotest/gdrivers/ilwis.py b/autotest/gdrivers/ilwis.py index 20ccd14af787..a40e489509f1 100755 --- a/autotest/gdrivers/ilwis.py +++ b/autotest/gdrivers/ilwis.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,7 +37,7 @@ def test_ilwis_1(): - tst = gdaltest.GDALTest('ilwis', 'ilwis/LanduseSmall.mpr', 1, 2351) + tst = gdaltest.GDALTest("ilwis", "ilwis/LanduseSmall.mpr", 1, 2351) srs = """PROJCS["UTM", GEOGCS["PSAD56", @@ -65,16 +64,17 @@ def test_ilwis_1(): return tst.testOpen(check_gt=gt, check_prj=srs) + ############################################################################### # copy byte data and verify. def test_ilwis_2(): - tst = gdaltest.GDALTest('ilwis', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("ilwis", "byte.tif", 1, 4672) + + return tst.testCreateCopy(check_srs=1, check_gt=1, new_filename="tmp/byte.mpr") - return tst.testCreateCopy(check_srs=1, check_gt=1, - new_filename='tmp/byte.mpr') ############################################################################### # copy floating point data and use Create interface. @@ -82,9 +82,10 @@ def test_ilwis_2(): def test_ilwis_3(): - tst = gdaltest.GDALTest('ilwis', 'hfa/float.img', 1, 23529) + tst = gdaltest.GDALTest("ilwis", "hfa/float.img", 1, 23529) + + return tst.testCreate(new_filename="tmp/float.mpr", out_bands=1) - return tst.testCreate(new_filename='tmp/float.mpr', out_bands=1) ############################################################################### # Try multi band dataset. @@ -92,10 +93,10 @@ def test_ilwis_3(): def test_ilwis_4(): - tst = gdaltest.GDALTest('ilwis', 'rgbsmall.tif', 2, 21053) + tst = gdaltest.GDALTest("ilwis", "rgbsmall.tif", 2, 21053) + + return tst.testCreate(new_filename="tmp/rgb.mpl", check_minmax=0, out_bands=3) - return tst.testCreate(new_filename='tmp/rgb.mpl', check_minmax=0, - out_bands=3) ############################################################################### # Test vsi in-memory support. @@ -103,11 +104,12 @@ def test_ilwis_4(): def test_ilwis_5(): - tst = gdaltest.GDALTest('ilwis', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("ilwis", "byte.tif", 1, 4672) + + return tst.testCreateCopy( + check_srs=1, check_gt=1, vsimem=1, new_filename="/vsimem/ilwis/byte.mpr" + ) - return tst.testCreateCopy(check_srs=1, check_gt=1, - vsimem=1, - new_filename='/vsimem/ilwis/byte.mpr') ############################################################################### # Cleanup. @@ -119,6 +121,3 @@ def test_ilwis_5(): def test_ilwis_cleanup(): gdaltest.clean_tmp() - - - diff --git a/autotest/gdrivers/iris.py b/autotest/gdrivers/iris.py index c7c6dc4de609..7ff4c1defc0b 100755 --- a/autotest/gdrivers/iris.py +++ b/autotest/gdrivers/iris.py @@ -29,27 +29,27 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Test reading a - fake - IRIS dataset def test_iris_1(): - tst = gdaltest.GDALTest('IRIS', 'iris/fakeiris.dat', 1, 65532) + tst = gdaltest.GDALTest("IRIS", "iris/fakeiris.dat", 1, 65532) return tst.testOpen() + ############################################################################### # Test reading a real world IRIS dataset. def test_iris_2(): - ds = gdal.Open('data/iris/iristest.dat') + ds = gdal.Open("data/iris/iristest.dat") assert ds.GetRasterBand(1).Checksum() == 52872 ds.GetProjectionRef() @@ -68,10 +68,22 @@ def test_iris_2(): # return 'fail' got_gt = ds.GetGeoTransform() - expected_gt = [16435.721785269096, 1370.4263720754534, 0.0, 5289830.4584420761, 0.0, -1357.6498705837876] + expected_gt = [ + 16435.721785269096, + 1370.4263720754534, + 0.0, + 5289830.4584420761, + 0.0, + -1357.6498705837876, + ] for i in range(6): - assert not ((expected_gt[i] == 0.0 and got_gt[i] != 0.0) or \ - (expected_gt[i] != 0.0 and abs(got_gt[i] - expected_gt[i]) / abs(expected_gt[i]) > 1e-5)) + assert not ( + (expected_gt[i] == 0.0 and got_gt[i] != 0.0) + or ( + expected_gt[i] != 0.0 + and abs(got_gt[i] - expected_gt[i]) / abs(expected_gt[i]) > 1e-5 + ) + ) expected_metadata = [ "AZIMUTH_SMOOTHING_FOR_SHEAR=0.0", @@ -99,14 +111,11 @@ def test_iris_2(): "TASK_NAME=PPIVOL_A ", "TIME_INPUT_INGEST_SWEEP=2012-04-19 14:48:05", "TIME_PRODUCT_GENERATED=2012-04-19 14:48:30", - "WAVELENGTH=5.33 cm"] + "WAVELENGTH=5.33 cm", + ] got_metadata = ds.GetMetadata() for md in expected_metadata: - key = md[0:md.find('=')] - value = md[md.find('=') + 1:] - assert got_metadata[key] == value, ('did not find %s' % key) - - - - + key = md[0 : md.find("=")] + value = md[md.find("=") + 1 :] + assert got_metadata[key] == value, "did not find %s" % key diff --git a/autotest/gdrivers/isce.py b/autotest/gdrivers/isce.py index 06e88269ffa4..efd9c14d9608 100755 --- a/autotest/gdrivers/isce.py +++ b/autotest/gdrivers/isce.py @@ -29,18 +29,17 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Perform simple read test. def test_isce_1(): - tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) + tst = gdaltest.GDALTest("isce", "isce/isce.slc", 1, 350) prj = """GEOGCS["WGS 84", DATUM["WGS_1984", @@ -54,13 +53,18 @@ def test_isce_1(): AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" - return tst.testOpen(check_prj=prj, - check_gt=(14.259166666666667, - 0.0008333333333333334, - 0.0, - 38.22083333333333, - 0.0, - -0.0008333333333333334)) + return tst.testOpen( + check_prj=prj, + check_gt=( + 14.259166666666667, + 0.0008333333333333334, + 0.0, + 38.22083333333333, + 0.0, + -0.0008333333333333334, + ), + ) + ############################################################################### # Test reading of metadata from the ISCE metadata domain @@ -68,9 +72,10 @@ def test_isce_1(): def test_isce_2(): - ds = gdal.Open('data/isce/isce.slc') - val = ds.GetMetadataItem('IMAGE_TYPE', 'ISCE') - assert val == 'slc' + ds = gdal.Open("data/isce/isce.slc") + val = ds.GetMetadataItem("IMAGE_TYPE", "ISCE") + assert val == "slc" + ############################################################################### # Verify this can be exported losslessly. @@ -78,8 +83,9 @@ def test_isce_2(): def test_isce_3(): - tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) - return tst.testCreateCopy(check_gt=0, new_filename='isce.tst.slc') + tst = gdaltest.GDALTest("isce", "isce/isce.slc", 1, 350) + return tst.testCreateCopy(check_gt=0, new_filename="isce.tst.slc") + ############################################################################### # Verify VSIF*L capacity @@ -87,9 +93,5 @@ def test_isce_3(): def test_isce_4(): - tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) - return tst.testCreateCopy(check_gt=0, new_filename='isce.tst.slc', vsimem=1) - - - - + tst = gdaltest.GDALTest("isce", "isce/isce.slc", 1, 350) + return tst.testCreateCopy(check_gt=0, new_filename="isce.tst.slc", vsimem=1) diff --git a/autotest/gdrivers/isg.py b/autotest/gdrivers/isg.py index 2142edcf0d1e..85dc7b384ce9 100755 --- a/autotest/gdrivers/isg.py +++ b/autotest/gdrivers/isg.py @@ -36,7 +36,6 @@ def test_isg_1(): - tst = gdaltest.GDALTest('ISG', 'isg/test.isg', 1, 159) + tst = gdaltest.GDALTest("ISG", "isg/test.isg", 1, 159) expected_gt = [120.0, 0.25, 0.0, 41.0, 0.0, -0.25] return tst.testOpen(check_gt=expected_gt) - diff --git a/autotest/gdrivers/isis.py b/autotest/gdrivers/isis.py index f6c8b018354e..1b3bd33e15ce 100755 --- a/autotest/gdrivers/isis.py +++ b/autotest/gdrivers/isis.py @@ -32,12 +32,11 @@ import json import struct - -from osgeo import gdal -from osgeo import osr import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Perform simple read test on isis3 detached dataset. @@ -57,12 +56,19 @@ def test_isis_1(): PARAMETER["false_northing",0], UNIT["metre",1]] """ - gt = (-4766.96484375, 10.102499961853027, 0.0, - -872623.625, 0.0, -10.102499961853027) - - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) + gt = ( + -4766.96484375, + 10.102499961853027, + 0.0, + -872623.625, + 0.0, + -10.102499961853027, + ) + + tst = gdaltest.GDALTest("ISIS3", "isis3/isis3_detached.lbl", 1, 9978) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Perform simple read test on isis3 detached dataset. @@ -82,12 +88,12 @@ def test_isis_2(): PARAMETER["false_northing",0], UNIT["metre",1]] """ - gt = (653.132641495800044, 0.38, 0, - -2298409.710162799805403, 0, -0.38) + gt = (653.132641495800044, 0.38, 0, -2298409.710162799805403, 0, -0.38) - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_unit_test.cub', 1, 42403) + tst = gdaltest.GDALTest("ISIS3", "isis3/isis3_unit_test.cub", 1, 42403) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Perform simple read test on isis3 detached dataset with GeoTIFF image file @@ -107,277 +113,358 @@ def test_isis_3(): PARAMETER["false_northing",0], UNIT["metre",1]] """ - gt = (-4766.96484375, 10.102499961853027, 0.0, - -872623.625, 0.0, -10.102499961853027) - - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_geotiff.lbl', 1, 9978) + gt = ( + -4766.96484375, + 10.102499961853027, + 0.0, + -872623.625, + 0.0, + -10.102499961853027, + ) + + tst = gdaltest.GDALTest("ISIS3", "isis3/isis3_geotiff.lbl", 1, 9978) return tst.testOpen(check_prj=srs, check_gt=gt) + # ISIS3 -> ISIS3 conversion def test_isis_4(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - ds = gdal.Open('/vsimem/isis_tmp.lbl') - assert ds.GetMetadataDomainList() == ['', 'json:ISIS3'] - lbl = ds.GetMetadata_List('json:ISIS3')[0] + tst = gdaltest.GDALTest("ISIS3", "isis3/isis3_detached.lbl", 1, 9978) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + ds = gdal.Open("/vsimem/isis_tmp.lbl") + assert ds.GetMetadataDomainList() == ["", "json:ISIS3"] + lbl = ds.GetMetadata_List("json:ISIS3")[0] # Couldn't be preserved, since points to dangling file - assert 'OriginalLabel' not in lbl - assert 'PositiveWest' not in lbl + assert "OriginalLabel" not in lbl + assert "PositiveWest" not in lbl assert ds.GetRasterBand(1).GetMaskFlags() == 0 assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 12220 ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") # Preserve source Mapping group as well - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['USE_SRC_MAPPING=YES']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert 'PositiveWest' in lbl - assert 'Planetographic' in lbl + tst = gdaltest.GDALTest( + "ISIS3", "isis3/isis3_detached.lbl", 1, 9978, options=["USE_SRC_MAPPING=YES"] + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert "PositiveWest" in lbl + assert "Planetographic" in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") # Preserve source Mapping group, but with a few overrides - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['USE_SRC_MAPPING=YES', - 'LONGITUDE_DIRECTION=PositiveEast', - 'LATITUDE_TYPE=Planetocentric', - 'TARGET_NAME=my_label']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert 'PositiveEast' in lbl - assert 'Planetocentric' in lbl - assert 'my_label' in lbl - ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "USE_SRC_MAPPING=YES", + "LONGITUDE_DIRECTION=PositiveEast", + "LATITUDE_TYPE=Planetocentric", + "TARGET_NAME=my_label", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert "PositiveEast" in lbl + assert "Planetocentric" in lbl + assert "my_label" in lbl + ds = None + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Label+image creation + WRITE_BOUNDING_DEGREES=NO option def test_isis_5(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['USE_SRC_LABEL=NO', - 'WRITE_BOUNDING_DEGREES=NO']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/isis_tmp.cub') is None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert 'MinimumLongitude' not in lbl + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=["USE_SRC_LABEL=NO", "WRITE_BOUNDING_DEGREES=NO"], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/isis_tmp.cub") is None + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert "MinimumLongitude" not in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Detached label creation and COMMENT option def test_isis_6(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['DATA_LOCATION=EXTERNAL', - 'USE_SRC_LABEL=NO', - 'COMMENT=my comment']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/isis_tmp.cub') is not None - f = gdal.VSIFOpenL('/vsimem/isis_tmp.lbl', 'rb') - content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=["DATA_LOCATION=EXTERNAL", "USE_SRC_LABEL=NO", "COMMENT=my comment"], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/isis_tmp.cub") is not None + f = gdal.VSIFOpenL("/vsimem/isis_tmp.lbl", "rb") + content = gdal.VSIFReadL(1, 10000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert '#my comment' in content + assert "#my comment" in content assert len(content) != 10000 - ds = gdal.Open('/vsimem/isis_tmp.lbl', gdal.GA_Update) + ds = gdal.Open("/vsimem/isis_tmp.lbl", gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds.GetRasterBand(1).Checksum() == 0 ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Uncompressed GeoTIFF creation def test_isis_7(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['DATA_LOCATION=GEOTIFF', - 'USE_SRC_LABEL=NO']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=["DATA_LOCATION=GEOTIFF", "USE_SRC_LABEL=NO"], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/isis_tmp.tif") is not None + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"Format":"BandSequential"' in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") # Test GEOTIFF_AS_REGULAR_EXTERNAL = NO - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['DATA_LOCATION=GEOTIFF', - 'GEOTIFF_AS_REGULAR_EXTERNAL=NO', - 'USE_SRC_LABEL=NO']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "DATA_LOCATION=GEOTIFF", + "GEOTIFF_AS_REGULAR_EXTERNAL=NO", + "USE_SRC_LABEL=NO", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/isis_tmp.tif") is not None + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"Format":"GeoTIFF"' in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Compressed GeoTIFF creation def test_isis_8(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['DATA_LOCATION=GEOTIFF', - 'USE_SRC_LABEL=NO', - 'GEOTIFF_OPTIONS=COMPRESS=LZW']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "DATA_LOCATION=GEOTIFF", + "USE_SRC_LABEL=NO", + "GEOTIFF_OPTIONS=COMPRESS=LZW", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/isis_tmp.tif") is not None + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"Format":"GeoTIFF"' in lbl ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl', gdal.GA_Update) + ds = gdal.Open("/vsimem/isis_tmp.lbl", gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds.GetRasterBand(1).Checksum() == 0 ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Tiled creation + EXTERNAL_FILENAME def test_isis_9(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['DATA_LOCATION=EXTERNAL', - 'USE_SRC_LABEL=NO', - 'TILED=YES', - 'EXTERNAL_FILENAME=/vsimem/foo.bin']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - assert gdal.VSIStatL('/vsimem/foo.bin') is not None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert ('"Format":"Tile"' in lbl and '"TileSamples":256' in lbl and \ - '"TileLines":256' in lbl) - ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') - assert gdal.VSIStatL('/vsimem/foo.bin') is None + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "DATA_LOCATION=EXTERNAL", + "USE_SRC_LABEL=NO", + "TILED=YES", + "EXTERNAL_FILENAME=/vsimem/foo.bin", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + assert gdal.VSIStatL("/vsimem/foo.bin") is not None + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert ( + '"Format":"Tile"' in lbl + and '"TileSamples":256' in lbl + and '"TileLines":256' in lbl + ) + ds = None + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + assert gdal.VSIStatL("/vsimem/foo.bin") is None + # Tiled creation + regular GeoTIFF + EXTERNAL_FILENAME def test_isis_10(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['USE_SRC_LABEL=NO', - 'DATA_LOCATION=GEOTIFF', - 'TILED=YES', - 'BLOCKXSIZE=16', 'BLOCKYSIZE=32', - 'EXTERNAL_FILENAME=/vsimem/foo.tif']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - ds = gdal.Open('/vsimem/foo.tif') + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "USE_SRC_LABEL=NO", + "DATA_LOCATION=GEOTIFF", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=32", + "EXTERNAL_FILENAME=/vsimem/foo.tif", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + ds = gdal.Open("/vsimem/foo.tif") assert ds.GetRasterBand(1).GetBlockSize() == [16, 32] ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') - assert gdal.VSIStatL('/vsimem/foo.tif') is None + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + assert gdal.VSIStatL("/vsimem/foo.tif") is None + # Tiled creation + compressed GeoTIFF def test_isis_11(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, - options=['USE_SRC_LABEL=NO', - 'DATA_LOCATION=GEOTIFF', - 'TILED=YES', - 'GEOTIFF_OPTIONS=COMPRESS=LZW']) - tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', - delete_copy=0) - ds = gdal.Open('/vsimem/isis_tmp.tif') + tst = gdaltest.GDALTest( + "ISIS3", + "isis3/isis3_detached.lbl", + 1, + 9978, + options=[ + "USE_SRC_LABEL=NO", + "DATA_LOCATION=GEOTIFF", + "TILED=YES", + "GEOTIFF_OPTIONS=COMPRESS=LZW", + ], + ) + tst.testCreateCopy(new_filename="/vsimem/isis_tmp.lbl", delete_copy=0) + ds = gdal.Open("/vsimem/isis_tmp.tif") assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Multiband def test_isis_12(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3') - ds = gdal.Open('/vsimem/isis_tmp.lbl') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdal.Translate("/vsimem/isis_tmp.lbl", src_ds, format="ISIS3") + ds = gdal.Open("/vsimem/isis_tmp.lbl") for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Multiband tiled def test_isis_13(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', - creationOptions=['TILED=YES', 'BLOCKXSIZE=16', - 'BLOCKYSIZE=32']) - ds = gdal.Open('/vsimem/isis_tmp.lbl') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdal.Translate( + "/vsimem/isis_tmp.lbl", + src_ds, + format="ISIS3", + creationOptions=["TILED=YES", "BLOCKXSIZE=16", "BLOCKYSIZE=32"], + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Multiband with uncompressed GeoTIFF def test_isis_14(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', - creationOptions=['DATA_LOCATION=GEOTIFF']) - ds = gdal.Open('/vsimem/isis_tmp.lbl') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdal.Translate( + "/vsimem/isis_tmp.lbl", + src_ds, + format="ISIS3", + creationOptions=["DATA_LOCATION=GEOTIFF"], + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Multiband with uncompressed tiled GeoTIFF def test_isis_15(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', - creationOptions=['DATA_LOCATION=GEOTIFF', 'TILED=YES', - 'BLOCKXSIZE=16', 'BLOCKYSIZE=32']) - ds = gdal.Open('/vsimem/isis_tmp.lbl') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdal.Translate( + "/vsimem/isis_tmp.lbl", + src_ds, + format="ISIS3", + creationOptions=[ + "DATA_LOCATION=GEOTIFF", + "TILED=YES", + "BLOCKXSIZE=16", + "BLOCKYSIZE=32", + ], + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Test Create() without anything else @@ -388,15 +475,21 @@ def test_isis_16(): for init_nd in [False, True]: for dt, cs, nd, options in [ [gdal.GDT_Byte, 0, 0, []], - [gdal.GDT_Byte, 0, 0, ['TILED=YES']], - [gdal.GDT_Byte, 0, 0, ['DATA_LOCATION=GEOTIFF', 'GEOTIFF_OPTIONS=COMPRESS=LZW']], + [gdal.GDT_Byte, 0, 0, ["TILED=YES"]], + [ + gdal.GDT_Byte, + 0, + 0, + ["DATA_LOCATION=GEOTIFF", "GEOTIFF_OPTIONS=COMPRESS=LZW"], + ], [gdal.GDT_Int16, 65525, -32768, []], [gdal.GDT_UInt16, 0, 0, []], - [gdal.GDT_Float32, 65534, -3.4028226550889045e+38, []] + [gdal.GDT_Float32, 65534, -3.4028226550889045e38, []], ]: - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', - 1, 2, 1, dt, options=options) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", 1, 2, 1, dt, options=options + ) ds.GetRasterBand(1).SetOffset(10) ds.GetRasterBand(1).SetScale(20) if read_before_write: @@ -404,31 +497,68 @@ def test_isis_16(): if init_nd: ds.GetRasterBand(1).Fill(nd) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - assert ds.GetRasterBand(1).Checksum() == cs, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).Checksum()) - assert ds.GetRasterBand(1).GetMaskFlags() == 0, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetMaskFlags()) - assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 0, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetMaskBand().Checksum()) - assert ds.GetRasterBand(1).GetOffset() == 10, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetOffset()) - assert ds.GetRasterBand(1).GetScale() == 20, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetScale()) - assert ds.GetRasterBand(1).GetNoDataValue() == nd, \ - (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetNoDataValue()) + ds = gdal.Open("/vsimem/isis_tmp.lbl") + assert ds.GetRasterBand(1).Checksum() == cs, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).Checksum(), + ) + assert ds.GetRasterBand(1).GetMaskFlags() == 0, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).GetMaskFlags(), + ) + assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 0, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).GetMaskBand().Checksum(), + ) + assert ds.GetRasterBand(1).GetOffset() == 10, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).GetOffset(), + ) + assert ds.GetRasterBand(1).GetScale() == 20, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).GetScale(), + ) + assert ds.GetRasterBand(1).GetNoDataValue() == nd, ( + dt, + cs, + nd, + options, + init_nd, + ds.GetRasterBand(1).GetNoDataValue(), + ) ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + - # Test create copy through Create() def test_isis_17(): - tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) + tst = gdaltest.GDALTest("ISIS3", "isis3/isis3_detached.lbl", 1, 9978) return tst.testCreate(vsimem=1) + # Test SRS serialization and deserialization @@ -437,106 +567,144 @@ def test_isis_18(): sr = osr.SpatialReference() sr.SetEquirectangular2(0, 1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetEquirectangular2(123456, 1, 2, 987654, 3210123) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) gdal.PushErrorHandler() # Will warn that latitude_of_origin, false_easting and false_northing are ignored ds = None gdal.PopErrorHandler() - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetOrthographic(1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Orthographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Orthographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["Orthographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Orthographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetSinusoidal(1, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Sinusoidal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Sinusoidal"],PARAMETER["longitude_of_center",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["Sinusoidal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Sinusoidal"],PARAMETER["longitude_of_center",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetMercator(0, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Mercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')), wkt + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["Mercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ), wkt sr = osr.SpatialReference() sr.SetPS(1, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["PolarStereographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_polarRadius",122838.72,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",SOUTH],AXIS["Northing",SOUTH]]')), wkt + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["PolarStereographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_polarRadius",122838.72,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",SOUTH],AXIS["Northing",SOUTH]]' + ) + ), wkt sr = osr.SpatialReference() sr.SetTM(1, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["TransverseMercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["TransverseMercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetLCC(1, 2, 3, 4, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") wkt = ds.GetProjectionRef() ds = None - assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["LambertConformal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",1],PARAMETER["standard_parallel_2",2],PARAMETER["latitude_of_origin",3],PARAMETER["central_meridian",4],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) + assert osr.SpatialReference(wkt).IsSame( + osr.SpatialReference( + 'PROJCS["LambertConformal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",1],PARAMETER["standard_parallel_2",2],PARAMETER["latitude_of_origin",3],PARAMETER["central_meridian",4],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]' + ) + ) sr = osr.SpatialReference() sr.SetEquirectangular2(0, 1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1, - options=['LATITUDE_TYPE=Planetographic', - 'TARGET_NAME=my_target', - 'BOUNDING_DEGREES=1.5,2.5,3.5,4.5']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", + 1, + 1, + options=[ + "LATITUDE_TYPE=Planetographic", + "TARGET_NAME=my_target", + "BOUNDING_DEGREES=1.5,2.5,3.5,4.5", + ], + ) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([1000, 1, 0, 2000, 0, -1]) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"TargetName":"my_target"' in lbl assert '"LatitudeType":"Planetographic"' in lbl assert '"MinimumLatitude":2.5' in lbl @@ -547,13 +715,14 @@ def test_isis_18(): sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 100, 100, - options=['LONGITUDE_DIRECTION=PositiveWest']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", 100, 100, options=["LONGITUDE_DIRECTION=PositiveWest"] + ) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([10, 1, 0, 40, 0, -1]) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"LongitudeDirection":"PositiveWest"' in lbl assert '"LongitudeDomain":180' in lbl assert '"MinimumLatitude":-60' in lbl @@ -564,13 +733,14 @@ def test_isis_18(): sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 100, 100, - options=['FORCE_360=YES']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", 100, 100, options=["FORCE_360=YES"] + ) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([-10, 1, 0, 40, 0, -1]) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"MinimumLatitude":-60' in lbl assert '"MinimumLongitude":90' in lbl assert '"MaximumLatitude":40' in lbl @@ -579,20 +749,22 @@ def test_isis_18(): assert '"UpperLeftCornerY":86188' in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Test gdal.Info() with json:ISIS3 metadata domain def test_isis_19(): - ds = gdal.Open('data/isis3/isis3_detached.lbl') - res = gdal.Info(ds, format='json', extraMDDomains=['json:ISIS3']) - assert res['metadata']['json:ISIS3']['IsisCube']['_type'] == 'object' + ds = gdal.Open("data/isis3/isis3_detached.lbl") + res = gdal.Info(ds, format="json", extraMDDomains=["json:ISIS3"]) + assert res["metadata"]["json:ISIS3"]["IsisCube"]["_type"] == "object" + + ds = gdal.Open("data/isis3/isis3_detached.lbl") + res = gdal.Info(ds, extraMDDomains=["json:ISIS3"]) + assert "IsisCube" in res - ds = gdal.Open('data/isis3/isis3_detached.lbl') - res = gdal.Info(ds, extraMDDomains=['json:ISIS3']) - assert 'IsisCube' in res # Test gdal.Translate() subsetting and label preservation @@ -600,13 +772,18 @@ def test_isis_19(): def test_isis_20(): with gdaltest.error_handler(): - gdal.Translate('/vsimem/isis_tmp.lbl', 'data/isis3/isis3_detached.lbl', - format='ISIS3', srcWin=[0, 0, 1, 1]) - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert 'AMadeUpValue' in lbl + gdal.Translate( + "/vsimem/isis_tmp.lbl", + "data/isis3/isis3_detached.lbl", + format="ISIS3", + srcWin=[0, 0, 1, 1], + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert "AMadeUpValue" in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Test gdal.Warp() and label preservation @@ -614,143 +791,162 @@ def test_isis_20(): def test_isis_21(): with gdaltest.error_handler(): - gdal.Warp('/vsimem/isis_tmp.lbl', 'data/isis3/isis3_detached.lbl', - format='ISIS3') - ds = gdal.Open('/vsimem/isis_tmp.lbl') + gdal.Warp( + "/vsimem/isis_tmp.lbl", "data/isis3/isis3_detached.lbl", format="ISIS3" + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds.GetRasterBand(1).Checksum() == 9978 - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert 'AMadeUpValue' in lbl + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert "AMadeUpValue" in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Test source JSon use def test_isis_22(): - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) # Invalid Json js = """invalid""" with gdaltest.error_handler(): - assert ds.SetMetadata([js], 'json:ISIS3') != 0 + assert ds.SetMetadata([js], "json:ISIS3") != 0 ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) # Invalid type for IsisCube js = """{ "IsisCube": 5 }""" - ds.SetMetadata([js], 'json:ISIS3') - lbl = ds.GetMetadata_List('json:ISIS3') + ds.SetMetadata([js], "json:ISIS3") + lbl = ds.GetMetadata_List("json:ISIS3") assert lbl is not None - ds.SetMetadata([js], 'json:ISIS3') + ds.SetMetadata([js], "json:ISIS3") ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds is not None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) # Invalid type for IsisCube.Core js = """{ "IsisCube": { "_type": "object", "Core": 5 } }""" - ds.SetMetadata([js], 'json:ISIS3') + ds.SetMetadata([js], "json:ISIS3") ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds is not None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) # Invalid type for IsisCube.Core.Dimensions and IsisCube.Core.Pixels js = """{ "IsisCube": { "_type": "object", "Core": { "_type": "object", "Dimensions": 5, "Pixels": 5 } } }""" - ds.SetMetadata([js], 'json:ISIS3') + ds.SetMetadata([js], "json:ISIS3") ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ds is not None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1, - options=['DATA_LOCATION=EXTERNAL']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", 1, 1, options=["DATA_LOCATION=EXTERNAL"] + ) js = """{ "IsisCube": { "foo": "bar", "bar": [ 123, 124.0, 2.5, "xyz", "anotherveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext", 234, 456, 789, 234, 567, 890, 123456789.0, 123456789.0, 123456789.0, 123456789.0, 123456789.0 ], "baz" : { "value": 5, "unit": "M" }, "baw": "with space", "very_long": "aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext"} }""" - ds.SetMetadata([js], 'json:ISIS3') + ds.SetMetadata([js], "json:ISIS3") ds = None - f = gdal.VSIFOpenL('/vsimem/isis_tmp.lbl', 'rb') + f = gdal.VSIFOpenL("/vsimem/isis_tmp.lbl", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') + content = gdal.VSIFReadL(1, 10000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert ('foo = bar' in content and \ - ' bar = (123, 124.0, 2.5, xyz' in content and \ - ' anotherveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-' in content and \ - ' eeeeeeeeeeeeeeeeeeeeeeeerylooooongtext, 234, 456, 789, 234, 567,' in content and \ - ' 890, 123456789.0, 123456789.0, 123456789.0, 123456789.0,' in content and \ - ' 123456789.0)' in content and \ - 'baz = 5 ' in content and \ - 'baw = "with space"' in content and \ - 'very_long = aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-' in content) - - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] - assert ('"foo":"bar"' in lbl and '123' in lbl and \ - '2.5' in lbl and 'xyz' in lbl and \ - '"value":5' in lbl and '"unit":"M"' in lbl and \ - '"baw":"with space"' in lbl and \ - '"very_long":"aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext"' in lbl) - ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + assert ( + "foo = bar" in content + and " bar = (123, 124.0, 2.5, xyz" in content + and " anotherveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-" + in content + and " eeeeeeeeeeeeeeeeeeeeeeeerylooooongtext, 234, 456, 789, 234, 567," + in content + and " 890, 123456789.0, 123456789.0, 123456789.0, 123456789.0," + in content + and " 123456789.0)" in content + and "baz = 5 " in content + and 'baw = "with space"' in content + and "very_long = aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-" + in content + ) + + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] + assert ( + '"foo":"bar"' in lbl + and "123" in lbl + and "2.5" in lbl + and "xyz" in lbl + and '"value":5' in lbl + and '"unit":"M"' in lbl + and '"baw":"with space"' in lbl + and '"very_long":"aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext"' + in lbl + ) + ds = None + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") + # Test nodata remapping def test_isis_23(): - mem_ds = gdal.Translate('', 'data/byte.tif', format='MEM') - mem_ds.SetProjection('') + mem_ds = gdal.Translate("", "data/byte.tif", format="MEM") + mem_ds.SetProjection("") mem_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) mem_ds.GetRasterBand(1).SetNoDataValue(74) ref_data = mem_ds.GetRasterBand(1).ReadRaster() - gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, - format='ISIS3') - ds = gdal.Open('/vsimem/isis_tmp.lbl') + gdal.Translate("/vsimem/isis_tmp.lbl", mem_ds, format="ISIS3") + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, - format='ISIS3', creationOptions=['DATA_LOCATION=GeoTIFF']) - ds = gdal.Open('/vsimem/isis_tmp.lbl') + gdal.Translate( + "/vsimem/isis_tmp.lbl", + mem_ds, + format="ISIS3", + creationOptions=["DATA_LOCATION=GeoTIFF"], + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, - format='ISIS3', creationOptions=['TILED=YES']) - ds = gdal.Open('/vsimem/isis_tmp.lbl') + gdal.Translate( + "/vsimem/isis_tmp.lbl", mem_ds, format="ISIS3", creationOptions=["TILED=YES"] + ) + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Float32]: - mem_ds = gdal.Translate('', 'data/byte.tif', format='MEM', outputType=dt) - mem_ds.SetProjection('') + mem_ds = gdal.Translate("", "data/byte.tif", format="MEM", outputType=dt) + mem_ds.SetProjection("") mem_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) mem_ds.GetRasterBand(1).SetNoDataValue(74) ref_data = mem_ds.GetRasterBand(1).ReadRaster() - gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, - format='ISIS3') - ds = gdal.Open('/vsimem/isis_tmp.lbl') + gdal.Translate("/vsimem/isis_tmp.lbl", mem_ds, format="ISIS3") + ds = gdal.Open("/vsimem/isis_tmp.lbl") assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") - def cancel_cbk(pct, msg, user_data): # pylint: disable=unused-argument return 0 + # Test error cases @@ -758,15 +954,22 @@ def test_isis_24(): # For DATA_LOCATION=EXTERNAL, the main filename should have a .lbl extension with gdaltest.error_handler(): - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.txt', 1, 1, - options=['DATA_LOCATION=EXTERNAL']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/error.txt", 1, 1, options=["DATA_LOCATION=EXTERNAL"] + ) assert ds is None # cannot create external filename with gdaltest.error_handler(): - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.lbl', 1, 1, - options=['DATA_LOCATION=EXTERNAL', - 'EXTERNAL_FILENAME=/i_dont/exist/error.cub']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/error.lbl", + 1, + 1, + options=[ + "DATA_LOCATION=EXTERNAL", + "EXTERNAL_FILENAME=/i_dont/exist/error.cub", + ], + ) assert ds is None # no GTiff driver @@ -782,56 +985,68 @@ def test_isis_24(): # cannot create GeoTIFF with gdaltest.error_handler(): - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.lbl', 1, 1, - options=['DATA_LOCATION=GEOTIFF', - 'EXTERNAL_FILENAME=/i_dont/exist/error.tif']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/error.lbl", + 1, + 1, + options=[ + "DATA_LOCATION=GEOTIFF", + "EXTERNAL_FILENAME=/i_dont/exist/error.tif", + ], + ) assert ds is None - gdal.Unlink('/vsimem/error.lbl') + gdal.Unlink("/vsimem/error.lbl") # Output file has same name as input file - src_ds = gdal.Translate('/vsimem/out.tif', 'data/byte.tif') + src_ds = gdal.Translate("/vsimem/out.tif", "data/byte.tif") with gdaltest.error_handler(): - ds = gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', - src_ds, - options=['DATA_LOCATION=GEOTIFF']) + ds = gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/out.lbl", src_ds, options=["DATA_LOCATION=GEOTIFF"] + ) assert ds is None - gdal.Unlink('/vsimem/out.tif') + gdal.Unlink("/vsimem/out.tif") # Missing /vsimem/out.cub - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', - src_ds, - options=['DATA_LOCATION=EXTERNAL']) - gdal.Unlink('/vsimem/out.cub') + gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/out.lbl", src_ds, options=["DATA_LOCATION=EXTERNAL"] + ) + gdal.Unlink("/vsimem/out.cub") with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl', gdal.GA_Update) + ds = gdal.Open("/vsimem/out.lbl", gdal.GA_Update) assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") # Missing /vsimem/out.tif - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', - src_ds, - options=['DATA_LOCATION=GEOTIFF', - 'GEOTIFF_OPTIONS=COMPRESS=LZW']) - gdal.Unlink('/vsimem/out.tif') + gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/out.lbl", + src_ds, + options=["DATA_LOCATION=GEOTIFF", "GEOTIFF_OPTIONS=COMPRESS=LZW"], + ) + gdal.Unlink("/vsimem/out.tif") with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") # Invalid StartByte - gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, - options=['DATA_LOCATION=GEOTIFF', - 'GEOTIFF_OPTIONS=COMPRESS=LZW']) - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.GetDriverByName("ISIS3").Create( + "/vsimem/out.lbl", + 1, + 1, + options=["DATA_LOCATION=GEOTIFF", "GEOTIFF_OPTIONS=COMPRESS=LZW"], + ) + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core StartByte = 2 Format = GeoTIFF @@ -849,22 +1064,25 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) with gdaltest.error_handler(): - gdal.Open('/vsimem/out.lbl') - gdal.Unlink('/vsimem/out.tif') + gdal.Open("/vsimem/out.lbl") + gdal.Unlink("/vsimem/out.tif") with gdaltest.error_handler(): - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', 'IsisCube') - assert gdal.IdentifyDriver('/vsimem/out.lbl') is not None + gdal.FileFromMemBuffer("/vsimem/out.lbl", "IsisCube") + assert gdal.IdentifyDriver("/vsimem/out.lbl") is not None with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = Tile Group = Dimensions @@ -880,15 +1098,18 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # Wrong tile dimensions : 0 x 0 with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -904,15 +1125,18 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # Invalid dataset dimensions : 0 x 0 with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -928,15 +1152,18 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # Invalid band count : 0 with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -952,16 +1179,19 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # unhandled format with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = unhandled Group = Dimensions @@ -977,16 +1207,19 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # bad PDL formatting with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") - gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/out.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -996,112 +1229,123 @@ def test_isis_24(): End_Group End_Object End_Object -End""") +End""", + ) # missing Group = Pixels. This is actually valid. Assuming Real - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is not None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') - - gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, - options=['DATA_LOCATION=GEOTIFF', - 'GEOTIFF_OPTIONS=COMPRESS=LZW']) + gdal.Unlink("/vsimem/out.lbl") + + gdal.GetDriverByName("ISIS3").Create( + "/vsimem/out.lbl", + 1, + 1, + options=["DATA_LOCATION=GEOTIFF", "GEOTIFF_OPTIONS=COMPRESS=LZW"], + ) # /vsimem/out.tif has incompatible characteristics with the ones declared in the label - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 2) + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 2) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 2, 1) + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 2, 1) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 2) + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1, 2) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 1, gdal.GDT_Int16) + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1, 1, gdal.GDT_Int16) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') + ds = gdal.Open("/vsimem/out.lbl") assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') - gdal.Unlink('/vsimem/out.tif') + gdal.Unlink("/vsimem/out.lbl") + gdal.Unlink("/vsimem/out.tif") - gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, - options=['DATA_LOCATION=GEOTIFF']) + gdal.GetDriverByName("ISIS3").Create( + "/vsimem/out.lbl", 1, 1, options=["DATA_LOCATION=GEOTIFF"] + ) # /vsimem/out.tif has incompatible characteristics with the ones declared in the label - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 2) + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 2) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 2, 1) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 2, 1) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 2) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1, 2) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 1, gdal.GDT_Int16) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1, 1, gdal.GDT_Int16) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, options=['COMPRESS=LZW']) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("GTiff").Create( + "/vsimem/out.tif", 1, 1, options=["COMPRESS=LZW"] + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, options=['TILED=YES']) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1, options=["TILED=YES"]) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1) + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/out.tif", 1, 1) ds.GetRasterBand(1).SetNoDataValue(0) - ds.SetMetadataItem('foo', 'bar') + ds.SetMetadataItem("foo", "bar") ds = None gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/out.lbl') - assert gdal.GetLastErrorMsg() != '' + ds = gdal.Open("/vsimem/out.lbl") + assert gdal.GetLastErrorMsg() != "" with gdaltest.error_handler(): - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') - gdal.Unlink('/vsimem/out.tif') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + gdal.Unlink("/vsimem/out.tif") - mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + mem_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) with gdaltest.error_handler(): - ds = gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', - mem_ds, - callback=cancel_cbk) + ds = gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/out.lbl", mem_ds, callback=cancel_cbk + ) assert ds is None # Delete would fail since ds is None - gdal.Unlink('/vsimem/out.lbl') + gdal.Unlink("/vsimem/out.lbl") + # Test CreateCopy() and scale and offset def test_isis_25(): - mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + mem_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) mem_ds.GetRasterBand(1).SetScale(10) mem_ds.GetRasterBand(1).SetOffset(20) - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', mem_ds) - ds = gdal.Open('/vsimem/out.lbl') + gdal.GetDriverByName("ISIS3").CreateCopy("/vsimem/out.lbl", mem_ds) + ds = gdal.Open("/vsimem/out.lbl") assert ds.GetRasterBand(1).GetScale() == 10 assert ds.GetRasterBand(1).GetOffset() == 20 ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + # Test objects with same name def test_isis_26(): - gdal.FileFromMemBuffer('/vsimem/in.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/in.lbl", + """Object = IsisCube Object = Core StartByte = 1 Format = BandSequential @@ -1139,15 +1383,17 @@ def test_isis_26(): x = C End_Object -End""") +End""", + ) - gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', format='ISIS3') + gdal.Translate("/vsimem/out.lbl", "/vsimem/in.lbl", format="ISIS3") - f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') - content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') + f = gdal.VSIFOpenL("/vsimem/out.lbl", "rb") + content = gdal.VSIFReadL(1, 10000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert ("""Object = Table + assert ( + """Object = Table Name = first_table End_Object @@ -1166,48 +1412,56 @@ def test_isis_26(): Object = foo x = C End_Object -""" in content) +""" + in content + ) + + gdal.Unlink("/vsimem/in.lbl") + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") - gdal.Unlink('/vsimem/in.lbl') - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') # Test history def test_isis_27(): - for src_location in ['LABEL', 'EXTERNAL']: - for dst_location in ['LABEL', 'EXTERNAL']: - gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, - options=['DATA_LOCATION=' + src_location]) - gdal.Translate('/vsimem/out2.lbl', '/vsimem/out.lbl', format='ISIS3', - creationOptions=['DATA_LOCATION=' + dst_location]) - - f = gdal.VSIFOpenL('/vsimem/out2.lbl', 'rb') + for src_location in ["LABEL", "EXTERNAL"]: + for dst_location in ["LABEL", "EXTERNAL"]: + gdal.GetDriverByName("ISIS3").Create( + "/vsimem/out.lbl", 1, 1, options=["DATA_LOCATION=" + src_location] + ) + gdal.Translate( + "/vsimem/out2.lbl", + "/vsimem/out.lbl", + format="ISIS3", + creationOptions=["DATA_LOCATION=" + dst_location], + ) + + f = gdal.VSIFOpenL("/vsimem/out2.lbl", "rb") content = None if f is not None: - content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') + content = gdal.VSIFReadL(1, 100000, f).decode("ASCII") gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/out2.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/out2.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] lbl = json.loads(lbl) offset = lbl["History"]["StartByte"] - 1 size = lbl["History"]["Bytes"] - if dst_location == 'EXTERNAL': + if dst_location == "EXTERNAL": assert lbl["Label"]["Bytes"] < 65536 - history_filename = lbl['History']['^History'] - if history_filename != 'out2.History.IsisCube': + history_filename = lbl["History"]["^History"] + if history_filename != "out2.History.IsisCube": print(src_location) print(dst_location) pytest.fail(content) - f = gdal.VSIFOpenL('/vsimem/' + history_filename, 'rb') + f = gdal.VSIFOpenL("/vsimem/" + history_filename, "rb") history = None if f is not None: - history = gdal.VSIFReadL(1, 100000, f).decode('ASCII') + history = gdal.VSIFReadL(1, 100000, f).decode("ASCII") gdal.VSIFCloseL(f) if offset != 0 or size != len(history): @@ -1221,35 +1475,41 @@ def test_isis_27(): pytest.fail(dst_location) history = content[offset:] - if not history.startswith('Object = ') or \ - 'FROM = out.lbl' not in history or \ - 'TO = out2.lbl' not in history or \ - 'TO = out.lbl' not in history: + if ( + not history.startswith("Object = ") + or "FROM = out.lbl" not in history + or "TO = out2.lbl" not in history + or "TO = out.lbl" not in history + ): print(src_location) print(dst_location) pytest.fail(content) - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out2.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out2.lbl") # Test GDAL_HISTORY - gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, - options=['GDAL_HISTORY=foo']) - f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') + gdal.GetDriverByName("ISIS3").Create( + "/vsimem/out.lbl", 1, 1, options=["GDAL_HISTORY=foo"] + ) + f = gdal.VSIFOpenL("/vsimem/out.lbl", "rb") content = None if f is not None: - content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') + content = gdal.VSIFReadL(1, 100000, f).decode("ASCII") gdal.VSIFCloseL(f) - assert 'foo' in content - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') + assert "foo" in content + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + # Test preservation of non-pixel sections def test_isis_28(): - gdal.FileFromMemBuffer('/vsimem/in_table', "FOO") - gdal.FileFromMemBuffer('/vsimem/in.lbl', """Object = IsisCube + gdal.FileFromMemBuffer("/vsimem/in_table", "FOO") + gdal.FileFromMemBuffer( + "/vsimem/in.lbl", + """Object = IsisCube Object = Core StartByte = 1 Format = BandSequential @@ -1273,48 +1533,53 @@ def test_isis_28(): Bytes = 3 ^Table = in_table End_Object -End""") +End""", + ) - ds = gdal.Open('/vsimem/in.lbl') + ds = gdal.Open("/vsimem/in.lbl") fl = ds.GetFileList() - if fl != ['/vsimem/in.lbl', '/vsimem/in_table']: + if fl != ["/vsimem/in.lbl", "/vsimem/in_table"]: print(fl) return ds = None - gdal.Translate('/vsimem/in_label.lbl', '/vsimem/in.lbl', format='ISIS3') + gdal.Translate("/vsimem/in_label.lbl", "/vsimem/in.lbl", format="ISIS3") - for src_location in ['LABEL', 'EXTERNAL']: - if src_location == 'LABEL': - src = '/vsimem/in_label.lbl' + for src_location in ["LABEL", "EXTERNAL"]: + if src_location == "LABEL": + src = "/vsimem/in_label.lbl" else: - src = '/vsimem/in.lbl' - for dst_location in ['LABEL', 'EXTERNAL']: - gdal.Translate('/vsimem/out.lbl', src, format='ISIS3', - creationOptions=['DATA_LOCATION=' + dst_location]) - f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') + src = "/vsimem/in.lbl" + for dst_location in ["LABEL", "EXTERNAL"]: + gdal.Translate( + "/vsimem/out.lbl", + src, + format="ISIS3", + creationOptions=["DATA_LOCATION=" + dst_location], + ) + f = gdal.VSIFOpenL("/vsimem/out.lbl", "rb") content = None if f is not None: - content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') + content = gdal.VSIFReadL(1, 100000, f).decode("ASCII") gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/out.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/out.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] lbl = json.loads(lbl) offset = lbl["Table_first_table"]["StartByte"] - 1 size = lbl["Table_first_table"]["Bytes"] - if dst_location == 'EXTERNAL': - table_filename = lbl['Table_first_table']['^Table'] - if table_filename != 'out.Table.first_table': + if dst_location == "EXTERNAL": + table_filename = lbl["Table_first_table"]["^Table"] + if table_filename != "out.Table.first_table": print(src_location) print(dst_location) pytest.fail(content) - f = gdal.VSIFOpenL('/vsimem/' + table_filename, 'rb') + f = gdal.VSIFOpenL("/vsimem/" + table_filename, "rb") table = None if f is not None: - table = gdal.VSIFReadL(1, 100000, f).decode('ASCII') + table = gdal.VSIFReadL(1, 100000, f).decode("ASCII") gdal.VSIFCloseL(f) if offset != 0 or size != 3 or size != len(table): @@ -1327,15 +1592,16 @@ def test_isis_28(): pytest.fail(dst_location) table = content[offset:] - if table != 'FOO': + if table != "FOO": print(src_location) print(dst_location) pytest.fail(content) - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + + gdal.GetDriverByName("ISIS3").Delete("/vsimem/in_label.lbl") + gdal.GetDriverByName("ISIS3").Delete("/vsimem/in.lbl") - gdal.GetDriverByName('ISIS3').Delete('/vsimem/in_label.lbl') - gdal.GetDriverByName('ISIS3').Delete('/vsimem/in.lbl') # Test complete removal of history @@ -1343,112 +1609,130 @@ def test_isis_28(): def test_isis_29(): with gdaltest.error_handler(): - gdal.Translate('/vsimem/in.lbl', 'data/byte.tif', format='ISIS3') + gdal.Translate("/vsimem/in.lbl", "data/byte.tif", format="ISIS3") - gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', - options='-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO') + gdal.Translate( + "/vsimem/out.lbl", + "/vsimem/in.lbl", + options="-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO", + ) - ds = gdal.Open('/vsimem/out.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/out.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] lbl = json.loads(lbl) - assert 'History' not in lbl + assert "History" not in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") - gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', - options='-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO -co DATA_LOCATION=EXTERNAL') + gdal.Translate( + "/vsimem/out.lbl", + "/vsimem/in.lbl", + options="-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO -co DATA_LOCATION=EXTERNAL", + ) - ds = gdal.Open('/vsimem/out.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/out.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] lbl = json.loads(lbl) - assert 'History' not in lbl + assert "History" not in lbl ds = None - assert gdal.VSIStatL('/vsimem/out.History.IsisCube') is None + assert gdal.VSIStatL("/vsimem/out.History.IsisCube") is None + + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.lbl") + gdal.GetDriverByName("ISIS3").Delete("/vsimem/in.lbl") - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') - gdal.GetDriverByName('ISIS3').Delete('/vsimem/in.lbl') # Test Fill() on a GeoTIFF file def test_isis_30(): - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/test.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF']) + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/test.lbl", 1, 1, options=["DATA_LOCATION=GEOTIFF"] + ) ds.GetRasterBand(1).Fill(1) ds = None - ds = gdal.Open('/vsimem/test.lbl') + ds = gdal.Open("/vsimem/test.lbl") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/test.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/test.lbl") assert cs == 1 + # Test correct working of block caching with a GeoTIFF file def test_isis_31(): - gdal.SetConfigOption('GDAL_FORCE_CACHING', 'YES') - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/test.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF']) - ds.WriteRaster(0, 0, 1, 1, struct.pack('B' * 1, 1)) + gdal.SetConfigOption("GDAL_FORCE_CACHING", "YES") + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/test.lbl", 1, 1, options=["DATA_LOCATION=GEOTIFF"] + ) + ds.WriteRaster(0, 0, 1, 1, struct.pack("B" * 1, 1)) ds = None - gdal.SetConfigOption('GDAL_FORCE_CACHING', None) + gdal.SetConfigOption("GDAL_FORCE_CACHING", None) - ds = gdal.Open('/vsimem/test.lbl') + ds = gdal.Open("/vsimem/test.lbl") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/test.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/test.lbl") assert cs == 1 ############################################################################### def test_isis3_write_utm(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/temp.lbl', src_ds, - options=['DATA_LOCATION=EXTERNAL']) - ds = gdal.Open('/vsimem/temp.lbl') + gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/temp.lbl", src_ds, options=["DATA_LOCATION=EXTERNAL"] + ) + ds = gdal.Open("/vsimem/temp.lbl") assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - f = gdal.VSIFOpenL('/vsimem/temp.lbl', 'rb') + f = gdal.VSIFOpenL("/vsimem/temp.lbl", "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert 'MinimumLongitude = -117.6411686' in data, data - assert 'MaximumLongitude = -117.6281108' in data, data - assert 'MaximumLatitude = 33.90241956' in data, data - assert 'MinimumLatitude = 33.891530168' in data, data - gdal.GetDriverByName('ISIS3').Delete('/vsimem/temp.lbl') + assert "MinimumLongitude = -117.6411686" in data, data + assert "MaximumLongitude = -117.6281108" in data, data + assert "MaximumLatitude = 33.90241956" in data, data + assert "MinimumLatitude = 33.891530168" in data, data + gdal.GetDriverByName("ISIS3").Delete("/vsimem/temp.lbl") ############################################################################### # Test bugfix https://github.com/OSGeo/gdal/issues/1510 + def test_isis3_parse_list_and_write_quote_string_in_list(): - src_ds = gdal.Open('data/isis3/FC21B0037339_15142232818F1C_3bands_truncated.cub') - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/temp.lbl', src_ds, - options=['DATA_LOCATION=EXTERNAL']) - f = gdal.VSIFOpenL('/vsimem/temp.lbl', 'rb') + src_ds = gdal.Open("data/isis3/FC21B0037339_15142232818F1C_3bands_truncated.cub") + gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/temp.lbl", src_ds, options=["DATA_LOCATION=EXTERNAL"] + ) + f = gdal.VSIFOpenL("/vsimem/temp.lbl", "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert 'FilterNumber = (1, 1, 1)' in data, data - assert 'FilterName = (Clear_F1, Clear_F1, Clear_F1)' in data, data + assert "FilterNumber = (1, 1, 1)" in data, data + assert "FilterName = (Clear_F1, Clear_F1, Clear_F1)" in data, data assert 'Name = ("band 1", "band 2", "band 3")' in data, data - gdal.GetDriverByName('ISIS3').Delete('/vsimem/temp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/temp.lbl") ############################################################################### # + def test_isis3_bandbin_single_band(): - gdal.FileFromMemBuffer('/vsimem/test.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/test.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -1472,28 +1756,32 @@ def test_isis3_bandbin_single_band(): End_Group End_Object -End""") +End""", + ) - ds = gdal.Open('/vsimem/test.lbl') + ds = gdal.Open("/vsimem/test.lbl") assert ds band = ds.GetRasterBand(1) - assert band.GetDescription() == 'My band name' + assert band.GetDescription() == "My band name" assert band.GetMetadata() == { - 'BANDWIDTH': '300.000000', - 'BANDWIDTH_UNIT': 'NANOMETERS', - 'WAVELENGTH': '700.000000', - 'WAVELENGTH_UNIT': 'NANOMETERS' + "BANDWIDTH": "300.000000", + "BANDWIDTH_UNIT": "NANOMETERS", + "WAVELENGTH": "700.000000", + "WAVELENGTH_UNIT": "NANOMETERS", } ds = None - gdal.Unlink('/vsimem/test.lbl') + gdal.Unlink("/vsimem/test.lbl") ############################################################################### # + def test_isis3_bandbin_multiple_bands(): - gdal.FileFromMemBuffer('/vsimem/test.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/test.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -1518,38 +1806,42 @@ def test_isis3_bandbin_multiple_bands(): End_Group End_Object -End""") +End""", + ) - ds = gdal.Open('/vsimem/test.lbl') + ds = gdal.Open("/vsimem/test.lbl") assert ds band = ds.GetRasterBand(1) - assert band.GetDescription() == 'first band' - assert band.GetUnitType() == 'DEGREE' + assert band.GetDescription() == "first band" + assert band.GetUnitType() == "DEGREE" assert band.GetMetadata() == { - 'BANDWIDTH': '0.500000', - 'BANDWIDTH_UNIT': 'um', - 'WAVELENGTH': '1.034800', - 'WAVELENGTH_UNIT': 'MICROMETER' + "BANDWIDTH": "0.500000", + "BANDWIDTH_UNIT": "um", + "WAVELENGTH": "1.034800", + "WAVELENGTH_UNIT": "MICROMETER", } band = ds.GetRasterBand(2) - assert band.GetDescription() == 'second band' + assert band.GetDescription() == "second band" assert band.GetMetadata() == { - 'BANDWIDTH': '0.600000', - 'BANDWIDTH_UNIT': 'um', - 'WAVELENGTH': '1.312800', - 'WAVELENGTH_UNIT': 'MICROMETER' + "BANDWIDTH": "0.600000", + "BANDWIDTH_UNIT": "um", + "WAVELENGTH": "1.312800", + "WAVELENGTH_UNIT": "MICROMETER", } ds = None - gdal.Unlink('/vsimem/test.lbl') + gdal.Unlink("/vsimem/test.lbl") ############################################################################### # Test that when converting from ISIS3 to other formats (PAM-enabled), the # json:ISIS3 metadata domain is preserved. + def test_isis3_preserve_label_across_format(): - gdal.FileFromMemBuffer('/vsimem/multiband.lbl', """Object = IsisCube + gdal.FileFromMemBuffer( + "/vsimem/multiband.lbl", + """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions @@ -1574,73 +1866,77 @@ def test_isis3_preserve_label_across_format(): End_Group End_Object -End""") - src_ds = gdal.Open('/vsimem/multiband.lbl') +End""", + ) + src_ds = gdal.Open("/vsimem/multiband.lbl") # Copy ISIS3 to GeoTIFF - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', src_ds) + gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/out.tif", src_ds) # Check GeoTIFF - ds = gdal.Open('/vsimem/out.tif') + ds = gdal.Open("/vsimem/out.tif") assert len(ds.GetMetadataDomainList()) == 3 - assert set(ds.GetMetadataDomainList()) == set(['IMAGE_STRUCTURE', 'json:ISIS3', 'DERIVED_SUBDATASETS']) - lbl = ds.GetMetadata_List('json:ISIS3')[0] + assert set(ds.GetMetadataDomainList()) == set( + ["IMAGE_STRUCTURE", "json:ISIS3", "DERIVED_SUBDATASETS"] + ) + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert lbl ds = None - assert gdal.VSIStatL('/vsimem/out.tif.aux.xml') + assert gdal.VSIStatL("/vsimem/out.tif.aux.xml") # Check that the label is in PAM, and not internal to GTiff - with gdaltest.config_option('GDAL_PAM_ENABLED', 'NO'): - ds = gdal.Open('/vsimem/out.tif') - assert not ds.GetMetadata_List('json:ISIS3') + with gdaltest.config_option("GDAL_PAM_ENABLED", "NO"): + ds = gdal.Open("/vsimem/out.tif") + assert not ds.GetMetadata_List("json:ISIS3") # Copy back from GeoTIFF to ISIS3 - src_ds_gtiff = gdal.Open('/vsimem/out.tif') - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.cub', src_ds_gtiff) - assert not gdal.VSIStatL('/vsimem/out.cub.aux.xml') - ds = gdal.Open('/vsimem/out.cub') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + src_ds_gtiff = gdal.Open("/vsimem/out.tif") + gdal.GetDriverByName("ISIS3").CreateCopy("/vsimem/out.cub", src_ds_gtiff) + assert not gdal.VSIStatL("/vsimem/out.cub.aux.xml") + ds = gdal.Open("/vsimem/out.cub") + lbl = ds.GetMetadata_List("json:ISIS3")[0] # Check label preservation - assert 'BandBin' in lbl + assert "BandBin" in lbl ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') - gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.cub') + gdal.GetDriverByName("GTiff").Delete("/vsimem/out.tif") + gdal.GetDriverByName("ISIS3").Delete("/vsimem/out.cub") # Copy ISIS3 to PDS4 with gdaltest.error_handler(): - gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/out.xml', src_ds) - ds = gdal.Open('/vsimem/out.xml') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + gdal.GetDriverByName("PDS4").CreateCopy("/vsimem/out.xml", src_ds) + ds = gdal.Open("/vsimem/out.xml") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert lbl ds = None - assert gdal.VSIStatL('/vsimem/out.xml.aux.xml') - gdal.GetDriverByName('PDS4').Delete('/vsimem/out.xml') + assert gdal.VSIStatL("/vsimem/out.xml.aux.xml") + gdal.GetDriverByName("PDS4").Delete("/vsimem/out.xml") # Copy ISIS3 to PNG - gdal.GetDriverByName('PNG').CreateCopy('/vsimem/out.png', src_ds) - ds = gdal.Open('/vsimem/out.png') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + gdal.GetDriverByName("PNG").CreateCopy("/vsimem/out.png", src_ds) + ds = gdal.Open("/vsimem/out.png") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert lbl ds = None - assert gdal.VSIStatL('/vsimem/out.png.aux.xml') - gdal.GetDriverByName('PNG').Delete('/vsimem/out.png') + assert gdal.VSIStatL("/vsimem/out.png.aux.xml") + gdal.GetDriverByName("PNG").Delete("/vsimem/out.png") # Check GeoTIFF with non pure copy mode (test gdal_translate_lib) - gdal.Translate('/vsimem/out.tif', src_ds, options = '-mo FOO=BAR') - ds = gdal.Open('/vsimem/out.tif') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + gdal.Translate("/vsimem/out.tif", src_ds, options="-mo FOO=BAR") + ds = gdal.Open("/vsimem/out.tif") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert lbl ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/out.tif") # Test converting a subset of bands - gdal.Translate('/vsimem/out.tif', src_ds, options = '-b 2 -mo FOO=BAR') - ds = gdal.Open('/vsimem/out.tif') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + gdal.Translate("/vsimem/out.tif", src_ds, options="-b 2 -mo FOO=BAR") + ds = gdal.Open("/vsimem/out.tif") + lbl = ds.GetMetadata_List("json:ISIS3")[0] lbl = json.loads(lbl) - assert lbl['IsisCube']['BandBin'] == json.loads("""{ + assert lbl["IsisCube"]["BandBin"] == json.loads( + """{ "_type":"group", "BandBinUnit":"MICROMETER", "Width":{ @@ -1658,10 +1954,12 @@ def test_isis3_preserve_label_across_format(): "BandBinCenter":[ 2.000000 ] - }""") + }""" + ) - assert 'OriginalBandBin' in lbl['IsisCube'] - assert lbl['IsisCube']['OriginalBandBin'] == json.loads("""{ + assert "OriginalBandBin" in lbl["IsisCube"] + assert lbl["IsisCube"]["OriginalBandBin"] == json.loads( + """{ "_type":"group", "BandSuffixName":[ "first band", @@ -1683,19 +1981,23 @@ def test_isis3_preserve_label_across_format(): ], "unit":"um" } - }""") + }""" + ) ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/out.tif") src_ds = None - gdal.Unlink('/vsimem/multiband.lbl') + gdal.Unlink("/vsimem/multiband.lbl") def test_isis3_point_perspective_read(): - ds = gdal.Open('data/isis3/isis3_pointperspective.cub') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=nsper +lat_0=-10 +lon_0=-90 +h=31603810 +x_0=0 +y_0=0 +R=3396190 +units=m +no_defs' + ds = gdal.Open("data/isis3/isis3_pointperspective.cub") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=nsper +lat_0=-10 +lon_0=-90 +h=31603810 +x_0=0 +y_0=0 +R=3396190 +units=m +no_defs" + ) def test_isis3_point_perspective_write(): @@ -1706,25 +2008,28 @@ def test_isis3_point_perspective_write(): sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 3000000, 0) sr.SetVerticalPerspective(1, 2, 0, 1000, 0, 0) - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) + ds = gdal.GetDriverByName("ISIS3").Create("/vsimem/isis_tmp.lbl", 1, 1) ds.SetSpatialRef(sr) ds.SetGeoTransform([-10, 1, 0, 40, 0, -1]) ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"CenterLatitude":1.0' in lbl assert '"CenterLongitude":2.0' in lbl assert '"Distance":3001.0' in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") def test_isis3_oblique_cylindrical_read(): - ds = gdal.Open('data/isis3/isis3_obliquecylindrical.cub') + ds = gdal.Open("data/isis3/isis3_obliquecylindrical.cub") srs = ds.GetSpatialRef() - assert srs.ExportToProj4() == '+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs' + assert ( + srs.ExportToProj4() + == "+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs" + ) pixel = ds.RasterXSize / 2.0 line = ds.RasterYSize / 2.0 @@ -1740,18 +2045,20 @@ def test_isis3_oblique_cylindrical_read(): def test_isis3_oblique_cylindrical_write(): - src_ds = gdal.Open('data/isis3/isis3_obliquecylindrical.cub') - ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', src_ds.RasterXSize, src_ds.RasterYSize) + src_ds = gdal.Open("data/isis3/isis3_obliquecylindrical.cub") + ds = gdal.GetDriverByName("ISIS3").Create( + "/vsimem/isis_tmp.lbl", src_ds.RasterXSize, src_ds.RasterYSize + ) ds.SetSpatialRef(src_ds.GetSpatialRef()) ds.SetGeoTransform(src_ds.GetGeoTransform()) src_ds = None ds = None - ds = gdal.Open('/vsimem/isis_tmp.lbl') - lbl = ds.GetMetadata_List('json:ISIS3')[0] + ds = gdal.Open("/vsimem/isis_tmp.lbl") + lbl = ds.GetMetadata_List("json:ISIS3")[0] assert '"PoleLongitude":0.0' in lbl assert '"PoleLatitude":0.0' in lbl assert '"PoleRotation":90.0' in lbl ds = None - gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') + gdal.GetDriverByName("ISIS3").Delete("/vsimem/isis_tmp.lbl") diff --git a/autotest/gdrivers/isis2.py b/autotest/gdrivers/isis2.py index dc847dccb794..d676e5d737f9 100755 --- a/autotest/gdrivers/isis2.py +++ b/autotest/gdrivers/isis2.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -39,7 +38,7 @@ def test_isis2_1(): - tst = gdaltest.GDALTest('ISIS2', 'isis2/arvidson_original_truncated.cub', 1, 382) + tst = gdaltest.GDALTest("ISIS2", "isis2/arvidson_original_truncated.cub", 1, 382) expected_prj = """PROJCS["SIMPLE_CYLINDRICAL VENUS", GEOGCS["GCS_VENUS", DATUM["D_VENUS", @@ -53,30 +52,40 @@ def test_isis2_1(): PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" - expected_gt = (10157400.403618813, 1200.0000476837158, 0.0, -585000.02324581146, 0.0, -1200.0000476837158) - return tst.testOpen(check_prj=expected_prj, - check_gt=expected_gt) + expected_gt = ( + 10157400.403618813, + 1200.0000476837158, + 0.0, + -585000.02324581146, + 0.0, + -1200.0000476837158, + ) + return tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) ############################################################################### # Test simple creation on disk. + def test_isis2_2(): - tst = gdaltest.GDALTest('ISIS2', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("ISIS2", "byte.tif", 1, 4672) return tst.testCreate() + ############################################################################### # Test a different data type with some options. def test_isis2_3(): - tst = gdaltest.GDALTest('ISIS2', 'float32.tif', 1, 4672, - options=['LABELING_METHOD=DETACHED', 'IMAGE_EXTENSION=qub']) + tst = gdaltest.GDALTest( + "ISIS2", + "float32.tif", + 1, + 4672, + options=["LABELING_METHOD=DETACHED", "IMAGE_EXTENSION=qub"], + ) return tst.testCreateCopy(vsimem=1) - - - diff --git a/autotest/gdrivers/jdem.py b/autotest/gdrivers/jdem.py index fad57483e9e2..961589b9ab25 100755 --- a/autotest/gdrivers/jdem.py +++ b/autotest/gdrivers/jdem.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_jdem_1(): - tst = gdaltest.GDALTest('JDEM', 'jdem/fakejdem.mem', 1, 15) + tst = gdaltest.GDALTest("JDEM", "jdem/fakejdem.mem", 1, 15) return tst.testOpen() - - - diff --git a/autotest/gdrivers/jp2kak.py b/autotest/gdrivers/jp2kak.py index 5a5b50b564bb..b327efbf2752 100755 --- a/autotest/gdrivers/jp2kak.py +++ b/autotest/gdrivers/jp2kak.py @@ -30,78 +30,82 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest -pytestmark = pytest.mark.require_driver('JP2KAK') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("JP2KAK") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.jp2kak_drv = gdal.GetDriverByName('JP2KAK') + gdaltest.jp2kak_drv = gdal.GetDriverByName("JP2KAK") assert gdaltest.jp2kak_drv is not None - gdaltest.deregister_all_jpeg2000_drivers_but('JP2KAK') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2KAK") yield gdaltest.reregister_all_jpeg2000_drivers() + ############################################################################### # Read test of simple byte reference data. def test_jp2kak_1(): - tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054) + tst = gdaltest.GDALTest("JP2KAK", "jpeg2000/byte.jp2", 1, 50054) return tst.testOpen() + ############################################################################### # Read test of simple 16bit reference data. def test_jp2kak_2(): - tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/int16.jp2', 1, 4587) + tst = gdaltest.GDALTest("JP2KAK", "jpeg2000/int16.jp2", 1, 4587) return tst.testOpen() + ############################################################################### # Test lossless copying. def test_jp2kak_3(): - tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054, - options=['QUALITY=100']) + tst = gdaltest.GDALTest( + "JP2KAK", "jpeg2000/byte.jp2", 1, 50054, options=["QUALITY=100"] + ) return tst.testCreateCopy() + ############################################################################### # Test GeoJP2 production with geotransform. def test_jp2kak_4(): - tst = gdaltest.GDALTest('JP2KAK', 'rgbsmall.tif', 0, 0, - options=['GMLJP2=OFF']) + tst = gdaltest.GDALTest("JP2KAK", "rgbsmall.tif", 0, 0, options=["GMLJP2=OFF"]) return tst.testCreateCopy(check_srs=1, check_gt=1) + ############################################################################### # Test GeoJP2 production with gcps. def test_jp2kak_5(): - tst = gdaltest.GDALTest('JP2KAK', 'rgbsmall.tif', 0, 0, - options=['GEOJP2=OFF']) + tst = gdaltest.GDALTest("JP2KAK", "rgbsmall.tif", 0, 0, options=["GEOJP2=OFF"]) return tst.testCreateCopy(check_srs=1, check_gt=1) + ############################################################################### # Test VSI*L support with a JPC rather than jp2 datastream. # @@ -109,11 +113,12 @@ def test_jp2kak_5(): def test_jp2kak_8(): - tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054, - options=['QUALITY=100']) + tst = gdaltest.GDALTest( + "JP2KAK", "jpeg2000/byte.jp2", 1, 50054, options=["QUALITY=100"] + ) + + return tst.testCreateCopy(vsimem=1, new_filename="/vsimem/jp2kak_8.jpc") - return tst.testCreateCopy(vsimem=1, - new_filename='/vsimem/jp2kak_8.jpc') ############################################################################### # Test checksum values for a YCbCr color model file. @@ -122,9 +127,10 @@ def test_jp2kak_8(): def test_jp2kak_9(): - tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2', 2, 32141) + tst = gdaltest.GDALTest("JP2KAK", "jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2", 2, 32141) return tst.testOpen() + ############################################################################### # Confirm that we can also read this file using the DirectRasterIO() # function and get appropriate values. @@ -133,18 +139,27 @@ def test_jp2kak_9(): def test_jp2kak_10(): - ds = gdal.Open('data/jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2') - data = ds.ReadRaster(0, 0, 800, 100, band_list=[2, 3]).decode('latin1') + ds = gdal.Open("data/jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2") + data = ds.ReadRaster(0, 0, 800, 100, band_list=[2, 3]).decode("latin1") ds = None - expected = [(0, 0), (255, 0), (0, 255), (255, 255), - (255, 255), (0, 255), (255, 0), (0, 0)] + expected = [ + (0, 0), + (255, 0), + (0, 255), + (255, 255), + (255, 255), + (0, 255), + (255, 0), + (0, 0), + ] got = [] for x in range(8): got.append((ord(data[x * 100]), ord(data[80000 + x * 100]))) - assert got == expected, 'did not get expected values.' + assert got == expected, "did not get expected values." + ############################################################################### # Test handle of 11bit signed file. @@ -153,10 +168,11 @@ def test_jp2kak_10(): def test_jp2kak_11(): - ds = gdal.Open('data/jpeg2000/gtsmall_11_int16.jp2') + ds = gdal.Open("data/jpeg2000/gtsmall_11_int16.jp2") cs = ds.GetRasterBand(1).Checksum() assert cs in (63475, 63472, 63452, 63471) + ############################################################################### # Test handle of 10bit unsigned file. # @@ -164,7 +180,7 @@ def test_jp2kak_11(): def test_jp2kak_12(): - ds = gdal.Open('data/jpeg2000/gtsmall_10_uint16.jp2') + ds = gdal.Open("data/jpeg2000/gtsmall_10_uint16.jp2") cs = ds.GetRasterBand(1).Checksum() assert cs in (63360, 63653, 63357, 63358) @@ -173,28 +189,37 @@ def test_jp2kak_12(): # Test internal overviews. # -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) + +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_13(use_stripe_compressor): - src_ds = gdal.Open('data/pcidsk/utm.pix') - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): - with gdaltest.config_option('JP2KAK_THREADS', '0'): - jp2_ds = gdaltest.jp2kak_drv.CreateCopy('tmp/jp2kak_13.jp2', src_ds) + src_ds = gdal.Open("data/pcidsk/utm.pix") + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): + with gdaltest.config_option("JP2KAK_THREADS", "0"): + jp2_ds = gdaltest.jp2kak_drv.CreateCopy("tmp/jp2kak_13.jp2", src_ds) src_ds = None jp2_band = jp2_ds.GetRasterBand(1) - assert jp2_band.GetOverviewCount() == 1, \ - 'did not get expected number of overviews on jp2' + assert ( + jp2_band.GetOverviewCount() == 1 + ), "did not get expected number of overviews on jp2" ov_band = jp2_band.GetOverview(0) - assert ov_band.XSize == 250 and ov_band.YSize == 4, \ - 'did not get expected overview size.' + assert ( + ov_band.XSize == 250 and ov_band.YSize == 4 + ), "did not get expected overview size." # # Note, due to oddities of rounding related to identifying discard # levels the overview is actually generated with no discard levels # and in the debug output we see 500x7 -> 500x7 -> 250x4. checksum = ov_band.Checksum() - assert checksum in (11767, 11776, 11736, 11801), 'did not get expected overview checksum' + assert checksum in ( + 11767, + 11776, + 11736, + 11801, + ), "did not get expected overview checksum" + ############################################################################### # Test external overviews. @@ -203,30 +228,44 @@ def test_jp2kak_13(use_stripe_compressor): def test_jp2kak_14(): - jp2_ds = gdal.Open('tmp/jp2kak_13.jp2') + jp2_ds = gdal.Open("tmp/jp2kak_13.jp2") - jp2_ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) + jp2_ds.BuildOverviews("NEAREST", overviewlist=[2, 4]) jp2_band = jp2_ds.GetRasterBand(1) - assert jp2_band.GetOverviewCount() == 2, \ - 'did not get expected number of overviews on jp2' + assert ( + jp2_band.GetOverviewCount() == 2 + ), "did not get expected number of overviews on jp2" ov_band = jp2_band.GetOverview(0) - assert ov_band.XSize == 250 and ov_band.YSize == 4, \ - 'did not get expected overview size.' + assert ( + ov_band.XSize == 250 and ov_band.YSize == 4 + ), "did not get expected overview size." checksum = ov_band.Checksum() - assert checksum in (12224, 12279, 12272, 12288), 'did not get expected overview checksum' + assert checksum in ( + 12224, + 12279, + 12272, + 12288, + ), "did not get expected overview checksum" ov_band = jp2_band.GetOverview(1) - assert ov_band.XSize == 125 and ov_band.YSize == 2, \ - 'did not get expected overview size. (2)' + assert ( + ov_band.XSize == 125 and ov_band.YSize == 2 + ), "did not get expected overview size. (2)" checksum = ov_band.Checksum() - assert checksum in (2918, 2957, 2980, 2990), 'did not get expected overview checksum (2)' + assert checksum in ( + 2918, + 2957, + 2980, + 2990, + ), "did not get expected overview checksum (2)" jp2_ds = None - gdaltest.jp2kak_drv.Delete('tmp/jp2kak_13.jp2') + gdaltest.jp2kak_drv.Delete("tmp/jp2kak_13.jp2") + # ############################################################################### @@ -236,16 +275,18 @@ def test_jp2kak_14(): def test_jp2kak_15(): - jp2_ds = gdal.Open('data/jpeg2000/small_200ppcm.jp2') + jp2_ds = gdal.Open("data/jpeg2000/small_200ppcm.jp2") md = jp2_ds.GetMetadata() - assert (not (md['TIFFTAG_RESOLUTIONUNIT'] != '3 (pixels/cm)' or - md['TIFFTAG_XRESOLUTION'] != '200.012')), \ - 'did not get expected resolution metadata' + assert not ( + md["TIFFTAG_RESOLUTIONUNIT"] != "3 (pixels/cm)" + or md["TIFFTAG_XRESOLUTION"] != "200.012" + ), "did not get expected resolution metadata" jp2_ds = None + ############################################################################### # Confirm we can write and then reread resolution information. # @@ -253,21 +294,23 @@ def test_jp2kak_15(): def test_jp2kak_16(): - jp2_ds = gdal.Open('data/jpeg2000/small_200ppcm.jp2') - out_ds = gdaltest.jp2kak_drv.CreateCopy('tmp/jp2kak_16.jp2', jp2_ds) + jp2_ds = gdal.Open("data/jpeg2000/small_200ppcm.jp2") + out_ds = gdaltest.jp2kak_drv.CreateCopy("tmp/jp2kak_16.jp2", jp2_ds) del out_ds jp2_ds = None - jp2_ds = gdal.Open('tmp/jp2kak_16.jp2') + jp2_ds = gdal.Open("tmp/jp2kak_16.jp2") md = jp2_ds.GetMetadata() - assert (not (md['TIFFTAG_RESOLUTIONUNIT'] != '3 (pixels/cm)' or - md['TIFFTAG_XRESOLUTION'] != '200.012')), \ - 'did not get expected resolution metadata' + assert not ( + md["TIFFTAG_RESOLUTIONUNIT"] != "3 (pixels/cm)" + or md["TIFFTAG_XRESOLUTION"] != "200.012" + ), "did not get expected resolution metadata" jp2_ds = None - gdaltest.jp2kak_drv.Delete('tmp/jp2kak_16.jp2') + gdaltest.jp2kak_drv.Delete("tmp/jp2kak_16.jp2") + ############################################################################### # Test reading a file with axis orientation set properly for an alternate @@ -280,93 +323,129 @@ def test_jp2kak_16(): def test_jp2kak_17(): - gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'YES') + gdal.SetConfigOption("GDAL_JP2K_ALT_OFFSETVECTOR_ORDER", "YES") - ds = gdal.Open('data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes_alt_offsetVector.jp2') + ds = gdal.Open("data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes_alt_offsetVector.jp2") gt = ds.GetGeoTransform() - gte = (42.999583333333369, 0.008271349862259, 0, - 34.000416666666631, 0, -0.008271349862259) - - if (gt[0] != pytest.approx(gte[0], abs=0.0000001) or - gt[3] != pytest.approx(gte[3], abs=0.000001) or - gt[1] != pytest.approx(gte[1], abs=0.000000000005) or - gt[2] != pytest.approx(gte[2], abs=0.000000000005) or - gt[4] != pytest.approx(gte[4], abs=0.000000000005) or - gt[5] != pytest.approx(gte[5], abs=0.000000000005)): - print('got: ', gt) - gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'NO') - pytest.fail('did not get expected geotransform') + gte = ( + 42.999583333333369, + 0.008271349862259, + 0, + 34.000416666666631, + 0, + -0.008271349862259, + ) + + if ( + gt[0] != pytest.approx(gte[0], abs=0.0000001) + or gt[3] != pytest.approx(gte[3], abs=0.000001) + or gt[1] != pytest.approx(gte[1], abs=0.000000000005) + or gt[2] != pytest.approx(gte[2], abs=0.000000000005) + or gt[4] != pytest.approx(gte[4], abs=0.000000000005) + or gt[5] != pytest.approx(gte[5], abs=0.000000000005) + ): + print("got: ", gt) + gdal.SetConfigOption("GDAL_JP2K_ALT_OFFSETVECTOR_ORDER", "NO") + pytest.fail("did not get expected geotransform") ds = None - gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'NO') + gdal.SetConfigOption("GDAL_JP2K_ALT_OFFSETVECTOR_ORDER", "NO") + ############################################################################### # Test lossless copying of Int16 -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) + +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_lossless_int16(use_stripe_compressor): - tst = gdaltest.GDALTest('JP2KAK', 'int16.tif', 1, 4672, - options=['QUALITY=100']) + tst = gdaltest.GDALTest("JP2KAK", "int16.tif", 1, 4672, options=["QUALITY=100"]) - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): return tst.testCreateCopy() + ############################################################################### # Test lossless copying of UInt16 -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_lossless_uint16(use_stripe_compressor): - tst = gdaltest.GDALTest('JP2KAK', '../gcore/data/uint16.tif', 1, 4672, - options=['QUALITY=100'], filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2KAK", + "../gcore/data/uint16.tif", + 1, + 4672, + options=["QUALITY=100"], + filename_absolute=1, + ) - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test lossless copying of Int32 -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_lossless_int32(use_stripe_compressor): - tst = gdaltest.GDALTest('JP2KAK', '../gcore/data/int32.tif', 1, 4672, - options=['QUALITY=100'], filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2KAK", + "../gcore/data/int32.tif", + 1, + 4672, + options=["QUALITY=100"], + filename_absolute=1, + ) - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): return tst.testCreateCopy() + ############################################################################### # Test lossless copying of UInt32 -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_lossless_uint32(use_stripe_compressor): - tst = gdaltest.GDALTest('JP2KAK', '../gcore/data/uint32.tif', 1, 4672, - options=['QUALITY=100'], filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2KAK", + "../gcore/data/uint32.tif", + 1, + 4672, + options=["QUALITY=100"], + filename_absolute=1, + ) - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test lossless copying of Int32 -@pytest.mark.parametrize("use_stripe_compressor", ['YES', 'NO']) +@pytest.mark.parametrize("use_stripe_compressor", ["YES", "NO"]) def test_jp2kak_lossless_int32_nbits_20(use_stripe_compressor): - src_ds = gdal.Translate('', '../gcore/data/int32.tif', options='-of MEM -scale 74 255 -524288 524287') - tmpfilename = '/vsimem/test_jp2kak_lossless_int32_nbits_20.j2k' - with gdaltest.config_option('JP2KAK_USE_STRIPE_COMPRESSOR', use_stripe_compressor): - gdal.GetDriverByName('JP2KAK').CreateCopy(tmpfilename, src_ds, options = ['QUALITY=100', 'NBITS=20']) + src_ds = gdal.Translate( + "", "../gcore/data/int32.tif", options="-of MEM -scale 74 255 -524288 524287" + ) + tmpfilename = "/vsimem/test_jp2kak_lossless_int32_nbits_20.j2k" + with gdaltest.config_option("JP2KAK_USE_STRIPE_COMPRESSOR", use_stripe_compressor): + gdal.GetDriverByName("JP2KAK").CreateCopy( + tmpfilename, src_ds, options=["QUALITY=100", "NBITS=20"] + ) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).ReadRaster() == src_ds.GetRasterBand(1).ReadRaster() - gdal.GetDriverByName('JP2KAK').Delete(tmpfilename) + gdal.GetDriverByName("JP2KAK").Delete(tmpfilename) + ############################################################################### # Test lossless copying of UInt32 @@ -374,12 +453,17 @@ def test_jp2kak_lossless_int32_nbits_20(use_stripe_compressor): def test_jp2kak_lossless_uint32_nbits_20(): - src_ds = gdal.Translate('', '../gcore/data/uint32.tif', options='-of MEM -scale 74 255 0 1048575') - tmpfilename = '/vsimem/test_jp2kak_lossless_uint32_nbits_20.j2k' - gdal.GetDriverByName('JP2KAK').CreateCopy(tmpfilename, src_ds, options = ['QUALITY=100', 'NBITS=20']) + src_ds = gdal.Translate( + "", "../gcore/data/uint32.tif", options="-of MEM -scale 74 255 0 1048575" + ) + tmpfilename = "/vsimem/test_jp2kak_lossless_uint32_nbits_20.j2k" + gdal.GetDriverByName("JP2KAK").CreateCopy( + tmpfilename, src_ds, options=["QUALITY=100", "NBITS=20"] + ) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).ReadRaster() == src_ds.GetRasterBand(1).ReadRaster() - gdal.GetDriverByName('JP2KAK').Delete(tmpfilename) + gdal.GetDriverByName("JP2KAK").Delete(tmpfilename) + ############################################################################### # Test lossy copying of Int32 @@ -387,12 +471,19 @@ def test_jp2kak_lossless_uint32_nbits_20(): def test_jp2kak_lossy_int32_nbits_20(): - src_ds = gdal.Translate('', '../gcore/data/int32.tif', options='-of MEM -scale 74 255 -524288 524287') - tmpfilename = '/vsimem/test_jp2kak_lossy_int32_nbits_20.j2k' - gdal.GetDriverByName('JP2KAK').CreateCopy(tmpfilename, src_ds, options = ['QUALITY=80', 'NBITS=20']) + src_ds = gdal.Translate( + "", "../gcore/data/int32.tif", options="-of MEM -scale 74 255 -524288 524287" + ) + tmpfilename = "/vsimem/test_jp2kak_lossy_int32_nbits_20.j2k" + gdal.GetDriverByName("JP2KAK").CreateCopy( + tmpfilename, src_ds, options=["QUALITY=80", "NBITS=20"] + ) ds = gdal.Open(tmpfilename) - assert src_ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx(ds.GetRasterBand(1).ComputeStatistics(False), rel=1e-2) - gdal.GetDriverByName('JP2KAK').Delete(tmpfilename) + assert src_ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx( + ds.GetRasterBand(1).ComputeStatistics(False), rel=1e-2 + ) + gdal.GetDriverByName("JP2KAK").Delete(tmpfilename) + ############################################################################### # Test lossy copying of UInt32 @@ -400,13 +491,20 @@ def test_jp2kak_lossy_int32_nbits_20(): def test_jp2kak_lossy_uint32_nbits_20(): - src_ds = gdal.Translate('', '../gcore/data/uint32.tif', options='-of MEM -scale 74 255 0 1048575') - tmpfilename = '/vsimem/test_jp2kak_lossy_uint32_nbits_20.j2k' - with gdaltest.config_option('JP2KAK_THREADS', '0'): - gdal.GetDriverByName('JP2KAK').CreateCopy(tmpfilename, src_ds, options = ['QUALITY=80', 'NBITS=20']) + src_ds = gdal.Translate( + "", "../gcore/data/uint32.tif", options="-of MEM -scale 74 255 0 1048575" + ) + tmpfilename = "/vsimem/test_jp2kak_lossy_uint32_nbits_20.j2k" + with gdaltest.config_option("JP2KAK_THREADS", "0"): + gdal.GetDriverByName("JP2KAK").CreateCopy( + tmpfilename, src_ds, options=["QUALITY=80", "NBITS=20"] + ) ds = gdal.Open(tmpfilename) - assert src_ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx(ds.GetRasterBand(1).ComputeStatistics(False), rel=1e-2) - gdal.GetDriverByName('JP2KAK').Delete(tmpfilename) + assert src_ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx( + ds.GetRasterBand(1).ComputeStatistics(False), rel=1e-2 + ) + gdal.GetDriverByName("JP2KAK").Delete(tmpfilename) + ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit @@ -414,19 +512,25 @@ def test_jp2kak_lossy_uint32_nbits_20(): def test_jp2kak_20(): - ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2") fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # jp2_fourth_band_data = fourth_band.ReadRaster( # 0, 0, ds.RasterXSize, ds.RasterYSize) - fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, - int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) - - tiff_drv = gdal.GetDriverByName('GTiff') - tmp_ds = tiff_drv.CreateCopy('/vsimem/jp2kak_20.tif', ds) + fourth_band.ReadRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + int(ds.RasterXSize / 16), + int(ds.RasterYSize / 16), + ) + + tiff_drv = gdal.GetDriverByName("GTiff") + tmp_ds = tiff_drv.CreateCopy("/vsimem/jp2kak_20.tif", ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) @@ -436,7 +540,7 @@ def test_jp2kak_20(): # 0, 0, ds.RasterXSize, ds.RasterYSize, # ds.RasterXSize/16, ds.RasterYSize/16) tmp_ds = None - tiff_drv.Delete('/vsimem/jp2kak_20.tif') + tiff_drv.Delete("/vsimem/jp2kak_20.tif") assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data @@ -445,10 +549,13 @@ def test_jp2kak_20(): # gdaltest.post_reason('fail') # return 'fail' - ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', - open_options=['1BIT_ALPHA_PROMOTION=NO']) + ds = gdal.OpenEx( + "data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2", + open_options=["1BIT_ALPHA_PROMOTION=NO"], + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" + ############################################################################### # Test non nearest upsampling @@ -457,46 +564,54 @@ def test_jp2kak_20(): def test_jp2kak_21(): tmp_ds = gdaltest.jp2kak_drv.CreateCopy( - '/vsimem/jp2kak_21.jp2', - gdal.Open('data/int16.tif'), options=['QUALITY=100']) + "/vsimem/jp2kak_21.jp2", gdal.Open("data/int16.tif"), options=["QUALITY=100"] + ) tmp_ds = None - tmp_ds = gdal.Open('/vsimem/jp2kak_21.jp2') + tmp_ds = gdal.Open("/vsimem/jp2kak_21.jp2") full_res_data = tmp_ds.ReadRaster(0, 0, 20, 20) - upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, - resample_alg=gdal.GRIORA_Cubic) + upsampled_data = tmp_ds.ReadRaster( + 0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic + ) tmp_ds = None - gdal.Unlink('/vsimem/jp2kak_21.jp2') + gdal.Unlink("/vsimem/jp2kak_21.jp2") - tmp_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Int16) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 20, 20, 1, gdal.GDT_Int16) tmp_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, full_res_data) - ref_upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, - resample_alg=gdal.GRIORA_Cubic) + ref_upsampled_data = tmp_ds.ReadRaster( + 0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic + ) - mem_ds = gdal.GetDriverByName('MEM').Create('', 40, 40, 1, gdal.GDT_Int16) + mem_ds = gdal.GetDriverByName("MEM").Create("", 40, 40, 1, gdal.GDT_Int16) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, ref_upsampled_data) ref_cs = mem_ds.GetRasterBand(1).Checksum() mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, upsampled_data) cs = mem_ds.GetRasterBand(1).Checksum() assert cs == ref_cs + ############################################################################### # Test RGBA datasets def test_jp2kak_22(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['QUALITY=100']) - ds = gdal.Open('/vsimem/jp2kak_22.jp2') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["QUALITY=100"] + ) + ds = gdal.Open("/vsimem/jp2kak_22.jp2") for i in range(4): ref_cs = src_ds.GetRasterBand(1).Checksum() cs = ds.GetRasterBand(1).Checksum() assert ref_cs == cs, i - assert src_ds.GetRasterBand(1).GetColorInterpretation() == ds.GetRasterBand(1).GetColorInterpretation(), \ - i + assert ( + src_ds.GetRasterBand(1).GetColorInterpretation() + == ds.GetRasterBand(1).GetColorInterpretation() + ), i ds = None - gdal.Unlink('/vsimem/jp2kak_22.jp2') + gdal.Unlink("/vsimem/jp2kak_22.jp2") + ############################################################################### # Test accessing overview levels when the dimensions of the full resolution @@ -505,29 +620,34 @@ def test_jp2kak_22(): def test_jp2kak_odd_dimensions(): - ds = gdal.Open('data/jpeg2000/513x513.jp2') + ds = gdal.Open("data/jpeg2000/513x513.jp2") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None assert cs == 29642 + ############################################################################### # Test reading an image whose origin is not (0,0) def test_jp2kak_image_origin_not_zero(): - ds = gdal.Open('data/jpeg2000/byte_image_origin_not_zero.jp2') + ds = gdal.Open("data/jpeg2000/byte_image_origin_not_zero.jp2") assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) is not None + assert ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) is not None + ############################################################################### # Test multiple RATE parameters + def test_jp2openjpeg_test_multi_rate(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5,2,3,4', 'LAYERS=4']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["RATE=1.5,2,3,4", "LAYERS=4"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -539,24 +659,28 @@ def test_jp2openjpeg_test_multi_rate(): # 9.1e+03 -> 9112 (24300 * 3 * 0.125F) # 1.2e+04 -> 12150 (24300 * 4 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[2].split('\n')[0].strip() == '4.6e+03' - assert split[3].split('\n')[0].strip() == '6.1e+03' - assert split[4].split('\n')[0].strip() == '9.1e+03' - assert split[5].split('\n')[0].strip() == '1.2e+04' + assert split[2].split("\n")[0].strip() == "4.6e+03" + assert split[3].split("\n")[0].strip() == "6.1e+03" + assert split[4].split("\n")[0].strip() == "9.1e+03" + assert split[5].split("\n")[0].strip() == "1.2e+04" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test multiple RATE parameters using dash as first value + def test_jp2openjpeg_test_multi_rate_dash(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=-,4', 'LAYERS=4']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["RATE=-,4", "LAYERS=4"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -569,22 +693,26 @@ def test_jp2openjpeg_test_multi_rate_dash(): # 0 # 0 - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[2].split('\n')[0].strip() == '1.2e+04' + assert split[2].split("\n")[0].strip() == "1.2e+04" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test single RATE parameter + def test_jp2openjpeg_test_single_rate(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5', 'LAYERS=4']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["RATE=1.5", "LAYERS=4"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -594,22 +722,26 @@ def test_jp2openjpeg_test_single_rate(): # First layers are 0; only the last one has a defined value # 4.6e+03 -> 4556 (24300 * 1.5 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[5].split('\n')[0].strip() == '4.6e+03' + assert split[5].split("\n")[0].strip() == "4.6e+03" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test single RATE parameter with defined quality < 99.5 + def test_jp2openjpeg_test_multi_rate_quality_50(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5', 'LAYERS=4', 'QUALITY=50']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["RATE=1.5", "LAYERS=4", "QUALITY=50"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -619,21 +751,25 @@ def test_jp2openjpeg_test_multi_rate_quality_50(): # First layers are 0; only the last one has a defined value # 4.6e+03 -> 4556 (24300 * 1.5 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[5].split('\n')[0].strip() == '4.6e+03' + assert split[5].split("\n")[0].strip() == "4.6e+03" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test single RATE parameter with defined quality > 99.5 + def test_jp2openjpeg_test_multi_rate_quality_100(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5', 'LAYERS=4', 'QUALITY=100']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["RATE=1.5", "LAYERS=4", "QUALITY=100"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -642,23 +778,28 @@ def test_jp2openjpeg_test_multi_rate_quality_100(): # dfPixelsTotal = 24300 # First layers are 0; only the last one has a defined value # 4.6e+03 -> 4556 (24300 * 1.5 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[5].split('\n')[0].strip() == '4.6e+03' + assert split[5].split("\n")[0].strip() == "4.6e+03" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test single RATE parameter with defined quality > 99.5 and the Creversible option + def test_jp2openjpeg_test_multi_rate_quality_100_reversible(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5', 'LAYERS=4', 'QUALITY=100', - 'Creversible=yes']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", + src_ds, + options=["RATE=1.5", "LAYERS=4", "QUALITY=100", "Creversible=yes"], + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -667,23 +808,28 @@ def test_jp2openjpeg_test_multi_rate_quality_100_reversible(): # dfPixelsTotal = 24300 # First layers are 0; only the last one has a defined value # 4.6e+03 -> 4556 (24300 * 1.5 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[5].split('\n')[0].strip() == '4.6e+03' + assert split[5].split("\n")[0].strip() == "4.6e+03" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test single RATE parameter with defined quality > 99.5 and the Creversible option + def test_jp2openjpeg_test_multi_rate_quality_100_no_reversible(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['RATE=1.5', 'LAYERS=4', 'QUALITY=100', - 'Creversible=no']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", + src_ds, + options=["RATE=1.5", "LAYERS=4", "QUALITY=100", "Creversible=no"], + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) @@ -692,55 +838,65 @@ def test_jp2openjpeg_test_multi_rate_quality_100_no_reversible(): # dfPixelsTotal = 24300 # First layers are 0; only the last one has a defined value # 4.6e+03 -> 4556 (24300 * 1.5 * 0.125F) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 4 layers + 2 blocs for extra information assert len(split) == 6 - assert split[5].split('\n')[0].strip() == '4.6e+03' + assert split[5].split("\n")[0].strip() == "4.6e+03" + + gdal.Unlink("/vsimem/jp2kak_22.jp2") - gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test quality > 99.5 and the Creversible option + def test_jp2openjpeg_test_quality_100_no_reversible(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['QUALITY=100', 'Creversible=no']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["QUALITY=100", "Creversible=no"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 12 layers + 2 blocs for extra information assert len(split) == 14 - gdal.Unlink('/vsimem/jp2kak_22.jp2') + gdal.Unlink("/vsimem/jp2kak_22.jp2") + ############################################################################### # Test quality > 99.5 and the Creversible option + def test_jp2openjpeg_test_quality_100_reversible(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['QUALITY=100', 'Creversible=yes']) - node = gdal.GetJPEG2000Structure('/vsimem/jp2kak_22.jp2', ['ALL=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + gdaltest.jp2kak_drv.CreateCopy( + "/vsimem/jp2kak_22.jp2", src_ds, options=["QUALITY=100", "Creversible=yes"] + ) + node = gdal.GetJPEG2000Structure("/vsimem/jp2kak_22.jp2", ["ALL=YES"]) arr = [] find_elements_with_name(node, "Field", "COM", arr) - split = arr[4][5][1].split(',') + split = arr[4][5][1].split(",") # 12 layers + 2 blocs for extra information assert len(split) == 14 - gdal.Unlink('/vsimem/jp2kak_22.jp2') + gdal.Unlink("/vsimem/jp2kak_22.jp2") return False + XML_TYPE_IDX = 0 XML_VALUE_IDX = 1 XML_FIRST_CHILD_IDX = 2 + def get_element_val(node): if node is None: return None @@ -750,10 +906,15 @@ def get_element_val(node): return child[XML_VALUE_IDX] return None + def find_element_with_name(ar, element_name, name): typ = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] - if typ == gdal.CXT_Element and value == element_name and get_attribute_val(ar, 'name') == name: + if ( + typ == gdal.CXT_Element + and value == element_name + and get_attribute_val(ar, "name") == name + ): return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] @@ -762,10 +923,15 @@ def find_element_with_name(ar, element_name, name): return found return None + def find_elements_with_name(ar, element_name, name, arr): typ = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] - if typ == gdal.CXT_Element and value == element_name and get_attribute_val(ar, 'name') == name: + if ( + typ == gdal.CXT_Element + and value == element_name + and get_attribute_val(ar, "name") == name + ): return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] @@ -776,15 +942,19 @@ def find_elements_with_name(ar, element_name, name, arr): find_elements_with_name(child, element_name, name, arr) return None + def get_attribute_val(ar, attr_name): node = find_xml_node(ar, attr_name, True) if node is None or node[XML_TYPE_IDX] != gdal.CXT_Attribute: return None - if len(ar) > XML_FIRST_CHILD_IDX and \ - node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text: + if ( + len(ar) > XML_FIRST_CHILD_IDX + and node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text + ): return node[XML_FIRST_CHILD_IDX][XML_VALUE_IDX] return None + def find_xml_node(ar, element_name, only_attributes=False): # type = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] diff --git a/autotest/gdrivers/jp2lura.py b/autotest/gdrivers/jp2lura.py index 65f0d8785377..37ba93aca8c3 100755 --- a/autotest/gdrivers/jp2lura.py +++ b/autotest/gdrivers/jp2lura.py @@ -30,41 +30,47 @@ ############################################################################### import os +import shutil import struct import sys -import shutil -from osgeo import gdal -from osgeo import ogr -from osgeo import osr -import pytest import gdaltest +import pytest from test_py_scripts import samples_path +from osgeo import gdal, ogr, osr + + def jp2lura_available(): - if gdal.GetConfigOption('LURA_LICENSE_NUM_1') is None or \ - gdal.GetConfigOption('LURA_LICENSE_NUM_2') is None: + if ( + gdal.GetConfigOption("LURA_LICENSE_NUM_1") is None + or gdal.GetConfigOption("LURA_LICENSE_NUM_2") is None + ): return False - gdaltest.deregister_all_jpeg2000_drivers_but('JP2Lura') - ds = gdal.Open( os.path.join(os.path.dirname(__file__), 'data/jpeg2000/byte.jp2') ) + gdaltest.deregister_all_jpeg2000_drivers_but("JP2Lura") + ds = gdal.Open(os.path.join(os.path.dirname(__file__), "data/jpeg2000/byte.jp2")) gdaltest.reregister_all_jpeg2000_drivers() return ds is not None -pytestmark = [ pytest.mark.require_driver('JP2Lura'), - pytest.mark.skipif(not jp2lura_available(), reason='JP2Lura driver not available or missing license') - ] +pytestmark = [ + pytest.mark.require_driver("JP2Lura"), + pytest.mark.skipif( + not jp2lura_available(), + reason="JP2Lura driver not available or missing license", + ), +] ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.jp2lura_drv = gdal.GetDriverByName('JP2Lura') + gdaltest.jp2lura_drv = gdal.GetDriverByName("JP2Lura") assert gdaltest.jp2lura_drv is not None - gdaltest.deregister_all_jpeg2000_drivers_but('JP2Lura') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2Lura") yield @@ -77,68 +83,78 @@ def startup_and_cleanup(): def test_jp2lura_missing_license_num(): - - old_num_1 = gdal.GetConfigOption('LURA_LICENSE_NUM_1') - old_num_2 = gdal.GetConfigOption('LURA_LICENSE_NUM_2') - gdal.SetConfigOption('LURA_LICENSE_NUM_1', '') - gdal.SetConfigOption('LURA_LICENSE_NUM_2', '') + old_num_1 = gdal.GetConfigOption("LURA_LICENSE_NUM_1") + old_num_2 = gdal.GetConfigOption("LURA_LICENSE_NUM_2") + gdal.SetConfigOption("LURA_LICENSE_NUM_1", "") + gdal.SetConfigOption("LURA_LICENSE_NUM_2", "") with gdaltest.error_handler(): - ds = gdal.Open('data/jpeg2000/byte.jp2') - gdal.SetConfigOption('LURA_LICENSE_NUM_1', old_num_1) - gdal.SetConfigOption('LURA_LICENSE_NUM_2', old_num_2) + ds = gdal.Open("data/jpeg2000/byte.jp2") + gdal.SetConfigOption("LURA_LICENSE_NUM_1", old_num_1) + gdal.SetConfigOption("LURA_LICENSE_NUM_2", old_num_2) assert ds is None + ############################################################################### # def test_jp2lura_invalid_license_num(): - - old_num_1 = gdal.GetConfigOption('LURA_LICENSE_NUM_1') - old_num_2 = gdal.GetConfigOption('LURA_LICENSE_NUM_2') - gdal.SetConfigOption('LURA_LICENSE_NUM_1', '1') - gdal.SetConfigOption('LURA_LICENSE_NUM_2', '1') + old_num_1 = gdal.GetConfigOption("LURA_LICENSE_NUM_1") + old_num_2 = gdal.GetConfigOption("LURA_LICENSE_NUM_2") + gdal.SetConfigOption("LURA_LICENSE_NUM_1", "1") + gdal.SetConfigOption("LURA_LICENSE_NUM_2", "1") with gdaltest.error_handler(): - ds = gdal.Open('data/jpeg2000/byte.jp2') - gdal.SetConfigOption('LURA_LICENSE_NUM_1', old_num_1) - gdal.SetConfigOption('LURA_LICENSE_NUM_2', old_num_2) + ds = gdal.Open("data/jpeg2000/byte.jp2") + gdal.SetConfigOption("LURA_LICENSE_NUM_1", old_num_1) + gdal.SetConfigOption("LURA_LICENSE_NUM_2", old_num_2) assert ds is None + ############################################################################### -def validate(filename, expected_gmljp2=True, return_error_count=False, oidoc=None, inspire_tg=True): +def validate( + filename, + expected_gmljp2=True, + return_error_count=False, + oidoc=None, + inspire_tg=True, +): path = samples_path if path not in sys.path: sys.path.append(path) - validate_jp2 = pytest.importorskip('validate_jp2') + validate_jp2 = pytest.importorskip("validate_jp2") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') - ogc_schemas_location = 'tmp/cache/SCHEMAS_OPENGIS_NET' + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET") + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd") + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd") + ogc_schemas_location = "tmp/cache/SCHEMAS_OPENGIS_NET" except OSError: - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" - if ogc_schemas_location != 'disabled': + if ogc_schemas_location != "disabled": try: import xmlvalidate + xmlvalidate.validate # to make pyflakes happy except (ImportError, AttributeError): - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" - res = validate_jp2.validate(filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location) + res = validate_jp2.validate( + filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location + ) if return_error_count: return (res.error_count, res.warning_count) if res.error_count == 0 and res.warning_count == 0: return pytest.fail() + ############################################################################### # Open byte.jp2 @@ -166,17 +182,18 @@ def test_jp2lura_2(): """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/byte.jp2', 1, 50054) + tst = gdaltest.GDALTest("JP2Lura", "jpeg2000/byte.jp2", 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Open int16.jp2 def test_jp2lura_3(): - ds = gdal.Open('data/jpeg2000/int16.jp2') - ds_ref = gdal.Open('data/int16.tif') + ds = gdal.Open("data/jpeg2000/int16.jp2") + ds_ref = gdal.Open("data/int16.tif") maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) @@ -186,51 +203,55 @@ def test_jp2lura_3(): ds_ref = None # Quite a bit of difference... - assert maxdiff <= 6, 'Image too different from reference' + assert maxdiff <= 6, "Image too different from reference" - ds = ogr.Open('data/jpeg2000/int16.jp2') + ds = ogr.Open("data/jpeg2000/int16.jp2") assert ds is None + ############################################################################### # Test copying byte.jp2 -def test_jp2lura_4(out_filename='tmp/jp2lura_4.jp2'): +def test_jp2lura_4(out_filename="tmp/jp2lura_4.jp2"): - src_ds = gdal.Open('data/jpeg2000/byte.jp2') + src_ds = gdal.Open("data/jpeg2000/byte.jp2") src_wkt = src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() - vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/jp2lura_4.vrt', src_ds) - vrt_ds.SetMetadataItem('TIFFTAG_XRESOLUTION', '300') - vrt_ds.SetMetadataItem('TIFFTAG_YRESOLUTION', '200') - vrt_ds.SetMetadataItem('TIFFTAG_RESOLUTIONUNIT', '3 (pixels/cm)') + vrt_ds = gdal.GetDriverByName("VRT").CreateCopy("/vsimem/jp2lura_4.vrt", src_ds) + vrt_ds.SetMetadataItem("TIFFTAG_XRESOLUTION", "300") + vrt_ds.SetMetadataItem("TIFFTAG_YRESOLUTION", "200") + vrt_ds.SetMetadataItem("TIFFTAG_RESOLUTIONUNIT", "3 (pixels/cm)") gdal.Unlink(out_filename) - out_ds = gdal.GetDriverByName('JP2Lura').CreateCopy(out_filename, vrt_ds, options=['REVERSIBLE=YES']) + out_ds = gdal.GetDriverByName("JP2Lura").CreateCopy( + out_filename, vrt_ds, options=["REVERSIBLE=YES"] + ) del out_ds vrt_ds = None - gdal.Unlink('/vsimem/jp2lura_4.vrt') + gdal.Unlink("/vsimem/jp2lura_4.vrt") - assert gdal.VSIStatL(out_filename + '.aux.xml') is None + assert gdal.VSIStatL(out_filename + ".aux.xml") is None - assert validate(out_filename, inspire_tg=False) != 'fail' + assert validate(out_filename, inspire_tg=False) != "fail" ds = gdal.Open(out_filename) cs = ds.GetRasterBand(1).Checksum() got_wkt = ds.GetProjectionRef() got_gt = ds.GetGeoTransform() - xres = ds.GetMetadataItem('TIFFTAG_XRESOLUTION') - yres = ds.GetMetadataItem('TIFFTAG_YRESOLUTION') - resunit = ds.GetMetadataItem('TIFFTAG_RESOLUTIONUNIT') + xres = ds.GetMetadataItem("TIFFTAG_XRESOLUTION") + yres = ds.GetMetadataItem("TIFFTAG_YRESOLUTION") + resunit = ds.GetMetadataItem("TIFFTAG_RESOLUTIONUNIT") ds = None gdal.Unlink(out_filename) - assert xres == '300' and yres == '200' and resunit == '3 (pixels/cm)', \ - 'bad resolution' + assert ( + xres == "300" and yres == "200" and resunit == "3 (pixels/cm)" + ), "bad resolution" sr1 = osr.SpatialReference() sr1.SetFromUserInput(got_wkt) @@ -240,16 +261,17 @@ def test_jp2lura_4(out_filename='tmp/jp2lura_4.jp2'): if sr1.IsSame(sr2) == 0: print(got_wkt) print(src_wkt) - pytest.fail('bad spatial reference') + pytest.fail("bad spatial reference") for i in range(6): - assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), 'bad geotransform' + assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), "bad geotransform" - assert cs == 50054, 'bad checksum' + assert cs == 50054, "bad checksum" def test_jp2lura_4_vsimem(): - return test_jp2lura_4('/vsimem/jp2lura_4.jp2') + return test_jp2lura_4("/vsimem/jp2lura_4.jp2") + ############################################################################### # Test copying int16.jp2 @@ -257,49 +279,62 @@ def test_jp2lura_4_vsimem(): def test_jp2lura_5(): - tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/int16.jp2', 1, None, options=['REVERSIBLE=YES', 'CODEC=J2K']) + tst = gdaltest.GDALTest( + "JP2Lura", + "jpeg2000/int16.jp2", + 1, + None, + options=["REVERSIBLE=YES", "CODEC=J2K"], + ) return tst.testCreateCopy() + ############################################################################### # Test reading ll.jp2 def test_jp2lura_6(): - tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/ll.jp2', 1, None) + tst = gdaltest.GDALTest("JP2Lura", "jpeg2000/ll.jp2", 1, None) tst.testOpen() - ds = gdal.Open('data/jpeg2000/ll.jp2') + ds = gdal.Open("data/jpeg2000/ll.jp2") ds.GetRasterBand(1).Checksum() ds = None + ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) def test_jp2lura_7(): - tst = gdaltest.GDALTest('JP2Lura', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2Lura", "/vsigzip/data/jpeg2000/byte.jp2.gz", 1, 50054, filename_absolute=1 + ) ret = tst.testOpen() - gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') + gdal.Unlink("data/jpeg2000/byte.jp2.gz.properties") return ret + ############################################################################### # Test a JP2Lura with the 3 bands having 13bit depth and the 4th one 1 bit def test_jp2lura_8(): - ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') + ds = gdal.Open("data/jpeg2000/3_13bit_and_1bit.jp2") expected_checksums = [64570, 57277, 56048] # 61292] for i, csum in enumerate(expected_checksums): - assert ds.GetRasterBand(i + 1).Checksum() == csum, \ - ('unexpected checksum (%d) for band %d' % (csum, i + 1)) + assert ( + ds.GetRasterBand(i + 1).Checksum() == csum + ), "unexpected checksum (%d) for band %d" % (csum, i + 1) + + assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, "unexpected data type" - assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' ############################################################################### # Check that we can use .j2w world files (#4651) @@ -307,32 +342,42 @@ def test_jp2lura_8(): def test_jp2lura_9(): - ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') + ds = gdal.Open("data/jpeg2000/byte_without_geotransform.jp2") geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" ds = None + ############################################################################### # Test YCBCR420 creation option def DISABLED_jp2lura_10(): - src_ds = gdal.Open('data/rgbsmall.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_10.jp2', src_ds, options=['YCBCR420=YES', 'RESOLUTIONS=3']) + src_ds = gdal.Open("data/rgbsmall.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_10.jp2", src_ds, options=["YCBCR420=YES", "RESOLUTIONS=3"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) assert out_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert out_ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert out_ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand del out_ds src_ds = None - gdal.Unlink('/vsimem/jp2lura_10.jp2') + gdal.Unlink("/vsimem/jp2lura_10.jp2") # Quite a bit of difference... - assert maxdiff <= 12, 'Image too different from reference' + assert maxdiff <= 12, "Image too different from reference" + ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit @@ -340,32 +385,45 @@ def DISABLED_jp2lura_10(): def DISABLED_jp2lura_11(): - ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2") fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) - - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2lura_11.tif', ds) + fourth_band.ReadRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + int(ds.RasterXSize / 16), + int(ds.RasterYSize / 16), + ) + + tmp_ds = gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/jp2lura_11.tif", ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) + gtiff_fourth_band_data = fourth_band.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize + ) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/jp2lura_11.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/jp2lura_11.tif") assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data - ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + ds = gdal.OpenEx( + "data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2", + open_options=["1BIT_ALPHA_PROMOTION=NO"], + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" + ############################################################################### # Check that PAM overrides internal georeferencing (#5279) @@ -373,39 +431,39 @@ def DISABLED_jp2lura_11(): def test_jp2lura_12(): - # Override projection - shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2lura_12.jp2') + shutil.copy("data/jpeg2000/byte.jp2", "tmp/jp2lura_12.jp2") - ds = gdal.Open('tmp/jp2lura_12.jp2') + ds = gdal.Open("tmp/jp2lura_12.jp2") sr = osr.SpatialReference() sr.ImportFromEPSG(32631) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('tmp/jp2lura_12.jp2') + ds = gdal.Open("tmp/jp2lura_12.jp2") wkt = ds.GetProjectionRef() ds = None - gdaltest.jp2lura_drv.Delete('tmp/jp2lura_12.jp2') + gdaltest.jp2lura_drv.Delete("tmp/jp2lura_12.jp2") - assert '32631' in wkt + assert "32631" in wkt # Override geotransform - shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2lura_12.jp2') + shutil.copy("data/jpeg2000/byte.jp2", "tmp/jp2lura_12.jp2") - ds = gdal.Open('tmp/jp2lura_12.jp2') + ds = gdal.Open("tmp/jp2lura_12.jp2") ds.SetGeoTransform([1000, 1, 0, 2000, 0, -1]) ds = None - ds = gdal.Open('tmp/jp2lura_12.jp2') + ds = gdal.Open("tmp/jp2lura_12.jp2") gt = ds.GetGeoTransform() ds = None - gdaltest.jp2lura_drv.Delete('tmp/jp2lura_12.jp2') + gdaltest.jp2lura_drv.Delete("tmp/jp2lura_12.jp2") assert gt == (1000, 1, 0, 2000, 0, -1) + ############################################################################### # Check that PAM overrides internal GCPs (#5279) @@ -413,41 +471,42 @@ def test_jp2lura_12(): def test_jp2lura_13(): # Create a dataset with GCPs - src_ds = gdal.Open('data/rgb_gcp.vrt') - ds = gdaltest.jp2lura_drv.CreateCopy('tmp/jp2lura_13.jp2', src_ds) + src_ds = gdal.Open("data/rgb_gcp.vrt") + ds = gdaltest.jp2lura_drv.CreateCopy("tmp/jp2lura_13.jp2", src_ds) ds = None src_ds = None - assert gdal.VSIStatL('tmp/jp2lura_13.jp2.aux.xml') is None + assert gdal.VSIStatL("tmp/jp2lura_13.jp2.aux.xml") is None - ds = gdal.Open('tmp/jp2lura_13.jp2') + ds = gdal.Open("tmp/jp2lura_13.jp2") count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() assert count == 4 assert len(gcps) == 4 - assert '4326' in wkt + assert "4326" in wkt ds = None # Override GCP - ds = gdal.Open('tmp/jp2lura_13.jp2') + ds = gdal.Open("tmp/jp2lura_13.jp2") sr = osr.SpatialReference() sr.ImportFromEPSG(32631) gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None - ds = gdal.Open('tmp/jp2lura_13.jp2') + ds = gdal.Open("tmp/jp2lura_13.jp2") count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() ds = None - gdaltest.jp2lura_drv.Delete('tmp/jp2lura_13.jp2') + gdaltest.jp2lura_drv.Delete("tmp/jp2lura_13.jp2") assert count == 1 assert len(gcps) == 1 - assert '32631' in wkt + assert "32631" in wkt + ############################################################################### # Check that we get GCPs even there's no projection info @@ -455,37 +514,41 @@ def test_jp2lura_13(): def test_jp2lura_14(): - ds = gdal.Open('data/jpeg2000/byte_2gcps.jp2') + ds = gdal.Open("data/jpeg2000/byte_2gcps.jp2") assert ds.GetGCPCount() == 2 + ############################################################################### # Test reading PixelIsPoint file (#5437) def test_jp2lura_16(): - ds = gdal.Open('data/jpeg2000/byte_point.jp2') + ds = gdal.Open("data/jpeg2000/byte_point.jp2") gt = ds.GetGeoTransform() - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ - 'did not get AREA_OR_POINT = Point' + assert ( + ds.GetMetadataItem("AREA_OR_POINT") == "Point" + ), "did not get AREA_OR_POINT = Point" ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) - assert gt == gt_expected, 'did not get expected geotransform' + assert gt == gt_expected, "did not get expected geotransform" - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "TRUE") - ds = gdal.Open('data/jpeg2000/byte_point.jp2') + ds = gdal.Open("data/jpeg2000/byte_point.jp2") gt = ds.GetGeoTransform() ds = None - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", None) gt_expected = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - assert gt == gt_expected, \ - 'did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE' + assert ( + gt == gt_expected + ), "did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE" + ############################################################################### # Test writing PixelIsPoint file (#5437) @@ -493,24 +556,26 @@ def test_jp2lura_16(): def test_jp2lura_17(): - src_ds = gdal.Open('data/jpeg2000/byte_point.jp2') - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_17.jp2', src_ds) + src_ds = gdal.Open("data/jpeg2000/byte_point.jp2") + ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_17.jp2", src_ds) ds = None src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_17.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2lura_17.jp2.aux.xml") is None - ds = gdal.Open('/vsimem/jp2lura_17.jp2') + ds = gdal.Open("/vsimem/jp2lura_17.jp2") gt = ds.GetGeoTransform() - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ - 'did not get AREA_OR_POINT = Point' + assert ( + ds.GetMetadataItem("AREA_OR_POINT") == "Point" + ), "did not get AREA_OR_POINT = Point" ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) - assert gt == gt_expected, 'did not get expected geotransform' + assert gt == gt_expected, "did not get expected geotransform" + + gdal.Unlink("/vsimem/jp2lura_17.jp2") - gdal.Unlink('/vsimem/jp2lura_17.jp2') ############################################################################### # Test when using the decode_area API when one dimension of the dataset is not a @@ -519,17 +584,20 @@ def test_jp2lura_17(): def test_jp2lura_18(): - src_ds = gdal.GetDriverByName('Mem').Create('', 2000, 2000) - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_18.jp2', src_ds, options=['TILEXSIZE=2000', 'TILEYSIZE=2000']) + src_ds = gdal.GetDriverByName("Mem").Create("", 2000, 2000) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_18.jp2", src_ds, options=["TILEXSIZE=2000", "TILEYSIZE=2000"] + ) ds = None src_ds = None - ds = gdal.Open('/vsimem/jp2lura_18.jp2') + ds = gdal.Open("/vsimem/jp2lura_18.jp2") ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - gdal.Unlink('/vsimem/jp2lura_18.jp2') + gdal.Unlink("/vsimem/jp2lura_18.jp2") + ############################################################################### # Test reading file where GMLJP2 has nul character instead of \n (#5760) @@ -537,66 +605,99 @@ def test_jp2lura_18(): def test_jp2lura_19(): - ds = gdal.Open('data/jpeg2000/byte_gmljp2_with_nul_car.jp2') - assert ds.GetProjectionRef() != '' + ds = gdal.Open("data/jpeg2000/byte_gmljp2_with_nul_car.jp2") + assert ds.GetProjectionRef() != "" ds = None + ############################################################################### # Validate GMLJP2 content against schema def test_jp2lura_20(): - xmlvalidate = pytest.importorskip('xmlvalidate') + xmlvalidate = pytest.importorskip("xmlvalidate") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET.zip') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET.zip") except OSError: try: - os.stat('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip') - shutil.copy('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip', 'tmp/cache') + os.stat("../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip") + shutil.copy("../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip", "tmp/cache") except OSError: - url = 'http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip' - if not gdaltest.download_file(url, 'SCHEMAS_OPENGIS_NET.zip', force_download=True, max_download_duration=20): - pytest.skip('Cannot get SCHEMAS_OPENGIS_NET.zip') + url = "http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip" + if not gdaltest.download_file( + url, + "SCHEMAS_OPENGIS_NET.zip", + force_download=True, + max_download_duration=20, + ): + pytest.skip("Cannot get SCHEMAS_OPENGIS_NET.zip") try: - os.mkdir('tmp/cache/SCHEMAS_OPENGIS_NET') + os.mkdir("tmp/cache/SCHEMAS_OPENGIS_NET") except OSError: pass try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/gml/3.1.1/profiles/gmlJP2Profile/1.0.0/gmlJP2Profile.xsd') + os.stat( + "tmp/cache/SCHEMAS_OPENGIS_NET/gml/3.1.1/profiles/gmlJP2Profile/1.0.0/gmlJP2Profile.xsd" + ) except OSError: - gdaltest.unzip('tmp/cache/SCHEMAS_OPENGIS_NET', 'tmp/cache/SCHEMAS_OPENGIS_NET.zip') + gdaltest.unzip( + "tmp/cache/SCHEMAS_OPENGIS_NET", "tmp/cache/SCHEMAS_OPENGIS_NET.zip" + ) try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd") except OSError: - xlink_xsd_url = 'http://www.w3.org/1999/xlink.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): - xlink_xsd_url = 'http://even.rouault.free.fr/xlink.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): - pytest.skip('Cannot get xlink.xsd') + xlink_xsd_url = "http://www.w3.org/1999/xlink.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xlink.xsd", + force_download=True, + max_download_duration=10, + ): + xlink_xsd_url = "http://even.rouault.free.fr/xlink.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xlink.xsd", + force_download=True, + max_download_duration=10, + ): + pytest.skip("Cannot get xlink.xsd") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd") except OSError: - xlink_xsd_url = 'http://www.w3.org/1999/xml.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): - xlink_xsd_url = 'http://even.rouault.free.fr/xml.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): - pytest.skip('Cannot get xml.xsd') - - xmlvalidate.transform_abs_links_to_ref_links('tmp/cache/SCHEMAS_OPENGIS_NET') - - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_20.jp2', src_ds) + xlink_xsd_url = "http://www.w3.org/1999/xml.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xml.xsd", + force_download=True, + max_download_duration=10, + ): + xlink_xsd_url = "http://even.rouault.free.fr/xml.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xml.xsd", + force_download=True, + max_download_duration=10, + ): + pytest.skip("Cannot get xml.xsd") + + xmlvalidate.transform_abs_links_to_ref_links("tmp/cache/SCHEMAS_OPENGIS_NET") + + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_20.jp2", src_ds) gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] ds = None - gdal.Unlink('/vsimem/jp2lura_20.jp2') + gdal.Unlink("/vsimem/jp2lura_20.jp2") + + assert xmlvalidate.validate( + gmljp2, ogc_schemas_location="tmp/cache/SCHEMAS_OPENGIS_NET" + ) - assert xmlvalidate.validate(gmljp2, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') ############################################################################### # Test RGBA support @@ -605,101 +706,122 @@ def test_jp2lura_20(): def test_jp2lura_22(): # RGBA - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", src_ds, options=["REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - assert validate('/vsimem/jp2lura_22.jp2', expected_gmljp2=False, inspire_tg=False) != 'fail' + assert ( + validate("/vsimem/jp2lura_22.jp2", expected_gmljp2=False, inspire_tg=False) + != "fail" + ) - gdal.Unlink('/vsimem/jp2lura_22.jp2') + gdal.Unlink("/vsimem/jp2lura_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" if False: # pylint: disable=using-constant-test # RGBA with 1BIT_ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['1BIT_ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", src_ds, options=["1BIT_ALPHA=YES"] + ) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - ds = gdal.OpenEx('/vsimem/jp2lura_22.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + ds = gdal.OpenEx( + "/vsimem/jp2lura_22.jp2", open_options=["1BIT_ALPHA_PROMOTION=NO"] + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - ds = gdal.Open('/vsimem/jp2lura_22.jp2') + ds = gdal.Open("/vsimem/jp2lura_22.jp2") assert ds.GetRasterBand(4).Checksum() == 23120 ds = None - gdal.Unlink('/vsimem/jp2lura_22.jp2') + gdal.Unlink("/vsimem/jp2lura_22.jp2") # RGBA with YCBCR420=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['YCBCR420=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", src_ds, options=["YCBCR420=YES"] + ) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(1).Checksum() == 11457 ds = None - gdal.Unlink('/vsimem/jp2lura_22.jp2') + gdal.Unlink("/vsimem/jp2lura_22.jp2") # RGBA with YCC=YES. Will emit a warning for now because of OpenJPEG # bug (only fixed in trunk, not released versions at that time) - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['YCC=YES', 'QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", + src_ds, + options=["YCC=YES", "QUALITY=100", "REVERSIBLE=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - gdal.Unlink('/vsimem/jp2lura_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + gdal.Unlink("/vsimem/jp2lura_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # RGB,undefined - src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba_photometric_rgb.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", src_ds, options=["QUALITY=100", "REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined ds = None - gdal.Unlink('/vsimem/jp2lura_22.jp2') + gdal.Unlink("/vsimem/jp2lura_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # RGB,undefined with ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES', 'ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba_photometric_rgb.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_22.jp2", + src_ds, + options=["QUALITY=100", "REVERSIBLE=YES", "ALPHA=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdal.Unlink('/vsimem/jp2lura_22.jp2') + gdal.Unlink("/vsimem/jp2lura_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" ############################################################################### @@ -708,24 +830,29 @@ def test_jp2lura_22(): def DISABLED_jp2lura_23(): - src_ds = gdal.Open('../gcore/data/uint16.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_23.jp2', src_ds, options=['NBITS=9', 'QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/uint16.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_23.jp2", + src_ds, + options=["NBITS=9", "QUALITY=100", "REVERSIBLE=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - ds = gdal.Open('/vsimem/jp2lura_23.jp2') - assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' + ds = gdal.Open("/vsimem/jp2lura_23.jp2") + assert ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "9" - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_23_2.jp2', ds) - assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' + out_ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_23_2.jp2", ds) + assert out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "9" del out_ds ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_23.jp2.aux.xml') is None - gdal.Unlink('/vsimem/jp2lura_23.jp2') - gdal.Unlink('/vsimem/jp2lura_23_2.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_23.jp2.aux.xml") is None + gdal.Unlink("/vsimem/jp2lura_23.jp2") + gdal.Unlink("/vsimem/jp2lura_23_2.jp2") + + assert maxdiff <= 1, "Image too different from reference" - assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # Test Grey+alpha support @@ -734,40 +861,49 @@ def DISABLED_jp2lura_23(): def test_jp2lura_24(): # Grey+alpha - src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_24.jp2', src_ds, options=['REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_greyalpha.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_24.jp2", src_ds, options=["REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_24.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_24.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_24.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_24.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - assert validate('/vsimem/jp2lura_24.jp2', expected_gmljp2=False, inspire_tg=False) != 'fail' + assert ( + validate("/vsimem/jp2lura_24.jp2", expected_gmljp2=False, inspire_tg=False) + != "fail" + ) - gdal.Unlink('/vsimem/jp2lura_24.jp2') + gdal.Unlink("/vsimem/jp2lura_24.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" if False: # pylint: disable=using-constant-test # Grey+alpha with 1BIT_ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') - gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_24.jp2', src_ds, options=['1BIT_ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_greyalpha.tif") + gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_24.jp2", src_ds, options=["1BIT_ALPHA=YES"] + ) src_ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_24.jp2.aux.xml') is None - ds = gdal.OpenEx('/vsimem/jp2lura_24.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + assert gdal.VSIStatL("/vsimem/jp2lura_24.jp2.aux.xml") is None + ds = gdal.OpenEx( + "/vsimem/jp2lura_24.jp2", open_options=["1BIT_ALPHA_PROMOTION=NO"] + ) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand - assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert ds.GetRasterBand(2).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - ds = gdal.Open('/vsimem/jp2lura_24.jp2') - assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + ds = gdal.Open("/vsimem/jp2lura_24.jp2") + assert ds.GetRasterBand(2).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None assert ds.GetRasterBand(2).Checksum() == 23120 ds = None - gdal.Unlink('/vsimem/jp2lura_24.jp2') + gdal.Unlink("/vsimem/jp2lura_24.jp2") ############################################################################### @@ -776,25 +912,28 @@ def test_jp2lura_24(): def test_jp2lura_25(): - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 5) + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100, 5) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(2).Fill(250) src_ds.GetRasterBand(3).Fill(245) src_ds.GetRasterBand(4).Fill(240) src_ds.GetRasterBand(5).Fill(235) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_25.jp2', src_ds, options=['REVERSIBLE=YES']) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_25.jp2", src_ds, options=["REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - ds = gdal.Open('/vsimem/jp2lura_25.jp2') + ds = gdal.Open("/vsimem/jp2lura_25.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_Undefined ds = None - assert gdal.VSIStatL('/vsimem/jp2lura_25.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2lura_25.jp2.aux.xml") is None + + gdal.Unlink("/vsimem/jp2lura_25.jp2") - gdal.Unlink('/vsimem/jp2lura_25.jp2') + assert maxdiff <= 0, "Image too different from reference" - assert maxdiff <= 0, 'Image too different from reference' ############################################################################### # Test CreateCopy() from a JPEG2000 with a 2048x2048 tiling @@ -805,15 +944,22 @@ def test_jp2lura_27(): # Test optimization in GDALCopyWholeRasterGetSwathSize() # Not sure how we can check that except looking at logs with CPL_DEBUG=GDAL # for "GDAL: GDALDatasetCopyWholeRaster(): 2048*2048 swaths, bInterleave=1" - src_ds = gdal.GetDriverByName('MEM').Create('', 2049, 2049, 4) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_27.jp2', src_ds, options=['LEVELS=1', 'TILEXSIZE=2048', 'TILEYSIZE=2048']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2049, 2049, 4) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_27.jp2", + src_ds, + options=["LEVELS=1", "TILEXSIZE=2048", "TILEYSIZE=2048"], + ) src_ds = None # print('End of JP2 decoding') - out2_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2lura_27.tif', out_ds, options=['TILED=YES']) + out2_ds = gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/jp2lura_27.tif", out_ds, options=["TILED=YES"] + ) out_ds = None del out2_ds - gdal.Unlink('/vsimem/jp2lura_27.jp2') - gdal.Unlink('/vsimem/jp2lura_27.tif') + gdal.Unlink("/vsimem/jp2lura_27.jp2") + gdal.Unlink("/vsimem/jp2lura_27.tif") + ############################################################################### # Test CODEBLOCK_WIDTH/_HEIGHT @@ -843,8 +989,10 @@ def get_attribute_val(ar, attr_name): node = find_xml_node(ar, attr_name, True) if node is None or node[XML_TYPE_IDX] != gdal.CXT_Attribute: return None - if len(ar) > XML_FIRST_CHILD_IDX and \ - node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text: + if ( + len(ar) > XML_FIRST_CHILD_IDX + and node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text + ): return node[XML_FIRST_CHILD_IDX][XML_VALUE_IDX] return None @@ -852,7 +1000,11 @@ def get_attribute_val(ar, attr_name): def find_element_with_name(ar, element_name, name): typ = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] - if typ == gdal.CXT_Element and value == element_name and get_attribute_val(ar, 'name') == name: + if ( + typ == gdal.CXT_Element + and value == element_name + and get_attribute_val(ar, "name") == name + ): return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] @@ -873,9 +1025,19 @@ def get_element_val(node): def jp2lura_test_codeblock(filename, codeblock_width, codeblock_height): - node = gdal.GetJPEG2000Structure(filename, ['ALL=YES']) - xcb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_xcb_minus_2")))) - ycb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_ycb_minus_2")))) + node = gdal.GetJPEG2000Structure(filename, ["ALL=YES"]) + xcb = 2 ** ( + 2 + + int( + get_element_val(find_element_with_name(node, "Field", "SPcod_xcb_minus_2")) + ) + ) + ycb = 2 ** ( + 2 + + int( + get_element_val(find_element_with_name(node, "Field", "SPcod_ycb_minus_2")) + ) + ) if xcb != codeblock_width or ycb != codeblock_height: return False return True @@ -883,31 +1045,37 @@ def jp2lura_test_codeblock(filename, codeblock_width, codeblock_height): def test_jp2lura_28(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) - tests = [(['CODEBLOCK_WIDTH=2'], 64, 64, True), - (['CODEBLOCK_WIDTH=2048'], 64, 64, True), - (['CODEBLOCK_HEIGHT=2'], 64, 64, True), - (['CODEBLOCK_HEIGHT=2048'], 64, 64, True), - (['CODEBLOCK_WIDTH=128', 'CODEBLOCK_HEIGHT=128'], 64, 64, True), - (['CODEBLOCK_WIDTH=63'], 32, 64, True), - (['CODEBLOCK_WIDTH=32', 'CODEBLOCK_HEIGHT=32'], 32, 32, False), - ] + tests = [ + (["CODEBLOCK_WIDTH=2"], 64, 64, True), + (["CODEBLOCK_WIDTH=2048"], 64, 64, True), + (["CODEBLOCK_HEIGHT=2"], 64, 64, True), + (["CODEBLOCK_HEIGHT=2048"], 64, 64, True), + (["CODEBLOCK_WIDTH=128", "CODEBLOCK_HEIGHT=128"], 64, 64, True), + (["CODEBLOCK_WIDTH=63"], 32, 64, True), + (["CODEBLOCK_WIDTH=32", "CODEBLOCK_HEIGHT=32"], 32, 32, False), + ] for (options, expected_cbkw, expected_cbkh, warning_expected) in tests: gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_28.jp2', src_ds, options=options) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_28.jp2", src_ds, options=options + ) gdal.PopErrorHandler() - if warning_expected and gdal.GetLastErrorMsg() == '': + if warning_expected and gdal.GetLastErrorMsg() == "": print(options) - pytest.fail('warning expected') + pytest.fail("warning expected") del out_ds - if not jp2lura_test_codeblock('/vsimem/jp2lura_28.jp2', expected_cbkw, expected_cbkh): + if not jp2lura_test_codeblock( + "/vsimem/jp2lura_28.jp2", expected_cbkw, expected_cbkh + ): print(options) - pytest.fail('unexpected codeblock size') + pytest.fail("unexpected codeblock size") + + gdal.Unlink("/vsimem/jp2lura_28.jp2") - gdal.Unlink('/vsimem/jp2lura_28.jp2') ############################################################################### # Test color table support @@ -915,7 +1083,7 @@ def test_jp2lura_28(): def test_jp2lura_30(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ct.SetColorEntry(1, (255, 255, 0, 255)) @@ -925,46 +1093,48 @@ def test_jp2lura_30(): gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_30.jp2', src_ds) + out_ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_30.jp2", src_ds) gdal.PopErrorHandler() assert out_ds is None + ############################################################################### # Test unusual band color interpretation order def DISABLED_jp2lura_31(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 3) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 3) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_RedBand) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_31.jp2', src_ds) + out_ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_31.jp2", src_ds) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_31.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_31.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_31.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_31.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None - gdal.Unlink('/vsimem/jp2lura_31.jp2') + gdal.Unlink("/vsimem/jp2lura_31.jp2") # With alpha now - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 4) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_RedBand) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_31.jp2', src_ds) + out_ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_31.jp2", src_ds) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_31.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_31.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_31.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_31.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_RedBand ds = None - gdal.Unlink('/vsimem/jp2lura_31.jp2') + gdal.Unlink("/vsimem/jp2lura_31.jp2") + ############################################################################### # Test crazy tile size @@ -972,16 +1142,23 @@ def DISABLED_jp2lura_31(): def DISABLED_jp2lura_33(): - src_ds = gdal.Open(""" + src_ds = gdal.Open( + """ -""") +""" + ) gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_33.jp2', src_ds, options=['BLOCKXSIZE=100000', 'BLOCKYSIZE=100000']) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_33.jp2", + src_ds, + options=["BLOCKXSIZE=100000", "BLOCKYSIZE=100000"], + ) gdal.PopErrorHandler() assert out_ds is None out_ds = None - gdal.Unlink('/vsimem/jp2lura_33.jp2') + gdal.Unlink("/vsimem/jp2lura_33.jp2") + ############################################################################### # Test opening a file whose dimensions are > 2^31-1 @@ -990,7 +1167,7 @@ def DISABLED_jp2lura_33(): def test_jp2lura_34(): gdal.PushErrorHandler() - ds = gdal.Open('data/jpeg2000/dimensions_above_31bit.jp2') + ds = gdal.Open("data/jpeg2000/dimensions_above_31bit.jp2") gdal.PopErrorHandler() assert ds is None @@ -998,24 +1175,27 @@ def test_jp2lura_34(): ############################################################################### # Test opening a truncated file + def test_jp2lura_35(): gdal.PushErrorHandler() - ds = gdal.Open('data/jpeg2000/truncated.jp2') + ds = gdal.Open("data/jpeg2000/truncated.jp2") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Test we cannot create files with more than 16384 bands def test_jp2lura_36(): - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 16385) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 16385) gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_36.jp2', src_ds) + out_ds = gdaltest.jp2lura_drv.CreateCopy("/vsimem/jp2lura_36.jp2", src_ds) gdal.PopErrorHandler() - assert out_ds is None and gdal.VSIStatL('/vsimem/jp2lura_36.jp2') is None + assert out_ds is None and gdal.VSIStatL("/vsimem/jp2lura_36.jp2") is None + ############################################################################### # Test metadata reading & writing @@ -1024,88 +1204,100 @@ def test_jp2lura_36(): def test_jp2lura_37(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") assert ds.GetMetadata() == {} - gdal.Unlink('/vsimem/jp2lura_37.jp2') + gdal.Unlink("/vsimem/jp2lura_37.jp2") # Simple metadata in main domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') - assert ds.GetMetadata() == {'FOO': 'BAR'} + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") + assert ds.GetMetadata() == {"FOO": "BAR"} ds = None - gdal.Unlink('/vsimem/jp2lura_37.jp2') + gdal.Unlink("/vsimem/jp2lura_37.jp2") # Simple metadata in auxiliary domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR', 'SOME_DOMAIN') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR", "SOME_DOMAIN") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') - md = ds.GetMetadata('SOME_DOMAIN') - assert md == {'FOO': 'BAR'} - gdal.Unlink('/vsimem/jp2lura_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") + md = ds.GetMetadata("SOME_DOMAIN") + assert md == {"FOO": "BAR"} + gdal.Unlink("/vsimem/jp2lura_37.jp2") # Simple metadata in auxiliary XML domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:SOME_DOMAIN') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:SOME_DOMAIN") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') - assert ds.GetMetadata('xml:SOME_DOMAIN')[0] == '\n' - gdal.Unlink('/vsimem/jp2lura_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") + assert ds.GetMetadata("xml:SOME_DOMAIN")[0] == "\n" + gdal.Unlink("/vsimem/jp2lura_37.jp2") # Special xml:BOX_ metadata domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:BOX_1') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:BOX_1") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') - assert ds.GetMetadata('xml:BOX_0')[0] == '' - gdal.Unlink('/vsimem/jp2lura_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") + assert ds.GetMetadata("xml:BOX_0")[0] == "" + gdal.Unlink("/vsimem/jp2lura_37.jp2") # Special xml:XMP metadata domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:XMP') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:XMP") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2lura_37.jp2') - assert ds.GetMetadata('xml:XMP')[0] == '' + assert gdal.VSIStatL("/vsimem/jp2lura_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2lura_37.jp2") + assert ds.GetMetadata("xml:XMP")[0] == "" ds = None - gdal.Unlink('/vsimem/jp2lura_37.jp2') + gdal.Unlink("/vsimem/jp2lura_37.jp2") - # Special xml:IPR metadata domain - # for options in [ ['WRITE_METADATA=YES'] ]: - # src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - # src_ds.SetMetadata( [ '' ], 'xml:IPR') - # out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options = options) - # del out_ds - # if gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is not None: - # gdaltest.post_reason('fail') - # return 'fail' - # ds = gdal.Open('/vsimem/jp2lura_37.jp2') - # if ds.GetMetadata('xml:IPR')[0] != '': - # gdaltest.post_reason('fail') - # return 'fail' - # ds = None + # Special xml:IPR metadata domain + # for options in [ ['WRITE_METADATA=YES'] ]: + # src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) + # src_ds.SetMetadata( [ '' ], 'xml:IPR') + # out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options = options) + # del out_ds + # if gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is not None: + # gdaltest.post_reason('fail') + # return 'fail' + # ds = gdal.Open('/vsimem/jp2lura_37.jp2') + # if ds.GetMetadata('xml:IPR')[0] != '': + # gdaltest.post_reason('fail') + # return 'fail' + # ds = None - gdal.Unlink('/vsimem/jp2lura_37.jp2') + gdal.Unlink("/vsimem/jp2lura_37.jp2") ############################################################################### @@ -1115,30 +1307,35 @@ def test_jp2lura_37(): def test_jp2lura_38(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) wkt = """PROJCS["UTM Zone 31, Northern Hemisphere",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",100,1]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" src_ds.SetProjection(wkt) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_38.jp2', src_ds, options=['GeoJP2=NO']) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_38.jp2", src_ds, options=["GeoJP2=NO"] + ) assert out_ds.GetProjectionRef() == wkt crsdictionary = out_ds.GetMetadata_List("xml:CRSDictionary.gml")[0] out_ds = None - gdal.Unlink('/vsimem/jp2lura_38.jp2') + gdal.Unlink("/vsimem/jp2lura_38.jp2") do_validate = False try: import xmlvalidate + do_validate = True except ImportError: - print('Cannot import xmlvalidate') + print("Cannot import xmlvalidate") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET") except OSError: do_validate = False if do_validate: - assert xmlvalidate.validate(crsdictionary, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') + assert xmlvalidate.validate( + crsdictionary, ogc_schemas_location="tmp/cache/SCHEMAS_OPENGIS_NET" + ) ############################################################################### @@ -1148,11 +1345,13 @@ def test_jp2lura_38(): def test_jp2lura_39(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') + gdal.SetConfigOption("GMLJP2OVERRIDE", "/vsimem/override.gml") # This GML has srsName only on RectifiedGrid (taken from D.2.2.2 from DGIWG_Profile_of_JPEG2000_for_Georeferenced_Imagery.pdf) - gdal.FileFromMemBuffer('/vsimem/override.gml', """ + gdal.FileFromMemBuffer( + "/vsimem/override.gml", + """ -""") - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_39.jp2', src_ds, options=['GeoJP2=NO']) - gdal.SetConfigOption('GMLJP2OVERRIDE', None) - gdal.Unlink('/vsimem/override.gml') +""", + ) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_39.jp2", src_ds, options=["GeoJP2=NO"] + ) + gdal.SetConfigOption("GMLJP2OVERRIDE", None) + gdal.Unlink("/vsimem/override.gml") del out_ds - ds = gdal.Open('/vsimem/jp2lura_39.jp2') - assert ds.GetProjectionRef().find('4326') >= 0 + ds = gdal.Open("/vsimem/jp2lura_39.jp2") + assert ds.GetProjectionRef().find("4326") >= 0 ds = None - gdal.Unlink('/vsimem/jp2lura_39.jp2') + gdal.Unlink("/vsimem/jp2lura_39.jp2") + ############################################################################### # Test we can parse GMLJP2 v2.0 @@ -1214,11 +1417,13 @@ def test_jp2lura_39(): def test_jp2lura_40(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') + gdal.SetConfigOption("GMLJP2OVERRIDE", "/vsimem/override.gml") - gdal.FileFromMemBuffer('/vsimem/override.gml', """ + gdal.FileFromMemBuffer( + "/vsimem/override.gml", + """ -""") - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_40.jp2', src_ds, options=['GeoJP2=NO']) - gdal.SetConfigOption('GMLJP2OVERRIDE', None) - gdal.Unlink('/vsimem/override.gml') +""", + ) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_40.jp2", src_ds, options=["GeoJP2=NO"] + ) + gdal.SetConfigOption("GMLJP2OVERRIDE", None) + gdal.Unlink("/vsimem/override.gml") del out_ds - ds = gdal.Open('/vsimem/jp2lura_40.jp2') - assert ds.GetProjectionRef().find('4326') >= 0 + ds = gdal.Open("/vsimem/jp2lura_40.jp2") + assert ds.GetProjectionRef().find("4326") >= 0 got_gt = ds.GetGeoTransform() expected_gt = (2, 0.1, 0, 49, 0, -0.1) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) ds = None - gdal.Unlink('/vsimem/jp2lura_40.jp2') + gdal.Unlink("/vsimem/jp2lura_40.jp2") + ############################################################################### # Test USE_SRC_CODESTREAM=YES @@ -1286,38 +1495,51 @@ def test_jp2lura_40(): def test_jp2lura_41(): - src_ds = gdal.Open('data/jpeg2000/byte.jp2') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES', '@PROFILE=PROFILE_1', 'GEOJP2=NO', 'GMLJP2=NO']) + src_ds = gdal.Open("data/jpeg2000/byte.jp2") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_41.jp2", + src_ds, + options=[ + "USE_SRC_CODESTREAM=YES", + "@PROFILE=PROFILE_1", + "GEOJP2=NO", + "GMLJP2=NO", + ], + ) assert src_ds.GetRasterBand(1).Checksum() == out_ds.GetRasterBand(1).Checksum() del out_ds - assert gdal.VSIStatL('/vsimem/jp2lura_41.jp2').size == 9923 - gdal.Unlink('/vsimem/jp2lura_41.jp2') - gdal.Unlink('/vsimem/jp2lura_41.jp2.aux.xml') + assert gdal.VSIStatL("/vsimem/jp2lura_41.jp2").size == 9923 + gdal.Unlink("/vsimem/jp2lura_41.jp2") + gdal.Unlink("/vsimem/jp2lura_41.jp2.aux.xml") # Warning if ignored option gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES', 'QUALITY=1']) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_41.jp2", + src_ds, + options=["USE_SRC_CODESTREAM=YES", "QUALITY=1"], + ) gdal.PopErrorHandler() del out_ds # if gdal.GetLastErrorMsg() == '': # gdaltest.post_reason('fail') # return 'fail' - gdal.Unlink('/vsimem/jp2lura_41.jp2') - gdal.Unlink('/vsimem/jp2lura_41.jp2.aux.xml') + gdal.Unlink("/vsimem/jp2lura_41.jp2") + gdal.Unlink("/vsimem/jp2lura_41.jp2.aux.xml") # Warning if source is not JPEG2000 - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES']) + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_41.jp2", src_ds, options=["USE_SRC_CODESTREAM=YES"] + ) gdal.PopErrorHandler() del out_ds - assert gdal.GetLastErrorMsg() != '' - gdal.Unlink('/vsimem/jp2lura_41.jp2') + assert gdal.GetLastErrorMsg() != "" + gdal.Unlink("/vsimem/jp2lura_41.jp2") + ############################################################################### # Get structure of a JPEG2000 file @@ -1325,28 +1547,31 @@ def test_jp2lura_41(): def test_jp2lura_43(): - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte.jp2', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString("data/jpeg2000/byte.jp2", ["ALL=YES"]) assert ret is not None + ############################################################################### # Test GMLJP2v2 def test_jp2lura_45(): - if gdal.GetDriverByName('GML') is None: + if gdal.GetDriverByName("GML") is None: pytest.skip() - if gdal.GetDriverByName('KML') is None and gdal.GetDriverByName('LIBKML') is None: + if gdal.GetDriverByName("KML") is None and gdal.GetDriverByName("LIBKML") is None: pytest.skip() # Test GMLJP2V2_DEF=YES - src_ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_45.jp2', src_ds, options=['GMLJP2V2_DEF=YES']) + src_ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_45.jp2", src_ds, options=["GMLJP2V2_DEF=YES"] + ) assert out_ds.GetLayerCount() == 0 assert out_ds.GetLayer(0) is None del out_ds - ds = gdal.Open('/vsimem/jp2lura_45.jp2') + ds = gdal.Open("/vsimem/jp2lura_45.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] minimal_instance = """= 0 and validate('/vsimem/jp2lura_52.jp2', expected_gmljp2=False, inspire_tg=False) == 'fail'), \ - (val, dt, fmt) + assert not ( + val >= 0 + and validate( + "/vsimem/jp2lura_52.jp2", expected_gmljp2=False, inspire_tg=False + ) + == "fail" + ), (val, dt, fmt) + + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_52.jp2") - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_52.jp2') ############################################################################### # Test RATE and QUALITY @@ -1793,41 +2271,46 @@ def test_jp2lura_52(): def test_jp2lura_53(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, - options=['RATE=1']) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_53.jp2", src_ds, options=["RATE=1"] + ) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 8 - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_53.jp2") - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, - options=['QUALITY=100']) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_53.jp2", src_ds, options=["QUALITY=100"] + ) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 2 - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_53.jp2") # Forcing irreversible due to RATE - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, - options=['REVERSIBLE=YES', 'RATE=1']) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_53.jp2", src_ds, options=["REVERSIBLE=YES", "RATE=1"] + ) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 8 - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_53.jp2") # QUALITY ignored - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, - options=['REVERSIBLE=YES', 'QUALITY=100']) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_53.jp2", src_ds, options=["REVERSIBLE=YES", "QUALITY=100"] + ) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 0 - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_53.jp2") + ############################################################################### # Test RasterIO edge cases @@ -1836,21 +2319,25 @@ def test_jp2lura_53(): def test_jp2lura_54(): # Tiled with incomplete boundary tiles - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100, 1) src_ds.GetRasterBand(1).Fill(100) - ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_54.jp2', src_ds, - options=['REVERSIBLE=YES', 'TILEXSIZE=64', 'TILEYSIZE=64']) + ds = gdaltest.jp2lura_drv.CreateCopy( + "/vsimem/jp2lura_54.jp2", + src_ds, + options=["REVERSIBLE=YES", "TILEXSIZE=64", "TILEYSIZE=64"], + ) # Request with a type that is not the natural type - data = ds.GetRasterBand(1).ReadRaster(0, 0, 100, 100, 100, 100, - buf_type=gdal.GDT_Int16) - data = struct.unpack('h' * 100 * 100, data) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, 100, 100, 100, 100, buf_type=gdal.GDT_Int16 + ) + data = struct.unpack("h" * 100 * 100, data) assert min(data) == 100 and max(data) == 100 # Request at a resolution that is not a power of two data = ds.GetRasterBand(1).ReadRaster(0, 0, 100, 100, 30, 30) - data = struct.unpack('B' * 30 * 30, data) + data = struct.unpack("B" * 30 * 30, data) assert min(data) == 100 and max(data) == 100 ds = None - gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_54.jp2') + gdaltest.jp2lura_drv.Delete("/vsimem/jp2lura_54.jp2") diff --git a/autotest/gdrivers/jp2metadata.py b/autotest/gdrivers/jp2metadata.py index 6cca3b092298..3915225994ed 100755 --- a/autotest/gdrivers/jp2metadata.py +++ b/autotest/gdrivers/jp2metadata.py @@ -30,18 +30,18 @@ import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal ############################################################################### # Test bugfix for #5249 (Irrelevant ERDAS GeoTIFF JP2Box read) + def test_jp2metadata_1(): - ds = gdal.Open('data/jpeg2000/erdas_foo.jp2') + ds = gdal.Open("data/jpeg2000/erdas_foo.jp2") if ds is None: pytest.skip() @@ -52,13 +52,14 @@ def test_jp2metadata_1(): for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-5) + ############################################################################### # Test Pleiades & Pleiades Neo imagery metadata def _test_jp2metadata(file_path, rpc_values_to_check=None): try: - os.remove(f'{file_path}.aux.xml') + os.remove(f"{file_path}.aux.xml") except OSError: pass @@ -71,24 +72,37 @@ def _test_jp2metadata(file_path, rpc_values_to_check=None): assert len(filelist) == 3, filelist mddlist = ds.GetMetadataDomainList() - assert 'IMD' in mddlist and 'RPC' in mddlist and 'IMAGERY' in mddlist, \ - 'did not get expected metadata list.' + assert ( + "IMD" in mddlist and "RPC" in mddlist and "IMAGERY" in mddlist + ), "did not get expected metadata list." - md = ds.GetMetadata('IMAGERY') - assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' - assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' - assert 'ACQUISITIONDATETIME' in md, \ - 'ACQUISITIONDATETIME not present in IMAGERY Domain' + 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" # RPC validity - md_rpc = ds.GetMetadata('RPC') + md_rpc = ds.GetMetadata("RPC") keys_rpc = set(md_rpc.keys()) - mandatory_keys_rpc = {'HEIGHT_OFF', 'HEIGHT_SCALE', 'LAT_OFF', 'LAT_SCALE', - 'LINE_DEN_COEFF', 'LINE_NUM_COEFF', 'LINE_OFF', - 'LINE_SCALE', 'LONG_OFF', 'LONG_SCALE', - 'SAMP_DEN_COEFF', 'SAMP_NUM_COEFF', 'SAMP_OFF', - 'SAMP_SCALE'} + mandatory_keys_rpc = { + "HEIGHT_OFF", + "HEIGHT_SCALE", + "LAT_OFF", + "LAT_SCALE", + "LINE_DEN_COEFF", + "LINE_NUM_COEFF", + "LINE_OFF", + "LINE_SCALE", + "LONG_OFF", + "LONG_SCALE", + "SAMP_DEN_COEFF", + "SAMP_NUM_COEFF", + "SAMP_OFF", + "SAMP_SCALE", + } diff = mandatory_keys_rpc.difference(keys_rpc) diff = [str(d) for d in diff] @@ -105,44 +119,55 @@ def _test_jp2metadata(file_path, rpc_values_to_check=None): if rpc_values_to_check is not None: for k, v in rpc_values_to_check.items(): if md_rpc[k] != v: - pytest.fail(f'the value of the RPC key : {k} is not valid') + pytest.fail(f"the value of the RPC key : {k} is not valid") ds = None - assert not os.path.exists(f'{file_path}.aux.xml') + assert not os.path.exists(f"{file_path}.aux.xml") def test_jp2metadata_2(): # Pleiades product description https://content.satimagingcorp.com/media/pdf/User_Guide_Pleiades.pdf - file_path = 'data/jpeg2000/IMG_md_ple_R1C1.jp2' + file_path = "data/jpeg2000/IMG_md_ple_R1C1.jp2" rpc_values_to_check = { - 'LAT_OFF': '-37.8185709405155', - 'SAMP_OFF': '5187', - 'LAT_SCALE': '0.056013496012568', - 'LONG_SCALE': '0.1152662335048689', - 'LINE_DEN_COEFF': ' 1 0.0001616419179600887 -0.0003138230500963576 -1.394071985006734e-06 -6.696094164696539e-06 -5.345869412075188e-09 1.763447020374064e-08 1.570099327763788e-05 -2.742185667248469e-05 2.311214210508507e-05 -1.355093965247957e-10 2.888456971707225e-08 8.124756826520027e-07 7.468753872581231e-09 5.656409063390933e-07 8.695797176083266e-06 -3.572353935073523e-09 -8.051282577435379e-11 1.691147472316222e-08 -6.436246171675777e-11', - 'SAMP_NUM_COEFF': ' 0.0002609410706716954 1.001026213740965 -0.0003819289116566809 0.0001240788067018346 0.0005862035015589599 5.081629489519709e-05 -1.435215968291365e-05 -0.0002758832786884909 0.0001043228128012142 -1.375374301980545e-08 5.424360099410591e-08 -5.026010178171814e-05 0.0001886885841229406 -6.535315557200323e-05 3.723625930897949e-05 0.000324332729058834 9.492897372587203e-09 -6.383348194827217e-09 -3.519296777850624e-08 -8.099247649030343e-09', + "LAT_OFF": "-37.8185709405155", + "SAMP_OFF": "5187", + "LAT_SCALE": "0.056013496012568", + "LONG_SCALE": "0.1152662335048689", + "LINE_DEN_COEFF": " 1 0.0001616419179600887 -0.0003138230500963576 -1.394071985006734e-06 -6.696094164696539e-06 -5.345869412075188e-09 1.763447020374064e-08 1.570099327763788e-05 -2.742185667248469e-05 2.311214210508507e-05 -1.355093965247957e-10 2.888456971707225e-08 8.124756826520027e-07 7.468753872581231e-09 5.656409063390933e-07 8.695797176083266e-06 -3.572353935073523e-09 -8.051282577435379e-11 1.691147472316222e-08 -6.436246171675777e-11", + "SAMP_NUM_COEFF": " 0.0002609410706716954 1.001026213740965 -0.0003819289116566809 0.0001240788067018346 0.0005862035015589599 5.081629489519709e-05 -1.435215968291365e-05 -0.0002758832786884909 0.0001043228128012142 -1.375374301980545e-08 5.424360099410591e-08 -5.026010178171814e-05 0.0001886885841229406 -6.535315557200323e-05 3.723625930897949e-05 0.000324332729058834 9.492897372587203e-09 -6.383348194827217e-09 -3.519296777850624e-08 -8.099247649030343e-09", } _test_jp2metadata(file_path, rpc_values_to_check=rpc_values_to_check) def test_jp2metadata_2b(): # Pleiades Neo product - file_path = 'data/jpeg2000/IMG_md_pneo_R1C1.jp2' + file_path = "data/jpeg2000/IMG_md_pneo_R1C1.jp2" rpc_values_to_check = { - 'LAT_OFF': '12.807914369557892', - 'SAMP_OFF': '5864', - 'LAT_SCALE': '0.06544078829767308', - 'LONG_SCALE': '0.06456467877685057', - 'LINE_DEN_COEFF': ' 1 0.00101120491477 0.00352363792876 1.54038387462e-06 -5.25674523513e-06 -5.82954187807e-08 -4.38661879766e-07 3.65133101845e-06 -1.87290332218e-06 5.73319333615e-06 1.04740906969e-09 -2.80668071974e-07 2.96747022687e-07 1.08930762307e-08 -7.17196535598e-08 3.34275572452e-07 -4.49546103468e-09 -2.39590665536e-08 2.69120818927e-07 1.87360972277e-10', - 'SAMP_NUM_COEFF': ' 0.0225143172142 1.00589741678 -0.00134174726147 0.0237253142511 5.88157266883e-05 0.00269050817565 -0.00136618510734 -0.0116423108131 0.00100142882811 6.72967252237e-05 -1.21136997927e-06 -0.000921827179509 -0.00020078717226 -3.50960323581e-06 -0.000207253349484 6.15117373574e-05 -3.45619374615e-06 -0.000130177039513 -9.67483269543e-06 -3.52598626454e-08', + "LAT_OFF": "12.807914369557892", + "SAMP_OFF": "5864", + "LAT_SCALE": "0.06544078829767308", + "LONG_SCALE": "0.06456467877685057", + "LINE_DEN_COEFF": " 1 0.00101120491477 0.00352363792876 1.54038387462e-06 -5.25674523513e-06 -5.82954187807e-08 -4.38661879766e-07 3.65133101845e-06 -1.87290332218e-06 5.73319333615e-06 1.04740906969e-09 -2.80668071974e-07 2.96747022687e-07 1.08930762307e-08 -7.17196535598e-08 3.34275572452e-07 -4.49546103468e-09 -2.39590665536e-08 2.69120818927e-07 1.87360972277e-10", + "SAMP_NUM_COEFF": " 0.0225143172142 1.00589741678 -0.00134174726147 0.0237253142511 5.88157266883e-05 0.00269050817565 -0.00136618510734 -0.0116423108131 0.00100142882811 6.72967252237e-05 -1.21136997927e-06 -0.000921827179509 -0.00020078717226 -3.50960323581e-06 -0.000207253349484 6.15117373574e-05 -3.45619374615e-06 -0.000130177039513 -9.67483269543e-06 -3.52598626454e-08", } _test_jp2metadata(file_path, rpc_values_to_check=rpc_values_to_check) ds = gdal.Open(file_path) md = ds.GetMetadata_Dict("IMD") - assert md['Geometric_Data.Use_Area.Located_Geometric_Values_1.Ground_Sample_Distance.GSD_ACROSS_TRACK'] == '0.7054510257833884' - assert md['Geometric_Data.Use_Area.Located_Geometric_Values_2.Ground_Sample_Distance.GSD_ACROSS_TRACK'] == '0.7059011471512184' + assert ( + md[ + "Geometric_Data.Use_Area.Located_Geometric_Values_1.Ground_Sample_Distance.GSD_ACROSS_TRACK" + ] + == "0.7054510257833884" + ) + assert ( + md[ + "Geometric_Data.Use_Area.Located_Geometric_Values_2.Ground_Sample_Distance.GSD_ACROSS_TRACK" + ] + == "0.7059011471512184" + ) + ############################################################################### # Test reading GMLJP2 file with srsName only on the Envelope, and lots of other @@ -152,33 +177,37 @@ def test_jp2metadata_2b(): def test_jp2metadata_3(): - gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'YES') + gdal.SetConfigOption("GDAL_IGNORE_AXIS_ORIENTATION", "YES") exp_wkt = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' - ds = gdal.Open('data/jpeg2000/ll.jp2') + ds = gdal.Open("data/jpeg2000/ll.jp2") if ds is None: - gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'NO') + gdal.SetConfigOption("GDAL_IGNORE_AXIS_ORIENTATION", "NO") pytest.skip() wkt = ds.GetProjection() if wkt != exp_wkt: - print('got: ', wkt) - print('exp: ', exp_wkt) - pytest.fail('did not get expected WKT, should be WGS84') + print("got: ", wkt) + print("exp: ", exp_wkt) + pytest.fail("did not get expected WKT, should be WGS84") gt = ds.GetGeoTransform() - if gt[0] != pytest.approx(8, abs=0.0000001) or gt[3] != pytest.approx(50, abs=0.000001) \ - or gt[1] != pytest.approx(0.000761397164, abs=0.000000000005) \ - or gt[2] != pytest.approx(0.0, abs=0.000000000005) \ - or gt[4] != pytest.approx(0.0, abs=0.000000000005) \ - or gt[5] != pytest.approx(-0.000761397164, abs=0.000000000005): - print('got: ', gt) - pytest.fail('did not get expected geotransform') + if ( + gt[0] != pytest.approx(8, abs=0.0000001) + or gt[3] != pytest.approx(50, abs=0.000001) + or gt[1] != pytest.approx(0.000761397164, abs=0.000000000005) + or gt[2] != pytest.approx(0.0, abs=0.000000000005) + or gt[4] != pytest.approx(0.0, abs=0.000000000005) + or gt[5] != pytest.approx(-0.000761397164, abs=0.000000000005) + ): + print("got: ", gt) + pytest.fail("did not get expected geotransform") ds = None - gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'NO') + gdal.SetConfigOption("GDAL_IGNORE_AXIS_ORIENTATION", "NO") + ############################################################################### # Test reading a file with axis orientation set properly for an alternate @@ -189,30 +218,40 @@ def test_jp2metadata_4(): exp_wkt = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' - ds = gdal.Open('data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes.jp2') + ds = gdal.Open("data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes.jp2") if ds is None: pytest.skip() wkt = ds.GetProjection() if wkt != exp_wkt: - print('got: ', wkt) - print('exp: ', exp_wkt) - pytest.fail('did not get expected WKT, should be WGS84') + print("got: ", wkt) + print("exp: ", exp_wkt) + pytest.fail("did not get expected WKT, should be WGS84") gt = ds.GetGeoTransform() - gte = (42.999583333333369, 0.008271349862259, 0, - 34.000416666666631, 0, -0.008271349862259) - - if gt[0] != pytest.approx(gte[0], abs=0.0000001) or gt[3] != pytest.approx(gte[3], abs=0.000001) \ - or gt[1] != pytest.approx(gte[1], abs=0.000000000005) \ - or gt[2] != pytest.approx(gte[2], abs=0.000000000005) \ - or gt[4] != pytest.approx(gte[4], abs=0.000000000005) \ - or gt[5] != pytest.approx(gte[5], abs=0.000000000005): - print('got: ', gt) - pytest.fail('did not get expected geotransform') + gte = ( + 42.999583333333369, + 0.008271349862259, + 0, + 34.000416666666631, + 0, + -0.008271349862259, + ) + + if ( + gt[0] != pytest.approx(gte[0], abs=0.0000001) + or gt[3] != pytest.approx(gte[3], abs=0.000001) + or gt[1] != pytest.approx(gte[1], abs=0.000000000005) + or gt[2] != pytest.approx(gte[2], abs=0.000000000005) + or gt[4] != pytest.approx(gte[4], abs=0.000000000005) + or gt[5] != pytest.approx(gte[5], abs=0.000000000005) + ): + print("got: ", gt) + pytest.fail("did not get expected geotransform") ds = None + ############################################################################### # Test reading a file with EPSG axis orientation being northing, easting, # but with explicit axisName being easting, northing (#5960) @@ -220,51 +259,63 @@ def test_jp2metadata_4(): def test_jp2metadata_5(): - ds = gdal.Open('data/jpeg2000/gmljp2_epsg3035_easting_northing.jp2') + ds = gdal.Open("data/jpeg2000/gmljp2_epsg3035_easting_northing.jp2") if ds is None: pytest.skip() sr = ds.GetSpatialRef() - assert sr.GetAuthorityCode(None) == '3035' + assert sr.GetAuthorityCode(None) == "3035" gt = ds.GetGeoTransform() gte = (4895766.000000001, 2.0, 0.0, 2296946.0, 0.0, -2.0) - if gt[0] != pytest.approx(gte[0], abs=0.0000001) or gt[3] != pytest.approx(gte[3], abs=0.000001) \ - or gt[1] != pytest.approx(gte[1], abs=0.000000000005) \ - or gt[2] != pytest.approx(gte[2], abs=0.000000000005) \ - or gt[4] != pytest.approx(gte[4], abs=0.000000000005) \ - or gt[5] != pytest.approx(gte[5], abs=0.000000000005): - print('got: ', gt) - pytest.fail('did not get expected geotransform') + if ( + gt[0] != pytest.approx(gte[0], abs=0.0000001) + or gt[3] != pytest.approx(gte[3], abs=0.000001) + or gt[1] != pytest.approx(gte[1], abs=0.000000000005) + or gt[2] != pytest.approx(gte[2], abs=0.000000000005) + or gt[4] != pytest.approx(gte[4], abs=0.000000000005) + or gt[5] != pytest.approx(gte[5], abs=0.000000000005) + ): + print("got: ", gt) + pytest.fail("did not get expected geotransform") ds = None + ############################################################################### # Get structure of a JPEG2000 file def test_jp2metadata_getjpeg2000structure(): - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte.jp2', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString("data/jpeg2000/byte.jp2", ["ALL=YES"]) assert ret is not None - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte_tlm_plt.jp2', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString( + "data/jpeg2000/byte_tlm_plt.jp2", ["ALL=YES"] + ) assert ret is not None - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte_one_poc.j2k', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString( + "data/jpeg2000/byte_one_poc.j2k", ["ALL=YES"] + ) assert ret is not None - with gdaltest.config_option('GDAL_JPEG2000_STRUCTURE_MAX_LINES', '15'): + with gdaltest.config_option("GDAL_JPEG2000_STRUCTURE_MAX_LINES", "15"): gdal.ErrorReset() with gdaltest.error_handler(): - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte.jp2', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString( + "data/jpeg2000/byte.jp2", ["ALL=YES"] + ) assert ret is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" - with gdaltest.config_option('GDAL_JPEG2000_STRUCTURE_MAX_LINES', '150'): + with gdaltest.config_option("GDAL_JPEG2000_STRUCTURE_MAX_LINES", "150"): gdal.ErrorReset() with gdaltest.error_handler(): - ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte.jp2', ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString( + "data/jpeg2000/byte.jp2", ["ALL=YES"] + ) assert ret is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" diff --git a/autotest/gdrivers/jp2openjpeg.py b/autotest/gdrivers/jp2openjpeg.py index b58aace64a24..b2b9186f23b9 100755 --- a/autotest/gdrivers/jp2openjpeg.py +++ b/autotest/gdrivers/jp2openjpeg.py @@ -30,32 +30,31 @@ ############################################################################### import os -import sys import shutil -from osgeo import gdal -from osgeo import ogr -from osgeo import osr -import pytest +import sys import gdaltest - +import pytest from test_py_scripts import samples_path -pytestmark = pytest.mark.require_driver('JP2OpenJPEG') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("JP2OpenJPEG") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.jp2openjpeg_drv = gdal.GetDriverByName('JP2OpenJPEG') + gdaltest.jp2openjpeg_drv = gdal.GetDriverByName("JP2OpenJPEG") assert gdaltest.jp2openjpeg_drv is not None - gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2OpenJPEG") yield gdaltest.reregister_all_jpeg2000_drivers() + ############################################################################### # Open byte.jp2 @@ -83,17 +82,18 @@ def test_jp2openjpeg_2(): """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('JP2OpenJPEG', 'jpeg2000/byte.jp2', 1, 50054) + tst = gdaltest.GDALTest("JP2OpenJPEG", "jpeg2000/byte.jp2", 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # Open int16.jp2 def test_jp2openjpeg_3(): - ds = gdal.Open('data/jpeg2000/int16.jp2') - ds_ref = gdal.Open('data/int16.tif') + ds = gdal.Open("data/jpeg2000/int16.jp2") + ds_ref = gdal.Open("data/int16.tif") maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) @@ -103,49 +103,53 @@ def test_jp2openjpeg_3(): ds_ref = None # Quite a bit of difference... - assert maxdiff <= 6, 'Image too different from reference' + assert maxdiff <= 6, "Image too different from reference" - ds = ogr.Open('data/jpeg2000/int16.jp2') + ds = ogr.Open("data/jpeg2000/int16.jp2") assert ds is None + ############################################################################### # Test copying byte.jp2 -def test_jp2openjpeg_4(out_filename='tmp/jp2openjpeg_4.jp2'): +def test_jp2openjpeg_4(out_filename="tmp/jp2openjpeg_4.jp2"): - src_ds = gdal.Open('data/jpeg2000/byte.jp2') + src_ds = gdal.Open("data/jpeg2000/byte.jp2") src_wkt = src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() - vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/jp2openjpeg_4.vrt', src_ds) - vrt_ds.SetMetadataItem('TIFFTAG_XRESOLUTION', '300') - vrt_ds.SetMetadataItem('TIFFTAG_YRESOLUTION', '200') - vrt_ds.SetMetadataItem('TIFFTAG_RESOLUTIONUNIT', '3 (pixels/cm)') + vrt_ds = gdal.GetDriverByName("VRT").CreateCopy("/vsimem/jp2openjpeg_4.vrt", src_ds) + vrt_ds.SetMetadataItem("TIFFTAG_XRESOLUTION", "300") + vrt_ds.SetMetadataItem("TIFFTAG_YRESOLUTION", "200") + vrt_ds.SetMetadataItem("TIFFTAG_RESOLUTIONUNIT", "3 (pixels/cm)") gdal.Unlink(out_filename) - out_ds = gdal.GetDriverByName('JP2OpenJPEG').CreateCopy(out_filename, vrt_ds, options=['REVERSIBLE=YES', 'QUALITY=100']) + out_ds = gdal.GetDriverByName("JP2OpenJPEG").CreateCopy( + out_filename, vrt_ds, options=["REVERSIBLE=YES", "QUALITY=100"] + ) del out_ds vrt_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_4.vrt') + gdal.Unlink("/vsimem/jp2openjpeg_4.vrt") - assert gdal.VSIStatL(out_filename + '.aux.xml') is None + assert gdal.VSIStatL(out_filename + ".aux.xml") is None ds = gdal.Open(out_filename) cs = ds.GetRasterBand(1).Checksum() got_wkt = ds.GetProjectionRef() got_gt = ds.GetGeoTransform() - xres = ds.GetMetadataItem('TIFFTAG_XRESOLUTION') - yres = ds.GetMetadataItem('TIFFTAG_YRESOLUTION') - resunit = ds.GetMetadataItem('TIFFTAG_RESOLUTIONUNIT') + xres = ds.GetMetadataItem("TIFFTAG_XRESOLUTION") + yres = ds.GetMetadataItem("TIFFTAG_YRESOLUTION") + resunit = ds.GetMetadataItem("TIFFTAG_RESOLUTIONUNIT") ds = None gdal.Unlink(out_filename) - assert xres == '300' and yres == '200' and resunit == '3 (pixels/cm)', \ - 'bad resolution' + assert ( + xres == "300" and yres == "200" and resunit == "3 (pixels/cm)" + ), "bad resolution" sr1 = osr.SpatialReference() sr1.SetFromUserInput(got_wkt) @@ -155,16 +159,17 @@ def test_jp2openjpeg_4(out_filename='tmp/jp2openjpeg_4.jp2'): if sr1.IsSame(sr2) == 0: print(got_wkt) print(src_wkt) - pytest.fail('bad spatial reference') + pytest.fail("bad spatial reference") for i in range(6): - assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), 'bad geotransform' + assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), "bad geotransform" - assert cs == 50054, 'bad checksum' + assert cs == 50054, "bad checksum" def test_jp2openjpeg_4_vsimem(): - return test_jp2openjpeg_4('/vsimem/jp2openjpeg_4.jp2') + return test_jp2openjpeg_4("/vsimem/jp2openjpeg_4.jp2") + ############################################################################### # Test copying int16.jp2 @@ -172,48 +177,65 @@ def test_jp2openjpeg_4_vsimem(): def test_jp2openjpeg_5(): - tst = gdaltest.GDALTest('JP2OpenJPEG', 'jpeg2000/int16.jp2', 1, None, options=['REVERSIBLE=YES', 'QUALITY=100', 'CODEC=J2K']) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", + "jpeg2000/int16.jp2", + 1, + None, + options=["REVERSIBLE=YES", "QUALITY=100", "CODEC=J2K"], + ) return tst.testCreateCopy() + ############################################################################### # Test reading ll.jp2 def test_jp2openjpeg_6(): - tst = gdaltest.GDALTest('JP2OpenJPEG', 'jpeg2000/ll.jp2', 1, None) + tst = gdaltest.GDALTest("JP2OpenJPEG", "jpeg2000/ll.jp2", 1, None) tst.testOpen() - ds = gdal.Open('data/jpeg2000/ll.jp2') + ds = gdal.Open("data/jpeg2000/ll.jp2") ds.GetRasterBand(1).Checksum() ds = None + ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) def test_jp2openjpeg_7(): - tst = gdaltest.GDALTest('JP2OpenJPEG', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", + "/vsigzip/data/jpeg2000/byte.jp2.gz", + 1, + 50054, + filename_absolute=1, + ) ret = tst.testOpen() - gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') + gdal.Unlink("data/jpeg2000/byte.jp2.gz.properties") return ret + ############################################################################### # Test a JP2OpenJPEG with the 3 bands having 13bit depth and the 4th one 1 bit def test_jp2openjpeg_8(): - ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') + ds = gdal.Open("data/jpeg2000/3_13bit_and_1bit.jp2") expected_checksums = [64570, 57277, 56048, 61292] for i in range(4): - assert ds.GetRasterBand(i + 1).Checksum() == expected_checksums[i], \ - ('unexpected checksum (%d) for band %d' % (expected_checksums[i], i + 1)) + assert ( + ds.GetRasterBand(i + 1).Checksum() == expected_checksums[i] + ), "unexpected checksum (%d) for band %d" % (expected_checksums[i], i + 1) + + assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, "unexpected data type" - assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' ############################################################################### # Check that we can use .j2w world files (#4651) @@ -221,32 +243,42 @@ def test_jp2openjpeg_8(): def test_jp2openjpeg_9(): - ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') + ds = gdal.Open("data/jpeg2000/byte_without_geotransform.jp2") geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" ds = None + ############################################################################### # Test YCBCR420 creation option def test_jp2openjpeg_10(): - src_ds = gdal.Open('data/rgbsmall.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_10.jp2', src_ds, options=['YCBCR420=YES', 'RESOLUTIONS=3']) + src_ds = gdal.Open("data/rgbsmall.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_10.jp2", src_ds, options=["YCBCR420=YES", "RESOLUTIONS=3"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) assert out_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert out_ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert out_ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand del out_ds src_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_10.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_10.jp2") # Quite a bit of difference... - assert maxdiff <= 12, 'Image too different from reference' + assert maxdiff <= 12, "Image too different from reference" + ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit @@ -254,32 +286,45 @@ def test_jp2openjpeg_10(): def test_jp2openjpeg_11(): - ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') + ds = gdal.Open("data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2") fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) - - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2openjpeg_11.tif', ds) + fourth_band.ReadRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + int(ds.RasterXSize / 16), + int(ds.RasterYSize / 16), + ) + + tmp_ds = gdal.GetDriverByName("GTiff").CreateCopy("/vsimem/jp2openjpeg_11.tif", ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) + gtiff_fourth_band_data = fourth_band.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize + ) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/jp2openjpeg_11.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/jp2openjpeg_11.tif") assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data - ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + ds = gdal.OpenEx( + "data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2", + open_options=["1BIT_ALPHA_PROMOTION=NO"], + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" + ############################################################################### # Check that PAM overrides internal georeferencing (#5279) @@ -288,37 +333,38 @@ def test_jp2openjpeg_11(): def test_jp2openjpeg_12(): # Override projection - shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2openjpeg_12.jp2') + shutil.copy("data/jpeg2000/byte.jp2", "tmp/jp2openjpeg_12.jp2") - ds = gdal.Open('tmp/jp2openjpeg_12.jp2') + ds = gdal.Open("tmp/jp2openjpeg_12.jp2") sr = osr.SpatialReference() sr.ImportFromEPSG(32631) ds.SetProjection(sr.ExportToWkt()) ds = None - ds = gdal.Open('tmp/jp2openjpeg_12.jp2') + ds = gdal.Open("tmp/jp2openjpeg_12.jp2") wkt = ds.GetProjectionRef() ds = None - gdaltest.jp2openjpeg_drv.Delete('tmp/jp2openjpeg_12.jp2') + gdaltest.jp2openjpeg_drv.Delete("tmp/jp2openjpeg_12.jp2") - assert '32631' in wkt + assert "32631" in wkt # Override geotransform - shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2openjpeg_12.jp2') + shutil.copy("data/jpeg2000/byte.jp2", "tmp/jp2openjpeg_12.jp2") - ds = gdal.Open('tmp/jp2openjpeg_12.jp2') + ds = gdal.Open("tmp/jp2openjpeg_12.jp2") ds.SetGeoTransform([1000, 1, 0, 2000, 0, -1]) ds = None - ds = gdal.Open('tmp/jp2openjpeg_12.jp2') + ds = gdal.Open("tmp/jp2openjpeg_12.jp2") gt = ds.GetGeoTransform() ds = None - gdaltest.jp2openjpeg_drv.Delete('tmp/jp2openjpeg_12.jp2') + gdaltest.jp2openjpeg_drv.Delete("tmp/jp2openjpeg_12.jp2") assert gt == (1000, 1, 0, 2000, 0, -1) + ############################################################################### # Check that PAM overrides internal GCPs (#5279) @@ -326,41 +372,42 @@ def test_jp2openjpeg_12(): def test_jp2openjpeg_13(): # Create a dataset with GCPs - src_ds = gdal.Open('data/rgb_gcp.vrt') - ds = gdaltest.jp2openjpeg_drv.CreateCopy('tmp/jp2openjpeg_13.jp2', src_ds) + src_ds = gdal.Open("data/rgb_gcp.vrt") + ds = gdaltest.jp2openjpeg_drv.CreateCopy("tmp/jp2openjpeg_13.jp2", src_ds) ds = None src_ds = None - assert gdal.VSIStatL('tmp/jp2openjpeg_13.jp2.aux.xml') is None + assert gdal.VSIStatL("tmp/jp2openjpeg_13.jp2.aux.xml") is None - ds = gdal.Open('tmp/jp2openjpeg_13.jp2') + ds = gdal.Open("tmp/jp2openjpeg_13.jp2") count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() assert count == 4 assert len(gcps) == 4 - assert '4326' in wkt + assert "4326" in wkt ds = None # Override GCP - ds = gdal.Open('tmp/jp2openjpeg_13.jp2') + ds = gdal.Open("tmp/jp2openjpeg_13.jp2") sr = osr.SpatialReference() sr.ImportFromEPSG(32631) gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None - ds = gdal.Open('tmp/jp2openjpeg_13.jp2') + ds = gdal.Open("tmp/jp2openjpeg_13.jp2") count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() ds = None - gdaltest.jp2openjpeg_drv.Delete('tmp/jp2openjpeg_13.jp2') + gdaltest.jp2openjpeg_drv.Delete("tmp/jp2openjpeg_13.jp2") assert count == 1 assert len(gcps) == 1 - assert '32631' in wkt + assert "32631" in wkt + ############################################################################### # Check that we get GCPs even there's no projection info @@ -368,55 +415,67 @@ def test_jp2openjpeg_13(): def test_jp2openjpeg_14(): - ds = gdal.Open('data/jpeg2000/byte_2gcps.jp2') + ds = gdal.Open("data/jpeg2000/byte_2gcps.jp2") assert ds.GetGCPCount() == 2 + ############################################################################### # Test multi-threading reading and (possibly) writing -@pytest.mark.parametrize('JP2OPENJPEG_USE_THREADED_IO', ['YES', 'NO']) + +@pytest.mark.parametrize("JP2OPENJPEG_USE_THREADED_IO", ["YES", "NO"]) def test_jp2openjpeg_15(JP2OPENJPEG_USE_THREADED_IO): - src_ds = gdal.GetDriverByName('MEM').Create('', 256, 256) + src_ds = gdal.GetDriverByName("MEM").Create("", 256, 256) src_ds.GetRasterBand(1).Fill(255) data = src_ds.ReadRaster() # Setting only used for writing - with gdaltest.config_option('JP2OPENJPEG_USE_THREADED_IO', JP2OPENJPEG_USE_THREADED_IO): - ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_15.jp2', src_ds, options=['BLOCKXSIZE=33', 'BLOCKYSIZE=34']) + with gdaltest.config_option( + "JP2OPENJPEG_USE_THREADED_IO", JP2OPENJPEG_USE_THREADED_IO + ): + ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_15.jp2", + src_ds, + options=["BLOCKXSIZE=33", "BLOCKYSIZE=34"], + ) src_ds = None got_data = ds.ReadRaster() ds = None - gdaltest.jp2openjpeg_drv.Delete('/vsimem/jp2openjpeg_15.jp2') + gdaltest.jp2openjpeg_drv.Delete("/vsimem/jp2openjpeg_15.jp2") assert got_data == data + ############################################################################### # Test reading PixelIsPoint file (#5437) def test_jp2openjpeg_16(): - ds = gdal.Open('data/jpeg2000/byte_point.jp2') + ds = gdal.Open("data/jpeg2000/byte_point.jp2") gt = ds.GetGeoTransform() - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ - 'did not get AREA_OR_POINT = Point' + assert ( + ds.GetMetadataItem("AREA_OR_POINT") == "Point" + ), "did not get AREA_OR_POINT = Point" ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) - assert gt == gt_expected, 'did not get expected geotransform' + assert gt == gt_expected, "did not get expected geotransform" - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", "TRUE") - ds = gdal.Open('data/jpeg2000/byte_point.jp2') + ds = gdal.Open("data/jpeg2000/byte_point.jp2") gt = ds.GetGeoTransform() ds = None - gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) + gdal.SetConfigOption("GTIFF_POINT_GEO_IGNORE", None) gt_expected = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - assert gt == gt_expected, \ - 'did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE' + assert ( + gt == gt_expected + ), "did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE" + ############################################################################### # Test writing PixelIsPoint file (#5437) @@ -424,24 +483,26 @@ def test_jp2openjpeg_16(): def test_jp2openjpeg_17(): - src_ds = gdal.Open('data/jpeg2000/byte_point.jp2') - ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_17.jp2', src_ds) + src_ds = gdal.Open("data/jpeg2000/byte_point.jp2") + ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_17.jp2", src_ds) ds = None src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_17.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_17.jp2.aux.xml") is None - ds = gdal.Open('/vsimem/jp2openjpeg_17.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_17.jp2") gt = ds.GetGeoTransform() - assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ - 'did not get AREA_OR_POINT = Point' + assert ( + ds.GetMetadataItem("AREA_OR_POINT") == "Point" + ), "did not get AREA_OR_POINT = Point" ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) - assert gt == gt_expected, 'did not get expected geotransform' + assert gt == gt_expected, "did not get expected geotransform" + + gdal.Unlink("/vsimem/jp2openjpeg_17.jp2") - gdal.Unlink('/vsimem/jp2openjpeg_17.jp2') ############################################################################### # Test when using the decode_area API when one dimension of the dataset is not a @@ -450,17 +511,22 @@ def test_jp2openjpeg_17(): def test_jp2openjpeg_18(): - src_ds = gdal.GetDriverByName('Mem').Create('', 2000, 2000) - ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_18.jp2', src_ds, options=['BLOCKXSIZE=2000', 'BLOCKYSIZE=2000']) + src_ds = gdal.GetDriverByName("Mem").Create("", 2000, 2000) + ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_18.jp2", + src_ds, + options=["BLOCKXSIZE=2000", "BLOCKYSIZE=2000"], + ) ds = None src_ds = None - ds = gdal.Open('/vsimem/jp2openjpeg_18.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_18.jp2") ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - gdal.Unlink('/vsimem/jp2openjpeg_18.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_18.jp2") + ############################################################################### # Test reading file where GMLJP2 has nul character instead of \n (#5760) @@ -468,66 +534,99 @@ def test_jp2openjpeg_18(): def test_jp2openjpeg_19(): - ds = gdal.Open('data/jpeg2000/byte_gmljp2_with_nul_car.jp2') - assert ds.GetProjectionRef() != '' + ds = gdal.Open("data/jpeg2000/byte_gmljp2_with_nul_car.jp2") + assert ds.GetProjectionRef() != "" ds = None + ############################################################################### # Validate GMLJP2 content against schema def test_jp2openjpeg_20(): - xmlvalidate = pytest.importorskip('xmlvalidate') + xmlvalidate = pytest.importorskip("xmlvalidate") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET.zip') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET.zip") except OSError: try: - os.stat('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip') - shutil.copy('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip', 'tmp/cache') + os.stat("../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip") + shutil.copy("../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip", "tmp/cache") except OSError: - url = 'http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip' - if not gdaltest.download_file(url, 'SCHEMAS_OPENGIS_NET.zip', force_download=True, max_download_duration=20): - pytest.skip('Cannot get SCHEMAS_OPENGIS_NET.zip') + url = "http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip" + if not gdaltest.download_file( + url, + "SCHEMAS_OPENGIS_NET.zip", + force_download=True, + max_download_duration=20, + ): + pytest.skip("Cannot get SCHEMAS_OPENGIS_NET.zip") try: - os.mkdir('tmp/cache/SCHEMAS_OPENGIS_NET') + os.mkdir("tmp/cache/SCHEMAS_OPENGIS_NET") except OSError: pass try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/gml/3.1.1/profiles/gmlJP2Profile/1.0.0/gmlJP2Profile.xsd') + os.stat( + "tmp/cache/SCHEMAS_OPENGIS_NET/gml/3.1.1/profiles/gmlJP2Profile/1.0.0/gmlJP2Profile.xsd" + ) except OSError: - gdaltest.unzip('tmp/cache/SCHEMAS_OPENGIS_NET', 'tmp/cache/SCHEMAS_OPENGIS_NET.zip') + gdaltest.unzip( + "tmp/cache/SCHEMAS_OPENGIS_NET", "tmp/cache/SCHEMAS_OPENGIS_NET.zip" + ) try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd") except OSError: - xlink_xsd_url = 'http://www.w3.org/1999/xlink.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): - xlink_xsd_url = 'http://even.rouault.free.fr/xlink.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): - pytest.skip('Cannot get xlink.xsd') + xlink_xsd_url = "http://www.w3.org/1999/xlink.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xlink.xsd", + force_download=True, + max_download_duration=10, + ): + xlink_xsd_url = "http://even.rouault.free.fr/xlink.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xlink.xsd", + force_download=True, + max_download_duration=10, + ): + pytest.skip("Cannot get xlink.xsd") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd") except OSError: - xlink_xsd_url = 'http://www.w3.org/1999/xml.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): - xlink_xsd_url = 'http://even.rouault.free.fr/xml.xsd' - if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): - pytest.skip('Cannot get xml.xsd') - - xmlvalidate.transform_abs_links_to_ref_links('tmp/cache/SCHEMAS_OPENGIS_NET') - - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_20.jp2', src_ds) + xlink_xsd_url = "http://www.w3.org/1999/xml.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xml.xsd", + force_download=True, + max_download_duration=10, + ): + xlink_xsd_url = "http://even.rouault.free.fr/xml.xsd" + if not gdaltest.download_file( + xlink_xsd_url, + "SCHEMAS_OPENGIS_NET/xml.xsd", + force_download=True, + max_download_duration=10, + ): + pytest.skip("Cannot get xml.xsd") + + xmlvalidate.transform_abs_links_to_ref_links("tmp/cache/SCHEMAS_OPENGIS_NET") + + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_20.jp2", src_ds) gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] ds = None - gdal.Unlink('/vsimem/jp2openjpeg_20.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_20.jp2") + + assert xmlvalidate.validate( + gmljp2, ogc_schemas_location="tmp/cache/SCHEMAS_OPENGIS_NET" + ) - assert xmlvalidate.validate(gmljp2, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') ############################################################################### # Test YCC=NO creation option @@ -535,15 +634,20 @@ def test_jp2openjpeg_20(): def test_jp2openjpeg_21(): - src_ds = gdal.Open('data/rgbsmall.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_21.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES', 'YCC=NO']) + src_ds = gdal.Open("data/rgbsmall.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_21.jp2", + src_ds, + options=["QUALITY=100", "REVERSIBLE=YES", "YCC=NO"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_21.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_21.jp2") # Quite a bit of difference... - assert maxdiff <= 1, 'Image too different from reference' + assert maxdiff <= 1, "Image too different from reference" + ############################################################################### # Test RGBA support @@ -552,97 +656,116 @@ def test_jp2openjpeg_21(): def test_jp2openjpeg_22(): # RGBA - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", src_ds, options=["QUALITY=100", "REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # RGBA with 1BIT_ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['1BIT_ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", src_ds, options=["1BIT_ALPHA=YES"] + ) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - ds = gdal.OpenEx('/vsimem/jp2openjpeg_22.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + ds = gdal.OpenEx( + "/vsimem/jp2openjpeg_22.jp2", open_options=["1BIT_ALPHA_PROMOTION=NO"] + ) fourth_band = ds.GetRasterBand(4) - assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert fourth_band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - ds = gdal.Open('/vsimem/jp2openjpeg_22.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_22.jp2") assert ds.GetRasterBand(4).Checksum() == 23120 ds = None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") # RGBA with YCBCR420=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['YCBCR420=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", src_ds, options=["YCBCR420=YES"] + ) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(1).Checksum() in [11457, 11450, 11498, 11502] ds = None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") # RGBA with YCC=YES. Will emit a warning for now because of OpenJPEG # bug (only fixed in trunk, not released versions at that time) - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['YCC=YES', 'QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", + src_ds, + options=["YCC=YES", "QUALITY=100", "REVERSIBLE=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # RGB,undefined - src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba_photometric_rgb.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", src_ds, options=["QUALITY=100", "REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined ds = None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # RGB,undefined with ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES', 'ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba_photometric_rgb.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_22.jp2", + src_ds, + options=["QUALITY=100", "REVERSIBLE=YES", "ALPHA=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_22.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_22.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_22.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_22.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdal.Unlink('/vsimem/jp2openjpeg_22.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_22.jp2") + + assert maxdiff <= 0, "Image too different from reference" - assert maxdiff <= 0, 'Image too different from reference' ############################################################################### # Test NBITS support @@ -650,24 +773,29 @@ def test_jp2openjpeg_22(): def test_jp2openjpeg_23(): - src_ds = gdal.Open('../gcore/data/uint16.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_23.jp2', src_ds, options=['NBITS=9', 'QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/uint16.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_23.jp2", + src_ds, + options=["NBITS=9", "QUALITY=100", "REVERSIBLE=YES"], + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - ds = gdal.Open('/vsimem/jp2openjpeg_23.jp2') - assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' + ds = gdal.Open("/vsimem/jp2openjpeg_23.jp2") + assert ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "9" - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_23_2.jp2', ds) - assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_23_2.jp2", ds) + assert out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "9" del out_ds ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_23.jp2.aux.xml') is None - gdal.Unlink('/vsimem/jp2openjpeg_23.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_23_2.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_23.jp2.aux.xml") is None + gdal.Unlink("/vsimem/jp2openjpeg_23.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_23_2.jp2") + + assert maxdiff <= 1, "Image too different from reference" - assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # Test Grey+alpha support @@ -676,36 +804,43 @@ def test_jp2openjpeg_23(): def test_jp2openjpeg_24(): # Grey+alpha - src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_24.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_greyalpha.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_24.jp2", src_ds, options=["QUALITY=100", "REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_24.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_24.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_24.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_24.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdal.Unlink('/vsimem/jp2openjpeg_24.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_24.jp2") - assert maxdiff <= 0, 'Image too different from reference' + assert maxdiff <= 0, "Image too different from reference" # Grey+alpha with 1BIT_ALPHA=YES - src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_24.jp2', src_ds, options=['1BIT_ALPHA=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_greyalpha.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_24.jp2", src_ds, options=["1BIT_ALPHA=YES"] + ) del out_ds src_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_24.jp2.aux.xml') is None - ds = gdal.OpenEx('/vsimem/jp2openjpeg_24.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + assert gdal.VSIStatL("/vsimem/jp2openjpeg_24.jp2.aux.xml") is None + ds = gdal.OpenEx( + "/vsimem/jp2openjpeg_24.jp2", open_options=["1BIT_ALPHA_PROMOTION=NO"] + ) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand - assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert ds.GetRasterBand(2).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - ds = gdal.Open('/vsimem/jp2openjpeg_24.jp2') - assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + ds = gdal.Open("/vsimem/jp2openjpeg_24.jp2") + assert ds.GetRasterBand(2).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None assert ds.GetRasterBand(2).Checksum() == 23120 ds = None - gdal.Unlink('/vsimem/jp2openjpeg_24.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_24.jp2") + ############################################################################### # Test multiband support @@ -713,200 +848,266 @@ def test_jp2openjpeg_24(): def test_jp2openjpeg_25(): - src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 5) + src_ds = gdal.GetDriverByName("MEM").Create("", 100, 100, 5) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(2).Fill(250) src_ds.GetRasterBand(3).Fill(245) src_ds.GetRasterBand(4).Fill(240) src_ds.GetRasterBand(5).Fill(235) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_25.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_25.jp2", src_ds, options=["QUALITY=100", "REVERSIBLE=YES"] + ) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None - ds = gdal.Open('/vsimem/jp2openjpeg_25.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_25.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_Undefined ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_25.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_25.jp2.aux.xml") is None - gdal.Unlink('/vsimem/jp2openjpeg_25.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_25.jp2") + + assert maxdiff <= 0, "Image too different from reference" - assert maxdiff <= 0, 'Image too different from reference' ############################################################################### -def validate(filename, expected_gmljp2=True, return_error_count=False, oidoc=None, inspire_tg=True): +def validate( + filename, + expected_gmljp2=True, + return_error_count=False, + oidoc=None, + inspire_tg=True, +): - for path in ('../ogr', samples_path): + for path in ("../ogr", samples_path): if path not in sys.path: sys.path.append(path) - validate_jp2 = pytest.importorskip('validate_jp2') + validate_jp2 = pytest.importorskip("validate_jp2") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') - ogc_schemas_location = 'tmp/cache/SCHEMAS_OPENGIS_NET' + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET") + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd") + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd") + ogc_schemas_location = "tmp/cache/SCHEMAS_OPENGIS_NET" except OSError: - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" - if ogc_schemas_location != 'disabled': + if ogc_schemas_location != "disabled": try: import xmlvalidate + xmlvalidate.validate # to make pyflakes happy except (ImportError, AttributeError): - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" - res = validate_jp2.validate(filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location) + res = validate_jp2.validate( + filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location + ) if return_error_count: return (res.error_count, res.warning_count) if res.error_count == 0 and res.warning_count == 0: return pytest.fail() + ############################################################################### # Test INSPIRE_TG support def test_jp2openjpeg_26(): - src_ds = gdal.GetDriverByName('MEM').Create('', 2048, 2048, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 2048, 2048, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([450000, 1, 0, 5000000, 0, -1]) # Nominal case: tiled - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES"] + ) overview_count = out_ds.GetRasterBand(1).GetOverviewCount() # We have 2x2 1024x1024 tiles. Each of them can be reconstructed down to 128x128. # So for full raster the smallest overview is 2*128 - assert (out_ds.GetRasterBand(1).GetOverview(overview_count - 1).XSize == 2 * 128 and \ - out_ds.GetRasterBand(1).GetOverview(overview_count - 1).YSize == 2 * 128) + assert ( + out_ds.GetRasterBand(1).GetOverview(overview_count - 1).XSize == 2 * 128 + and out_ds.GetRasterBand(1).GetOverview(overview_count - 1).YSize == 2 * 128 + ) out_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - assert validate('/vsimem/jp2openjpeg_26.jp2') != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + assert validate("/vsimem/jp2openjpeg_26.jp2") != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Nominal case: untiled - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'BLOCKXSIZE=2048', 'BLOCKYSIZE=2048']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "BLOCKXSIZE=2048", "BLOCKYSIZE=2048"], + ) overview_count = out_ds.GetRasterBand(1).GetOverviewCount() - assert (out_ds.GetRasterBand(1).GetOverview(overview_count - 1).XSize == 128 and \ - out_ds.GetRasterBand(1).GetOverview(overview_count - 1).YSize == 128) + assert ( + out_ds.GetRasterBand(1).GetOverview(overview_count - 1).XSize == 128 + and out_ds.GetRasterBand(1).GetOverview(overview_count - 1).YSize == 128 + ) gdal.ErrorReset() out_ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" out_ds.GetRasterBand(1).GetOverview(0).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" out_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - assert validate('/vsimem/jp2openjpeg_26.jp2') != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + assert validate("/vsimem/jp2openjpeg_26.jp2") != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Nominal case: RGBA - src_ds = gdal.GetDriverByName('MEM').Create('', 128, 128, 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 128, 128, 4) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([450000, 1, 0, 5000000, 0, -1]) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'ALPHA=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES", "ALPHA=YES"] + ) out_ds = None - ds = gdal.OpenEx('/vsimem/jp2openjpeg_26.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) + ds = gdal.OpenEx( + "/vsimem/jp2openjpeg_26.jp2", open_options=["1BIT_ALPHA_PROMOTION=NO"] + ) assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand - assert ds.GetRasterBand(4).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + assert ds.GetRasterBand(4).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - assert validate('/vsimem/jp2openjpeg_26.jp2') != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + assert validate("/vsimem/jp2openjpeg_26.jp2") != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Warning case: disabling JPX gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'JPX=NO']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES", "JPX=NO"] + ) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" out_ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - res = validate('/vsimem/jp2openjpeg_26.jp2', return_error_count=True) - assert res == 'skip' or res == (2, 0) - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + res = validate("/vsimem/jp2openjpeg_26.jp2", return_error_count=True) + assert res == "skip" or res == (2, 0) + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Bilevel (1 bit) - src_ds = gdal.GetDriverByName('MEM').Create('', 128, 128, 1) - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES']) - assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' + src_ds = gdal.GetDriverByName("MEM").Create("", 128, 128, 1) + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", "1", "IMAGE_STRUCTURE") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES"] + ) + assert out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "1" ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - assert validate('/vsimem/jp2openjpeg_26.jp2', expected_gmljp2=False) != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + assert validate("/vsimem/jp2openjpeg_26.jp2", expected_gmljp2=False) != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Auto-promotion 12->16 bits - src_ds = gdal.GetDriverByName('MEM').Create('', 128, 128, 1, gdal.GDT_UInt16) - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '12', 'IMAGE_STRUCTURE') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES']) - assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + src_ds = gdal.GetDriverByName("MEM").Create("", 128, 128, 1, gdal.GDT_UInt16) + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", "12", "IMAGE_STRUCTURE") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES"] + ) + assert out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_26.jp2.aux.xml') is None - assert validate('/vsimem/jp2openjpeg_26.jp2', expected_gmljp2=False) != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_26.jp2.aux.xml") is None + assert validate("/vsimem/jp2openjpeg_26.jp2", expected_gmljp2=False) != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") - src_ds = gdal.GetDriverByName('MEM').Create('', 2048, 2048, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 2048, 2048, 1) # Error case: too big tile gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'BLOCKXSIZE=1536', 'BLOCKYSIZE=1536']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "BLOCKXSIZE=1536", "BLOCKYSIZE=1536"], + ) gdal.PopErrorHandler() assert out_ds is None # Error case: non square tile gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=128']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "BLOCKXSIZE=512", "BLOCKYSIZE=128"], + ) gdal.PopErrorHandler() assert out_ds is None # Error case: incompatible PROFILE gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'PROFILE=UNRESTRICTED']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "PROFILE=UNRESTRICTED"], + ) gdal.PopErrorHandler() assert out_ds is None # Error case: valid, but too small number of resolutions regarding PROFILE_1 gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'RESOLUTIONS=1']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "RESOLUTIONS=1"], + ) gdal.PopErrorHandler() assert out_ds is None # Too big resolution number. Will fallback to default one gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'RESOLUTIONS=100']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "RESOLUTIONS=100"], + ) gdal.PopErrorHandler() assert out_ds is not None out_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_26.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_26.jp2") # Error case: unsupported NBITS gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'NBITS=2']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", src_ds, options=["INSPIRE_TG=YES", "NBITS=2"] + ) gdal.PopErrorHandler() assert out_ds is None # Error case: unsupported CODEC (J2K) gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.j2k', src_ds, options=['INSPIRE_TG=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.j2k", src_ds, options=["INSPIRE_TG=YES"] + ) gdal.PopErrorHandler() assert out_ds is None # Error case: invalid CODEBLOCK_WIDTH/HEIGHT gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'CODEBLOCK_WIDTH=128', 'CODEBLOCK_HEIGHT=32']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "CODEBLOCK_WIDTH=128", "CODEBLOCK_HEIGHT=32"], + ) gdal.PopErrorHandler() assert out_ds is None gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_26.jp2', src_ds, options=['INSPIRE_TG=YES', 'CODEBLOCK_WIDTH=32', 'CODEBLOCK_HEIGHT=128']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_26.jp2", + src_ds, + options=["INSPIRE_TG=YES", "CODEBLOCK_WIDTH=32", "CODEBLOCK_HEIGHT=128"], + ) gdal.PopErrorHandler() assert out_ds is None + ############################################################################### # Test CreateCopy() from a JPEG2000 with a 2048x2048 tiling @@ -916,15 +1117,22 @@ def test_jp2openjpeg_27(): # Test optimization in GDALCopyWholeRasterGetSwathSize() # Not sure how we can check that except looking at logs with CPL_DEBUG=GDAL # for "GDAL: GDALDatasetCopyWholeRaster(): 2048*2048 swaths, bInterleave=1" - src_ds = gdal.GetDriverByName('MEM').Create('', 2049, 2049, 4) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_27.jp2', src_ds, options=['RESOLUTIONS=1', 'BLOCKXSIZE=2048', 'BLOCKYSIZE=2048']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2049, 2049, 4) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_27.jp2", + src_ds, + options=["RESOLUTIONS=1", "BLOCKXSIZE=2048", "BLOCKYSIZE=2048"], + ) src_ds = None # print('End of JP2 decoding') - out2_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2openjpeg_27.tif', out_ds, options=['TILED=YES']) + out2_ds = gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/jp2openjpeg_27.tif", out_ds, options=["TILED=YES"] + ) out_ds = None del out2_ds - gdal.Unlink('/vsimem/jp2openjpeg_27.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_27.tif') + gdal.Unlink("/vsimem/jp2openjpeg_27.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_27.tif") + ############################################################################### # Test CODEBLOCK_WIDTH/_HEIGHT @@ -954,8 +1162,10 @@ def get_attribute_val(ar, attr_name): node = find_xml_node(ar, attr_name, True) if node is None or node[XML_TYPE_IDX] != gdal.CXT_Attribute: return None - if len(ar) > XML_FIRST_CHILD_IDX and \ - node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text: + if ( + len(ar) > XML_FIRST_CHILD_IDX + and node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text + ): return node[XML_FIRST_CHILD_IDX][XML_VALUE_IDX] return None @@ -963,7 +1173,11 @@ def get_attribute_val(ar, attr_name): def find_element_with_name(ar, element_name, name): typ = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] - if typ == gdal.CXT_Element and value == element_name and get_attribute_val(ar, 'name') == name: + if ( + typ == gdal.CXT_Element + and value == element_name + and get_attribute_val(ar, "name") == name + ): return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] @@ -984,9 +1198,19 @@ def get_element_val(node): def jp2openjpeg_test_codeblock(filename, codeblock_width, codeblock_height): - node = gdal.GetJPEG2000Structure(filename, ['ALL=YES']) - xcb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_xcb_minus_2")))) - ycb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_ycb_minus_2")))) + node = gdal.GetJPEG2000Structure(filename, ["ALL=YES"]) + xcb = 2 ** ( + 2 + + int( + get_element_val(find_element_with_name(node, "Field", "SPcod_xcb_minus_2")) + ) + ) + ycb = 2 ** ( + 2 + + int( + get_element_val(find_element_with_name(node, "Field", "SPcod_ycb_minus_2")) + ) + ) if xcb != codeblock_width or ycb != codeblock_height: return False return True @@ -994,31 +1218,37 @@ def jp2openjpeg_test_codeblock(filename, codeblock_width, codeblock_height): def test_jp2openjpeg_28(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) - tests = [(['CODEBLOCK_WIDTH=2'], 64, 64, True), - (['CODEBLOCK_WIDTH=2048'], 64, 64, True), - (['CODEBLOCK_HEIGHT=2'], 64, 64, True), - (['CODEBLOCK_HEIGHT=2048'], 64, 64, True), - (['CODEBLOCK_WIDTH=128', 'CODEBLOCK_HEIGHT=128'], 64, 64, True), - (['CODEBLOCK_WIDTH=63'], 32, 64, True), - (['CODEBLOCK_WIDTH=32', 'CODEBLOCK_HEIGHT=32'], 32, 32, False), - ] + tests = [ + (["CODEBLOCK_WIDTH=2"], 64, 64, True), + (["CODEBLOCK_WIDTH=2048"], 64, 64, True), + (["CODEBLOCK_HEIGHT=2"], 64, 64, True), + (["CODEBLOCK_HEIGHT=2048"], 64, 64, True), + (["CODEBLOCK_WIDTH=128", "CODEBLOCK_HEIGHT=128"], 64, 64, True), + (["CODEBLOCK_WIDTH=63"], 32, 64, True), + (["CODEBLOCK_WIDTH=32", "CODEBLOCK_HEIGHT=32"], 32, 32, False), + ] for (options, expected_cbkw, expected_cbkh, warning_expected) in tests: gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_28.jp2', src_ds, options=options) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_28.jp2", src_ds, options=options + ) gdal.PopErrorHandler() - if warning_expected and gdal.GetLastErrorMsg() == '': + if warning_expected and gdal.GetLastErrorMsg() == "": print(options) - pytest.fail('warning expected') + pytest.fail("warning expected") del out_ds - if not jp2openjpeg_test_codeblock('/vsimem/jp2openjpeg_28.jp2', expected_cbkw, expected_cbkh): + if not jp2openjpeg_test_codeblock( + "/vsimem/jp2openjpeg_28.jp2", expected_cbkw, expected_cbkh + ): print(options) - pytest.fail('unexpected codeblock size') + pytest.fail("unexpected codeblock size") + + gdal.Unlink("/vsimem/jp2openjpeg_28.jp2") - gdal.Unlink('/vsimem/jp2openjpeg_28.jp2') ############################################################################### # Test TILEPARTS option @@ -1026,31 +1256,35 @@ def test_jp2openjpeg_28(): def test_jp2openjpeg_29(): - src_ds = gdal.GetDriverByName('MEM').Create('', 128, 128, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 128, 128, 1) - tests = [(['TILEPARTS=DISABLED'], False), - (['TILEPARTS=RESOLUTIONS'], False), - (['TILEPARTS=LAYERS'], True), # warning since there's only one quality layer - (['TILEPARTS=LAYERS', 'QUALITY=1,2'], False), - (['TILEPARTS=COMPONENTS'], False), - (['TILEPARTS=ILLEGAL'], True), - ] + tests = [ + (["TILEPARTS=DISABLED"], False), + (["TILEPARTS=RESOLUTIONS"], False), + (["TILEPARTS=LAYERS"], True), # warning since there's only one quality layer + (["TILEPARTS=LAYERS", "QUALITY=1,2"], False), + (["TILEPARTS=COMPONENTS"], False), + (["TILEPARTS=ILLEGAL"], True), + ] for (options, warning_expected) in tests: gdal.ErrorReset() gdal.PushErrorHandler() - options.append('BLOCKXSIZE=64') - options.append('BLOCKYSIZE=64') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_29.jp2', src_ds, options=options) + options.append("BLOCKXSIZE=64") + options.append("BLOCKYSIZE=64") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_29.jp2", src_ds, options=options + ) gdal.PopErrorHandler() - if warning_expected and gdal.GetLastErrorMsg() == '': + if warning_expected and gdal.GetLastErrorMsg() == "": print(options) - pytest.fail('warning expected') + pytest.fail("warning expected") # Not sure if that could be easily checked del out_ds # print gdal.GetJPEG2000StructureAsString('/vsimem/jp2openjpeg_29.jp2', ['ALL=YES']) - gdal.Unlink('/vsimem/jp2openjpeg_29.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_29.jp2") + ############################################################################### # Test color table support @@ -1058,7 +1292,7 @@ def test_jp2openjpeg_29(): def test_jp2openjpeg_30(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ct.SetColorEntry(1, (255, 255, 0, 255)) @@ -1066,114 +1300,127 @@ def test_jp2openjpeg_30(): ct.SetColorEntry(3, (0, 255, 255, 255)) src_ds.GetRasterBand(1).SetRasterColorTable(ct) - tests = [([], False), - (['QUALITY=100', 'REVERSIBLE=YES'], False), - (['QUALITY=50'], True), - (['REVERSIBLE=NO'], True), - ] + tests = [ + ([], False), + (["QUALITY=100", "REVERSIBLE=YES"], False), + (["QUALITY=50"], True), + (["REVERSIBLE=NO"], True), + ] for (options, warning_expected) in tests: gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_30.jp2', src_ds, options=options) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_30.jp2", src_ds, options=options + ) gdal.PopErrorHandler() - if warning_expected and gdal.GetLastErrorMsg() == '': + if warning_expected and gdal.GetLastErrorMsg() == "": print(options) - pytest.fail('warning expected') + pytest.fail("warning expected") ct = out_ds.GetRasterBand(1).GetRasterColorTable() - assert (ct.GetCount() == 4 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.' + assert ( + ct.GetCount() == 4 + 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." del out_ds - assert validate('/vsimem/jp2openjpeg_30.jp2', expected_gmljp2=False) != 'fail' + assert validate("/vsimem/jp2openjpeg_30.jp2", expected_gmljp2=False) != "fail" - gdal.Unlink('/vsimem/jp2openjpeg_30.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_30.jp2") # Test with c4 != 255 - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (0, 0, 0, 0)) ct.SetColorEntry(1, (255, 255, 0, 255)) ct.SetColorEntry(2, (255, 0, 255, 255)) ct.SetColorEntry(3, (0, 255, 255, 255)) src_ds.GetRasterBand(1).SetRasterColorTable(ct) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_30.jp2', src_ds) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_30.jp2", src_ds) ct = out_ds.GetRasterBand(1).GetRasterColorTable() - assert (ct.GetCount() == 4 and \ - ct.GetColorEntry(0) == (0, 0, 0, 0) 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.' + assert ( + ct.GetCount() == 4 + and ct.GetColorEntry(0) == (0, 0, 0, 0) + 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." del out_ds - gdal.Unlink('/vsimem/jp2openjpeg_30.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_30.jp2") # Same but with CT_COMPONENTS=3 - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (0, 0, 0, 0)) ct.SetColorEntry(1, (255, 255, 0, 255)) ct.SetColorEntry(2, (255, 0, 255, 255)) ct.SetColorEntry(3, (0, 255, 255, 255)) src_ds.GetRasterBand(1).SetRasterColorTable(ct) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_30.jp2', src_ds, options=['CT_COMPONENTS=3']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_30.jp2", src_ds, options=["CT_COMPONENTS=3"] + ) ct = out_ds.GetRasterBand(1).GetRasterColorTable() - assert (ct.GetCount() == 4 and \ - ct.GetColorEntry(0) == (0, 0, 0, 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.' + assert ( + ct.GetCount() == 4 + and ct.GetColorEntry(0) == (0, 0, 0, 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." del out_ds - gdal.Unlink('/vsimem/jp2openjpeg_30.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_30.jp2") # Not supported: color table on first band, and other bands - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 2) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 2) ct = gdal.ColorTable() src_ds.GetRasterBand(1).SetRasterColorTable(ct) gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_30.jp2', src_ds) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_30.jp2", src_ds) gdal.PopErrorHandler() assert out_ds is None + ############################################################################### # Test unusual band color interpretation order def test_jp2openjpeg_31(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 3) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 3) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_RedBand) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_31.jp2', src_ds) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_31.jp2", src_ds) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_31.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_31.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_31.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_31.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None - gdal.Unlink('/vsimem/jp2openjpeg_31.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_31.jp2") # With alpha now - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 4) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_RedBand) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_31.jp2', src_ds) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_31.jp2", src_ds) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_31.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_31.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_31.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_31.jp2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_RedBand ds = None - gdal.Unlink('/vsimem/jp2openjpeg_31.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_31.jp2") + ############################################################################### # Test creation of "XLBoxes" for JP2C @@ -1181,13 +1428,16 @@ def test_jp2openjpeg_31(): def test_jp2openjpeg_32(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 1) gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_32.jp2', src_ds, options=['JP2C_XLBOX=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_32.jp2", src_ds, options=["JP2C_XLBOX=YES"] + ) gdal.PopErrorHandler() assert out_ds.GetRasterBand(1).Checksum() == 0 out_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_32.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_32.jp2") + ############################################################################### # Test crazy tile size @@ -1195,18 +1445,25 @@ def test_jp2openjpeg_32(): def test_jp2openjpeg_33(): - src_ds = gdal.Open(""" + src_ds = gdal.Open( + """ -""") +""" + ) gdal.PushErrorHandler() # Limit number of resolutions, because of # https://github.com/uclouvain/openjpeg/issues/493 - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_33.jp2', src_ds, options=['BLOCKXSIZE=100000', 'BLOCKYSIZE=100000', 'RESOLUTIONS=5']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_33.jp2", + src_ds, + options=["BLOCKXSIZE=100000", "BLOCKYSIZE=100000", "RESOLUTIONS=5"], + ) gdal.PopErrorHandler() assert out_ds is None out_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_33.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_33.jp2") + ############################################################################### # Test opening a file whose dimensions are > 2^31-1 @@ -1215,7 +1472,7 @@ def test_jp2openjpeg_33(): def test_jp2openjpeg_34(): gdal.PushErrorHandler() - ds = gdal.Open('data/jpeg2000/dimensions_above_31bit.jp2') + ds = gdal.Open("data/jpeg2000/dimensions_above_31bit.jp2") gdal.PopErrorHandler() assert ds is None @@ -1223,24 +1480,27 @@ def test_jp2openjpeg_34(): ############################################################################### # Test opening a truncated file + def test_jp2openjpeg_35(): gdal.PushErrorHandler() - ds = gdal.Open('data/jpeg2000/truncated.jp2') + ds = gdal.Open("data/jpeg2000/truncated.jp2") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Test we cannot create files with more than 16384 bands def test_jp2openjpeg_36(): - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 16385) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2, 16385) gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_36.jp2', src_ds) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_36.jp2", src_ds) gdal.PopErrorHandler() - assert out_ds is None and gdal.VSIStatL('/vsimem/jp2openjpeg_36.jp2') is None + assert out_ds is None and gdal.VSIStatL("/vsimem/jp2openjpeg_36.jp2") is None + ############################################################################### # Test metadata reading & writing @@ -1249,89 +1509,109 @@ def test_jp2openjpeg_36(): def test_jp2openjpeg_37(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") assert ds.GetMetadata() == {} - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Simple metadata in main domain - for options in [['WRITE_METADATA=YES'], ['WRITE_METADATA=YES', 'INSPIRE_TG=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"], ["WRITE_METADATA=YES", "INSPIRE_TG=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - assert ds.GetMetadata() == {'FOO': 'BAR'} + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + assert ds.GetMetadata() == {"FOO": "BAR"} ds = None - assert not ('INSPIRE_TG=YES' in options and validate('/vsimem/jp2openjpeg_37.jp2', expected_gmljp2=False) == 'fail') + assert not ( + "INSPIRE_TG=YES" in options + and validate("/vsimem/jp2openjpeg_37.jp2", expected_gmljp2=False) == "fail" + ) - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Simple metadata in auxiliary domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadataItem('FOO', 'BAR', 'SOME_DOMAIN') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadataItem("FOO", "BAR", "SOME_DOMAIN") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - md = ds.GetMetadata('SOME_DOMAIN') - assert md == {'FOO': 'BAR'} - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + md = ds.GetMetadata("SOME_DOMAIN") + assert md == {"FOO": "BAR"} + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Simple metadata in auxiliary XML domain - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:SOME_DOMAIN') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=['WRITE_METADATA=YES']) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:SOME_DOMAIN") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=["WRITE_METADATA=YES"] + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - assert ds.GetMetadata('xml:SOME_DOMAIN')[0] == '\n' - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + assert ds.GetMetadata("xml:SOME_DOMAIN")[0] == "\n" + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Special xml:BOX_ metadata domain - for options in [['WRITE_METADATA=YES'], ['WRITE_METADATA=YES', 'INSPIRE_TG=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:BOX_1') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"], ["WRITE_METADATA=YES", "INSPIRE_TG=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:BOX_1") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - assert ds.GetMetadata('xml:BOX_0')[0] == '' - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + assert ds.GetMetadata("xml:BOX_0")[0] == "" + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Special xml:XMP metadata domain - for options in [['WRITE_METADATA=YES'], ['WRITE_METADATA=YES', 'INSPIRE_TG=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:XMP') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"], ["WRITE_METADATA=YES", "INSPIRE_TG=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:XMP") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - assert ds.GetMetadata('xml:XMP')[0] == '' + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + assert ds.GetMetadata("xml:XMP")[0] == "" ds = None - assert not ('INSPIRE_TG=YES' in options and validate('/vsimem/jp2openjpeg_37.jp2', expected_gmljp2=False) == 'fail') + assert not ( + "INSPIRE_TG=YES" in options + and validate("/vsimem/jp2openjpeg_37.jp2", expected_gmljp2=False) == "fail" + ) - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") # Special xml:IPR metadata domain - for options in [['WRITE_METADATA=YES']]: - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) - src_ds.SetMetadata([''], 'xml:IPR') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_37.jp2', src_ds, options=options) + for options in [["WRITE_METADATA=YES"]]: + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) + src_ds.SetMetadata([""], "xml:IPR") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_37.jp2", src_ds, options=options + ) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_37.jp2.aux.xml') is None - ds = gdal.Open('/vsimem/jp2openjpeg_37.jp2') - assert ds.GetMetadata('xml:IPR')[0] == '' + assert gdal.VSIStatL("/vsimem/jp2openjpeg_37.jp2.aux.xml") is None + ds = gdal.Open("/vsimem/jp2openjpeg_37.jp2") + assert ds.GetMetadata("xml:IPR")[0] == "" ds = None - assert validate('/vsimem/jp2openjpeg_37.jp2', expected_gmljp2=False) != 'fail' - gdal.Unlink('/vsimem/jp2openjpeg_37.jp2') + assert validate("/vsimem/jp2openjpeg_37.jp2", expected_gmljp2=False) != "fail" + gdal.Unlink("/vsimem/jp2openjpeg_37.jp2") ############################################################################### @@ -1341,31 +1621,36 @@ def test_jp2openjpeg_37(): def test_jp2openjpeg_38(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) + src_ds = gdal.GetDriverByName("MEM").Create("", 2, 2) wkt = """PROJCS["UTM Zone 31, Northern Hemisphere",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",100,2]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" src_ds.SetProjection(wkt) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_38.jp2', src_ds, options=['GeoJP2=NO']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_38.jp2", src_ds, options=["GeoJP2=NO"] + ) assert out_ds.GetProjectionRef() == wkt crsdictionary = out_ds.GetMetadata_List("xml:CRSDictionary.gml")[0] out_ds = None - gdal.Unlink('/vsimem/jp2openjpeg_38.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_38.jp2.aux.xml') + gdal.Unlink("/vsimem/jp2openjpeg_38.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_38.jp2.aux.xml") do_validate = False try: import xmlvalidate + do_validate = True except ImportError: - print('Cannot import xmlvalidate') + print("Cannot import xmlvalidate") try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET") except OSError: do_validate = False if do_validate: - assert xmlvalidate.validate(crsdictionary, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') + assert xmlvalidate.validate( + crsdictionary, ogc_schemas_location="tmp/cache/SCHEMAS_OPENGIS_NET" + ) ############################################################################### @@ -1375,11 +1660,13 @@ def test_jp2openjpeg_38(): def test_jp2openjpeg_39(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') + gdal.SetConfigOption("GMLJP2OVERRIDE", "/vsimem/override.gml") # This GML has srsName only on RectifiedGrid (taken from D.2.2.2 from DGIWG_Profile_of_JPEG2000_for_Georeferenced_Imagery.pdf) - gdal.FileFromMemBuffer('/vsimem/override.gml', """ + gdal.FileFromMemBuffer( + "/vsimem/override.gml", + """ -""") - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_39.jp2', src_ds, options=['GeoJP2=NO']) - gdal.SetConfigOption('GMLJP2OVERRIDE', None) - gdal.Unlink('/vsimem/override.gml') +""", + ) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_39.jp2", src_ds, options=["GeoJP2=NO"] + ) + gdal.SetConfigOption("GMLJP2OVERRIDE", None) + gdal.Unlink("/vsimem/override.gml") del out_ds - ds = gdal.Open('/vsimem/jp2openjpeg_39.jp2') - assert ds.GetProjectionRef().find('4326') >= 0 + ds = gdal.Open("/vsimem/jp2openjpeg_39.jp2") + assert ds.GetProjectionRef().find("4326") >= 0 ds = None - gdal.Unlink('/vsimem/jp2openjpeg_39.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_39.jp2") + ############################################################################### # Test we can parse GMLJP2 v2.0 @@ -1441,11 +1732,13 @@ def test_jp2openjpeg_39(): def test_jp2openjpeg_40(): # No metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) - gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') + gdal.SetConfigOption("GMLJP2OVERRIDE", "/vsimem/override.gml") - gdal.FileFromMemBuffer('/vsimem/override.gml', """ + gdal.FileFromMemBuffer( + "/vsimem/override.gml", + """ -""") - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_40.jp2', src_ds, options=['GeoJP2=NO']) - gdal.SetConfigOption('GMLJP2OVERRIDE', None) - gdal.Unlink('/vsimem/override.gml') +""", + ) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_40.jp2", src_ds, options=["GeoJP2=NO"] + ) + gdal.SetConfigOption("GMLJP2OVERRIDE", None) + gdal.Unlink("/vsimem/override.gml") del out_ds - ds = gdal.Open('/vsimem/jp2openjpeg_40.jp2') - assert ds.GetProjectionRef().find('4326') >= 0 + ds = gdal.Open("/vsimem/jp2openjpeg_40.jp2") + assert ds.GetProjectionRef().find("4326") >= 0 got_gt = ds.GetGeoTransform() expected_gt = (2, 0.1, 0, 49, 0, -0.1) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) ds = None - gdal.Unlink('/vsimem/jp2openjpeg_40.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_40.jp2") + ############################################################################### # Test USE_SRC_CODESTREAM=YES @@ -1513,36 +1810,49 @@ def test_jp2openjpeg_40(): def test_jp2openjpeg_41(): - src_ds = gdal.Open('data/jpeg2000/byte.jp2') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES', 'PROFILE=PROFILE_1', 'GEOJP2=NO', 'GMLJP2=NO']) + src_ds = gdal.Open("data/jpeg2000/byte.jp2") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_41.jp2", + src_ds, + options=[ + "USE_SRC_CODESTREAM=YES", + "PROFILE=PROFILE_1", + "GEOJP2=NO", + "GMLJP2=NO", + ], + ) assert src_ds.GetRasterBand(1).Checksum() == out_ds.GetRasterBand(1).Checksum() del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_41.jp2').size == 9923 - gdal.Unlink('/vsimem/jp2openjpeg_41.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_41.jp2.aux.xml') + assert gdal.VSIStatL("/vsimem/jp2openjpeg_41.jp2").size == 9923 + gdal.Unlink("/vsimem/jp2openjpeg_41.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_41.jp2.aux.xml") # Warning if ignored option gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES', 'QUALITY=1']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_41.jp2", + src_ds, + options=["USE_SRC_CODESTREAM=YES", "QUALITY=1"], + ) gdal.PopErrorHandler() del out_ds - assert gdal.GetLastErrorMsg() != '' - gdal.Unlink('/vsimem/jp2openjpeg_41.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_41.jp2.aux.xml') + assert gdal.GetLastErrorMsg() != "" + gdal.Unlink("/vsimem/jp2openjpeg_41.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_41.jp2.aux.xml") # Warning if source is not JPEG2000 - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_41.jp2', src_ds, - options=['USE_SRC_CODESTREAM=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_41.jp2", src_ds, options=["USE_SRC_CODESTREAM=YES"] + ) gdal.PopErrorHandler() del out_ds - assert gdal.GetLastErrorMsg() != '' - gdal.Unlink('/vsimem/jp2openjpeg_41.jp2') + assert gdal.GetLastErrorMsg() != "" + gdal.Unlink("/vsimem/jp2openjpeg_41.jp2") + ############################################################################### # Test update of existing file @@ -1550,131 +1860,144 @@ def test_jp2openjpeg_41(): def test_jp2openjpeg_42(): - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_42.jp2', src_ds, options=['JP2C_LENGTH_ZERO=YES']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_42.jp2", src_ds, options=["JP2C_LENGTH_ZERO=YES"] + ) gdal.PopErrorHandler() del out_ds # Nothing to rewrite - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) del ds # Add metadata: will be written after codestream since there's no other georef or metadata box before codestream - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - ds.SetMetadataItem('FOO', 'BAR') + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + ds.SetMetadataItem("FOO", "BAR") ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Add metadata and GCP - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - assert ds.GetMetadata() == {'FOO': 'BAR'} + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + assert ds.GetMetadata() == {"FOO": "BAR"} sr = osr.SpatialReference() sr.ImportFromEPSG(32631) gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check we got metadata and GCP, and there's no GMLJP2 box - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - assert ds.GetMetadata() == {'FOO': 'BAR'} + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + assert ds.GetMetadata() == {"FOO": "BAR"} assert ds.GetGCPCount() == 1 assert len(ds.GetMetadataDomainList()) == 2 # Unset metadata and GCP ds.SetMetadata(None) - ds.SetGCPs([], '') + ds.SetGCPs([], "") ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check we have no longer metadata or GCP - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) assert ds.GetMetadata() == {} assert ds.GetGCPCount() == 0 - assert ds.GetMetadataDomainList() == ['DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == ["DERIVED_SUBDATASETS"] # Add projection and geotransform ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([0, 1, 2, 3, 4, 5]) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check them - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - assert ds.GetProjectionRef().find('32631') >= 0 + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + assert ds.GetProjectionRef().find("32631") >= 0 assert ds.GetGeoTransform() == (0, 1, 2, 3, 4, 5) # Check that we have a GMLJP2 box - assert ds.GetMetadataDomainList() == ['xml:gml.root-instance', 'DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == [ + "xml:gml.root-instance", + "DERIVED_SUBDATASETS", + ] # Remove projection and geotransform - ds.SetProjection('') + ds.SetProjection("") ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check we have no longer anything - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - assert ds.GetProjectionRef() == '' + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + assert ds.GetProjectionRef() == "" assert ds.GetGeoTransform() == (0, 1, 0, 0, 0, 1) - assert ds.GetMetadataDomainList() == ['DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == ["DERIVED_SUBDATASETS"] ds = None # Create file with georef boxes before codestream, and disable GMLJP2 - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([0, 1, 2, 3, 4, 5]) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_42.jp2', src_ds, options=['GMLJP2=NO']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_42.jp2", src_ds, options=["GMLJP2=NO"] + ) del out_ds # Modify geotransform - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) ds.SetGeoTransform([1, 2, 3, 4, 5, 6]) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check it and that we don't have GMLJP2 - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) assert ds.GetGeoTransform() == (1, 2, 3, 4, 5, 6) - assert ds.GetMetadataDomainList() == ['DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == ["DERIVED_SUBDATASETS"] ds = None # Create file with georef boxes before codestream, and disable GeoJP2 - src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 20, 20) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2, 3, 0, 4, 0, -5]) - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_42.jp2', src_ds, options=['GeoJP2=NO']) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_42.jp2", src_ds, options=["GeoJP2=NO"] + ) del out_ds # Modify geotransform - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) assert ds.GetGeoTransform() == (2, 3, 0, 4, 0, -5) ds.SetGeoTransform([1, 2, 0, 3, 0, -4]) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check it - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) assert ds.GetGeoTransform() == (1, 2, 0, 3, 0, -4) - assert ds.GetMetadataDomainList() == ['xml:gml.root-instance', 'DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == [ + "xml:gml.root-instance", + "DERIVED_SUBDATASETS", + ] # Add GCPs gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check it (a GeoJP2 box has been added and GMLJP2 removed) - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) assert ds.GetGCPs() - assert ds.GetMetadataDomainList() == ['DERIVED_SUBDATASETS'] + assert ds.GetMetadataDomainList() == ["DERIVED_SUBDATASETS"] # Add IPR box - ds.SetMetadata([''], 'xml:IPR') + ds.SetMetadata([""], "xml:IPR") ds = None - assert gdal.VSIStatL('/vsimem/jp2openjpeg_42.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_42.jp2.aux.xml") is None # Check it - ds = gdal.Open('/vsimem/jp2openjpeg_42.jp2', gdal.GA_Update) - assert ds.GetMetadata('xml:IPR')[0] == '' + ds = gdal.Open("/vsimem/jp2openjpeg_42.jp2", gdal.GA_Update) + assert ds.GetMetadata("xml:IPR")[0] == "" ds = None - gdal.Unlink('/vsimem/jp2openjpeg_42.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_42.jp2") + ############################################################################### # Check a file against a OrthoimageryCoverage document @@ -1682,15 +2005,20 @@ def test_jp2openjpeg_42(): def test_jp2openjpeg_44(): - src_ds = gdal.Open('data/utm.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_44.jp2', src_ds, options=['INSPIRE_TG=YES']) + src_ds = gdal.Open("data/utm.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_44.jp2", src_ds, options=["INSPIRE_TG=YES"] + ) del out_ds - ret = validate('/vsimem/jp2openjpeg_44.jp2', oidoc='data/jpeg2000/utm_inspire_tg_oi.xml') - gdal.Unlink('/vsimem/jp2openjpeg_44.jp2') - gdal.Unlink('/vsimem/jp2openjpeg_44.jp2.aux.xml') + ret = validate( + "/vsimem/jp2openjpeg_44.jp2", oidoc="data/jpeg2000/utm_inspire_tg_oi.xml" + ) + gdal.Unlink("/vsimem/jp2openjpeg_44.jp2") + gdal.Unlink("/vsimem/jp2openjpeg_44.jp2.aux.xml") return ret + ############################################################################### # Test GMLJP2v2 @@ -1698,21 +2026,23 @@ def test_jp2openjpeg_44(): def test_jp2openjpeg_45(): with gdaltest.error_handler(): - if ogr.Open('../ogr/data/gml/ionic_wfs.gml') is None: - pytest.skip('GML read support missing') + if ogr.Open("../ogr/data/gml/ionic_wfs.gml") is None: + pytest.skip("GML read support missing") with gdaltest.error_handler(): - if ogr.Open('../ogr/data/kml/empty.kml') is None: - pytest.skip('KML support missing') + if ogr.Open("../ogr/data/kml/empty.kml") is None: + pytest.skip("KML support missing") # Test GMLJP2V2_DEF=YES - src_ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_45.jp2', src_ds, options=['GMLJP2V2_DEF=YES']) + src_ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_45.jp2", src_ds, options=["GMLJP2V2_DEF=YES"] + ) assert out_ds.GetLayerCount() == 0 assert out_ds.GetLayer(0) is None del out_ds - ds = gdal.Open('/vsimem/jp2openjpeg_45.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_45.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] minimal_instance = """' in gmljp2 + assert "" in gmljp2 ds = None - gdal.Unlink('/vsimem/jp2openjpeg_45.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_45.jp2") # Test valid values for grid_coverage_range_type_file - gdal.FileFromMemBuffer("/vsimem/grid_coverage_range_type_file.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/grid_coverage_range_type_file.xml", + """ custom -""") - gdal.FileFromMemBuffer("/vsimem/conf.json", '{ "root_instance": { "grid_coverage_range_type_file": "/vsimem/grid_coverage_range_type_file.xml" } }') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_45.jp2', src_ds, options=['GMLJP2V2_DEF=/vsimem/conf.json']) - gdal.Unlink('/vsimem/conf.json') - gdal.Unlink('/vsimem/grid_coverage_range_type_file.xml') +""", + ) + gdal.FileFromMemBuffer( + "/vsimem/conf.json", + '{ "root_instance": { "grid_coverage_range_type_file": "/vsimem/grid_coverage_range_type_file.xml" } }', + ) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_45.jp2", src_ds, options=["GMLJP2V2_DEF=/vsimem/conf.json"] + ) + gdal.Unlink("/vsimem/conf.json") + gdal.Unlink("/vsimem/grid_coverage_range_type_file.xml") del out_ds - ds = gdal.Open('/vsimem/jp2openjpeg_45.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_45.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] assert "custom_datarecord" in gmljp2, predefined[0] ds = None - gdal.Unlink('/vsimem/jp2openjpeg_45.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_45.jp2") # Test most invalid cases import json @@ -1869,99 +2238,96 @@ def test_jp2openjpeg_45(): gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_45.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_45.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.PopErrorHandler() assert out_ds is None conf = { "root_instance": { "grid_coverage_range_type_file": "/vsimem/i_dont_exist.xml", - "metadata": [ "", "/vsimem/i_dont_exist.xml", { "file": "/vsimem/third_metadata.xml", - "parent_node": "CoverageCollection" + "parent_node": "CoverageCollection", }, - { - "content": " + gdal.FileFromMemBuffer( + "/vsimem/second_metadata.xml", + """ Second metadata -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/third_metadata.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/third_metadata.xml", + """ Third metadata -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/feature.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/feature.xml", + """ -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/a_schema.xsd", - """ + gdal.FileFromMemBuffer( + "/vsimem/a_schema.xsd", + """ @@ -2007,56 +2373,72 @@ def test_jp2openjpeg_45(): -""") +""", + ) - for name in ['myshape', 'myshape2']: - ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/' + name + '.shp') + for name in ["myshape", "myshape2"]: + ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource( + "/vsimem/" + name + ".shp" + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer(name, srs=srs) - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('foo', 'bar') - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) + f.SetField("foo", "bar") + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 49)")) lyr.CreateFeature(f) ds = None - gdal.FileFromMemBuffer("/vsimem/feature2.gml", - """ + gdal.FileFromMemBuffer( + "/vsimem/feature2.gml", + """ -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/feature3.gml", - """ + gdal.FileFromMemBuffer( + "/vsimem/feature3.gml", + """ -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/empty.kml", - """ + gdal.FileFromMemBuffer( + "/vsimem/empty.kml", + """ -""") +""", + ) gdal.FileFromMemBuffer("/vsimem/style1.xml", '') - gdal.FileFromMemBuffer("/vsimem/style2.xml", '') - gdal.FileFromMemBuffer("/vsimem/style3.xml", '') - gdal.FileFromMemBuffer("/vsimem/style4.xml", '') + gdal.FileFromMemBuffer( + "/vsimem/style2.xml", '' + ) + gdal.FileFromMemBuffer("/vsimem/style3.xml", "") + gdal.FileFromMemBuffer("/vsimem/style4.xml", "") - gdal.FileFromMemBuffer("/vsimem/extension1.xml", '') - gdal.FileFromMemBuffer("/vsimem/extension2.xml", '') - gdal.FileFromMemBuffer("/vsimem/extension3.xml", '') - gdal.FileFromMemBuffer("/vsimem/extension4.xml", '') + gdal.FileFromMemBuffer( + "/vsimem/extension1.xml", '' + ) + gdal.FileFromMemBuffer( + "/vsimem/extension2.xml", + '', + ) + gdal.FileFromMemBuffer("/vsimem/extension3.xml", "") + gdal.FileFromMemBuffer("/vsimem/extension4.xml", "") # So that the Python text is real JSon false = False @@ -2069,11 +2451,10 @@ def test_jp2openjpeg_45(): "/vsimem/second_metadata.xml", { "file": "/vsimem/third_metadata.xml", - "parent_node": "CoverageCollection" + "parent_node": "CoverageCollection", }, { - "content": - """ + "content": """ @@ -2092,83 +2473,57 @@ def test_jp2openjpeg_45(): """, - "parent_node": "GridCoverage" - } - ], - - "annotations": [ - "/vsimem/myshape.shp", - "/vsimem/empty.kml" + "parent_node": "GridCoverage", + }, ], - + "annotations": ["/vsimem/myshape.shp", "/vsimem/empty.kml"], "gml_filelist": [ "/vsimem/feature.xml", { "file": "/vsimem/myshape.shp", "inline": false, - "parent_node": "CoverageCollection" + "parent_node": "CoverageCollection", }, { "file": "/vsimem/myshape2.shp", "namespace": "http://ogr.maptools.org/", "inline": false, "schema_location": "gmljp2://xml/a_schema.xsd", - "parent_node": "GridCoverage" + "parent_node": "GridCoverage", }, { "file": "/vsimem/feature2.gml", "inline": false, - "schema_location": "gmljp2://xml/a_schema.xsd" + "schema_location": "gmljp2://xml/a_schema.xsd", }, { "file": "/vsimem/feature3.gml", "inline": false, "namespace": "http://ogr.maptools.org/", - "schema_location": "gmljp2://xml/a_schema.xsd" - } + "schema_location": "gmljp2://xml/a_schema.xsd", + }, ], - "styles": [ "/vsimem/style1.xml", - { - "file": "/vsimem/style2.xml", - "parent_node": "GridCoverage" - }, - { - "file": "/vsimem/style3.xml", - "parent_node": "CoverageCollection" - }, - { - "file": "/vsimem/style4.xml" - } + {"file": "/vsimem/style2.xml", "parent_node": "GridCoverage"}, + {"file": "/vsimem/style3.xml", "parent_node": "CoverageCollection"}, + {"file": "/vsimem/style4.xml"}, ], - "extensions": [ "/vsimem/extension1.xml", - { - "file": "/vsimem/extension2.xml", - "parent_node": "GridCoverage" - }, - { - "file": "/vsimem/extension3.xml", - "parent_node": "CoverageCollection" - }, - { - "file": "/vsimem/extension4.xml" - } - ] + {"file": "/vsimem/extension2.xml", "parent_node": "GridCoverage"}, + {"file": "/vsimem/extension3.xml", "parent_node": "CoverageCollection"}, + {"file": "/vsimem/extension4.xml"}, + ], }, - "boxes": [ "/vsimem/a_schema.xsd", - { - "file": "/vsimem/a_schema.xsd", - "label": "duplicated.xsd" - } - ] + {"file": "/vsimem/a_schema.xsd", "label": "duplicated.xsd"}, + ], } - gdal.FileFromMemBuffer("/vsimem/grid_coverage_file.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/grid_coverage_file.xml", + """ @@ -2198,13 +2553,18 @@ def test_jp2openjpeg_45(): -""") - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_45.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) +""", + ) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_45.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.Unlink("/vsimem/grid_coverage_file.xml") gdal.Unlink("/vsimem/second_metadata.xml") gdal.Unlink("/vsimem/third_metadata.xml") gdal.Unlink("/vsimem/feature.xml") - for name in ['myshape', 'myshape2']: + for name in ["myshape", "myshape2"]: gdal.Unlink("/vsimem/" + name + ".shp") gdal.Unlink("/vsimem/" + name + ".shx") gdal.Unlink("/vsimem/" + name + ".dbf") @@ -2224,22 +2584,30 @@ def test_jp2openjpeg_45(): del out_ds # Now do the checks - dircontent = gdal.ReadDir('/vsimem/gmljp2') + dircontent = gdal.ReadDir("/vsimem/gmljp2") assert dircontent is None - ds = gdal.Open('/vsimem/jp2openjpeg_45.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_45.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] - assert 'my_GMLJP2RectifiedGridCoverage' in gmljp2 + assert "my_GMLJP2RectifiedGridCoverage" in gmljp2 first_metadata_pos = gmljp2.find("First metadata") second_metadata_pos = gmljp2.find("Second metadata") third_metadata_pos = gmljp2.find("Third metadata") - GMLJP2RectifiedGridCoverage_pos = gmljp2.find('GMLJP2RectifiedGridCoverage') + GMLJP2RectifiedGridCoverage_pos = gmljp2.find("GMLJP2RectifiedGridCoverage") fourth_metadata_pos = gmljp2.find("Fourth metadata") feature_pos = gmljp2.find("""""") empty_kml_pos = gmljp2.find("""""") style1_pos = gmljp2.find("""""") @@ -2247,71 +2615,114 @@ def test_jp2openjpeg_45(): style3_pos = gmljp2.find("""""") style4_pos = gmljp2.find("""""") extension1_pos = gmljp2.find("""""") - extension2_pos = gmljp2.find("""""") - extension3_pos = gmljp2.find("""""") - extension4_pos = gmljp2.find("""""") - - assert (first_metadata_pos >= 0 and second_metadata_pos >= 0 and third_metadata_pos >= 0 and \ - GMLJP2RectifiedGridCoverage_pos >= 0 and fourth_metadata_pos >= 0 and \ - feature_pos >= 0 and myshape_gml_pos >= 0 and myshape2_gml_pos >= 0 and \ - feature2_pos >= 0 and myshape_kml_pos >= 0 and empty_kml_pos >= 0 and \ - style1_pos >= 0 and style2_pos >= 0 and style3_pos >= 0 and style4_pos >= 0 and \ - extension1_pos >= 0 and extension2_pos >= 0 and extension3_pos >= 0 and extension4_pos >= 0 and (first_metadata_pos < second_metadata_pos and - second_metadata_pos < third_metadata_pos and - third_metadata_pos < GMLJP2RectifiedGridCoverage_pos and - GMLJP2RectifiedGridCoverage_pos < fourth_metadata_pos and - fourth_metadata_pos < feature_pos and - fourth_metadata_pos < feature_pos and - myshape2_gml_pos < myshape_kml_pos and - myshape_kml_pos < empty_kml_pos and - empty_kml_pos < style2_pos and - style2_pos < extension2_pos and - extension2_pos < feature_pos and - feature_pos < myshape_gml_pos and - myshape_gml_pos < feature2_pos and - feature2_pos < feature3_pos and - feature3_pos < style1_pos and - style1_pos < style3_pos and - style3_pos < style4_pos and - style4_pos < extension1_pos and - extension1_pos < extension3_pos and - extension3_pos < extension4_pos)), \ - gmljp2 + extension2_pos = gmljp2.find( + """""" + ) + extension3_pos = gmljp2.find( + """""" + ) + extension4_pos = gmljp2.find( + """""" + ) + + assert ( + first_metadata_pos >= 0 + and second_metadata_pos >= 0 + and third_metadata_pos >= 0 + and GMLJP2RectifiedGridCoverage_pos >= 0 + and fourth_metadata_pos >= 0 + and feature_pos >= 0 + and myshape_gml_pos >= 0 + and myshape2_gml_pos >= 0 + and feature2_pos >= 0 + and myshape_kml_pos >= 0 + and empty_kml_pos >= 0 + and style1_pos >= 0 + and style2_pos >= 0 + and style3_pos >= 0 + and style4_pos >= 0 + and extension1_pos >= 0 + and extension2_pos >= 0 + and extension3_pos >= 0 + and extension4_pos >= 0 + and ( + first_metadata_pos < second_metadata_pos + and second_metadata_pos < third_metadata_pos + and third_metadata_pos < GMLJP2RectifiedGridCoverage_pos + and GMLJP2RectifiedGridCoverage_pos < fourth_metadata_pos + and fourth_metadata_pos < feature_pos + and fourth_metadata_pos < feature_pos + and myshape2_gml_pos < myshape_kml_pos + and myshape_kml_pos < empty_kml_pos + and empty_kml_pos < style2_pos + and style2_pos < extension2_pos + and extension2_pos < feature_pos + and feature_pos < myshape_gml_pos + and myshape_gml_pos < feature2_pos + and feature2_pos < feature3_pos + and feature3_pos < style1_pos + and style1_pos < style3_pos + and style3_pos < style4_pos + and style4_pos < extension1_pos + and extension1_pos < extension3_pos + and extension3_pos < extension4_pos + ) + ), gmljp2 # print(gmljp2) myshape_gml = ds.GetMetadata_List("xml:myshape.gml")[0] - assert """""" in myshape_gml + assert ( + """""" + in myshape_gml + ) assert """http://www.opengis.net/def/crs/EPSG/0/4326""" in myshape_gml myshape_xsd = ds.GetMetadata_List("xml:myshape.xsd")[0] - assert """""" in myshape_xsd + assert ( + """""" + in myshape_xsd + ) myshape2_gml = ds.GetMetadata_List("xml:myshape2.gml")[0] - assert """""" in myshape2_gml + assert ( + """""" + in myshape2_gml + ) feature2_gml = ds.GetMetadata_List("xml:feature2.gml")[0] - assert """""" in feature2_gml + assert ( + """""" + in feature2_gml + ) feature3_gml = ds.GetMetadata_List("xml:feature3.gml")[0] - assert """""" in feature3_gml + assert ( + """""" + in feature3_gml + ) myshape2_xsd = ds.GetMetadata_List("xml:a_schema.xsd")[0] assert """{{{ XPATH(1) }}} {{{ XPATH('str') }}} {{{ XPATH(true()) }}}X{{{ XPATH(//B) }}} {{{XPATH(if(//B/text() = 'my_value',if(false(),'not_expected',concat('yeah: ',uuid())),'doh!'))}}}""") - - gdal.FileFromMemBuffer("/vsimem/source.xml", - """my_value""") - - src_ds = gdal.Open('data/byte.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_46.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) + gdal.FileFromMemBuffer( + "/vsimem/template.xml", + """{{{ XPATH(1) }}} {{{ XPATH('str') }}} {{{ XPATH(true()) }}}X{{{ XPATH(//B) }}} {{{XPATH(if(//B/text() = 'my_value',if(false(),'not_expected',concat('yeah: ',uuid())),'doh!'))}}}""", + ) + + gdal.FileFromMemBuffer("/vsimem/source.xml", """my_value""") + + src_ds = gdal.Open("data/byte.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_46.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.Unlink("/vsimem/template.xml") gdal.Unlink("/vsimem/source.xml") del out_ds - if gdal.GetLastErrorMsg().find('dynamic_metadata not supported') >= 0: - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + if gdal.GetLastErrorMsg().find("dynamic_metadata not supported") >= 0: + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") pytest.skip() # Maybe a conflict with FileGDB libxml2 - if gdal.GetLastErrorMsg().find('An error occurred in libxml2') >= 0: - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + if gdal.GetLastErrorMsg().find("An error occurred in libxml2") >= 0: + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") pytest.skip() - ds = gdal.Open('/vsimem/jp2openjpeg_46.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_46.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] - if """1 str trueX + if ( + """1 str trueX my_value -yeah: """ not in gmljp2: +yeah: """ + not in gmljp2 + ): if """1 str true""" in gmljp2: pytest.skip() pytest.fail(gmljp2) ds = None - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") for invalid_template in [ - '{{{', - '{{{}}}', - '{{{XPATH', - '{{{XPATH(1)', - '{{{XPATH(}}}', - '{{{XPATH()}}}', - '{{{XPATH(//node[)}}}', + "{{{", + "{{{}}}", + "{{{XPATH", + "{{{XPATH(1)", + "{{{XPATH(}}}", + "{{{XPATH()}}}", + "{{{XPATH(//node[)}}}", ]: gdal.FileFromMemBuffer("/vsimem/template.xml", invalid_template) @@ -2455,20 +2905,24 @@ def test_jp2openjpeg_46(): gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_46.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_46.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.PopErrorHandler() # print('error : ' + gdal.GetLastErrorMsg()) gdal.Unlink("/vsimem/template.xml") gdal.Unlink("/vsimem/source.xml") del out_ds - ds = gdal.Open('/vsimem/jp2openjpeg_46.jp2') + ds = gdal.Open("/vsimem/jp2openjpeg_46.jp2") gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] ds = None - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") - assert '' not in gmljp2, invalid_template + assert "" not in gmljp2, invalid_template # Nonexistent template. gdal.FileFromMemBuffer("/vsimem/source.xml", """""") @@ -2476,8 +2930,7 @@ def test_jp2openjpeg_46(): "root_instance": { "metadata": [ { - "dynamic_metadata": - { + "dynamic_metadata": { "template": "/vsimem/not_existing_template.xml", "source": "/vsimem/source.xml", } @@ -2487,21 +2940,25 @@ def test_jp2openjpeg_46(): } gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_46.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_46.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.PopErrorHandler() del out_ds gdal.Unlink("/vsimem/source.xml") - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") # Nonexistent source gdal.FileFromMemBuffer( - "/vsimem/template.xml", """""") + "/vsimem/template.xml", """""" + ) conf = { "root_instance": { "metadata": [ { - "dynamic_metadata": - { + "dynamic_metadata": { "template": "/vsimem/template.xml", "source": "/vsimem/not_existing_source.xml", } @@ -2511,21 +2968,26 @@ def test_jp2openjpeg_46(): } gdal.ErrorReset() gdal.PushErrorHandler() - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_46.jp2', src_ds, options=['GMLJP2V2_DEF=' + json.dumps(conf)]) + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy( + "/vsimem/jp2openjpeg_46.jp2", + src_ds, + options=["GMLJP2V2_DEF=" + json.dumps(conf)], + ) gdal.PopErrorHandler() del out_ds gdal.Unlink("/vsimem/template.xml") - gdal.Unlink('/vsimem/jp2openjpeg_46.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_46.jp2") # Invalid source - gdal.FileFromMemBuffer("/vsimem/template.xml", """""") + gdal.FileFromMemBuffer( + "/vsimem/template.xml", """""" + ) gdal.FileFromMemBuffer("/vsimem/source.xml", """ + assert ( + """ 33.8916535473944 -117.641168620797 33.9024195619211 -117.628010158598 - """ in gmljp2 + """ + in gmljp2 + ) + ############################################################################### # Test writing & reading RPC in GeoJP2 box @@ -2575,16 +3049,17 @@ def test_jp2openjpeg_gmljp2v2_axis_swap(): def test_jp2openjpeg_47(): - src_ds = gdal.Open('../gcore/data/byte_rpc.tif') - out_ds = gdaltest.jp2openjpeg_drv.CreateCopy('/vsimem/jp2openjpeg_47.jp2', src_ds) + src_ds = gdal.Open("../gcore/data/byte_rpc.tif") + out_ds = gdaltest.jp2openjpeg_drv.CreateCopy("/vsimem/jp2openjpeg_47.jp2", src_ds) del out_ds - assert gdal.VSIStatL('/vsimem/jp2openjpeg_47.jp2.aux.xml') is None + assert gdal.VSIStatL("/vsimem/jp2openjpeg_47.jp2.aux.xml") is None - ds = gdal.Open('/vsimem/jp2openjpeg_47.jp2') - assert ds.GetMetadata('RPC') is not None + ds = gdal.Open("/vsimem/jp2openjpeg_47.jp2") + assert ds.GetMetadata("RPC") is not None ds = None - gdal.Unlink('/vsimem/jp2openjpeg_47.jp2') + gdal.Unlink("/vsimem/jp2openjpeg_47.jp2") + ############################################################################### # Test reading a dataset whose tile dimensions are larger than dataset ones @@ -2592,67 +3067,85 @@ def test_jp2openjpeg_47(): def test_jp2openjpeg_48(): - ds = gdal.Open('data/jpeg2000/byte_tile_2048.jp2') + ds = gdal.Open("data/jpeg2000/byte_tile_2048.jp2") (blockxsize, blockysize) = ds.GetRasterBand(1).GetBlockSize() assert (blockxsize, blockysize) == (20, 20) assert ds.GetRasterBand(1).Checksum() == 4610 ds = None + ############################################################################### def test_jp2openjpeg_online_1(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k", + "7sisters200.j2k", + ): pytest.skip() # Checksum = 32669 on my PC - tst = gdaltest.GDALTest('JP2OpenJPEG', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", "tmp/cache/7sisters200.j2k", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/7sisters200.j2k') + ds = gdal.Open("tmp/cache/7sisters200.j2k") ds.GetRasterBand(1).Checksum() ds = None + ############################################################################### def test_jp2openjpeg_online_2(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2", "gcp.jp2" + ): pytest.skip() # Checksum = 15621 on my PC - tst = gdaltest.GDALTest('JP2OpenJPEG', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", "tmp/cache/gcp.jp2", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/gcp.jp2') + ds = gdal.Open("tmp/cache/gcp.jp2") ds.GetRasterBand(1).Checksum() - assert len(ds.GetGCPs()) == 15, 'bad number of GCP' + assert len(ds.GetGCPs()) == 15, "bad number of GCP" expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]""" - assert ds.GetGCPProjection() == expected_wkt, 'bad GCP projection' + assert ds.GetGCPProjection() == expected_wkt, "bad GCP projection" ds = None + ############################################################################### def test_jp2openjpeg_online_3(): - if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): + 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'): + if not gdaltest.download_file( + "http://www.openjpeg.org/samples/Bretagne1.bmp", "Bretagne1.bmp" + ): pytest.skip() - tst = gdaltest.GDALTest('JP2OpenJPEG', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", "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') + ds = gdal.Open("tmp/cache/Bretagne1.j2k") + ds_ref = gdal.Open("tmp/cache/Bretagne1.bmp") maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) @@ -2661,24 +3154,31 @@ def test_jp2openjpeg_online_3(): ds_ref = None # Difference between the image before and after compression - assert maxdiff <= 17, 'Image too different from reference' + assert maxdiff <= 17, "Image too different from reference" + ############################################################################### def test_jp2openjpeg_online_4(): - if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): + 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'): + if not gdaltest.download_file( + "http://www.openjpeg.org/samples/Bretagne2.bmp", "Bretagne2.bmp" + ): pytest.skip() - tst = gdaltest.GDALTest('JP2OpenJPEG', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) + tst = gdaltest.GDALTest( + "JP2OpenJPEG", "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') + ds = gdal.Open("tmp/cache/Bretagne2.j2k") + ds_ref = gdal.Open("tmp/cache/Bretagne2.bmp") maxdiff = gdaltest.compare_ds(ds, ds_ref, 0, 0, 1024, 1024) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) @@ -2687,7 +3187,8 @@ def test_jp2openjpeg_online_4(): ds_ref = None # Difference between the image before and after compression - assert maxdiff <= 10, 'Image too different from reference' + assert maxdiff <= 10, "Image too different from reference" + ############################################################################### # Try reading JP2OpenJPEG with color table @@ -2695,155 +3196,361 @@ def test_jp2openjpeg_online_4(): def test_jp2openjpeg_online_5(): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9.jp2', 'file9.jp2'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9.jp2", + "file9.jp2", + ): pytest.skip() - ds = gdal.Open('tmp/cache/file9.jp2') + ds = gdal.Open("tmp/cache/file9.jp2") cs1 = ds.GetRasterBand(1).Checksum() - assert cs1 == 47664, 'Did not get expected checksums' - assert ds.GetRasterBand(1).GetColorTable() is not None, \ - 'Did not get expected color table' + assert cs1 == 47664, "Did not get expected checksums" + assert ( + ds.GetRasterBand(1).GetColorTable() is not None + ), "Did not get expected color table" ds = None + ############################################################################### # Try reading YCbCr JP2OpenJPEG as RGB def test_jp2openjpeg_online_6(): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_03/file3.jp2', 'file3.jp2'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_03/file3.jp2", + "file3.jp2", + ): pytest.skip() - ds = gdal.Open('tmp/cache/file3.jp2') + ds = gdal.Open("tmp/cache/file3.jp2") cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() - assert cs1 == 26140 and cs2 == 32689 and cs3 == 48247, \ - 'Did not get expected checksums' + assert ( + cs1 == 26140 and cs2 == 32689 and cs3 == 48247 + ), "Did not get expected checksums" ds = None + ############################################################################### # Test GDAL_GEOREF_SOURCES def test_jp2openjpeg_49(): - tests = [(None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - (None, False, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - (None, False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ('INTERNAL', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ('INTERNAL,PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('INTERNAL,WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('INTERNAL,PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('INTERNAL,WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,PAM,INTERNAL', False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ('PAM,WORLDFILE,INTERNAL', False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ('PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,INTERNAL', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,PAM,INTERNAL', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,INTERNAL,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('NONE', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ] - - for (config_option_value, copy_pam, copy_worldfile, expected_srs, expected_gt) in tests: - gdal.SetConfigOption('GDAL_GEOREF_SOURCES', config_option_value) - gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.jp2', open('data/jpeg2000/byte_nogeoref.jp2', 'rb').read()) + tests = [ + (None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + (None, False, True, "", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + (None, False, False, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ("INTERNAL", True, True, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ( + "INTERNAL,PAM", + True, + True, + 'LOCAL_CS["PAM"]', + (100.0, 1.0, 0.0, 300.0, 0.0, -1.0), + ), + ("INTERNAL,WORLDFILE", True, True, "", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + ( + "INTERNAL,PAM,WORLDFILE", + True, + True, + 'LOCAL_CS["PAM"]', + (100.0, 1.0, 0.0, 300.0, 0.0, -1.0), + ), + ( + "INTERNAL,WORLDFILE,PAM", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ("WORLDFILE,PAM,INTERNAL", False, False, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ("PAM,WORLDFILE,INTERNAL", False, False, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ("PAM", True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + ( + "PAM,WORLDFILE", + True, + True, + 'LOCAL_CS["PAM"]', + (100.0, 1.0, 0.0, 300.0, 0.0, -1.0), + ), + ("WORLDFILE", True, True, "", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + ( + "WORLDFILE,PAM", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ("WORLDFILE,INTERNAL", True, True, "", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + ( + "WORLDFILE,PAM,INTERNAL", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ( + "WORLDFILE,INTERNAL,PAM", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ("NONE", True, True, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ] + + for ( + config_option_value, + copy_pam, + copy_worldfile, + expected_srs, + expected_gt, + ) in tests: + gdal.SetConfigOption("GDAL_GEOREF_SOURCES", config_option_value) + gdal.FileFromMemBuffer( + "/vsimem/byte_nogeoref.jp2", + open("data/jpeg2000/byte_nogeoref.jp2", "rb").read(), + ) if copy_pam: - gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.jp2.aux.xml', open('data/jpeg2000/byte_nogeoref.jp2.aux.xml', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/byte_nogeoref.jp2.aux.xml", + open("data/jpeg2000/byte_nogeoref.jp2.aux.xml", "rb").read(), + ) if copy_worldfile: - gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.j2w', open('data/jpeg2000/byte_nogeoref.j2w', 'rb').read()) - ds = gdal.Open('/vsimem/byte_nogeoref.jp2') + gdal.FileFromMemBuffer( + "/vsimem/byte_nogeoref.j2w", + open("data/jpeg2000/byte_nogeoref.j2w", "rb").read(), + ) + ds = gdal.Open("/vsimem/byte_nogeoref.jp2") gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() ds = None - gdal.SetConfigOption('GDAL_GEOREF_SOURCES', None) - gdal.Unlink('/vsimem/byte_nogeoref.jp2') - gdal.Unlink('/vsimem/byte_nogeoref.jp2.aux.xml') - gdal.Unlink('/vsimem/byte_nogeoref.j2w') + gdal.SetConfigOption("GDAL_GEOREF_SOURCES", None) + gdal.Unlink("/vsimem/byte_nogeoref.jp2") + gdal.Unlink("/vsimem/byte_nogeoref.jp2.aux.xml") + gdal.Unlink("/vsimem/byte_nogeoref.j2w") if gt != expected_gt: - print('Got ' + str(gt)) - print('Expected ' + str(expected_gt)) - pytest.fail('Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) - - if expected_srs == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': - pass # ok - elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): - print('Got ' + srs_wkt) - print('Expected ' + expected_srs) - pytest.fail('Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) - - tests = [(None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - (None, False, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - (None, False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('INTERNAL', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('INTERNAL,PAM', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('INTERNAL,WORLDFILE', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('INTERNAL,PAM,WORLDFILE', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('INTERNAL,WORLDFILE,PAM', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('WORLDFILE,PAM,INTERNAL', False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('PAM,WORLDFILE,INTERNAL', False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('GEOJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('GEOJP2,GMLJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('GMLJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), - ('GMLJP2,GEOJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), - ('MSIG', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ('MSIG,GMLJP2,GEOJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), - ('MSIG,GEOJP2,GMLJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), - ('PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), - ('WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,INTERNAL', True, True, '26711', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,PAM,INTERNAL', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('WORLDFILE,INTERNAL,PAM', True, True, '26711', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), - ('NONE', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), - ] - - for (config_option_value, copy_pam, copy_worldfile, expected_srs, expected_gt) in tests: - gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.jp2', open('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', 'rb').read()) + print("Got " + str(gt)) + print("Expected " + str(expected_gt)) + pytest.fail( + "Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s" + % (config_option_value, str(copy_pam), str(copy_worldfile)) + ) + + if ( + expected_srs == 'LOCAL_CS["PAM"]' + and srs_wkt + == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ): + pass # ok + elif (expected_srs == "" and srs_wkt != "") or ( + expected_srs != "" and expected_srs not in srs_wkt + ): + print("Got " + srs_wkt) + print("Expected " + expected_srs) + pytest.fail( + "Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s" + % (config_option_value, str(copy_pam), str(copy_worldfile)) + ) + + tests = [ + (None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + (None, False, True, "26711", (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), + (None, False, False, "26711", (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), + ("INTERNAL", True, True, "26711", (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), + ( + "INTERNAL,PAM", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ( + "INTERNAL,WORLDFILE", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ( + "INTERNAL,PAM,WORLDFILE", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ( + "INTERNAL,WORLDFILE,PAM", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ( + "WORLDFILE,PAM,INTERNAL", + False, + False, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ( + "PAM,WORLDFILE,INTERNAL", + False, + False, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ("GEOJP2", True, True, "26711", (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), + ( + "GEOJP2,GMLJP2", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ("GMLJP2", True, True, "26712", (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), + ( + "GMLJP2,GEOJP2", + True, + True, + "26712", + (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0), + ), + ("MSIG", True, True, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ( + "MSIG,GMLJP2,GEOJP2", + True, + True, + "26712", + (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0), + ), + ( + "MSIG,GEOJP2,GMLJP2", + True, + True, + "26711", + (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), + ), + ("PAM", True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), + ( + "PAM,WORLDFILE", + True, + True, + 'LOCAL_CS["PAM"]', + (100.0, 1.0, 0.0, 300.0, 0.0, -1.0), + ), + ("WORLDFILE", True, True, "", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + ( + "WORLDFILE,PAM", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ("WORLDFILE,INTERNAL", True, True, "26711", (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), + ( + "WORLDFILE,PAM,INTERNAL", + True, + True, + 'LOCAL_CS["PAM"]', + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ( + "WORLDFILE,INTERNAL,PAM", + True, + True, + "26711", + (99.5, 1.0, 0.0, 200.5, 0.0, -1.0), + ), + ("NONE", True, True, "", (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), + ] + + for ( + config_option_value, + copy_pam, + copy_worldfile, + expected_srs, + expected_gt, + ) in tests: + gdal.FileFromMemBuffer( + "/vsimem/inconsitant_geojp2_gmljp2.jp2", + open("data/jpeg2000/inconsitant_geojp2_gmljp2.jp2", "rb").read(), + ) if copy_pam: - gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml', open('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml", + open( + "data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml", "rb" + ).read(), + ) if copy_worldfile: - gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.j2w', open('data/jpeg2000/inconsitant_geojp2_gmljp2.j2w', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/inconsitant_geojp2_gmljp2.j2w", + open("data/jpeg2000/inconsitant_geojp2_gmljp2.j2w", "rb").read(), + ) open_options = [] if config_option_value is not None: - open_options += ['GEOREF_SOURCES=' + config_option_value] - ds = gdal.OpenEx('/vsimem/inconsitant_geojp2_gmljp2.jp2', open_options=open_options) + open_options += ["GEOREF_SOURCES=" + config_option_value] + ds = gdal.OpenEx( + "/vsimem/inconsitant_geojp2_gmljp2.jp2", open_options=open_options + ) gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() ds = None - gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.jp2') - gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml') - gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.j2w') + gdal.Unlink("/vsimem/inconsitant_geojp2_gmljp2.jp2") + gdal.Unlink("/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml") + gdal.Unlink("/vsimem/inconsitant_geojp2_gmljp2.j2w") if gt != expected_gt: - print('Got ' + str(gt)) - print('Expected ' + str(expected_gt)) - pytest.fail('Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) - - if expected_srs == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': - pass # ok - elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): - print('Got ' + srs_wkt) - print('Expected ' + expected_srs) - pytest.fail('Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) - - ds = gdal.OpenEx('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', open_options=['GEOREF_SOURCES=PAM,WORLDFILE']) + print("Got " + str(gt)) + print("Expected " + str(expected_gt)) + pytest.fail( + "Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s" + % (config_option_value, str(copy_pam), str(copy_worldfile)) + ) + + if ( + expected_srs == 'LOCAL_CS["PAM"]' + and srs_wkt + == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ): + pass # ok + elif (expected_srs == "" and srs_wkt != "") or ( + expected_srs != "" and expected_srs not in srs_wkt + ): + print("Got " + srs_wkt) + print("Expected " + expected_srs) + pytest.fail( + "Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s" + % (config_option_value, str(copy_pam), str(copy_worldfile)) + ) + + ds = gdal.OpenEx( + "data/jpeg2000/inconsitant_geojp2_gmljp2.jp2", + open_options=["GEOREF_SOURCES=PAM,WORLDFILE"], + ) fl = ds.GetFileList() - assert set(fl) == set(['data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', 'data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml']), \ - 'Did not get expected filelist' + assert set(fl) == set( + [ + "data/jpeg2000/inconsitant_geojp2_gmljp2.jp2", + "data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml", + ] + ), "Did not get expected filelist" gdal.ErrorReset() with gdaltest.error_handler(): - gdal.OpenEx('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', open_options=['GEOREF_SOURCES=unhandled']) - assert gdal.GetLastErrorMsg() != '', 'expected warning' + gdal.OpenEx( + "data/jpeg2000/inconsitant_geojp2_gmljp2.jp2", + open_options=["GEOREF_SOURCES=unhandled"], + ) + assert gdal.GetLastErrorMsg() != "", "expected warning" ############################################################################### @@ -2852,12 +3559,14 @@ def test_jp2openjpeg_49(): def test_jp2openjpeg_50(): - ds = gdal.Open('data/jpeg2000/fake_sent2_preview.jp2') + ds = gdal.Open("data/jpeg2000/fake_sent2_preview.jp2") blockxsize, blockysize = ds.GetRasterBand(1).GetBlockSize() - assert blockxsize == ds.RasterXSize and blockysize == ds.RasterYSize, \ - 'expected warning' + assert ( + blockxsize == ds.RasterXSize and blockysize == ds.RasterYSize + ), "expected warning" cs = ds.GetRasterBand(1).Checksum() - assert cs == 2046, 'expected warning' + assert cs == 2046, "expected warning" + ############################################################################### # Test CODEBLOCK_STYLE @@ -2865,45 +3574,64 @@ def test_jp2openjpeg_50(): def test_jp2openjpeg_codeblock_style(): - if gdaltest.jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST').find('CODEBLOCK_STYLE') < 0: + if ( + gdaltest.jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST").find( + "CODEBLOCK_STYLE" + ) + < 0 + ): pytest.skip() - filename = '/vsimem/jp2openjpeg_codeblock_style.jp2' - for options in [['CODEBLOCK_STYLE=63', 'REVERSIBLE=YES', 'QUALITY=100'], - ['CODEBLOCK_STYLE=BYPASS,RESET,TERMALL,VSC,PREDICTABLE,SEGSYM', 'REVERSIBLE=YES', 'QUALITY=100']]: + filename = "/vsimem/jp2openjpeg_codeblock_style.jp2" + for options in [ + ["CODEBLOCK_STYLE=63", "REVERSIBLE=YES", "QUALITY=100"], + [ + "CODEBLOCK_STYLE=BYPASS,RESET,TERMALL,VSC,PREDICTABLE,SEGSYM", + "REVERSIBLE=YES", + "QUALITY=100", + ], + ]: gdal.ErrorReset() - gdaltest.jp2openjpeg_drv.CreateCopy(filename, gdal.Open('data/byte.tif'), - options=options) - assert gdal.GetLastErrorMsg() == '' + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, gdal.Open("data/byte.tif"), options=options + ) + assert gdal.GetLastErrorMsg() == "" ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672 with gdaltest.error_handler(): - gdaltest.jp2openjpeg_drv.CreateCopy(filename, gdal.Open('data/byte.tif'), - options=['CODEBLOCK_STYLE=64']) - assert gdal.GetLastErrorMsg() != '' + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, gdal.Open("data/byte.tif"), options=["CODEBLOCK_STYLE=64"] + ) + assert gdal.GetLastErrorMsg() != "" with gdaltest.error_handler(): - gdaltest.jp2openjpeg_drv.CreateCopy(filename, gdal.Open('data/byte.tif'), - options=['CODEBLOCK_STYLE=UNSUPPORTED']) - assert gdal.GetLastErrorMsg() != '' + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, + gdal.Open("data/byte.tif"), + options=["CODEBLOCK_STYLE=UNSUPPORTED"], + ) + assert gdal.GetLastErrorMsg() != "" gdaltest.jp2openjpeg_drv.Delete(filename) + ############################################################################### # Test external overviews def test_jp2openjpeg_external_overviews_single_band(): - filename = '/vsimem/jp2openjpeg_external_overviews_single_band.jp2' - gdaltest.jp2openjpeg_drv.CreateCopy(filename, - gdal.Open('../gcore/data/utmsmall.tif'), - options=['REVERSIBLE=YES', 'QUALITY=100']) + filename = "/vsimem/jp2openjpeg_external_overviews_single_band.jp2" + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, + gdal.Open("../gcore/data/utmsmall.tif"), + options=["REVERSIBLE=YES", "QUALITY=100"], + ) ds = gdal.Open(filename) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) ds = None ds = gdal.Open(filename) @@ -2914,28 +3642,32 @@ def test_jp2openjpeg_external_overviews_single_band(): assert cs == 28926 + ############################################################################### # Test external overviews def test_jp2openjpeg_external_overviews_multiple_band(): - filename = '/vsimem/jp2openjpeg_external_overviews_multiple_band.jp2' - gdaltest.jp2openjpeg_drv.CreateCopy(filename, - gdal.Open('data/small_world.tif'), - options=['REVERSIBLE=YES', 'QUALITY=100']) + filename = "/vsimem/jp2openjpeg_external_overviews_multiple_band.jp2" + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, + gdal.Open("data/small_world.tif"), + options=["REVERSIBLE=YES", "QUALITY=100"], + ) ds = gdal.Open(filename) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) ds = None ds = gdal.Open(filename) - cs = [ds.GetRasterBand(i+1).GetOverview(0).Checksum() for i in range(3)] + cs = [ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] ds = None gdaltest.jp2openjpeg_drv.Delete(filename) assert cs == [6233, 7706, 26085] + ############################################################################### # Test accessing overview levels when the dimensions of the full resolution # image are not a multiple of 2^numresolutions @@ -2943,36 +3675,43 @@ def test_jp2openjpeg_external_overviews_multiple_band(): def test_jp2openjpeg_odd_dimensions(): - ds = gdal.Open('data/jpeg2000/513x513.jp2') + ds = gdal.Open("data/jpeg2000/513x513.jp2") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None assert cs == 29642 + ############################################################################### def test_jp2openjpeg_odd_dimensions_overviews(): # Only try the rest with openjpeg >= 2.3 to avoid potential memory issues - if gdaltest.jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST').find('CODEBLOCK_STYLE') < 0: + if ( + gdaltest.jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST").find( + "CODEBLOCK_STYLE" + ) + < 0 + ): pytest.skip() # Check that we don't request outside of the full resolution coordinates - ds = gdal.Open('data/jpeg2000/single_block_32769_16385.jp2') - assert ds.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,2049,1025) - assert gdal.GetLastErrorMsg() == '' + ds = gdal.Open("data/jpeg2000/single_block_32769_16385.jp2") + assert ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 2049, 1025) + assert gdal.GetLastErrorMsg() == "" ds = None + ############################################################################### # Test reading an image whose origin is not (0,0) def test_jp2openjpeg_image_origin_not_zero(): - ds = gdal.Open('data/jpeg2000/byte_image_origin_not_zero.jp2') + ds = gdal.Open("data/jpeg2000/byte_image_origin_not_zero.jp2") assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) is not None + assert ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) is not None ############################################################################### @@ -2982,10 +3721,11 @@ def test_jp2openjpeg_image_origin_not_zero(): def test_jp2openjpeg_tilesize_16(): # Generated with gdal_translate byte.tif foo.jp2 -of jp2openjpeg -outsize 256 256 -co blockxsize=16 -co blockysize=16 -co BLOCKSIZE_STRICT=true -co resolutions=3 - ds = gdal.Open('data/jpeg2000/tile_size_16.jp2') + ds = gdal.Open("data/jpeg2000/tile_size_16.jp2") assert ds.GetRasterBand(1).Checksum() == 44216 assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 61711 + ############################################################################### # Test generation of PLT marker segments @@ -2993,21 +3733,25 @@ def test_jp2openjpeg_tilesize_16(): def test_jp2openjpeg_generate_PLT(): # Only try the test with openjpeg >= 2.4.0 that supports it - if gdaltest.jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST').find('PLT') < 0: + if ( + gdaltest.jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST").find("PLT") + < 0 + ): pytest.skip() - filename = '/vsimem/temp.jp2' - gdaltest.jp2openjpeg_drv.CreateCopy(filename, gdal.Open('data/byte.tif'), - options=['PLT=YES', - 'REVERSIBLE=YES', - 'QUALITY=100']) + filename = "/vsimem/temp.jp2" + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, + gdal.Open("data/byte.tif"), + options=["PLT=YES", "REVERSIBLE=YES", "QUALITY=100"], + ) ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None # Check presence of a PLT marker - ret = gdal.GetJPEG2000StructureAsString(filename, ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString(filename, ["ALL=YES"]) assert '= 2.5.0 that supports it - if gdaltest.jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST').find('TLM') < 0: + if ( + gdaltest.jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST").find("TLM") + < 0 + ): pytest.skip() - filename = '/vsimem/temp.jp2' - gdaltest.jp2openjpeg_drv.CreateCopy(filename, gdal.Open('data/byte.tif'), - options=['TLM=YES', - 'REVERSIBLE=YES', - 'QUALITY=100']) + filename = "/vsimem/temp.jp2" + gdaltest.jp2openjpeg_drv.CreateCopy( + filename, + gdal.Open("data/byte.tif"), + options=["TLM=YES", "REVERSIBLE=YES", "QUALITY=100"], + ) ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None # Check presence of a TLM marker - ret = gdal.GetJPEG2000StructureAsString(filename, ['ALL=YES']) + ret = gdal.GetJPEG2000StructureAsString(filename, ["ALL=YES"]) assert '= 2.5.0 that supports it - if "'STRICT'" not in gdaltest.jp2openjpeg_drv.GetMetadataItem('DMD_OPENOPTIONLIST'): + if "'STRICT'" not in gdaltest.jp2openjpeg_drv.GetMetadataItem("DMD_OPENOPTIONLIST"): pytest.skip() - filename = 'data/jpeg2000/small_world_truncated.jp2' + filename = "data/jpeg2000/small_world_truncated.jp2" ds = gdal.Open(filename) with gdaltest.error_handler(): assert ds.GetRasterBand(1).Checksum() == 0 ds = None - ds = gdal.OpenEx(filename, open_options=['STRICT=NO']) + ds = gdal.OpenEx(filename, open_options=["STRICT=NO"]) with gdaltest.error_handler(): assert ds.GetRasterBand(1).Checksum() == 5058 ds = None diff --git a/autotest/gdrivers/jpeg.py b/autotest/gdrivers/jpeg.py index 592f0bd854ac..1001b688610e 100755 --- a/autotest/gdrivers/jpeg.py +++ b/autotest/gdrivers/jpeg.py @@ -31,75 +31,82 @@ ############################################################################### import os -import sys import shutil import struct +import sys import gdaltest - -from osgeo import gdal -from osgeo import gdalconst import pytest +from osgeo import gdal, gdalconst + ############################################################################### # Perform simple read test. def test_jpeg_1(): - ds = gdal.Open('data/jpeg/albania.jpg') + ds = gdal.Open("data/jpeg/albania.jpg") cs = ds.GetRasterBand(2).Checksum() if cs == 34296: - gdaltest.jpeg_version = '9b' + gdaltest.jpeg_version = "9b" elif cs == 34298: - gdaltest.jpeg_version = '8' + gdaltest.jpeg_version = "8" else: - gdaltest.jpeg_version = 'pre8' + gdaltest.jpeg_version = "pre8" ds = None - if gdaltest.jpeg_version == '9b': - tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 34296) - elif gdaltest.jpeg_version == '8': - tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 34298) + if gdaltest.jpeg_version == "9b": + tst = gdaltest.GDALTest("JPEG", "jpeg/albania.jpg", 2, 34296) + elif gdaltest.jpeg_version == "8": + tst = gdaltest.GDALTest("JPEG", "jpeg/albania.jpg", 2, 34298) else: - tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 17016) + tst = gdaltest.GDALTest("JPEG", "jpeg/albania.jpg", 2, 17016) return tst.testOpen() + ############################################################################### # Verify EXIF metadata, color interpretation and image_structure def test_jpeg_2(): - ds = gdal.Open('data/jpeg/albania.jpg') + ds = gdal.Open("data/jpeg/albania.jpg") md = ds.GetMetadata() ds.GetFileList() try: - assert (not (md['EXIF_GPSLatitudeRef'] != 'N' or - md['EXIF_GPSLatitude'] != '(41) (1) (22.91)' or - md['EXIF_PixelXDimension'] != '361' or - md['EXIF_GPSVersionID'] != '0x02 0x00 0x00 0x00' or - md['EXIF_ExifVersion'] != '0210' or - md['EXIF_XResolution'] != '(96)')), 'Exif metadata wrong.' + assert not ( + md["EXIF_GPSLatitudeRef"] != "N" + or md["EXIF_GPSLatitude"] != "(41) (1) (22.91)" + or md["EXIF_PixelXDimension"] != "361" + or md["EXIF_GPSVersionID"] != "0x02 0x00 0x00 0x00" + or md["EXIF_ExifVersion"] != "0210" + or md["EXIF_XResolution"] != "(96)" + ), "Exif metadata wrong." except KeyError: print(md) - pytest.fail('Exit metadata apparently missing.') + pytest.fail("Exit metadata apparently missing.") + + assert ( + ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand + ), "Did not get expected color interpretation." - assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ - 'Did not get expected color interpretation.' + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert ( + "INTERLEAVE" in md and md["INTERLEAVE"] == "PIXEL" + ), "missing INTERLEAVE metadata" + assert ( + "COMPRESSION" in md and md["COMPRESSION"] == "JPEG" + ), "missing INTERLEAVE metadata" - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert 'INTERLEAVE' in md and md['INTERLEAVE'] == 'PIXEL', \ - 'missing INTERLEAVE metadata' - assert 'COMPRESSION' in md and md['COMPRESSION'] == 'JPEG', \ - 'missing INTERLEAVE metadata' + md = ds.GetRasterBand(3).GetMetadata("IMAGE_STRUCTURE") + assert ( + "COMPRESSION" in md and md["COMPRESSION"] == "JPEG" + ), "missing INTERLEAVE metadata" - md = ds.GetRasterBand(3).GetMetadata('IMAGE_STRUCTURE') - assert 'COMPRESSION' in md and md['COMPRESSION'] == 'JPEG', \ - 'missing INTERLEAVE metadata' ############################################################################### # Create simple copy and check (greyscale) using progressive option. @@ -107,52 +114,54 @@ def test_jpeg_2(): def test_jpeg_3(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") - options = ['PROGRESSIVE=YES', - 'QUALITY=50', - 'WORLDFILE=YES'] - ds = gdal.GetDriverByName('JPEG').CreateCopy('tmp/byte.jpg', ds, - options=options) + options = ["PROGRESSIVE=YES", "QUALITY=50", "WORLDFILE=YES"] + ds = gdal.GetDriverByName("JPEG").CreateCopy("tmp/byte.jpg", ds, options=options) # IJG, MozJPEG expected_cs = [4794, 4787] - assert ds.GetRasterBand(1).Checksum() in expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(1).Checksum() in expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_GrayIndex, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_GrayIndex + ), "Wrong color interpretation." expected_gt = [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0] gt = ds.GetGeoTransform() for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=1e-6), 'did not get expected geotransform from PAM' + assert gt[i] == pytest.approx( + expected_gt[i], abs=1e-6 + ), "did not get expected geotransform from PAM" ds = None - os.unlink('tmp/byte.jpg.aux.xml') + os.unlink("tmp/byte.jpg.aux.xml") try: - os.stat('tmp/byte.wld') + os.stat("tmp/byte.wld") except OSError: - pytest.fail('should have .wld file at that point') + pytest.fail("should have .wld file at that point") - ds = gdal.Open('tmp/byte.jpg') + ds = gdal.Open("tmp/byte.jpg") expected_gt = [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0] gt = ds.GetGeoTransform() for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=1e-6), \ - 'did not get expected geotransform from .wld' + assert gt[i] == pytest.approx( + expected_gt[i], abs=1e-6 + ), "did not get expected geotransform from .wld" ds = None - ds = gdal.Open('tmp/byte.jpg') + ds = gdal.Open("tmp/byte.jpg") ds.GetFileList() ds = None - gdal.GetDriverByName('JPEG').Delete('tmp/byte.jpg') + gdal.GetDriverByName("JPEG").Delete("tmp/byte.jpg") - assert not os.path.exists('tmp/byte.wld') + assert not os.path.exists("tmp/byte.wld") ############################################################################### @@ -166,14 +175,15 @@ def test_jpeg_4(): except AttributeError: pytest.skip() - ds = gdal.Open('data/jpeg/masked.jpg') + ds = gdal.Open("data/jpeg/masked.jpg") refband = ds.GetRasterBand(1) - assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, 'wrong mask flags' + assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, "wrong mask flags" cs = refband.GetMaskBand().Checksum() - assert cs == 770, 'Wrong mask checksum' + assert cs == 770, "Wrong mask checksum" + ############################################################################### # Verify CreateCopy() of masked jpeg. @@ -186,20 +196,21 @@ def test_jpeg_5(): except AttributeError: pytest.skip() - ds = gdal.Open('data/jpeg/masked.jpg') + ds = gdal.Open("data/jpeg/masked.jpg") - ds2 = gdal.GetDriverByName('JPEG').CreateCopy('tmp/masked.jpg', ds) + ds2 = gdal.GetDriverByName("JPEG").CreateCopy("tmp/masked.jpg", ds) refband = ds2.GetRasterBand(1) - assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, 'wrong mask flags' + assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, "wrong mask flags" cs = refband.GetMaskBand().Checksum() - assert cs == 770, 'Wrong checksum on copied images mask.' + assert cs == 770, "Wrong checksum on copied images mask." refband = None ds2 = None - gdal.GetDriverByName('JPEG').Delete('tmp/masked.jpg') + gdal.GetDriverByName("JPEG").Delete("tmp/masked.jpg") + ############################################################################### # Verify ability to open file with corrupt metadata (#1904). Note the file @@ -209,24 +220,28 @@ def test_jpeg_5(): def test_jpeg_6(): - ds = gdal.Open('data/jpeg/vophead.jpg') + ds = gdal.Open("data/jpeg/vophead.jpg") # Because of the optimization in r17446, we shouldn't yet get this error. - assert (not (gdal.GetLastErrorType() == 2 and - gdal.GetLastErrorMsg().find('Ignoring EXIF') != -1)), 'got error too soon.' + assert not ( + gdal.GetLastErrorType() == 2 + and gdal.GetLastErrorMsg().find("Ignoring EXIF") != -1 + ), "got error too soon." - with gdaltest.error_handler('CPLQuietErrorHandler'): + with gdaltest.error_handler("CPLQuietErrorHandler"): # Get this warning: # Ignoring EXIF directory with unlikely entry count (65499). md = ds.GetMetadata() # Did we get an exif related warning? - assert (not (gdal.GetLastErrorType() != 2 or - gdal.GetLastErrorMsg().find('Ignoring EXIF') == -1)), \ - 'did not get expected error.' + assert not ( + gdal.GetLastErrorType() != 2 + or gdal.GetLastErrorMsg().find("Ignoring EXIF") == -1 + ), "did not get expected error." - assert len(md) == 1 and md['EXIF_Software'] == 'IrfanView', \ - 'did not get expected metadata.' + assert ( + len(md) == 1 and md["EXIF_Software"] == "IrfanView" + ), "did not get expected metadata." ds = None @@ -234,23 +249,26 @@ def test_jpeg_6(): ############################################################################### # Test creating an in memory copy. + def test_jpeg_7(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") - options = ['PROGRESSIVE=YES', - 'QUALITY=50'] - ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/byte.jpg', ds, - options=options) + options = ["PROGRESSIVE=YES", "QUALITY=50"] + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/byte.jpg", ds, options=options + ) # IJG, MozJPEG expected_cs = [4794, 4787] - assert ds.GetRasterBand(1).Checksum() in expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(1).Checksum() in expected_cs + ), "Wrong checksum on copied image." ds = None - gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') + gdal.GetDriverByName("JPEG").Delete("/vsimem/byte.jpg") + ############################################################################### # Read a CMYK image as a RGB image @@ -258,36 +276,44 @@ def test_jpeg_7(): def test_jpeg_8(): - ds = gdal.Open('data/jpeg/rgb_ntf_cmyk.jpg') + ds = gdal.Open("data/jpeg/rgb_ntf_cmyk.jpg") expected_cs = 20385 - assert ds.GetRasterBand(1).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(1).Checksum() == expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand + ), "Wrong color interpretation." expected_cs = 20865 - assert ds.GetRasterBand(2).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(2).Checksum() == expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand + ), "Wrong color interpretation." expected_cs = 19441 - assert ds.GetRasterBand(3).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(3).Checksum() == expected_cs + ), "Wrong checksum on copied image." + + assert ( + ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand + ), "Wrong color interpretation." - assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ - 'Wrong color interpretation.' + md = ds.GetMetadata("IMAGE_STRUCTURE") - md = ds.GetMetadata('IMAGE_STRUCTURE') + assert ( + "SOURCE_COLOR_SPACE" in md and md["SOURCE_COLOR_SPACE"] == "CMYK" + ), "missing SOURCE_COLOR_SPACE metadata" - assert 'SOURCE_COLOR_SPACE' in md and md['SOURCE_COLOR_SPACE'] == 'CMYK', \ - 'missing SOURCE_COLOR_SPACE metadata' ############################################################################### # Read a CMYK image as a CMYK image @@ -295,41 +321,50 @@ def test_jpeg_8(): def test_jpeg_9(): - gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') - ds = gdal.Open('data/jpeg/rgb_ntf_cmyk.jpg') - gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'YES') + gdal.SetConfigOption("GDAL_JPEG_TO_RGB", "NO") + ds = gdal.Open("data/jpeg/rgb_ntf_cmyk.jpg") + gdal.SetConfigOption("GDAL_JPEG_TO_RGB", "YES") expected_cs = 21187 - assert ds.GetRasterBand(1).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(1).Checksum() == expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand + ), "Wrong color interpretation." expected_cs = 21054 - assert ds.GetRasterBand(2).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(2).Checksum() == expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_MagentaBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_MagentaBand + ), "Wrong color interpretation." expected_cs = 21499 - assert ds.GetRasterBand(3).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(3).Checksum() == expected_cs + ), "Wrong checksum on copied image." - assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_YellowBand, \ - 'Wrong color interpretation.' + assert ( + ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_YellowBand + ), "Wrong color interpretation." expected_cs = 21069 - assert ds.GetRasterBand(4).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(4).Checksum() == expected_cs + ), "Wrong checksum on copied image." + + assert ( + ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_BlackBand + ), "Wrong color interpretation." - assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_BlackBand, \ - 'Wrong color interpretation.' ############################################################################### # Check reading a 12-bit JPEG @@ -337,28 +372,28 @@ def test_jpeg_9(): def test_jpeg_10(): - if gdaltest.jpeg_version == '9b': # Fails for some reason + if gdaltest.jpeg_version == "9b": # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing - drv = gdal.GetDriverByName('JPEG') + drv = gdal.GetDriverByName("JPEG") md = drv.GetMetadata() - if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: - pytest.skip('12bit jpeg not available') + if md[gdal.DMD_CREATIONDATATYPES].find("UInt16") == -1: + pytest.skip("12bit jpeg not available") try: - os.remove('data/jpeg/12bit_rose_extract.jpg.aux.xml') + os.remove("data/jpeg/12bit_rose_extract.jpg.aux.xml") except OSError: pass - ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') + ds = gdal.Open("data/jpeg/12bit_rose_extract.jpg") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 3613 and stats[2] <= 3614 ds = None try: - os.remove('data/jpeg/12bit_rose_extract.jpg.aux.xml') + os.remove("data/jpeg/12bit_rose_extract.jpg.aux.xml") except OSError: pass @@ -369,26 +404,27 @@ def test_jpeg_10(): def test_jpeg_11(): - if gdaltest.jpeg_version == '9b': # Fails for some reason + if gdaltest.jpeg_version == "9b": # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing - drv = gdal.GetDriverByName('JPEG') + drv = gdal.GetDriverByName("JPEG") md = drv.GetMetadata() - if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: - pytest.skip('12bit jpeg not available') + if md[gdal.DMD_CREATIONDATATYPES].find("UInt16") == -1: + pytest.skip("12bit jpeg not available") - ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') - out_ds = gdal.GetDriverByName('JPEG').CreateCopy('tmp/jpeg11.jpg', ds) + ds = gdal.Open("data/jpeg/12bit_rose_extract.jpg") + out_ds = gdal.GetDriverByName("JPEG").CreateCopy("tmp/jpeg11.jpg", ds) del out_ds - ds = gdal.Open('tmp/jpeg11.jpg') + ds = gdal.Open("tmp/jpeg11.jpg") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 3613 and stats[2] <= 3614 ds = None - gdal.GetDriverByName('JPEG').Delete('tmp/jpeg11.jpg') + gdal.GetDriverByName("JPEG").Delete("tmp/jpeg11.jpg") + ############################################################################### # Test reading a stored JPEG in ZIP (#3908) @@ -396,37 +432,40 @@ def test_jpeg_11(): def test_jpeg_12(): - ds = gdal.Open('/vsizip/data/jpeg/byte_jpg.zip') + ds = gdal.Open("/vsizip/data/jpeg/byte_jpg.zip") assert ds is not None gdal.ErrorReset() ds.GetRasterBand(1).Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" gdal.ErrorReset() ds.GetRasterBand(1).GetMaskBand().Checksum() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None + ############################################################################### # Test writing to /vsistdout/ def test_jpeg_13(): - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsistdout_redirect//vsimem/tmp.jpg', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsistdout_redirect//vsimem/tmp.jpg", src_ds + ) assert ds.GetRasterBand(1).Checksum() == 0 ds.ReadRaster(0, 0, 1, 1) src_ds = None ds = None - ds = gdal.Open('/vsimem/tmp.jpg') + ds = gdal.Open("/vsimem/tmp.jpg") assert ds is not None - gdal.Unlink('/vsimem/tmp.jpg') + gdal.Unlink("/vsimem/tmp.jpg") + ############################################################################### # Test writing to /vsistdout/ @@ -434,25 +473,26 @@ def test_jpeg_13(): def test_jpeg_14(): - if gdaltest.jpeg_version == '9b': # Fails for some reason + if gdaltest.jpeg_version == "9b": # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing - drv = gdal.GetDriverByName('JPEG') + drv = gdal.GetDriverByName("JPEG") md = drv.GetMetadata() - if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: - pytest.skip('12bit jpeg not available') + if md[gdal.DMD_CREATIONDATATYPES].find("UInt16") == -1: + pytest.skip("12bit jpeg not available") - src_ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') - ds = drv.CreateCopy('/vsistdout_redirect//vsimem/tmp.jpg', src_ds) + src_ds = gdal.Open("data/jpeg/12bit_rose_extract.jpg") + ds = drv.CreateCopy("/vsistdout_redirect//vsimem/tmp.jpg", src_ds) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None - ds = gdal.Open('/vsimem/tmp.jpg') + ds = gdal.Open("/vsimem/tmp.jpg") assert ds is not None - gdal.Unlink('/vsimem/tmp.jpg') + gdal.Unlink("/vsimem/tmp.jpg") + ############################################################################### # Test CreateCopy() interruption @@ -460,20 +500,21 @@ def test_jpeg_14(): def test_jpeg_15(): - tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 17016) + tst = gdaltest.GDALTest("JPEG", "jpeg/albania.jpg", 2, 17016) return tst.testCreateCopy(vsimem=1, interrupt_during_copy=True) + ############################################################################### # Test overview support def test_jpeg_16(): - shutil.copy('data/jpeg/albania.jpg', 'tmp/albania.jpg') - gdal.Unlink('tmp/albania.jpg.ovr') + shutil.copy("data/jpeg/albania.jpg", "tmp/albania.jpg") + gdal.Unlink("tmp/albania.jpg.ovr") - ds = gdal.Open('tmp/albania.jpg') + ds = gdal.Open("tmp/albania.jpg") assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(1) is None @@ -481,18 +522,18 @@ def test_jpeg_16(): # "Internal" overview cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - if gdaltest.jpeg_version in ('8', '9b'): + if gdaltest.jpeg_version in ("8", "9b"): expected_cs = 34218 else: expected_cs = 31892 assert cs == expected_cs # Build external overviews - ds.BuildOverviews('NEAR', [2, 4]) + ds.BuildOverviews("NEAR", [2, 4]) assert ds.GetRasterBand(1).GetOverviewCount() == 2 # Check updated checksum cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - if gdaltest.jpeg_version in ('8', '9b'): + if gdaltest.jpeg_version in ("8", "9b"): expected_cs = 33698 else: expected_cs = 32460 @@ -501,10 +542,10 @@ def test_jpeg_16(): ds = None # Check we are using external overviews - ds = gdal.Open('tmp/albania.jpg') + ds = gdal.Open("tmp/albania.jpg") assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - if gdaltest.jpeg_version in ('8', '9b'): + if gdaltest.jpeg_version in ("8", "9b"): expected_cs = 33698 else: expected_cs = 32460 @@ -512,49 +553,54 @@ def test_jpeg_16(): ds = None + ############################################################################### # Test bogus files def test_jpeg_17(): gdal.ErrorReset() - with gdaltest.error_handler('CPLQuietErrorHandler'): - ds = gdal.Open('data/jpeg/bogus.jpg') - assert (not (ds is not None or - gdal.GetLastErrorType() != gdal.CE_Failure or - gdal.GetLastErrorMsg() == '')) + with gdaltest.error_handler("CPLQuietErrorHandler"): + ds = gdal.Open("data/jpeg/bogus.jpg") + assert not ( + ds is not None + or gdal.GetLastErrorType() != gdal.CE_Failure + or gdal.GetLastErrorMsg() == "" + ) gdal.ErrorReset() - ds = gdal.Open('data/jpeg/byte_corrupted.jpg') - with gdaltest.error_handler('CPLQuietErrorHandler'): - # ERROR 1: libjpeg: Huffman table 0x00 was not defined + ds = gdal.Open("data/jpeg/byte_corrupted.jpg") + with gdaltest.error_handler("CPLQuietErrorHandler"): + # ERROR 1: libjpeg: Huffman table 0x00 was not defined cs = ds.GetRasterBand(1).Checksum() - if (gdal.GetLastErrorType() != gdal.CE_Failure or - gdal.GetLastErrorMsg() == ''): + if gdal.GetLastErrorType() != gdal.CE_Failure or gdal.GetLastErrorMsg() == "": # libjpeg-turbo 1.4.0 doesn't emit errors... assert cs == 4925 gdal.ErrorReset() - ds = gdal.Open('data/jpeg/byte_corrupted2.jpg') - with gdaltest.error_handler('CPLQuietErrorHandler'): + ds = gdal.Open("data/jpeg/byte_corrupted2.jpg") + with gdaltest.error_handler("CPLQuietErrorHandler"): # Get this warning: # libjpeg: Corrupt JPEG data: found marker 0x00 instead of RST63 ds.GetRasterBand(1).Checksum() - assert (not (gdal.GetLastErrorType() != gdal.CE_Warning or - gdal.GetLastErrorMsg() == '')) + assert not ( + gdal.GetLastErrorType() != gdal.CE_Warning or gdal.GetLastErrorMsg() == "" + ) gdal.ErrorReset() - ds = gdal.Open('data/jpeg/byte_corrupted2.jpg') - with gdaltest.error_handler('CPLQuietErrorHandler'): - gdal.SetConfigOption('GDAL_ERROR_ON_LIBJPEG_WARNING', 'TRUE') + ds = gdal.Open("data/jpeg/byte_corrupted2.jpg") + with gdaltest.error_handler("CPLQuietErrorHandler"): + gdal.SetConfigOption("GDAL_ERROR_ON_LIBJPEG_WARNING", "TRUE") # Get this ERROR 1: # libjpeg: Corrupt JPEG data: found marker 0x00 instead of RST63 ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_ERROR_ON_LIBJPEG_WARNING', None) + gdal.SetConfigOption("GDAL_ERROR_ON_LIBJPEG_WARNING", None) + + assert not ( + gdal.GetLastErrorType() != gdal.CE_Failure or gdal.GetLastErrorMsg() == "" + ) - assert (not (gdal.GetLastErrorType() != gdal.CE_Failure or - gdal.GetLastErrorMsg() == '')) ############################################################################### # Test situation where we cause a restart and need to reset scale @@ -563,52 +609,60 @@ def test_jpeg_17(): def test_jpeg_18(): height = 1024 width = 1024 - src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/jpeg_18.tif', - width, height, 1) + src_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/jpeg_18.tif", width, height, 1 + ) for i in range(height): - data = struct.pack('B' * 1, int(i / (height / 256))) + data = struct.pack("B" * 1, int(i / (height / 256))) src_ds.WriteRaster(0, i, width, 1, data, 1, 1) - ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_18.jpg', src_ds, - options=['QUALITY=99']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_18.jpg", src_ds, options=["QUALITY=99"] + ) src_ds = None - gdal.Unlink('/vsimem/jpeg_18.tif') + gdal.Unlink("/vsimem/jpeg_18.tif") oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) line0 = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) - data = struct.unpack('B' * width, line0) + data = struct.unpack("B" * width, line0) assert data[0] == pytest.approx(0, abs=10) line1023 = ds.GetRasterBand(1).ReadRaster(0, height - 1, width, 1) - data = struct.unpack('B' * width, line1023) + data = struct.unpack("B" * width, line1023) assert data[0] == pytest.approx(255, abs=10) - line0_ovr1 = ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, 0, - int(width / 4), - 1) - data = struct.unpack('B' * (int(width / 4)), line0_ovr1) + line0_ovr1 = ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, 0, int(width / 4), 1) + data = struct.unpack("B" * (int(width / 4)), line0_ovr1) assert data[0] == pytest.approx(0, abs=10) line1023_bis = ds.GetRasterBand(1).ReadRaster(0, height - 1, width, 1) assert line1023_bis != line0 and line1023 == line1023_bis line0_bis = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) assert line0 == line0_bis - line255_ovr1 = ds.GetRasterBand(1).GetOverview(1).ReadRaster( - 0, int(height / 4) - 1, int(width / 4), 1) - data = struct.unpack('B' * int(width / 4), line255_ovr1) + line255_ovr1 = ( + ds.GetRasterBand(1) + .GetOverview(1) + .ReadRaster(0, int(height / 4) - 1, int(width / 4), 1) + ) + data = struct.unpack("B" * int(width / 4), line255_ovr1) assert data[0] == pytest.approx(255, abs=10) line0_bis = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) assert line0 == line0_bis - line0_ovr1_bis = ds.GetRasterBand(1).GetOverview(1).ReadRaster( - 0, 0, int(width / 4), 1) + line0_ovr1_bis = ( + ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, 0, int(width / 4), 1) + ) assert line0_ovr1 == line0_ovr1_bis - line255_ovr1_bis = ds.GetRasterBand(1).GetOverview(1).ReadRaster( - 0, int(height / 4) - 1, int(width / 4), 1) + line255_ovr1_bis = ( + ds.GetRasterBand(1) + .GetOverview(1) + .ReadRaster(0, int(height / 4) - 1, int(width / 4), 1) + ) assert line255_ovr1 == line255_ovr1_bis gdal.SetCacheMax(oldSize) ds = None - gdal.Unlink('/vsimem/jpeg_18.jpg') + gdal.Unlink("/vsimem/jpeg_18.jpg") + ############################################################################### # Test MSB ordering of bits in mask (#5102) @@ -617,38 +671,42 @@ def test_jpeg_18(): def test_jpeg_19(): for width, height, iX in [(32, 32, 12), (25, 25, 8), (24, 25, 8)]: - src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/jpeg_19.tif', - width, height, 1) + src_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/jpeg_19.tif", width, height, 1 + ) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( - 0, 0, iX, height, struct.pack('B' * 1, 255), 1, 1) + 0, 0, iX, height, struct.pack("B" * 1, 255), 1, 1 + ) src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( - iX, 0, width - iX, height, struct.pack('B' * 1, 0), 1, 1) - tiff_mask_data = src_ds.GetRasterBand(1).GetMaskBand().ReadRaster( - 0, 0, width, height) + iX, 0, width - iX, height, struct.pack("B" * 1, 0), 1, 1 + ) + tiff_mask_data = ( + src_ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, width, height) + ) # Generate a JPEG file with a (default) LSB bit mask order - out_ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_19.jpg', - src_ds) + out_ds = gdal.GetDriverByName("JPEG").CreateCopy("/vsimem/jpeg_19.jpg", src_ds) out_ds = None # Generate a JPEG file with a MSB bit mask order - gdal.SetConfigOption('JPEG_WRITE_MASK_BIT_ORDER', 'MSB') - out_ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_19_msb.jpg', src_ds) + gdal.SetConfigOption("JPEG_WRITE_MASK_BIT_ORDER", "MSB") + out_ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_19_msb.jpg", src_ds + ) del out_ds - gdal.SetConfigOption('JPEG_WRITE_MASK_BIT_ORDER', None) + gdal.SetConfigOption("JPEG_WRITE_MASK_BIT_ORDER", None) src_ds = None # Check that the file are indeed different - statBuf = gdal.VSIStatL('/vsimem/jpeg_19.jpg') - f = gdal.VSIFOpenL('/vsimem/jpeg_19.jpg', 'rb') + statBuf = gdal.VSIStatL("/vsimem/jpeg_19.jpg") + f = gdal.VSIFOpenL("/vsimem/jpeg_19.jpg", "rb") data1 = gdal.VSIFReadL(1, statBuf.size, f) gdal.VSIFCloseL(f) - statBuf = gdal.VSIStatL('/vsimem/jpeg_19_msb.jpg') - f = gdal.VSIFOpenL('/vsimem/jpeg_19_msb.jpg', 'rb') + statBuf = gdal.VSIStatL("/vsimem/jpeg_19_msb.jpg") + f = gdal.VSIFOpenL("/vsimem/jpeg_19_msb.jpg", "rb") data2 = gdal.VSIFReadL(1, statBuf.size, f) gdal.VSIFCloseL(f) @@ -658,22 +716,25 @@ def test_jpeg_19(): assert data1 != data2 # Check the file with the LSB bit mask order - ds = gdal.Open('/vsimem/jpeg_19.jpg') - jpg_mask_data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( - 0, 0, width, height) + ds = gdal.Open("/vsimem/jpeg_19.jpg") + jpg_mask_data = ( + ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, width, height) + ) ds = None assert tiff_mask_data == jpg_mask_data # Check the file with the MSB bit mask order - ds = gdal.Open('/vsimem/jpeg_19_msb.jpg') - jpg_mask_data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( - 0, 0, width, height) + ds = gdal.Open("/vsimem/jpeg_19_msb.jpg") + jpg_mask_data = ( + ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 0, width, height) + ) ds = None assert tiff_mask_data == jpg_mask_data - gdal.GetDriverByName('GTiff').Delete('/vsimem/jpeg_19.tif') - gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_19.jpg') - gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_19_msb.jpg') + gdal.GetDriverByName("GTiff").Delete("/vsimem/jpeg_19.tif") + gdal.GetDriverByName("JPEG").Delete("/vsimem/jpeg_19.jpg") + gdal.GetDriverByName("JPEG").Delete("/vsimem/jpeg_19_msb.jpg") + ############################################################################### # Test correct decection of LSB order in mask (#4351) @@ -681,15 +742,19 @@ def test_jpeg_19(): def test_jpeg_mask_lsb_order_issue_4351(): - src_ds = gdal.GetDriverByName('MEM').Create('', 15, 4, 3) + src_ds = gdal.GetDriverByName("MEM").Create("", 15, 4, 3) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) - src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(7, 2, 2, 1, b'\xFF' * 2) - tmpfilename = '/vsimem/test_jpeg_mask_lsb_order_issue_4351.jpg' - assert gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(7, 2, 2, 1, b"\xFF" * 2) + tmpfilename = "/vsimem/test_jpeg_mask_lsb_order_issue_4351.jpg" + assert gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) ds = gdal.Open(tmpfilename) - assert ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 2, 15, 1) == b'\x00' * 7 + b'\xFF' * 2 + b'\x00' * 6 + assert ( + ds.GetRasterBand(1).GetMaskBand().ReadRaster(0, 2, 15, 1) + == b"\x00" * 7 + b"\xFF" * 2 + b"\x00" * 6 + ) ds = None - gdal.GetDriverByName('JPEG').Delete(tmpfilename) + gdal.GetDriverByName("JPEG").Delete(tmpfilename) + ############################################################################### # Test correct GCP reading with PAM (#5352) @@ -697,17 +762,18 @@ def test_jpeg_mask_lsb_order_issue_4351(): def test_jpeg_20(): - src_ds = gdal.Open('data/rgb_gcp.vrt') - ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_20.jpg', src_ds) + src_ds = gdal.Open("data/rgb_gcp.vrt") + ds = gdal.GetDriverByName("JPEG").CreateCopy("/vsimem/jpeg_20.jpg", src_ds) ds = None - ds = gdal.Open('/vsimem/jpeg_20.jpg') + ds = gdal.Open("/vsimem/jpeg_20.jpg") assert ds.GetGCPProjection().find('GEOGCS["WGS 84"') == 0 assert ds.GetGCPCount() == 4 assert len(ds.GetGCPs()) == 4 ds = None - gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_20.jpg') + gdal.GetDriverByName("JPEG").Delete("/vsimem/jpeg_20.jpg") + ############################################################################### # Test implicit and EXIF overviews @@ -715,29 +781,31 @@ def test_jpeg_20(): def test_jpeg_21(): - ds = gdal.Open('data/jpeg/black_with_white_exif_ovr.jpg') + ds = gdal.Open("data/jpeg/black_with_white_exif_ovr.jpg") assert ds.GetRasterBand(1).GetOverviewCount() == 3 expected_dim_cs = [[512, 512, 0], [256, 256, 0], [196, 196, 12681]] i = 0 for expected_w, expected_h, expected_cs in expected_dim_cs: ovr = ds.GetRasterBand(1).GetOverview(i) cs = ovr.Checksum() - assert (not (ovr.XSize != expected_w or - ovr.YSize != expected_h or - cs != expected_cs)) + assert not ( + ovr.XSize != expected_w or ovr.YSize != expected_h or cs != expected_cs + ) i = i + 1 ds = None + ############################################################################### # Test generation of EXIF overviews def test_jpeg_22(): - src_ds = gdal.GetDriverByName('Mem').Create('', 4096, 2048) + src_ds = gdal.GetDriverByName("Mem").Create("", 4096, 2048) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_22.jpg", src_ds, options=["EXIF_THUMBNAIL=YES"] + ) src_ds = None assert ds.GetRasterBand(1).GetOverviewCount() == 4 ovr = ds.GetRasterBand(1).GetOverview(3) @@ -746,95 +814,105 @@ def test_jpeg_22(): ds = None # With 3 bands - src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096, 3) + src_ds = gdal.GetDriverByName("Mem").Create("", 2048, 4096, 3) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_22.jpg", src_ds, options=["EXIF_THUMBNAIL=YES"] + ) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 64 and ovr.YSize == 128 ds = None # With comment - src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) + src_ds = gdal.GetDriverByName("Mem").Create("", 2048, 4096) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_22.jpg', src_ds, - options=['COMMENT=foo', 'EXIF_THUMBNAIL=YES', 'THUMBNAIL_WIDTH=40']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_22.jpg", + src_ds, + options=["COMMENT=foo", "EXIF_THUMBNAIL=YES", "THUMBNAIL_WIDTH=40"], + ) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) - assert ds.GetMetadataItem('COMMENT') == 'foo' + assert ds.GetMetadataItem("COMMENT") == "foo" assert ovr.XSize == 40 and ovr.YSize == 80 ds = None - src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) + src_ds = gdal.GetDriverByName("Mem").Create("", 2048, 4096) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_22.jpg', src_ds, - options=['EXIF_THUMBNAIL=YES', 'THUMBNAIL_HEIGHT=60']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_22.jpg", + src_ds, + options=["EXIF_THUMBNAIL=YES", "THUMBNAIL_HEIGHT=60"], + ) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 30 and ovr.YSize == 60 ds = None - src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) + src_ds = gdal.GetDriverByName("Mem").Create("", 2048, 4096) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_22.jpg', src_ds, - options=['EXIF_THUMBNAIL=YES', - 'THUMBNAIL_WIDTH=50', - 'THUMBNAIL_HEIGHT=40']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/jpeg_22.jpg", + src_ds, + options=["EXIF_THUMBNAIL=YES", "THUMBNAIL_WIDTH=50", "THUMBNAIL_HEIGHT=40"], + ) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 50 and ovr.YSize == 40 ds = None - gdal.Unlink('/vsimem/jpeg_22.jpg') + gdal.Unlink("/vsimem/jpeg_22.jpg") + ############################################################################### # Test optimized JPEG IRasterIO def test_jpeg_23(): - ds = gdal.Open('data/jpeg/albania.jpg') + ds = gdal.Open("data/jpeg/albania.jpg") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] # Band interleaved data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - tmp_ds = gdal.GetDriverByName('Mem').Create( - '', ds.RasterXSize, ds.RasterYSize, 3) + tmp_ds = gdal.GetDriverByName("Mem").Create("", ds.RasterXSize, ds.RasterYSize, 3) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs # Pixel interleaved - ds = gdal.Open('data/jpeg/albania.jpg') - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, - buf_pixel_space=3, buf_band_space=1) - y = int(ds.RasterYSize/2) - data_bottom = ds.ReadRaster(0, y, ds.RasterXSize, ds.RasterYSize - y, - buf_pixel_space=3, buf_band_space=1) - data_top = ds.ReadRaster(0, 0, ds.RasterXSize, y, - buf_pixel_space=3, buf_band_space=1) + ds = gdal.Open("data/jpeg/albania.jpg") + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=3, buf_band_space=1 + ) + y = int(ds.RasterYSize / 2) + data_bottom = ds.ReadRaster( + 0, y, ds.RasterXSize, ds.RasterYSize - y, buf_pixel_space=3, buf_band_space=1 + ) + data_top = ds.ReadRaster( + 0, 0, ds.RasterXSize, y, buf_pixel_space=3, buf_band_space=1 + ) assert data == data_top + data_bottom - tmp_ds = gdal.GetDriverByName('Mem').Create( - '', ds.RasterXSize, ds.RasterYSize, 3) - tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, - buf_pixel_space=3, buf_band_space=1) + tmp_ds = gdal.GetDriverByName("Mem").Create("", ds.RasterXSize, ds.RasterYSize, 3) + tmp_ds.WriteRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=3, buf_band_space=1 + ) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs # Pixel interleaved with padding - ds = gdal.Open('data/jpeg/albania.jpg') - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, - buf_pixel_space=4, buf_band_space=1) - tmp_ds = gdal.GetDriverByName('Mem').Create( - '', ds.RasterXSize, ds.RasterYSize, 3) - tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, - buf_pixel_space=4, buf_band_space=1) + ds = gdal.Open("data/jpeg/albania.jpg") + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=4, buf_band_space=1 + ) + tmp_ds = gdal.GetDriverByName("Mem").Create("", ds.RasterXSize, ds.RasterYSize, 3) + tmp_ds.WriteRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=4, buf_band_space=1 + ) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs + ############################################################################### # Test Arithmetic coding (and if not enabled, will trigger error code handling # in CreateCopy()) @@ -842,29 +920,38 @@ def test_jpeg_23(): def test_jpeg_24(): - has_arithmetic = bool(gdal.GetDriverByName('JPEG').GetMetadataItem( - 'DMD_CREATIONOPTIONLIST').find('ARITHMETIC') >= 0) + has_arithmetic = bool( + gdal.GetDriverByName("JPEG") + .GetMetadataItem("DMD_CREATIONOPTIONLIST") + .find("ARITHMETIC") + >= 0 + ) - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") if not has_arithmetic: gdal.PushErrorHandler() - ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/byte.jpg', src_ds, - options=['ARITHMETIC=YES']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/byte.jpg", src_ds, options=["ARITHMETIC=YES"] + ) if not has_arithmetic: gdal.PopErrorHandler() else: - if gdal.GetLastErrorMsg().find('Requested feature was omitted at compile time') >= 0: + if ( + gdal.GetLastErrorMsg().find("Requested feature was omitted at compile time") + >= 0 + ): ds = None - gdal.Unlink('/vsimem/byte.jpg') + gdal.Unlink("/vsimem/byte.jpg") pytest.skip() expected_cs = 4743 - assert ds.GetRasterBand(1).Checksum() == expected_cs, \ - 'Wrong checksum on copied image.' + assert ( + ds.GetRasterBand(1).Checksum() == expected_cs + ), "Wrong checksum on copied image." ds = None - gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') + gdal.GetDriverByName("JPEG").Delete("/vsimem/byte.jpg") ############################################################################### @@ -873,17 +960,19 @@ def test_jpeg_24(): def test_jpeg_25(): - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/byte.jpg', src_ds, options=['COMMENT=my comment']) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("JPEG").CreateCopy( + "/vsimem/byte.jpg", src_ds, options=["COMMENT=my comment"] + ) ds = None - ds = gdal.Open('/vsimem/byte.jpg') - if ds.GetMetadataItem('COMMENT') != 'my comment': + ds = gdal.Open("/vsimem/byte.jpg") + if ds.GetMetadataItem("COMMENT") != "my comment": print(ds.GetMetadata()) - pytest.fail('Wrong comment.') + pytest.fail("Wrong comment.") ds = None - gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') + gdal.GetDriverByName("JPEG").Delete("/vsimem/byte.jpg") + ############################################################################### # Test creation error @@ -891,12 +980,11 @@ def test_jpeg_25(): def test_jpeg_26(): - src_ds = gdal.GetDriverByName('Mem').Create('', 70000, 1) + src_ds = gdal.GetDriverByName("Mem").Create("", 70000, 1) with gdaltest.error_handler(): - ds = gdal.GetDriverByName('JPEG').CreateCopy( - '/vsimem/jpeg_26.jpg', src_ds) + ds = gdal.GetDriverByName("JPEG").CreateCopy("/vsimem/jpeg_26.jpg", src_ds) assert ds is None - gdal.Unlink('/vsimem/jpeg_26.jpg') + gdal.Unlink("/vsimem/jpeg_26.jpg") ############################################################################### @@ -904,34 +992,37 @@ def test_jpeg_26(): # vulnerabilities listed in # http://www.libjpeg-jpeg_26.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf -@pytest.mark.skipif(sys.platform == 'win32', reason='Fails for some reason on Windows') + +@pytest.mark.skipif(sys.platform == "win32", reason="Fails for some reason on Windows") def test_jpeg_27_max_memory(): # Should error out with 'Reading this image would require # libjpeg to allocate at least...' gdal.ErrorReset() with gdaltest.error_handler(): - os.environ['JPEGMEM'] = '10M' - gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', '1000') - ds = gdal.Open('/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip') + os.environ["JPEGMEM"] = "10M" + gdal.SetConfigOption("GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER", "1000") + ds = gdal.Open( + "/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip" + ) cs = ds.GetRasterBand(1).Checksum() - del os.environ['JPEGMEM'] - gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', None) - assert cs == 0 and gdal.GetLastErrorMsg() != '' + del os.environ["JPEGMEM"] + gdal.SetConfigOption("GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER", None) + assert cs == 0 and gdal.GetLastErrorMsg() != "" def test_jpeg_27_max_scan_number(): # Should error out with 'Scan number... gdal.ErrorReset() - ds = gdal.Open('/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip') + ds = gdal.Open("/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip") with gdaltest.error_handler(): - gdal.SetConfigOption('GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC', 'YES') - gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', '10') + gdal.SetConfigOption("GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC", "YES") + gdal.SetConfigOption("GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER", "10") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC', None) - gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', None) - assert cs == 0 and gdal.GetLastErrorMsg() != '' + gdal.SetConfigOption("GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC", None) + gdal.SetConfigOption("GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER", None) + assert cs == 0 and gdal.GetLastErrorMsg() != "" ############################################################################### @@ -940,131 +1031,172 @@ def test_jpeg_27_max_scan_number(): def test_jpeg_28(): - tmpfilename = '/vsimem/jpeg_28.jpg' + tmpfilename = "/vsimem/jpeg_28.jpg" # Nothing - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - ds = gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + ds = gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None ds = gdal.Open(tmpfilename) assert not ds.GetMetadata() # EXIF tags only - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - - src_ds.SetMetadataItem('EXIF_DateTime', 'dt') # not enough values ASCII - src_ds.SetMetadataItem('EXIF_DateTimeOriginal', '01234567890123456789') # truncated ASCII - src_ds.SetMetadataItem('EXIF_DateTimeDigitized', '0123456789012345678') # right number of items ASCII - src_ds.SetMetadataItem('EXIF_Make', 'make') # variable ASCII - - src_ds.SetMetadataItem('EXIF_ExifVersion', '01234') # truncated UNDEFINED - src_ds.SetMetadataItem('EXIF_ComponentsConfiguration', '0x1F') # not enough values UNDEFINED - src_ds.SetMetadataItem('EXIF_FlashpixVersion', 'ABCD') # right number of items UNDEFINED - src_ds.SetMetadataItem('EXIF_SpatialFrequencyResponse', '0xab 0xCD') # variable UNDEFINED - - src_ds.SetMetadataItem('EXIF_Orientation', '10') # right number of items SHORT - src_ds.SetMetadataItem('EXIF_ResolutionUnit', '2 4') # truncated SHORT - src_ds.SetMetadataItem('EXIF_TransferFunction', '0 1') # not enough values SHORT - src_ds.SetMetadataItem('EXIF_ISOSpeedRatings', '1 2 3') # variable SHORT - - src_ds.SetMetadataItem('EXIF_StandardOutputSensitivity', '123456789') # right number of items LONG - - src_ds.SetMetadataItem('EXIF_XResolution', '96') # right number of items RATIONAL - src_ds.SetMetadataItem('EXIF_YResolution', '96 0') # truncated RATIONAL - src_ds.SetMetadataItem('EXIF_CompressedBitsPerPixel', 'nan') # invalid RATIONAL - src_ds.SetMetadataItem('EXIF_ApertureValue', '-1') # invalid RATIONAL + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + + src_ds.SetMetadataItem("EXIF_DateTime", "dt") # not enough values ASCII + src_ds.SetMetadataItem( + "EXIF_DateTimeOriginal", "01234567890123456789" + ) # truncated ASCII + src_ds.SetMetadataItem( + "EXIF_DateTimeDigitized", "0123456789012345678" + ) # right number of items ASCII + src_ds.SetMetadataItem("EXIF_Make", "make") # variable ASCII + + src_ds.SetMetadataItem("EXIF_ExifVersion", "01234") # truncated UNDEFINED + src_ds.SetMetadataItem( + "EXIF_ComponentsConfiguration", "0x1F" + ) # not enough values UNDEFINED + src_ds.SetMetadataItem( + "EXIF_FlashpixVersion", "ABCD" + ) # right number of items UNDEFINED + src_ds.SetMetadataItem( + "EXIF_SpatialFrequencyResponse", "0xab 0xCD" + ) # variable UNDEFINED + + src_ds.SetMetadataItem("EXIF_Orientation", "10") # right number of items SHORT + src_ds.SetMetadataItem("EXIF_ResolutionUnit", "2 4") # truncated SHORT + src_ds.SetMetadataItem("EXIF_TransferFunction", "0 1") # not enough values SHORT + src_ds.SetMetadataItem("EXIF_ISOSpeedRatings", "1 2 3") # variable SHORT + + src_ds.SetMetadataItem( + "EXIF_StandardOutputSensitivity", "123456789" + ) # right number of items LONG + + src_ds.SetMetadataItem("EXIF_XResolution", "96") # right number of items RATIONAL + src_ds.SetMetadataItem("EXIF_YResolution", "96 0") # truncated RATIONAL + src_ds.SetMetadataItem("EXIF_CompressedBitsPerPixel", "nan") # invalid RATIONAL + src_ds.SetMetadataItem("EXIF_ApertureValue", "-1") # invalid RATIONAL with gdaltest.error_handler(): - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() - expected_md = {'EXIF_DateTimeDigitized': '0123456789012345678', 'EXIF_DateTimeOriginal': '0123456789012345678', 'EXIF_Orientation': '10', 'EXIF_ApertureValue': '(0)', 'EXIF_YResolution': '(96)', 'EXIF_XResolution': '(96)', 'EXIF_TransferFunction': '0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0', 'EXIF_ExifVersion': '0123', 'EXIF_DateTime': 'dt ', 'EXIF_FlashpixVersion': 'ABCD', 'EXIF_ComponentsConfiguration': '0x1f 0x00 0x00 0x00', 'EXIF_Make': 'make', 'EXIF_StandardOutputSensitivity': '123456789', 'EXIF_ResolutionUnit': '2', 'EXIF_CompressedBitsPerPixel': '(0)', 'EXIF_SpatialFrequencyResponse': '0xab 0xcd', 'EXIF_ISOSpeedRatings': '1 2 3'} + expected_md = { + "EXIF_DateTimeDigitized": "0123456789012345678", + "EXIF_DateTimeOriginal": "0123456789012345678", + "EXIF_Orientation": "10", + "EXIF_ApertureValue": "(0)", + "EXIF_YResolution": "(96)", + "EXIF_XResolution": "(96)", + "EXIF_TransferFunction": "0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "EXIF_ExifVersion": "0123", + "EXIF_DateTime": "dt ", + "EXIF_FlashpixVersion": "ABCD", + "EXIF_ComponentsConfiguration": "0x1f 0x00 0x00 0x00", + "EXIF_Make": "make", + "EXIF_StandardOutputSensitivity": "123456789", + "EXIF_ResolutionUnit": "2", + "EXIF_CompressedBitsPerPixel": "(0)", + "EXIF_SpatialFrequencyResponse": "0xab 0xcd", + "EXIF_ISOSpeedRatings": "1 2 3", + } assert got_md == expected_md # Test SRATIONAL for val in (-1.5, -1, -0.5, 0, 0.5, 1, 1.5): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_ShutterSpeedValue', str(val)) - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_ShutterSpeedValue", str(val)) + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) - got_val = ds.GetMetadataItem('EXIF_ShutterSpeedValue') - got_val = got_val.replace('(', '').replace(')', '') - assert float(got_val) == val, ds.GetMetadataItem('EXIF_ShutterSpeedValue') + got_val = ds.GetMetadataItem("EXIF_ShutterSpeedValue") + got_val = got_val.replace("(", "").replace(")", "") + assert float(got_val) == val, ds.GetMetadataItem("EXIF_ShutterSpeedValue") # Test RATIONAL for val in (0, 0.5, 1, 1.5): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_ApertureValue', str(val)) - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_ApertureValue", str(val)) + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) - got_val = ds.GetMetadataItem('EXIF_ApertureValue') - got_val = got_val.replace('(', '').replace(')', '') - assert float(got_val) == val, ds.GetMetadataItem('EXIF_ApertureValue') + got_val = ds.GetMetadataItem("EXIF_ApertureValue") + got_val = got_val.replace("(", "").replace(")", "") + assert float(got_val) == val, ds.GetMetadataItem("EXIF_ApertureValue") # GPS tags only - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') - src_ds.SetMetadataItem('EXIF_GPSLatitude', '49 34 56.5') - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_GPSLatitudeRef", "N") + src_ds.SetMetadataItem("EXIF_GPSLatitude", "49 34 56.5") + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() - assert got_md == {'EXIF_GPSLatitudeRef': 'N', 'EXIF_GPSLatitude': '(49) (34) (56.5)'} + assert got_md == { + "EXIF_GPSLatitudeRef": "N", + "EXIF_GPSLatitude": "(49) (34) (56.5)", + } ds = None # EXIF and GPS tags - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') - src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_ExifVersion", "0231") + src_ds.SetMetadataItem("EXIF_GPSLatitudeRef", "N") + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() - assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_GPSLatitudeRef': 'N'} + assert got_md == {"EXIF_ExifVersion": "0231", "EXIF_GPSLatitudeRef": "N"} ds = None # EXIF and other metadata - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') - src_ds.SetMetadataItem('EXIF_invalid', 'foo') - src_ds.SetMetadataItem('FOO', 'BAR') + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_ExifVersion", "0231") + src_ds.SetMetadataItem("EXIF_invalid", "foo") + src_ds.SetMetadataItem("FOO", "BAR") with gdaltest.error_handler(): - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is not None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is not None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() - assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_invalid': 'foo', 'FOO': 'BAR'} + assert got_md == {"EXIF_ExifVersion": "0231", "EXIF_invalid": "foo", "FOO": "BAR"} ds = None # Too much content for EXIF - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('EXIF_UserComment', 'x' * 65535) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("EXIF_UserComment", "x" * 65535) with gdaltest.error_handler(): - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) + gdal.GetDriverByName("JPEG").CreateCopy(tmpfilename, src_ds) src_ds = None ds = None # EXIF and GPS tags and EXIF overview - src_ds = gdal.GetDriverByName('MEM').Create('', 1024, 1024) - src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') - src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') - gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds, - options=['EXIF_THUMBNAIL=YES', 'THUMBNAIL_WIDTH=32', 'THUMBNAIL_HEIGHT=32']) + src_ds = gdal.GetDriverByName("MEM").Create("", 1024, 1024) + src_ds.SetMetadataItem("EXIF_ExifVersion", "0231") + src_ds.SetMetadataItem("EXIF_GPSLatitudeRef", "N") + gdal.GetDriverByName("JPEG").CreateCopy( + tmpfilename, + src_ds, + options=["EXIF_THUMBNAIL=YES", "THUMBNAIL_WIDTH=32", "THUMBNAIL_HEIGHT=32"], + ) src_ds = None - assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None + assert gdal.VSIStatL(tmpfilename + ".aux.xml") is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() - assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_GPSLatitudeRef': 'N'} - assert ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1).XSize == 32 + assert got_md == {"EXIF_ExifVersion": "0231", "EXIF_GPSLatitudeRef": "N"} + assert ( + ds.GetRasterBand(1) + .GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1) + .XSize + == 32 + ) ds = None gdal.Unlink(tmpfilename) @@ -1076,18 +1208,30 @@ def test_jpeg_28(): def test_jpeg_multiscan_overviews(): - tmpfilename = '/vsimem/test_jpeg_multiscan_overviews.jpg' + tmpfilename = "/vsimem/test_jpeg_multiscan_overviews.jpg" # Will require ~ 20 MB of libjpeg memory - src_ds = gdal.GetDriverByName('MEM').Create('', 10000, 1000) + src_ds = gdal.GetDriverByName("MEM").Create("", 10000, 1000) src_ds.GetRasterBand(1).Fill(255) - ds = gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds, options=['PROGRESSIVE=YES']) + ds = gdal.GetDriverByName("JPEG").CreateCopy( + tmpfilename, src_ds, options=["PROGRESSIVE=YES"] + ) src_ds = None ds = gdal.Open(tmpfilename) - for y in (0,1): - assert struct.unpack('B', ds.GetRasterBand(1).ReadRaster(0,y,1,1))[0] == 255 - assert struct.unpack('B', ds.GetRasterBand(1).GetOverview(0).ReadRaster(0,y,1,1))[0] == 255 - assert struct.unpack('B', ds.GetRasterBand(1).GetOverview(1).ReadRaster(0,y,1,1))[0] == 255 + for y in (0, 1): + assert struct.unpack("B", ds.GetRasterBand(1).ReadRaster(0, y, 1, 1))[0] == 255 + assert ( + struct.unpack( + "B", ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, y, 1, 1) + )[0] + == 255 + ) + assert ( + struct.unpack( + "B", ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, y, 1, 1) + )[0] + == 255 + ) ds = None gdal.Unlink(tmpfilename) @@ -1096,62 +1240,69 @@ def test_jpeg_multiscan_overviews(): ############################################################################### # Open JPEG image with FLIR metadata and raw thermal image as PNG + def test_jpeg_flir_png(): - ds = gdal.Open('data/jpeg/flir/FLIR.jpg') - assert ds.GetMetadataDomainList() == ['IMAGE_STRUCTURE', 'FLIR', '', 'SUBDATASETS', 'DERIVED_SUBDATASETS'] - assert ds.GetMetadata('FLIR') == { - 'AboveColor': '170 128 128', - 'AtmosphericTemperature': '20.000000 C', - 'AtmosphericTransAlpha1': '0.006569', - 'AtmosphericTransAlpha2': '0.012620', - 'AtmosphericTransBeta1': '-0.002276', - 'AtmosphericTransBeta2': '-0.006670', - 'AtmosphericTransX': '1.900000', - 'BelowColor': '50 128 128', - 'CameraModel': 'FLIR_i7', - 'CameraPartNumber': 'T197600', - 'CameraSerialNumber': '470023842', - 'CameraSoftware': '8.1.1', - 'CameraTemperatureMaxClip': '270.000031 C', - 'CameraTemperatureMaxSaturated': '270.000031 C', - 'CameraTemperatureMaxWarn': '250.000031 C', - 'CameraTemperatureMinClip': '-40.000000 C', - 'CameraTemperatureMinSaturated': '-60.000000 C', - 'CameraTemperatureMinWarn': '0.000000 C', - 'CameraTemperatureRangeMax': '250.000031 C', - 'CameraTemperatureRangeMin': '0.000000 C', - 'DateTimeOriginal': '2012-02-11T14:17:08.253+01:00', - 'Emissivity': '0.800000', - 'FieldOfView': '24.985918 deg', - 'FocusDistance': '2.000000 m', - 'FocusStepCount': '0', - 'FrameRate': '9', - 'IRWindowTemperature': '1.000000', - 'Isotherm1Color': '100 128 128', - 'Isotherm2Color': '100 110 240', - 'LensModel': 'FOL7', - 'ObjectDistance': '1.000000 m', - 'OverflowColor': '67 216 98', - 'Palette': '(16 101 140), (17 103 142), (18 105 145), (19 106 147), (20 108 149), (21 110 152), (22 112 154), (23 114 156), (24 116 158), (25 118 160), (26 120 162), (27 121 164), (28 123 165), (29 125 167), (30 127 169), (31 128 170), (32 130 172), (33 132 173), (34 133 174), (35 135 175), (36 136 177), (37 138 178), (38 140 179), (39 141 180), (40 143 181), (41 144 181), (42 145 182), (43 147 183), (44 148 183), (44 150 184), (45 151 185), (46 152 185), (47 154 185), (48 155 186), (49 156 186), (50 157 186), (51 159 186), (52 160 186), (53 161 186), (54 162 186), (55 163 186), (56 165 186), (57 166 186), (58 167 186), (59 168 186), (60 169 185), (61 170 185), (62 171 185), (63 172 184), (64 173 184), (65 174 183), (66 175 182), (67 176 182), (68 177 181), (69 177 180), (70 178 180), (71 179 179), (72 180 178), (73 181 177), (74 182 176), (75 182 175), (76 183 174), (77 184 173), (78 184 172), (79 185 171), (80 186 170), (81 186 169), (82 187 168), (83 188 166), (84 188 165), (85 189 164), (86 189 163), (87 190 161), (88 190 160), (89 191 159), (90 191 157), (91 192 156), (92 192 154), (93 193 153), (94 193 151), (95 194 150), (96 194 148), (97 194 147), (98 195 145), (99 195 144), (99 195 142), (100 196 140), (101 196 139), (102 196 137), (103 197 135), (104 197 134), (105 197 132), (106 197 130), (107 197 129), (108 198 127), (109 198 125), (110 198 123), (111 198 122), (112 198 120), (113 198 118), (114 198 117), (115 198 115), (116 198 113), (117 198 111), (118 198 109), (119 198 108), (120 198 106), (121 198 104), (122 198 102), (123 198 101), (124 198 99), (125 198 97), (126 198 96), (127 198 94), (128 198 92), (129 198 90), (130 198 89), (131 197 87), (132 197 85), (133 197 84), (134 197 82), (135 197 80), (136 196 79), (137 196 77), (138 196 75), (139 196 74), (140 195 72), (141 195 71), (142 195 69), (143 194 68), (144 194 66), (145 194 65), (146 193 63), (147 193 62), (148 193 60), (149 192 59), (150 192 58), (151 191 56), (152 191 55), (153 191 54), (154 190 53), (154 190 51), (155 189 50), (156 189 49), (157 188 48), (158 188 47), (159 187 46), (160 187 45), (161 186 44), (162 186 43), (163 185 42), (164 184 41), (165 184 40), (166 183 40), (167 183 39), (168 182 38), (169 181 37), (170 181 37), (171 180 36), (172 179 36), (173 179 35), (174 178 35), (175 177 34), (176 177 34), (177 176 34), (178 175 33), (179 175 33), (180 174 33), (181 173 33), (182 172 33), (183 172 33), (184 171 33), (185 170 33), (186 169 33), (187 168 33), (188 168 34), (189 167 34), (190 166 34), (191 165 35), (192 164 35), (193 163 36), (194 163 37), (195 162 37), (196 161 38), (197 160 39), (198 159 40), (199 158 41), (200 157 42), (201 156 43), (202 155 44), (203 155 45), (204 154 46), (205 153 48), (206 152 49), (207 151 51), (208 150 52), (209 149 54), (209 148 56), (210 147 58), (211 146 60), (212 145 62), (213 144 64), (214 143 66), (215 142 68), (216 141 70), (217 140 73), (218 139 75), (219 138 78), (220 137 80), (221 136 83), (222 135 86), (223 134 89), (224 133 91), (225 131 95), (226 130 98), (227 129 101), (228 128 104), (229 127 108), (230 126 111), (231 125 115), (232 124 118), (233 123 122), (234 122 126), (235 121 130)', - 'PaletteColors': '224', - 'PaletteFileName': '\\FlashFS\\system\\iron.pal', - 'PaletteMethod': '0', - 'PaletteName': 'Iron', - 'PaletteStretch': '2', - 'PlanckB': '1374.5', - 'PlanckF': '1.35', - 'PlanckO': '-6646', - 'PlanckR1': '13799.269', - 'PlanckR2': '0.022241818', - 'RawThermalImageHeight': '120', - 'RawThermalImageWidth': '120', - 'RawValueMedian': '12582', - 'RawValueRange': '1980', - 'RawValueRangeMax': '61986', - 'RawValueRangeMin': '7630', - 'ReflectedApparentTemperature': '20.000000 C', - 'UnderflowColor': '41 110 240' + ds = gdal.Open("data/jpeg/flir/FLIR.jpg") + assert ds.GetMetadataDomainList() == [ + "IMAGE_STRUCTURE", + "FLIR", + "", + "SUBDATASETS", + "DERIVED_SUBDATASETS", + ] + assert ds.GetMetadata("FLIR") == { + "AboveColor": "170 128 128", + "AtmosphericTemperature": "20.000000 C", + "AtmosphericTransAlpha1": "0.006569", + "AtmosphericTransAlpha2": "0.012620", + "AtmosphericTransBeta1": "-0.002276", + "AtmosphericTransBeta2": "-0.006670", + "AtmosphericTransX": "1.900000", + "BelowColor": "50 128 128", + "CameraModel": "FLIR_i7", + "CameraPartNumber": "T197600", + "CameraSerialNumber": "470023842", + "CameraSoftware": "8.1.1", + "CameraTemperatureMaxClip": "270.000031 C", + "CameraTemperatureMaxSaturated": "270.000031 C", + "CameraTemperatureMaxWarn": "250.000031 C", + "CameraTemperatureMinClip": "-40.000000 C", + "CameraTemperatureMinSaturated": "-60.000000 C", + "CameraTemperatureMinWarn": "0.000000 C", + "CameraTemperatureRangeMax": "250.000031 C", + "CameraTemperatureRangeMin": "0.000000 C", + "DateTimeOriginal": "2012-02-11T14:17:08.253+01:00", + "Emissivity": "0.800000", + "FieldOfView": "24.985918 deg", + "FocusDistance": "2.000000 m", + "FocusStepCount": "0", + "FrameRate": "9", + "IRWindowTemperature": "1.000000", + "Isotherm1Color": "100 128 128", + "Isotherm2Color": "100 110 240", + "LensModel": "FOL7", + "ObjectDistance": "1.000000 m", + "OverflowColor": "67 216 98", + "Palette": "(16 101 140), (17 103 142), (18 105 145), (19 106 147), (20 108 149), (21 110 152), (22 112 154), (23 114 156), (24 116 158), (25 118 160), (26 120 162), (27 121 164), (28 123 165), (29 125 167), (30 127 169), (31 128 170), (32 130 172), (33 132 173), (34 133 174), (35 135 175), (36 136 177), (37 138 178), (38 140 179), (39 141 180), (40 143 181), (41 144 181), (42 145 182), (43 147 183), (44 148 183), (44 150 184), (45 151 185), (46 152 185), (47 154 185), (48 155 186), (49 156 186), (50 157 186), (51 159 186), (52 160 186), (53 161 186), (54 162 186), (55 163 186), (56 165 186), (57 166 186), (58 167 186), (59 168 186), (60 169 185), (61 170 185), (62 171 185), (63 172 184), (64 173 184), (65 174 183), (66 175 182), (67 176 182), (68 177 181), (69 177 180), (70 178 180), (71 179 179), (72 180 178), (73 181 177), (74 182 176), (75 182 175), (76 183 174), (77 184 173), (78 184 172), (79 185 171), (80 186 170), (81 186 169), (82 187 168), (83 188 166), (84 188 165), (85 189 164), (86 189 163), (87 190 161), (88 190 160), (89 191 159), (90 191 157), (91 192 156), (92 192 154), (93 193 153), (94 193 151), (95 194 150), (96 194 148), (97 194 147), (98 195 145), (99 195 144), (99 195 142), (100 196 140), (101 196 139), (102 196 137), (103 197 135), (104 197 134), (105 197 132), (106 197 130), (107 197 129), (108 198 127), (109 198 125), (110 198 123), (111 198 122), (112 198 120), (113 198 118), (114 198 117), (115 198 115), (116 198 113), (117 198 111), (118 198 109), (119 198 108), (120 198 106), (121 198 104), (122 198 102), (123 198 101), (124 198 99), (125 198 97), (126 198 96), (127 198 94), (128 198 92), (129 198 90), (130 198 89), (131 197 87), (132 197 85), (133 197 84), (134 197 82), (135 197 80), (136 196 79), (137 196 77), (138 196 75), (139 196 74), (140 195 72), (141 195 71), (142 195 69), (143 194 68), (144 194 66), (145 194 65), (146 193 63), (147 193 62), (148 193 60), (149 192 59), (150 192 58), (151 191 56), (152 191 55), (153 191 54), (154 190 53), (154 190 51), (155 189 50), (156 189 49), (157 188 48), (158 188 47), (159 187 46), (160 187 45), (161 186 44), (162 186 43), (163 185 42), (164 184 41), (165 184 40), (166 183 40), (167 183 39), (168 182 38), (169 181 37), (170 181 37), (171 180 36), (172 179 36), (173 179 35), (174 178 35), (175 177 34), (176 177 34), (177 176 34), (178 175 33), (179 175 33), (180 174 33), (181 173 33), (182 172 33), (183 172 33), (184 171 33), (185 170 33), (186 169 33), (187 168 33), (188 168 34), (189 167 34), (190 166 34), (191 165 35), (192 164 35), (193 163 36), (194 163 37), (195 162 37), (196 161 38), (197 160 39), (198 159 40), (199 158 41), (200 157 42), (201 156 43), (202 155 44), (203 155 45), (204 154 46), (205 153 48), (206 152 49), (207 151 51), (208 150 52), (209 149 54), (209 148 56), (210 147 58), (211 146 60), (212 145 62), (213 144 64), (214 143 66), (215 142 68), (216 141 70), (217 140 73), (218 139 75), (219 138 78), (220 137 80), (221 136 83), (222 135 86), (223 134 89), (224 133 91), (225 131 95), (226 130 98), (227 129 101), (228 128 104), (229 127 108), (230 126 111), (231 125 115), (232 124 118), (233 123 122), (234 122 126), (235 121 130)", + "PaletteColors": "224", + "PaletteFileName": "\\FlashFS\\system\\iron.pal", + "PaletteMethod": "0", + "PaletteName": "Iron", + "PaletteStretch": "2", + "PlanckB": "1374.5", + "PlanckF": "1.35", + "PlanckO": "-6646", + "PlanckR1": "13799.269", + "PlanckR2": "0.022241818", + "RawThermalImageHeight": "120", + "RawThermalImageWidth": "120", + "RawValueMedian": "12582", + "RawValueRange": "1980", + "RawValueRangeMax": "61986", + "RawValueRangeMin": "7630", + "ReflectedApparentTemperature": "20.000000 C", + "UnderflowColor": "41 110 240", } subds = ds.GetSubDatasets() assert len(subds) == 1 @@ -1161,12 +1312,16 @@ def test_jpeg_flir_png(): assert ds.RasterCount == 3 assert ds.GetRasterBand(1).Checksum() == 761 + ############################################################################### # Open JPEG image with FLIR metadata and raw thermal image as raw + def test_jpeg_flir_raw(): - ds = gdal.Open('data/jpeg/flir/Image_thermique_de_l_emission_d_un_radiateur_a_travers_un_mur.jpg') + ds = gdal.Open( + "data/jpeg/flir/Image_thermique_de_l_emission_d_un_radiateur_a_travers_un_mur.jpg" + ) subds = ds.GetSubDatasets() assert len(subds) == 1 @@ -1176,43 +1331,46 @@ def test_jpeg_flir_raw(): assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).Checksum() == 30310 + ############################################################################### def test_jpeg_flir_error_flir_subds(): with gdaltest.error_handler(): - ds = gdal.Open('JPEG:foo.jpg') + ds = gdal.Open("JPEG:foo.jpg") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('JPEG:foo.jpg:BAR') + ds = gdal.Open("JPEG:foo.jpg:BAR") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('JPEG:data/jpeg/masked.jpg:FLIR_RAW_THERMAL_IMAGE') + ds = gdal.Open("JPEG:data/jpeg/masked.jpg:FLIR_RAW_THERMAL_IMAGE") assert ds is None + ############################################################################### # Write a CMYK image def test_jpeg_write_cmyk(): - with gdaltest.config_option('GDAL_JPEG_TO_RGB', 'NO'): - src_ds = gdal.Open('data/jpeg/rgb_ntf_cmyk.jpg') + with gdaltest.config_option("GDAL_JPEG_TO_RGB", "NO"): + src_ds = gdal.Open("data/jpeg/rgb_ntf_cmyk.jpg") - gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/out.jpg', src_ds) - assert gdal.GetLastErrorMsg() == '' - gdal.Unlink('/vsimem/out.jpg.aux.xml') + gdal.GetDriverByName("JPEG").CreateCopy("/vsimem/out.jpg", src_ds) + assert gdal.GetLastErrorMsg() == "" + gdal.Unlink("/vsimem/out.jpg.aux.xml") - with gdaltest.config_option('GDAL_JPEG_TO_RGB', 'NO'): - ds = gdal.Open('/vsimem/out.jpg') + with gdaltest.config_option("GDAL_JPEG_TO_RGB", "NO"): + ds = gdal.Open("/vsimem/out.jpg") assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand ds = None - gdal.Unlink('/vsimem/out.jpg') + gdal.Unlink("/vsimem/out.jpg") + ############################################################################### # Attempt writing a 4-band image not CMYK @@ -1220,16 +1378,17 @@ def test_jpeg_write_cmyk(): def test_jpeg_write_4band_not_cmyk(): - src_ds = gdal.GetDriverByName('MEM').Create('', 8, 8, 4) + src_ds = gdal.GetDriverByName("MEM").Create("", 8, 8, 4) with gdaltest.error_handler(): - gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/out.jpg', src_ds) - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('JPEG').Delete('/vsimem/out.jpg') + gdal.GetDriverByName("JPEG").CreateCopy("/vsimem/out.jpg", src_ds) + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("JPEG").Delete("/vsimem/out.jpg") + ############################################################################### # Cleanup def test_jpeg_cleanup(): - gdal.Unlink('tmp/albania.jpg') - gdal.Unlink('tmp/albania.jpg.ovr') + gdal.Unlink("tmp/albania.jpg") + gdal.Unlink("tmp/albania.jpg.ovr") diff --git a/autotest/gdrivers/jpeg_profile.py b/autotest/gdrivers/jpeg_profile.py index 0d15cbc23d04..41665ea46a94 100755 --- a/autotest/gdrivers/jpeg_profile.py +++ b/autotest/gdrivers/jpeg_profile.py @@ -30,49 +30,50 @@ # Part of a free package of ICC profile found at: # http://sourceforge.net/projects/openicc/files/OpenICC-Profiles/ -import os import base64 +import os - -from osgeo import gdal import pytest +from osgeo import gdal ############################################################################### # Test writing and reading of ICC profile in CreateCopy() + def test_jpeg_copy_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('JPEG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + driver = gdal.GetDriverByName("JPEG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.jpg', ds) + ds2 = driver.CreateCopy("tmp/icc_test.jpg", ds) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.jpg') + ds2 = gdal.Open("tmp/icc_test.jpg") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc + + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.jpg") - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.jpg') ############################################################################### # Test writing and reading of ICC profile in CreateCopy() options @@ -80,36 +81,37 @@ def test_jpeg_copy_icc(): def test_jpeg_copy_options_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('JPEG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("JPEG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.jpg', ds, options=options) + ds2 = driver.CreateCopy("tmp/icc_test.jpg", ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.jpg') + ds2 = gdal.Open("tmp/icc_test.jpg") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc + + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.jpg") - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.jpg') ############################################################################### # Test writing and reading of 64K+ ICC profile in CreateCopy() @@ -121,61 +123,56 @@ def test_jpeg_copy_icc_64K(): # It will still work, but need to test that the segmented ICC profile # is put back together correctly. # We will simply use the same profile multiple times. - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() while len(data) < 200000: data += data - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('JPEG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + driver = gdal.GetDriverByName("JPEG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.jpg', ds, options=['COMMENT=foo']) + ds2 = driver.CreateCopy("tmp/icc_test.jpg", ds, options=["COMMENT=foo"]) ds = None md = ds2.GetMetadata("COLOR_PROFILE") - comment = ds2.GetMetadataItem('COMMENT') + comment = ds2.GetMetadataItem("COMMENT") ds2 = None with pytest.raises(OSError): - os.stat('tmp/icc_test.jpg.aux.xml') - + os.stat("tmp/icc_test.jpg.aux.xml") - assert comment == 'foo' + assert comment == "foo" - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.jpg') + ds2 = gdal.Open("tmp/icc_test.jpg") md = ds2.GetMetadata("COLOR_PROFILE") ds2 = None with pytest.raises(OSError): - os.stat('tmp/icc_test.jpg.aux.xml') - + os.stat("tmp/icc_test.jpg.aux.xml") - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with GetMetadataItem() - ds2 = gdal.Open('tmp/icc_test.jpg') + ds2 = gdal.Open("tmp/icc_test.jpg") source_icc_profile = ds2.GetMetadataItem("SOURCE_ICC_PROFILE", "COLOR_PROFILE") ds2 = None with pytest.raises(OSError): - os.stat('tmp/icc_test.jpg.aux.xml') - + os.stat("tmp/icc_test.jpg.aux.xml") assert source_icc_profile == icc - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.jpg') - -############################################################################################### - + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.jpg") +############################################################################################### diff --git a/autotest/gdrivers/jpegxl.py b/autotest/gdrivers/jpegxl.py index 69b841ceb196..4e8f7ad70432 100755 --- a/autotest/gdrivers/jpegxl.py +++ b/autotest/gdrivers/jpegxl.py @@ -31,404 +31,491 @@ import base64 -from osgeo import gdal -import pytest import gdaltest +import pytest -pytestmark = pytest.mark.require_driver('JPEGXL') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("JPEGXL") def test_jpegxl_read(): - tst = gdaltest.GDALTest('JPEGXL', 'jpegxl/byte.jxl', 1, 4672) + tst = gdaltest.GDALTest("JPEGXL", "jpegxl/byte.jxl", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_jpegxl_byte(): - tst = gdaltest.GDALTest('JPEGXL', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("JPEGXL", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_jpegxl_uint16(): - tst = gdaltest.GDALTest('JPEGXL', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("JPEGXL", "../../gcore/data/uint16.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_jpegxl_float32(): - tst = gdaltest.GDALTest('JPEGXL', 'float32.tif', 1, 4672) + tst = gdaltest.GDALTest("JPEGXL", "float32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) def test_jpegxl_grey_alpha(): - tst = gdaltest.GDALTest('JPEGXL', '../../gcore/data/stefan_full_greyalpha.tif', 1, 1970) + tst = gdaltest.GDALTest( + "JPEGXL", "../../gcore/data/stefan_full_greyalpha.tif", 1, 1970 + ) return tst.testCreateCopy(vsimem=1) def test_jpegxl_rgb(): - tst = gdaltest.GDALTest('JPEGXL', 'rgbsmall.tif', 1, 21212) + tst = gdaltest.GDALTest("JPEGXL", "rgbsmall.tif", 1, 21212) return tst.testCreateCopy(vsimem=1) def test_jpegxl_rgba(): - tst = gdaltest.GDALTest('JPEGXL', '../../gcore/data/stefan_full_rgba.tif', 1, 12603) + tst = gdaltest.GDALTest("JPEGXL", "../../gcore/data/stefan_full_rgba.tif", 1, 12603) return tst.testCreateCopy(vsimem=1) def test_jpegxl_rgba_lossless_no(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - outfilename = '/vsimem/out.jxl' - gdal.GetDriverByName('JPEGXL').CreateCopy(outfilename, src_ds, options = ['LOSSLESS=NO']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + outfilename = "/vsimem/out.jxl" + gdal.GetDriverByName("JPEGXL").CreateCopy( + outfilename, src_ds, options=["LOSSLESS=NO"] + ) ds = gdal.Open(outfilename) cs = ds.GetRasterBand(1).Checksum() assert cs != 0 and cs != src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('JPEGXL').Delete(outfilename) + gdal.GetDriverByName("JPEGXL").Delete(outfilename) def test_jpegxl_rgba_distance(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - outfilename = '/vsimem/out.jxl' - gdal.GetDriverByName('JPEGXL').CreateCopy(outfilename, src_ds, options = ['DISTANCE=2']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + outfilename = "/vsimem/out.jxl" + gdal.GetDriverByName("JPEGXL").CreateCopy( + outfilename, src_ds, options=["DISTANCE=2"] + ) ds = gdal.Open(outfilename) cs = ds.GetRasterBand(1).Checksum() assert cs != 0 and cs != src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('JPEGXL').Delete(outfilename) + gdal.GetDriverByName("JPEGXL").Delete(outfilename) -@pytest.mark.parametrize('quality,equivalent_distance', [(100,0), - (90,1), - (10,12.65)]) +@pytest.mark.parametrize( + "quality,equivalent_distance", [(100, 0), (90, 1), (10, 12.65)] +) def test_jpegxl_rgba_quality(quality, equivalent_distance): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - outfilename = '/vsimem/out.jxl' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + outfilename = "/vsimem/out.jxl" - gdal.GetDriverByName('JPEGXL').CreateCopy(outfilename, src_ds, options = ['QUALITY=' + str(quality)]) + gdal.GetDriverByName("JPEGXL").CreateCopy( + outfilename, src_ds, options=["QUALITY=" + str(quality)] + ) ds = gdal.Open(outfilename) cs = ds.GetRasterBand(1).Checksum() assert cs != 0 and cs != src_ds.GetRasterBand(1).Checksum() with gdaltest.error_handler(): - gdal.GetDriverByName('JPEGXL').CreateCopy(outfilename, src_ds, options = ['DISTANCE=' + str(equivalent_distance)]) + gdal.GetDriverByName("JPEGXL").CreateCopy( + outfilename, src_ds, options=["DISTANCE=" + str(equivalent_distance)] + ) ds = gdal.Open(outfilename) assert ds.GetRasterBand(1).Checksum() == cs ds = None - gdal.GetDriverByName('JPEGXL').Delete(outfilename) + gdal.GetDriverByName("JPEGXL").Delete(outfilename) def test_jpegxl_xmp(): - if 'COMPRESS_BOX' not in gdal.GetDriverByName('JPEGXL').GetMetadataItem('DMD_CREATIONOPTIONLIST'): + if "COMPRESS_BOX" not in gdal.GetDriverByName("JPEGXL").GetMetadataItem( + "DMD_CREATIONOPTIONLIST" + ): pytest.skip() - src_ds = gdal.Open('data/gtiff/byte_with_xmp.tif') - outfilename = '/vsimem/out.jxl' - gdal.GetDriverByName('JPEGXL').CreateCopy(outfilename, src_ds) - assert gdal.VSIStatL(outfilename + '.aux.xml') is None + src_ds = gdal.Open("data/gtiff/byte_with_xmp.tif") + outfilename = "/vsimem/out.jxl" + gdal.GetDriverByName("JPEGXL").CreateCopy(outfilename, src_ds) + assert gdal.VSIStatL(outfilename + ".aux.xml") is None ds = gdal.Open(outfilename) - assert set(ds.GetMetadataDomainList()) == set(['DERIVED_SUBDATASETS', 'xml:XMP']) - assert ds.GetMetadata('xml:XMP')[0].startswith('33.903' in data, data - assert '33.625' in data, data - assert '-117.309' in data, data - assert '-117.639' in data, data - - filelist = ['tmp/0/0/0.jpg', - 'tmp/0/0/0.kml', - 'tmp/1/0/0.jpg', - 'tmp/1/0/0.kml', - 'tmp/1/0/1.jpg', - 'tmp/1/0/1.kml', - 'tmp/1/1/0.jpg', - 'tmp/1/1/0.kml', - 'tmp/1/1/1.jpg', - 'tmp/1/1/1.kml', - 'tmp/tmp.kml'] + assert "33.903" in data, data + assert "33.625" in data, data + assert "-117.309" in data, data + assert "-117.639" in data, data + + filelist = [ + "tmp/0/0/0.jpg", + "tmp/0/0/0.kml", + "tmp/1/0/0.jpg", + "tmp/1/0/0.kml", + "tmp/1/0/1.jpg", + "tmp/1/0/1.kml", + "tmp/1/1/0.jpg", + "tmp/1/1/0.kml", + "tmp/1/1/1.jpg", + "tmp/1/1/1.kml", + "tmp/tmp.kml", + ] for filename in filelist: try: os.remove(filename) except OSError: pytest.fail("Missing file: %s" % filename) - shutil.rmtree('tmp/0') - shutil.rmtree('tmp/1') + shutil.rmtree("tmp/0") + shutil.rmtree("tmp/1") + ############################################################################### # Test overviews @@ -150,9 +159,19 @@ def test_kmlsuperoverlay_4(): gdal.FileFromMemBuffer("/vsimem/src.vrt", vrt_xml) src_ds = gdal.Open("/vsimem/src.vrt") - ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('/vsimem/kmlsuperoverlay_4.kmz', src_ds, options=['FORMAT=PNG', 'NAME=myname', 'DESCRIPTION=mydescription', 'ALTITUDE=10', 'ALTITUDEMODE=absolute']) - assert ds.GetMetadataItem('NAME') == 'myname' - assert ds.GetMetadataItem('DESCRIPTION') == 'mydescription' + ds = gdal.GetDriverByName("KMLSUPEROVERLAY").CreateCopy( + "/vsimem/kmlsuperoverlay_4.kmz", + src_ds, + options=[ + "FORMAT=PNG", + "NAME=myname", + "DESCRIPTION=mydescription", + "ALTITUDE=10", + "ALTITUDEMODE=absolute", + ], + ) + assert ds.GetMetadataItem("NAME") == "myname" + assert ds.GetMetadataItem("DESCRIPTION") == "mydescription" if ds.GetRasterBand(1).GetOverviewCount() != 1: ds = None src_ds = None @@ -173,7 +192,7 @@ def test_kmlsuperoverlay_4(): pytest.fail() # Test fix for #6311 - vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) + vrt_ds = gdal.GetDriverByName("VRT").CreateCopy("", ds) got_data = vrt_ds.ReadRaster(0, 0, 800, 400, 200, 100) ref_data = ds.ReadRaster(0, 0, 800, 400, 200, 100) vrt_ds = None @@ -190,6 +209,7 @@ def test_kmlsuperoverlay_4(): gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") + ############################################################################### # Test that a raster which crosses the anti-meridian will be able to be displayed correctly (#4528) @@ -198,7 +218,8 @@ def test_kmlsuperoverlay_5(): from xml.etree import ElementTree - src_ds = gdal.Open(""" + src_ds = gdal.Open( + """ PROJCS["WGS 84 / Mercator 41", GEOGCS["WGS 84", DATUM["WGS_1984", @@ -226,32 +247,37 @@ def test_kmlsuperoverlay_5(): -""") - ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('tmp/tmp.kml', src_ds, options=['FIX_ANTIMERIDIAN=YES']) +""" + ) + ds = gdal.GetDriverByName("KMLSUPEROVERLAY").CreateCopy( + "tmp/tmp.kml", src_ds, options=["FIX_ANTIMERIDIAN=YES"] + ) del ds src_ds = None files = [ - 'tmp/tmp.kml', - 'tmp/0/0/0.kml', - 'tmp/1/0/0.kml', - 'tmp/1/0/1.kml', - 'tmp/1/1/0.kml', - 'tmp/1/1/1.kml', + "tmp/tmp.kml", + "tmp/0/0/0.kml", + "tmp/1/0/0.kml", + "tmp/1/0/1.kml", + "tmp/1/1/0.kml", + "tmp/1/1/1.kml", ] for f in files: res = ElementTree.parse(f) - for tag in res.findall('.//{http://earth.google.com/kml/2.1}LatLonAltBox'): - east = tag.find('{http://earth.google.com/kml/2.1}east').text - west = tag.find('{http://earth.google.com/kml/2.1}west').text + for tag in res.findall(".//{http://earth.google.com/kml/2.1}LatLonAltBox"): + east = tag.find("{http://earth.google.com/kml/2.1}east").text + west = tag.find("{http://earth.google.com/kml/2.1}west").text - assert float(east) >= float(west), \ - ('East is less than west in LatLonAltBox %s, (%s < %s)' % (f, east, west)) + assert float(east) >= float( + west + ), "East is less than west in LatLonAltBox %s, (%s < %s)" % (f, east, west) + + shutil.rmtree("tmp/0") + shutil.rmtree("tmp/1") + os.remove("tmp/tmp.kml") - shutil.rmtree('tmp/0') - shutil.rmtree('tmp/1') - os.remove('tmp/tmp.kml') ############################################################################### # Test raster KML with alternate structure (such as http://opentopo.sdsc.edu/files/Haiti/NGA_Haiti_LiDAR2.kmz)) @@ -259,28 +285,39 @@ def test_kmlsuperoverlay_5(): def test_kmlsuperoverlay_6(): - ds = gdal.Open('data/kml/kmlimage.kmz') - assert ds.GetProjectionRef().find('WGS_1984') >= 0 + ds = gdal.Open("data/kml/kmlimage.kmz") + assert ds.GetProjectionRef().find("WGS_1984") >= 0 got_gt = ds.GetGeoTransform() - ref_gt = [1.2554125761846773, 1.6640895429971981e-05, 0.0, 43.452120815728101, 0.0, -1.0762348187666334e-05] + ref_gt = [ + 1.2554125761846773, + 1.6640895429971981e-05, + 0.0, + 43.452120815728101, + 0.0, + -1.0762348187666334e-05, + ] for i in range(6): assert got_gt[i] == pytest.approx(ref_gt[i], abs=1e-6) for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == 47673 - assert ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == gdal.GCI_RedBand + i + assert ( + ds.GetRasterBand(i + 1).GetRasterColorInterpretation() + == gdal.GCI_RedBand + i + ) assert ds.GetRasterBand(1).GetOverviewCount() == 1 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 61070 + ############################################################################### # Test raster KML with single Overlay (such as https://trac.osgeo.org/gdal/ticket/6712) def test_kmlsuperoverlay_7(): - ds = gdal.Open('data/kml/small_world.kml') - assert ds.GetProjectionRef().find('WGS_1984') >= 0 + ds = gdal.Open("data/kml/small_world.kml") + assert ds.GetProjectionRef().find("WGS_1984") >= 0 got_gt = ds.GetGeoTransform() ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9] for i in range(6): @@ -290,14 +327,15 @@ def test_kmlsuperoverlay_7(): assert cs == 30111 assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand + ############################################################################### # Test raster KML with single Overlay (such as https://issues.qgis.org/issues/20173) def test_kmlsuperoverlay_single_overlay_document_folder_pct(): - ds = gdal.Open('data/kml/small_world_in_document_folder_pct.kml') - assert ds.GetProjectionRef().find('WGS_1984') >= 0 + ds = gdal.Open("data/kml/small_world_in_document_folder_pct.kml") + assert ds.GetProjectionRef().find("WGS_1984") >= 0 got_gt = ds.GetGeoTransform() ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9] for i in range(6): @@ -306,14 +344,15 @@ def test_kmlsuperoverlay_single_overlay_document_folder_pct(): assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_PaletteIndex assert ds.GetRasterBand(1).GetColorTable() + ############################################################################### # Test raster KML with single Overlay, with no Folder element def test_kmlsuperoverlay_single_overlay_document_pct(): - ds = gdal.Open('data/kml/small_world_in_document_pct.kml') - assert ds.GetProjectionRef().find('WGS_1984') >= 0 + ds = gdal.Open("data/kml/small_world_in_document_pct.kml") + assert ds.GetProjectionRef().find("WGS_1984") >= 0 got_gt = ds.GetGeoTransform() ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9] for i in range(6): @@ -322,6 +361,7 @@ def test_kmlsuperoverlay_single_overlay_document_pct(): assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_PaletteIndex assert ds.GetRasterBand(1).GetColorTable() + ############################################################################### # Test that a raster with lots of blank space doesn't have unnecessary child # KML/PNG files in transparent areas @@ -330,7 +370,8 @@ def test_kmlsuperoverlay_single_overlay_document_pct(): def test_kmlsuperoverlay_8(): # a large raster with actual data on each end and blank space in between - src_ds = gdal.Open(""" + src_ds = gdal.Open( + """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]] 0, 0.01, 0, 0, 0, 0.01 @@ -405,21 +446,43 @@ def test_kmlsuperoverlay_8(): 0 -""") - ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('tmp/tmp.kml', src_ds, options=['FORMAT=AUTO']) +""" + ) + ds = gdal.GetDriverByName("KMLSUPEROVERLAY").CreateCopy( + "tmp/tmp.kml", src_ds, options=["FORMAT=AUTO"] + ) del ds src_ds = None - assert set(os.listdir('tmp/0/0')) == set(('0.kml', '0.png')) - assert (set(os.listdir('tmp/3/1')) == set(('0.jpg', '0.kml', '1.jpg', '1.kml', '2.jpg', '2.kml', '3.jpg', '3.kml', - '4.jpg', '4.kml', '5.jpg', '5.kml', '6.jpg', '6.kml', '7.jpg', '7.kml',))) - assert set(os.listdir('tmp/3/2')) == set() + assert set(os.listdir("tmp/0/0")) == set(("0.kml", "0.png")) + assert set(os.listdir("tmp/3/1")) == set( + ( + "0.jpg", + "0.kml", + "1.jpg", + "1.kml", + "2.jpg", + "2.kml", + "3.jpg", + "3.kml", + "4.jpg", + "4.kml", + "5.jpg", + "5.kml", + "6.jpg", + "6.kml", + "7.jpg", + "7.kml", + ) + ) + assert set(os.listdir("tmp/3/2")) == set() + + shutil.rmtree("tmp/0") + shutil.rmtree("tmp/1") + shutil.rmtree("tmp/2") + shutil.rmtree("tmp/3") + os.remove("tmp/tmp.kml") - shutil.rmtree('tmp/0') - shutil.rmtree('tmp/1') - shutil.rmtree('tmp/2') - shutil.rmtree('tmp/3') - os.remove('tmp/tmp.kml') ############################################################################### # Cleanup @@ -427,12 +490,9 @@ def test_kmlsuperoverlay_8(): def test_kmlsuperoverlay_cleanup(): - gdal.Unlink('/vsimem/0/0/0.png') - gdal.Unlink('/vsimem/0/0/0.kml') - gdal.Unlink('/vsimem/0/0') - gdal.Unlink('/vsimem/0') - gdal.Unlink('/vsimem/kmlout.kml') - gdal.Unlink('/vsimem/kmlout.kmz') - - - + gdal.Unlink("/vsimem/0/0/0.png") + gdal.Unlink("/vsimem/0/0/0.kml") + gdal.Unlink("/vsimem/0/0") + gdal.Unlink("/vsimem/0") + gdal.Unlink("/vsimem/kmlout.kml") + gdal.Unlink("/vsimem/kmlout.kmz") diff --git a/autotest/gdrivers/kro.py b/autotest/gdrivers/kro.py index 4d4e91852580..4378bca11647 100755 --- a/autotest/gdrivers/kro.py +++ b/autotest/gdrivers/kro.py @@ -29,52 +29,55 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Create 3-band byte def test_kro_1(): - tst = gdaltest.GDALTest('KRO', 'rgbsmall.tif', 2, 21053) + 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) + 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) + tst = gdaltest.GDALTest("KRO", "../../gcore/data/float32.tif", 1, 4672) return tst.testCreate() + ############################################################################### # Create 4-band rgba uint16 def test_kro_4(): - tst = gdaltest.GDALTest('KRO', 'png/rgba16.png', 1, 1886) + tst = gdaltest.GDALTest("KRO", "png/rgba16.png", 1, 1886) return tst.testCreate() + ############################################################################### # Test optimized IO @@ -83,18 +86,14 @@ 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'): + if not gdaltest.filesystem_supports_sparse_files("tmp"): pytest.skip() - ds = gdal.GetDriverByName('KRO').Create('tmp/kro_5.kro', 100000, 10000, 4) + ds = gdal.GetDriverByName("KRO").Create("tmp/kro_5.kro", 100000, 10000, 4) ds = None - ds = gdal.Open('tmp/kro_5.kro') + 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') - - - - + gdal.Unlink("tmp/kro_5.kro") diff --git a/autotest/gdrivers/ktx2.py b/autotest/gdrivers/ktx2.py index ba4a8856829b..42ffbba07c8a 100755 --- a/autotest/gdrivers/ktx2.py +++ b/autotest/gdrivers/ktx2.py @@ -28,32 +28,36 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - import gdaltest import pytest -pytestmark = pytest.mark.require_driver('KTX2') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("KTX2") def test_ktx2_read_etc1s(): - ds = gdal.Open('data/ktx2/byte_etc1s.ktx2') - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'ETC1S' + ds = gdal.Open("data/ktx2/byte_etc1s.ktx2") + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "ETC1S" assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 assert ds.RasterCount == 3 - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == [4916] * 3 + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + 4916 + ] * 3 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None def test_ktx2_read_uastc(): - ds = gdal.Open('data/ktx2/byte_uastc.ktx2') - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'UASTC' + ds = gdal.Open("data/ktx2/byte_uastc.ktx2") + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "UASTC" assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 assert ds.RasterCount == 3 - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == [4775] * 3 + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + 4775 + ] * 3 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None @@ -62,13 +66,13 @@ def test_ktx2_read_two_layers(): # File created with "./basisu -ktx2 -tex_type video -multifile_printf "file%d.png" -multifile_first 1 -multifile_num 2" # where file1.png is ../gcore/data/stefan_full_rgba.tif # and file2.png the output of ´gdal_translate file1.png file2.png -scale_1 0 255 255 0 -scale_2 0 255 255 0 -scale_3 0 255 255 0 - ds = gdal.Open('data/ktx2/two_layers.ktx2') + ds = gdal.Open("data/ktx2/two_layers.ktx2") assert ds.RasterXSize == 0 assert ds.RasterYSize == 0 assert ds.RasterCount == 0 subds_list = ds.GetSubDatasets() assert len(subds_list) == 2 - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") subds = gdal.Open(subds_list[0][0]) assert subds assert subds.RasterXSize == src_ds.RasterXSize @@ -79,60 +83,81 @@ def test_ktx2_read_two_layers(): assert subds2.RasterXSize == src_ds.RasterXSize assert subds2.RasterYSize == src_ds.RasterYSize assert subds2.RasterCount == src_ds.RasterCount - assert [subds2.GetRasterBand(i+1).Checksum() for i in range(subds.RasterCount)] != [subds.GetRasterBand(i+1).Checksum() for i in range(subds.RasterCount)] - - -@pytest.mark.parametrize("filename", ['KTX2:', - 'KTX2:data/ktx2/two_layers.ktx2', - 'KTX2:data/ktx2/two_layers.ktx2:0', - 'KTX2:data/ktx2/i_do_not_exist.ktx2:0:0', - 'KTX2:data/ktx2/two_layers.ktx2:2:0', - 'KTX2:data/ktx2/two_layers.ktx2:0:1', - ]) + assert [ + subds2.GetRasterBand(i + 1).Checksum() for i in range(subds.RasterCount) + ] != [subds.GetRasterBand(i + 1).Checksum() for i in range(subds.RasterCount)] + + +@pytest.mark.parametrize( + "filename", + [ + "KTX2:", + "KTX2:data/ktx2/two_layers.ktx2", + "KTX2:data/ktx2/two_layers.ktx2:0", + "KTX2:data/ktx2/i_do_not_exist.ktx2:0:0", + "KTX2:data/ktx2/two_layers.ktx2:2:0", + "KTX2:data/ktx2/two_layers.ktx2:0:1", + ], +) def test_ktx2_read_wrong_subds(filename): with gdaltest.error_handler(): assert gdal.Open(filename) is None def test_ktx2_write_rgba_output_on_filesystem(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = 'tmp/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy(out_filename, src_ds) is not None + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "tmp/out.ktx2" + assert gdal.GetDriverByName("KTX2").CreateCopy(out_filename, src_ds) is not None out_ds = gdal.Open(out_filename) assert out_ds.RasterXSize == src_ds.RasterXSize assert out_ds.RasterYSize == src_ds.RasterYSize assert out_ds.RasterCount == src_ds.RasterCount - got_cs = [out_ds.GetRasterBand(i+1).Checksum() for i in range(out_ds.RasterCount)] - assert got_cs in ([7694, 58409, 37321, 8494], # Linux - [7913, 58488, 37737, 8324]) # Windows - assert out_ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'ETC1S' + got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] + assert got_cs in ( + [7694, 58409, 37321, 8494], # Linux + [7913, 58488, 37737, 8324], + ) # Windows + assert out_ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == "ETC1S" gdal.Unlink(out_filename) -@pytest.mark.parametrize("compression", ['ETC1S', 'UASTC']) +@pytest.mark.parametrize("compression", ["ETC1S", "UASTC"]) def test_ktx2_write_compression(compression): gdal.ErrorReset() - src_ds = gdal.Open('data/byte.tif') - out_filename = '/vsimem/out.ktx2' - gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=' + compression]) - gdal.Unlink(out_filename + '.aux.xml') + src_ds = gdal.Open("data/byte.tif") + out_filename = "/vsimem/out.ktx2" + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=" + compression] + ) + gdal.Unlink(out_filename + ".aux.xml") ds = gdal.Open(out_filename) - assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == compression + assert ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE") == compression gdal.Unlink(out_filename) def test_ktx2_write_supercompression(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_SUPER_COMPRESSION=NONE']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=["COMPRESSION=UASTC", "UASTC_SUPER_COMPRESSION=NONE"], + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_SUPER_COMPRESSION=ZSTD']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=["COMPRESSION=UASTC", "UASTC_SUPER_COMPRESSION=ZSTD"], + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size < size gdal.Unlink(out_filename) @@ -140,32 +165,43 @@ def test_ktx2_write_supercompression(): def test_ktx2_write_mipmap(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - out_ds = gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['MIPMAP=YES']) - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + out_ds = gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["MIPMAP=YES"] + ) + assert gdal.GetLastErrorMsg() == "" assert out_ds.GetRasterBand(1).GetOverviewCount() == 7 ovr_ds = out_ds.GetRasterBand(1).GetOverview(0).GetDataset() assert ovr_ds.RasterXSize == 81 assert ovr_ds.RasterYSize == 75 - got_cs = [ovr_ds.GetRasterBand(i+1).Checksum() for i in range(ovr_ds.RasterCount)] - assert got_cs in ([19694, 16863, 11239, 35973], # Linux - [19968, 16919, 11262, 36022]) # Windows + got_cs = [ovr_ds.GetRasterBand(i + 1).Checksum() for i in range(ovr_ds.RasterCount)] + assert got_cs in ( + [19694, 16863, 11239, 35973], # Linux + [19968, 16919, 11262, 36022], + ) # Windows gdal.Unlink(out_filename) def test_ktx2_write_uastc_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_LEVEL=0']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_LEVEL=0"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_LEVEL=2']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_LEVEL=2"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size != size gdal.Unlink(out_filename) @@ -173,15 +209,23 @@ def test_ktx2_write_uastc_level(): def test_ktx2_write_uastc_rdo_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_RDO_LEVEL=0.3']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_RDO_LEVEL=0.3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COMPRESSION=UASTC', 'UASTC_RDO_LEVEL=3']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COMPRESSION=UASTC", "UASTC_RDO_LEVEL=3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size < size gdal.Unlink(out_filename) @@ -189,15 +233,23 @@ def test_ktx2_write_uastc_rdo_level(): def test_ktx2_write_etc1s_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_LEVEL=0']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_LEVEL=0"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_LEVEL=3']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_LEVEL=3"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size != size gdal.Unlink(out_filename) @@ -205,15 +257,23 @@ def test_ktx2_write_etc1s_level(): def test_ktx2_write_etc1s_quality_level(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_QUALITY_LEVEL=1"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=255']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_QUALITY_LEVEL=255"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size > size gdal.Unlink(out_filename) @@ -221,37 +281,64 @@ def test_ktx2_write_etc1s_quality_level(): def test_ktx2_write_etc1s_clusters_options(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = []) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy(out_filename, src_ds, options=[]) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16128', - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=[ + "ETC1S_MAX_ENDPOINTS_CLUSTERS=16128", + "ETC1S_MAX_SELECTOR_CLUSTERS=16128", + ], + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size > size gdal.Unlink(out_filename) gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16129', # too big - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is None + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=[ + "ETC1S_MAX_ENDPOINTS_CLUSTERS=16129", # too big + "ETC1S_MAX_SELECTOR_CLUSTERS=16128", + ], + ) + is None + ) + def test_ktx2_write_colorspace(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COLORSPACE=PERCEPTUAL_SRGB']) is not None - assert gdal.GetLastErrorMsg() == '' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COLORSPACE=PERCEPTUAL_SRGB"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" size = gdal.VSIStatL(out_filename).size - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['COLORSPACE=LINEAR']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["COLORSPACE=LINEAR"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" new_size = gdal.VSIStatL(out_filename).size assert new_size != size gdal.Unlink(out_filename) @@ -259,60 +346,82 @@ def test_ktx2_write_colorspace(): def test_ktx2_write_num_threads(): gdal.ErrorReset() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" # Just check that it works - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['NUM_THREADS=1']) is not None - assert gdal.GetLastErrorMsg() == '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["NUM_THREADS=1"] + ) + is not None + ) + assert gdal.GetLastErrorMsg() == "" gdal.Unlink(out_filename) def test_ktx2_write_etc1s_incompatible_or_missing_options(): - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_filename = '/vsimem/out.ktx2' + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_filename = "/vsimem/out.ktx2" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_ENDPOINTS_CLUSTERS=16128']) is None - assert gdal.GetLastErrorMsg() != '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_MAX_ENDPOINTS_CLUSTERS=16128"] + ) + is None + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is None - assert gdal.GetLastErrorMsg() != '' + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, src_ds, options=["ETC1S_MAX_SELECTOR_CLUSTERS=16128"] + ) + is None + ) + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1', - 'ETC1S_MAX_ENDPOINTS_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorType() == 2 # warning + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=["ETC1S_QUALITY_LEVEL=1", "ETC1S_MAX_ENDPOINTS_CLUSTERS=16128"], + ) + is not None + ) + assert gdal.GetLastErrorType() == 2 # warning gdal.Unlink(out_filename) gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy( - out_filename, src_ds, options = ['ETC1S_QUALITY_LEVEL=1', - 'ETC1S_MAX_SELECTOR_CLUSTERS=16128']) is not None - assert gdal.GetLastErrorType() == 2 # warning + assert ( + gdal.GetDriverByName("KTX2").CreateCopy( + out_filename, + src_ds, + options=["ETC1S_QUALITY_LEVEL=1", "ETC1S_MAX_SELECTOR_CLUSTERS=16128"], + ) + is not None + ) + assert gdal.GetLastErrorType() == 2 # warning gdal.Unlink(out_filename) def test_ktx2_write_incompatible_source(): - out_filename = '/vsimem/out.ktx2' + out_filename = "/vsimem/out.ktx2" - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 0) with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("KTX2").CreateCopy(out_filename, src_ds) is None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 5) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 5) with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("KTX2").CreateCopy(out_filename, src_ds) is None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_UInt16) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_UInt16) with gdaltest.error_handler(): - assert gdal.GetDriverByName('KTX2').CreateCopy(out_filename, src_ds) is None + assert gdal.GetDriverByName("KTX2").CreateCopy(out_filename, src_ds) is None diff --git a/autotest/gdrivers/l1b.py b/autotest/gdrivers/l1b.py index af4d4606e84e..fde31a3ccbc7 100755 --- a/autotest/gdrivers/l1b.py +++ b/autotest/gdrivers/l1b.py @@ -31,44 +31,80 @@ import os +import gdaltest import pytest from osgeo import gdal -import gdaltest - - ############################################################################### # l1b_list = [ - ('http://download.osgeo.org/gdal/data/l1b', 'n12gac8bit.l1b', 51754, -1, 1938), - ('http://download.osgeo.org/gdal/data/l1b', 'n12gac10bit.l1b', 46039, -1, 1887), - ('http://download.osgeo.org/gdal/data/l1b', 'n12gac10bit_ebcdic.l1b', 46039, -1, 1887), # 2848 - ('http://download.osgeo.org/gdal/data/l1b', 'n14gac16bit.l1b', 42286, -1, 2142), - ('http://download.osgeo.org/gdal/data/l1b', 'n15gac8bit.l1b', 55772, -1, 2091), - ('http://download.osgeo.org/gdal/data/l1b', 'n16gac10bit.l1b', 6749, -1, 2142), - ('http://download.osgeo.org/gdal/data/l1b', 'n17gac16bit.l1b', 61561, -1, 2040), - ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'frang.1b', 33700, 30000, 357), # 10 bit guess - ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'franh.1b', 56702, 100000, 255), # 10 bit guess - ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'calfirel.1b', 55071, 30000, 255), # 16 bit guess - ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'rapnzg.1b', 58084, 30000, 612), # 16 bit guess - ('http://www.sat.dundee.ac.uk/testdata/new_noaa/new_klm_format/', 'noaa18.n1b', 50229, 50000, 102), - ('http://www.sat.dundee.ac.uk/testdata/metop', 'noaa1b', 62411, 150000, 408) + ("http://download.osgeo.org/gdal/data/l1b", "n12gac8bit.l1b", 51754, -1, 1938), + ("http://download.osgeo.org/gdal/data/l1b", "n12gac10bit.l1b", 46039, -1, 1887), + ( + "http://download.osgeo.org/gdal/data/l1b", + "n12gac10bit_ebcdic.l1b", + 46039, + -1, + 1887, + ), # 2848 + ("http://download.osgeo.org/gdal/data/l1b", "n14gac16bit.l1b", 42286, -1, 2142), + ("http://download.osgeo.org/gdal/data/l1b", "n15gac8bit.l1b", 55772, -1, 2091), + ("http://download.osgeo.org/gdal/data/l1b", "n16gac10bit.l1b", 6749, -1, 2142), + ("http://download.osgeo.org/gdal/data/l1b", "n17gac16bit.l1b", 61561, -1, 2040), + ( + "http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr", + "frang.1b", + 33700, + 30000, + 357, + ), # 10 bit guess + ( + "http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr", + "franh.1b", + 56702, + 100000, + 255, + ), # 10 bit guess + ( + "http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr", + "calfirel.1b", + 55071, + 30000, + 255, + ), # 16 bit guess + ( + "http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr", + "rapnzg.1b", + 58084, + 30000, + 612, + ), # 16 bit guess + ( + "http://www.sat.dundee.ac.uk/testdata/new_noaa/new_klm_format/", + "noaa18.n1b", + 50229, + 50000, + 102, + ), + ("http://www.sat.dundee.ac.uk/testdata/metop", "noaa1b", 62411, 150000, 408), ] @pytest.mark.parametrize( - 'downloadURL,fileName,checksum,download_size,gcpNumber', + "downloadURL,fileName,checksum,download_size,gcpNumber", l1b_list, - ids=[item[1] for item in l1b_list] + ids=[item[1] for item in l1b_list], ) def test_l1b(downloadURL, fileName, checksum, download_size, gcpNumber): - if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): + if not gdaltest.download_file( + downloadURL + "/" + fileName, fileName, download_size + ): pytest.skip() - ds = gdal.Open('tmp/cache/' + fileName) + ds = gdal.Open("tmp/cache/" + fileName) assert ds.GetRasterBand(1).Checksum() == checksum @@ -77,21 +113,22 @@ def test_l1b(downloadURL, fileName, checksum, download_size, gcpNumber): def test_l1b_geoloc(): try: - os.stat('tmp/cache/n12gac8bit.l1b') + os.stat("tmp/cache/n12gac8bit.l1b") except OSError: pytest.skip() - ds = gdal.Open('tmp/cache/n12gac8bit.l1b') - md = ds.GetMetadata('GEOLOCATION') + ds = gdal.Open("tmp/cache/n12gac8bit.l1b") + md = ds.GetMetadata("GEOLOCATION") expected_md = { - 'LINE_OFFSET': '0', - 'LINE_STEP': '1', - 'PIXEL_OFFSET': '0', - 'PIXEL_STEP': '1', - 'X_BAND': '1', - 'X_DATASET': 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"', - 'Y_BAND': '2', - 'Y_DATASET': 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"'} + "LINE_OFFSET": "0", + "LINE_STEP": "1", + "PIXEL_OFFSET": "0", + "PIXEL_STEP": "1", + "X_BAND": "1", + "X_DATASET": 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"', + "Y_BAND": "2", + "Y_DATASET": 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"', + } for key in expected_md: assert md[key] == expected_md[key] ds = None @@ -102,21 +139,22 @@ def test_l1b_geoloc(): cs = ds.GetRasterBand(2).Checksum() assert cs == 52616 + ############################################################################### # def test_l1b_solar_zenith_angles_before_noaa_15(): try: - os.stat('tmp/cache/n12gac10bit.l1b') + os.stat("tmp/cache/n12gac10bit.l1b") except OSError: pytest.skip() - ds = gdal.Open('tmp/cache/n12gac10bit.l1b') - md = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("tmp/cache/n12gac10bit.l1b") + md = ds.GetMetadata("SUBDATASETS") expected_md = { - 'SUBDATASET_1_NAME': 'L1B_SOLAR_ZENITH_ANGLES:"tmp/cache/n12gac10bit.l1b"', - 'SUBDATASET_1_DESC': 'Solar zenith angles' + "SUBDATASET_1_NAME": 'L1B_SOLAR_ZENITH_ANGLES:"tmp/cache/n12gac10bit.l1b"', + "SUBDATASET_1_DESC": "Solar zenith angles", } for key in expected_md: assert md[key] == expected_md[key] @@ -126,31 +164,39 @@ def test_l1b_solar_zenith_angles_before_noaa_15(): cs = ds.GetRasterBand(1).Checksum() assert cs == 22924 + ############################################################################### # def test_l1b_metadata_before_noaa_15(): try: - os.stat('tmp/cache/n12gac10bit.l1b') + os.stat("tmp/cache/n12gac10bit.l1b") except OSError: pytest.skip() - gdal.SetConfigOption('L1B_FETCH_METADATA', 'YES') - gdal.SetConfigOption('L1B_METADATA_DIRECTORY', 'tmp') - ds = gdal.Open('tmp/cache/n12gac10bit.l1b') - gdal.SetConfigOption('L1B_FETCH_METADATA', None) - gdal.SetConfigOption('L1B_METADATA_DIRECTORY', None) + gdal.SetConfigOption("L1B_FETCH_METADATA", "YES") + gdal.SetConfigOption("L1B_METADATA_DIRECTORY", "tmp") + ds = gdal.Open("tmp/cache/n12gac10bit.l1b") + gdal.SetConfigOption("L1B_FETCH_METADATA", None) + gdal.SetConfigOption("L1B_METADATA_DIRECTORY", None) del ds - f = open('tmp/n12gac10bit.l1b_metadata.csv', 'rb') - ln = f.readline().decode('ascii') - assert ln == 'SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,FATAL_FLAG,TIME_ERROR,DATA_GAP,DATA_JITTER,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,DESCEND,P_N_STATUS,BIT_SYNC_STATUS,SYNC_ERROR,FRAME_SYNC_ERROR,FLYWHEELING,BIT_SLIPPAGE,C3_SBBC,C4_SBBC,C5_SBBC,TIP_PARITY_FRAME_1,TIP_PARITY_FRAME_2,TIP_PARITY_FRAME_3,TIP_PARITY_FRAME_4,TIP_PARITY_FRAME_5,SYNC_ERRORS,CAL_SLOPE_C1,CAL_INTERCEPT_C1,CAL_SLOPE_C2,CAL_INTERCEPT_C2,CAL_SLOPE_C3,CAL_INTERCEPT_C3,CAL_SLOPE_C4,CAL_INTERCEPT_C4,CAL_SLOPE_C5,CAL_INTERCEPT_C5,NUM_SOLZENANGLES_EARTHLOCPNTS\n' - ln = f.readline().decode('ascii') - assert ln == '3387,0,1998,84,16966146,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.102000,-4.130000,0.103000,-4.210000,-0.001677,1.667438,-0.157728,156.939636,-0.179833,179.775742,51\n' + f = open("tmp/n12gac10bit.l1b_metadata.csv", "rb") + ln = f.readline().decode("ascii") + assert ( + ln + == "SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,FATAL_FLAG,TIME_ERROR,DATA_GAP,DATA_JITTER,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,DESCEND,P_N_STATUS,BIT_SYNC_STATUS,SYNC_ERROR,FRAME_SYNC_ERROR,FLYWHEELING,BIT_SLIPPAGE,C3_SBBC,C4_SBBC,C5_SBBC,TIP_PARITY_FRAME_1,TIP_PARITY_FRAME_2,TIP_PARITY_FRAME_3,TIP_PARITY_FRAME_4,TIP_PARITY_FRAME_5,SYNC_ERRORS,CAL_SLOPE_C1,CAL_INTERCEPT_C1,CAL_SLOPE_C2,CAL_INTERCEPT_C2,CAL_SLOPE_C3,CAL_INTERCEPT_C3,CAL_SLOPE_C4,CAL_INTERCEPT_C4,CAL_SLOPE_C5,CAL_INTERCEPT_C5,NUM_SOLZENANGLES_EARTHLOCPNTS\n" + ) + ln = f.readline().decode("ascii") + assert ( + ln + == "3387,0,1998,84,16966146,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.102000,-4.130000,0.103000,-4.210000,-0.001677,1.667438,-0.157728,156.939636,-0.179833,179.775742,51\n" + ) f.close() - os.unlink('tmp/n12gac10bit.l1b_metadata.csv') + os.unlink("tmp/n12gac10bit.l1b_metadata.csv") + ############################################################################### # @@ -158,15 +204,15 @@ def test_l1b_metadata_before_noaa_15(): def test_l1b_angles_after_noaa_15(): try: - os.stat('tmp/cache/n16gac10bit.l1b') + os.stat("tmp/cache/n16gac10bit.l1b") except OSError: pytest.skip() - ds = gdal.Open('tmp/cache/n16gac10bit.l1b') - md = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("tmp/cache/n16gac10bit.l1b") + md = ds.GetMetadata("SUBDATASETS") expected_md = { - 'SUBDATASET_1_NAME': 'L1B_ANGLES:"tmp/cache/n16gac10bit.l1b"', - 'SUBDATASET_1_DESC': 'Solar zenith angles, satellite zenith angles and relative azimuth angles' + "SUBDATASET_1_NAME": 'L1B_ANGLES:"tmp/cache/n16gac10bit.l1b"', + "SUBDATASET_1_DESC": "Solar zenith angles, satellite zenith angles and relative azimuth angles", } for key in expected_md: assert md[key] == expected_md[key] @@ -180,21 +226,22 @@ def test_l1b_angles_after_noaa_15(): cs = ds.GetRasterBand(3).Checksum() assert cs == 64989 + ############################################################################### # def test_l1b_clouds_after_noaa_15(): try: - os.stat('tmp/cache/n16gac10bit.l1b') + os.stat("tmp/cache/n16gac10bit.l1b") except OSError: pytest.skip() - ds = gdal.Open('tmp/cache/n16gac10bit.l1b') - md = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("tmp/cache/n16gac10bit.l1b") + md = ds.GetMetadata("SUBDATASETS") expected_md = { - 'SUBDATASET_2_NAME': 'L1B_CLOUDS:"tmp/cache/n16gac10bit.l1b"', - 'SUBDATASET_2_DESC': 'Clouds from AVHRR (CLAVR)' + "SUBDATASET_2_NAME": 'L1B_CLOUDS:"tmp/cache/n16gac10bit.l1b"', + "SUBDATASET_2_DESC": "Clouds from AVHRR (CLAVR)", } for key in expected_md: assert md[key] == expected_md[key] @@ -204,31 +251,39 @@ def test_l1b_clouds_after_noaa_15(): cs = ds.GetRasterBand(1).Checksum() assert cs == 0 + ############################################################################### # def test_l1b_metadata_after_noaa_15(): try: - os.stat('tmp/cache/n16gac10bit.l1b') + os.stat("tmp/cache/n16gac10bit.l1b") except OSError: pytest.skip() - gdal.SetConfigOption('L1B_FETCH_METADATA', 'YES') - gdal.SetConfigOption('L1B_METADATA_DIRECTORY', 'tmp') - ds = gdal.Open('tmp/cache/n16gac10bit.l1b') - gdal.SetConfigOption('L1B_FETCH_METADATA', None) - gdal.SetConfigOption('L1B_METADATA_DIRECTORY', None) + gdal.SetConfigOption("L1B_FETCH_METADATA", "YES") + gdal.SetConfigOption("L1B_METADATA_DIRECTORY", "tmp") + ds = gdal.Open("tmp/cache/n16gac10bit.l1b") + gdal.SetConfigOption("L1B_FETCH_METADATA", None) + gdal.SetConfigOption("L1B_METADATA_DIRECTORY", None) del ds - f = open('tmp/n16gac10bit.l1b_metadata.csv', 'rb') - ln = f.readline().decode('ascii') - assert ln == 'SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,SAT_CLOCK_DRIF_DELTA,SOUTHBOUND,SCANTIME_CORRECTED,C3_SELECT,FATAL_FLAG,TIME_ERROR,DATA_GAP,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,FIRST_GOOD_TIME_AFTER_CLOCK_UPDATE,INSTRUMENT_STATUS_CHANGED,SYNC_LOCK_DROPPED,FRAME_SYNC_ERROR,FRAME_SYNC_DROPPED_LOCK,FLYWHEELING,BIT_SLIPPAGE,TIP_PARITY_ERROR,REFLECTED_SUNLIGHT_C3B,REFLECTED_SUNLIGHT_C4,REFLECTED_SUNLIGHT_C5,RESYNC,P_N_STATUS,BAD_TIME_CAN_BE_INFERRED,BAD_TIME_CANNOT_BE_INFERRED,TIME_DISCONTINUITY,REPEAT_SCAN_TIME,UNCALIBRATED_BAD_TIME,CALIBRATED_FEWER_SCANLINES,UNCALIBRATED_BAD_PRT,CALIBRATED_MARGINAL_PRT,UNCALIBRATED_CHANNELS,NO_EARTH_LOC_BAD_TIME,EARTH_LOC_QUESTIONABLE_TIME,EARTH_LOC_QUESTIONABLE,EARTH_LOC_VERY_QUESTIONABLE,C3B_UNCALIBRATED,C3B_QUESTIONABLE,C3B_ALL_BLACKBODY,C3B_ALL_SPACEVIEW,C3B_MARGINAL_BLACKBODY,C3B_MARGINAL_SPACEVIEW,C4_UNCALIBRATED,C4_QUESTIONABLE,C4_ALL_BLACKBODY,C4_ALL_SPACEVIEW,C4_MARGINAL_BLACKBODY,C4_MARGINAL_SPACEVIEW,C5_UNCALIBRATED,C5_QUESTIONABLE,C5_ALL_BLACKBODY,C5_ALL_SPACEVIEW,C5_MARGINAL_BLACKBODY,C5_MARGINAL_SPACEVIEW,BIT_ERRORS,VIS_OP_CAL_C1_SLOPE_1,VIS_OP_CAL_C1_INTERCEPT_1,VIS_OP_CAL_C1_SLOPE_2,VIS_OP_CAL_C1_INTERCEPT_2,VIS_OP_CAL_C1_INTERSECTION,VIS_TEST_CAL_C1_SLOPE_1,VIS_TEST_CAL_C1_INTERCEPT_1,VIS_TEST_CAL_C1_SLOPE_2,VIS_TEST_CAL_C1_INTERCEPT_2,VIS_TEST_CAL_C1_INTERSECTION,VIS_PRELAUNCH_CAL_C1_SLOPE_1,VIS_PRELAUNCH_CAL_C1_INTERCEPT_1,VIS_PRELAUNCH_CAL_C1_SLOPE_2,VIS_PRELAUNCH_CAL_C1_INTERCEPT_2,VIS_PRELAUNCH_CAL_C1_INTERSECTION,VIS_OP_CAL_C2_SLOPE_1,VIS_OP_CAL_C2_INTERCEPT_1,VIS_OP_CAL_C2_SLOPE_2,VIS_OP_CAL_C2_INTERCEPT_2,VIS_OP_CAL_C2_INTERSECTION,VIS_TEST_CAL_C2_SLOPE_1,VIS_TEST_CAL_C2_INTERCEPT_1,VIS_TEST_CAL_C2_SLOPE_2,VIS_TEST_CAL_C2_INTERCEPT_2,VIS_TEST_CAL_C2_INTERSECTION,VIS_PRELAUNCH_CAL_C2_SLOPE_1,VIS_PRELAUNCH_CAL_C2_INTERCEPT_1,VIS_PRELAUNCH_CAL_C2_SLOPE_2,VIS_PRELAUNCH_CAL_C2_INTERCEPT_2,VIS_PRELAUNCH_CAL_C2_INTERSECTION,VIS_OP_CAL_C3A_SLOPE_1,VIS_OP_CAL_C3A_INTERCEPT_1,VIS_OP_CAL_C3A_SLOPE_2,VIS_OP_CAL_C3A_INTERCEPT_2,VIS_OP_CAL_C3A_INTERSECTION,VIS_TEST_CAL_C3A_SLOPE_1,VIS_TEST_CAL_C3A_INTERCEPT_1,VIS_TEST_CAL_C3A_SLOPE_2,VIS_TEST_CAL_C3A_INTERCEPT_2,VIS_TEST_CAL_C3A_INTERSECTION,VIS_PRELAUNCH_CAL_C3A_SLOPE_1,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_1,VIS_PRELAUNCH_CAL_C3A_SLOPE_2,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_2,VIS_PRELAUNCH_CAL_C3A_INTERSECTION,IR_OP_CAL_C3B_COEFF_1,IR_OP_CAL_C3B_COEFF_2,IR_OP_CAL_C3B_COEFF_3,IR_TEST_CAL_C3B_COEFF_1,IR_TEST_CAL_C3B_COEFF_2,IR_TEST_CAL_C3B_COEFF_3,IR_OP_CAL_C4_COEFF_1,IR_OP_CAL_C4_COEFF_2,IR_OP_CAL_C4_COEFF_3,IR_TEST_CAL_C4_COEFF_1,IR_TEST_CAL_C4_COEFF_2,IR_TEST_CAL_C4_COEFF_3,IR_OP_CAL_C5_COEFF_1,IR_OP_CAL_C5_COEFF_2,IR_OP_CAL_C5_COEFF_3,IR_TEST_CAL_C5_COEFF_1,IR_TEST_CAL_C5_COEFF_2,IR_TEST_CAL_C5_COEFF_3,EARTH_LOC_CORR_TIP_EULER,EARTH_LOC_IND,SPACECRAFT_ATT_CTRL,ATT_SMODE,ATT_PASSIVE_WHEEL_TEST,TIME_TIP_EULER,TIP_EULER_ROLL,TIP_EULER_PITCH,TIP_EULER_YAW,SPACECRAFT_ALT\n' - ln = f.readline().decode('ascii') - assert ln == '3406,0,2003,85,3275054,79,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.052300,-2.015999,0.152800,-51.910000,499,0.052300,-2.015999,0.152800,-51.910000,498,0.052300,-2.015999,0.152800,-51.910000,498,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,2.488212,-0.002511,0.000000,2.488212,-0.002511,0.000000,179.546496,-0.188553,0.000008,179.546496,-0.188553,0.000008,195.236384,-0.201709,0.000006,195.236384,-0.201709,0.000006,0,0,0,0,0,608093,-0.021000,-0.007000,0.000000,862.000000\n' + f = open("tmp/n16gac10bit.l1b_metadata.csv", "rb") + ln = f.readline().decode("ascii") + assert ( + ln + == "SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,SAT_CLOCK_DRIF_DELTA,SOUTHBOUND,SCANTIME_CORRECTED,C3_SELECT,FATAL_FLAG,TIME_ERROR,DATA_GAP,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,FIRST_GOOD_TIME_AFTER_CLOCK_UPDATE,INSTRUMENT_STATUS_CHANGED,SYNC_LOCK_DROPPED,FRAME_SYNC_ERROR,FRAME_SYNC_DROPPED_LOCK,FLYWHEELING,BIT_SLIPPAGE,TIP_PARITY_ERROR,REFLECTED_SUNLIGHT_C3B,REFLECTED_SUNLIGHT_C4,REFLECTED_SUNLIGHT_C5,RESYNC,P_N_STATUS,BAD_TIME_CAN_BE_INFERRED,BAD_TIME_CANNOT_BE_INFERRED,TIME_DISCONTINUITY,REPEAT_SCAN_TIME,UNCALIBRATED_BAD_TIME,CALIBRATED_FEWER_SCANLINES,UNCALIBRATED_BAD_PRT,CALIBRATED_MARGINAL_PRT,UNCALIBRATED_CHANNELS,NO_EARTH_LOC_BAD_TIME,EARTH_LOC_QUESTIONABLE_TIME,EARTH_LOC_QUESTIONABLE,EARTH_LOC_VERY_QUESTIONABLE,C3B_UNCALIBRATED,C3B_QUESTIONABLE,C3B_ALL_BLACKBODY,C3B_ALL_SPACEVIEW,C3B_MARGINAL_BLACKBODY,C3B_MARGINAL_SPACEVIEW,C4_UNCALIBRATED,C4_QUESTIONABLE,C4_ALL_BLACKBODY,C4_ALL_SPACEVIEW,C4_MARGINAL_BLACKBODY,C4_MARGINAL_SPACEVIEW,C5_UNCALIBRATED,C5_QUESTIONABLE,C5_ALL_BLACKBODY,C5_ALL_SPACEVIEW,C5_MARGINAL_BLACKBODY,C5_MARGINAL_SPACEVIEW,BIT_ERRORS,VIS_OP_CAL_C1_SLOPE_1,VIS_OP_CAL_C1_INTERCEPT_1,VIS_OP_CAL_C1_SLOPE_2,VIS_OP_CAL_C1_INTERCEPT_2,VIS_OP_CAL_C1_INTERSECTION,VIS_TEST_CAL_C1_SLOPE_1,VIS_TEST_CAL_C1_INTERCEPT_1,VIS_TEST_CAL_C1_SLOPE_2,VIS_TEST_CAL_C1_INTERCEPT_2,VIS_TEST_CAL_C1_INTERSECTION,VIS_PRELAUNCH_CAL_C1_SLOPE_1,VIS_PRELAUNCH_CAL_C1_INTERCEPT_1,VIS_PRELAUNCH_CAL_C1_SLOPE_2,VIS_PRELAUNCH_CAL_C1_INTERCEPT_2,VIS_PRELAUNCH_CAL_C1_INTERSECTION,VIS_OP_CAL_C2_SLOPE_1,VIS_OP_CAL_C2_INTERCEPT_1,VIS_OP_CAL_C2_SLOPE_2,VIS_OP_CAL_C2_INTERCEPT_2,VIS_OP_CAL_C2_INTERSECTION,VIS_TEST_CAL_C2_SLOPE_1,VIS_TEST_CAL_C2_INTERCEPT_1,VIS_TEST_CAL_C2_SLOPE_2,VIS_TEST_CAL_C2_INTERCEPT_2,VIS_TEST_CAL_C2_INTERSECTION,VIS_PRELAUNCH_CAL_C2_SLOPE_1,VIS_PRELAUNCH_CAL_C2_INTERCEPT_1,VIS_PRELAUNCH_CAL_C2_SLOPE_2,VIS_PRELAUNCH_CAL_C2_INTERCEPT_2,VIS_PRELAUNCH_CAL_C2_INTERSECTION,VIS_OP_CAL_C3A_SLOPE_1,VIS_OP_CAL_C3A_INTERCEPT_1,VIS_OP_CAL_C3A_SLOPE_2,VIS_OP_CAL_C3A_INTERCEPT_2,VIS_OP_CAL_C3A_INTERSECTION,VIS_TEST_CAL_C3A_SLOPE_1,VIS_TEST_CAL_C3A_INTERCEPT_1,VIS_TEST_CAL_C3A_SLOPE_2,VIS_TEST_CAL_C3A_INTERCEPT_2,VIS_TEST_CAL_C3A_INTERSECTION,VIS_PRELAUNCH_CAL_C3A_SLOPE_1,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_1,VIS_PRELAUNCH_CAL_C3A_SLOPE_2,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_2,VIS_PRELAUNCH_CAL_C3A_INTERSECTION,IR_OP_CAL_C3B_COEFF_1,IR_OP_CAL_C3B_COEFF_2,IR_OP_CAL_C3B_COEFF_3,IR_TEST_CAL_C3B_COEFF_1,IR_TEST_CAL_C3B_COEFF_2,IR_TEST_CAL_C3B_COEFF_3,IR_OP_CAL_C4_COEFF_1,IR_OP_CAL_C4_COEFF_2,IR_OP_CAL_C4_COEFF_3,IR_TEST_CAL_C4_COEFF_1,IR_TEST_CAL_C4_COEFF_2,IR_TEST_CAL_C4_COEFF_3,IR_OP_CAL_C5_COEFF_1,IR_OP_CAL_C5_COEFF_2,IR_OP_CAL_C5_COEFF_3,IR_TEST_CAL_C5_COEFF_1,IR_TEST_CAL_C5_COEFF_2,IR_TEST_CAL_C5_COEFF_3,EARTH_LOC_CORR_TIP_EULER,EARTH_LOC_IND,SPACECRAFT_ATT_CTRL,ATT_SMODE,ATT_PASSIVE_WHEEL_TEST,TIME_TIP_EULER,TIP_EULER_ROLL,TIP_EULER_PITCH,TIP_EULER_YAW,SPACECRAFT_ALT\n" + ) + ln = f.readline().decode("ascii") + assert ( + ln + == "3406,0,2003,85,3275054,79,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.052300,-2.015999,0.152800,-51.910000,499,0.052300,-2.015999,0.152800,-51.910000,498,0.052300,-2.015999,0.152800,-51.910000,498,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,2.488212,-0.002511,0.000000,2.488212,-0.002511,0.000000,179.546496,-0.188553,0.000008,179.546496,-0.188553,0.000008,195.236384,-0.201709,0.000006,195.236384,-0.201709,0.000006,0,0,0,0,0,608093,-0.021000,-0.007000,0.000000,862.000000\n" + ) f.close() - os.unlink('tmp/n16gac10bit.l1b_metadata.csv') + os.unlink("tmp/n16gac10bit.l1b_metadata.csv") + ############################################################################### # @@ -236,13 +291,9 @@ def test_l1b_metadata_after_noaa_15(): def test_l1b_little_endian(): - ds = gdal.Open('/vsizip/data/l1b/hrpt_little_endian.l1b.zip') - assert ds.GetGCPProjection().find('GRS80') >= 0 + ds = gdal.Open("/vsizip/data/l1b/hrpt_little_endian.l1b.zip") + assert ds.GetGCPProjection().find("GRS80") >= 0 assert ds.GetRasterBand(1).Checksum() == 14145 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 25115 ds = None - - - - diff --git a/autotest/gdrivers/lan.py b/autotest/gdrivers/lan.py index 32f1b5ef5c88..fd194bf0c515 100755 --- a/autotest/gdrivers/lan.py +++ b/autotest/gdrivers/lan.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,17 +37,15 @@ def test_lan_1(): - tst = gdaltest.GDALTest('LAN', 'lan/fakelan.lan', 1, 10) + tst = gdaltest.GDALTest("LAN", "lan/fakelan.lan", 1, 10) return tst.testOpen() + ############################################################################### # Test reading a - fake - LAN 4 bit dataset def test_lan_2(): - tst = gdaltest.GDALTest('LAN', 'lan/fakelan4bit.lan', 1, 10) + tst = gdaltest.GDALTest("LAN", "lan/fakelan4bit.lan", 1, 10) return tst.testOpen() - - - diff --git a/autotest/gdrivers/lcp.py b/autotest/gdrivers/lcp.py index 21aeb63c460c..712aa7edb685 100755 --- a/autotest/gdrivers/lcp.py +++ b/autotest/gdrivers/lcp.py @@ -33,201 +33,348 @@ import random import struct -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test test_FARSITE_UTM12.LCP def test_lcp_1(): - ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') - assert ds.RasterCount == 8, 'wrong number of bands' - - assert ds.GetProjectionRef().find('NAD83 / UTM zone 12N') != -1, \ - ("didn't get expect projection. Got : %s" % (ds.GetProjectionRef())) - - metadata = [('LATITUDE', '49'), - ('LINEAR_UNIT', 'Meters'), - ('DESCRIPTION', 'This is a test LCP file created with FARSITE 4.1.054, using data downloaded from the USGS \r\nNational Map for LANDFIRE (2008-05-06). Data were reprojected to UTM zone 12 on NAD83 \r\nusing gdalwarp (GDAL 1.4.2).\r\n')] + ds = gdal.Open("data/lcp/test_FARSITE_UTM12.LCP") + assert ds.RasterCount == 8, "wrong number of bands" + + assert ( + ds.GetProjectionRef().find("NAD83 / UTM zone 12N") != -1 + ), "didn't get expect projection. Got : %s" % (ds.GetProjectionRef()) + + metadata = [ + ("LATITUDE", "49"), + ("LINEAR_UNIT", "Meters"), + ( + "DESCRIPTION", + "This is a test LCP file created with FARSITE 4.1.054, using data downloaded from the USGS \r\nNational Map for LANDFIRE (2008-05-06). Data were reprojected to UTM zone 12 on NAD83 \r\nusing gdalwarp (GDAL 1.4.2).\r\n", + ), + ] md = ds.GetMetadata() for item in metadata: - assert md[item[0]] == item[1], \ - ('wrong metadataitem for dataset. md[\'%s\']=\'%s\', expected \'%s\'' % (item[0], md[item[0]], item[1])) + assert ( + md[item[0]] == item[1] + ), "wrong metadataitem for dataset. md['%s']='%s', expected '%s'" % ( + item[0], + md[item[0]], + item[1], + ) check_gt = (285807.932887174887583, 30, 0, 5379230.386217921040952, 0, -30) new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=1e-5): - print('') - print('old = ', check_gt) - print('new = ', new_gt) - pytest.fail('Geotransform differs.') - - dataPerBand = [(18645, [('ELEVATION_UNIT', '0'), - ('ELEVATION_UNIT_NAME', 'Meters'), - ('ELEVATION_MIN', '1064'), - ('ELEVATION_MAX', '1492'), - ('ELEVATION_NUM_CLASSES', '-1'), - ('ELEVATION_FILE', '')]), - (16431, [('SLOPE_UNIT', '0'), - ('SLOPE_UNIT_NAME', 'Degrees'), - ('SLOPE_MIN', '0'), - ('SLOPE_MAX', '34'), - ('SLOPE_NUM_CLASSES', '36'), - ('SLOPE_FILE', 'slope.asc')]), - (18851, [('ASPECT_UNIT', '2'), - ('ASPECT_UNIT_NAME', 'Azimuth degrees'), - ('ASPECT_MIN', '0'), - ('ASPECT_MAX', '357'), - ('ASPECT_NUM_CLASSES', '-1'), - ('ASPECT_FILE', 'aspect.asc')]), - (26182, [('FUEL_MODEL_OPTION', '0'), - ('FUEL_MODEL_OPTION_DESC', 'no custom models AND no conversion file needed'), - ('FUEL_MODEL_MIN', '1'), - ('FUEL_MODEL_MAX', '99'), - ('FUEL_MODEL_NUM_CLASSES', '6'), - ('FUEL_MODEL_VALUES', '1,2,5,8,10,99'), - ('FUEL_MODEL_FILE', 'fbfm13.asc')]), - (30038, [('CANOPY_COV_UNIT', '0'), - ('CANOPY_COV_UNIT_NAME', 'Categories (0-4)'), - ('CANOPY_COV_MIN', '0'), - ('CANOPY_COV_MAX', '95'), - ('CANOPY_COV_NUM_CLASSES', '10'), - ('CANOPY_COV_FILE', 'cancov.asc')]), - (22077, [('CANOPY_HT_UNIT', '3'), - ('CANOPY_HT_UNIT_NAME', 'Meters x 10'), - ('CANOPY_HT_MIN', '0'), - ('CANOPY_HT_MAX', '375'), - ('CANOPY_HT_NUM_CLASSES', '5'), - ('CANOPY_HT_FILE', 'canht.asc')]), - (30388, [('CBH_UNIT', '3'), - ('CBH_UNIT_NAME', 'Meters x 10'), - ('CBH_MIN', '0'), - ('CBH_MAX', '100'), - ('CBH_NUM_CLASSES', '33'), - ('CBH_FILE', 'cbh.asc')]), - (23249, [('CBD_UNIT', '3'), - ('CBD_UNIT_NAME', 'kg/m^3 x 100'), - ('CBD_MIN', '0'), - ('CBD_MAX', '21'), - ('CBD_NUM_CLASSES', '20'), - ('CBD_FILE', 'cbd.asc')]) - ] + print("") + print("old = ", check_gt) + print("new = ", new_gt) + pytest.fail("Geotransform differs.") + + dataPerBand = [ + ( + 18645, + [ + ("ELEVATION_UNIT", "0"), + ("ELEVATION_UNIT_NAME", "Meters"), + ("ELEVATION_MIN", "1064"), + ("ELEVATION_MAX", "1492"), + ("ELEVATION_NUM_CLASSES", "-1"), + ("ELEVATION_FILE", ""), + ], + ), + ( + 16431, + [ + ("SLOPE_UNIT", "0"), + ("SLOPE_UNIT_NAME", "Degrees"), + ("SLOPE_MIN", "0"), + ("SLOPE_MAX", "34"), + ("SLOPE_NUM_CLASSES", "36"), + ("SLOPE_FILE", "slope.asc"), + ], + ), + ( + 18851, + [ + ("ASPECT_UNIT", "2"), + ("ASPECT_UNIT_NAME", "Azimuth degrees"), + ("ASPECT_MIN", "0"), + ("ASPECT_MAX", "357"), + ("ASPECT_NUM_CLASSES", "-1"), + ("ASPECT_FILE", "aspect.asc"), + ], + ), + ( + 26182, + [ + ("FUEL_MODEL_OPTION", "0"), + ( + "FUEL_MODEL_OPTION_DESC", + "no custom models AND no conversion file needed", + ), + ("FUEL_MODEL_MIN", "1"), + ("FUEL_MODEL_MAX", "99"), + ("FUEL_MODEL_NUM_CLASSES", "6"), + ("FUEL_MODEL_VALUES", "1,2,5,8,10,99"), + ("FUEL_MODEL_FILE", "fbfm13.asc"), + ], + ), + ( + 30038, + [ + ("CANOPY_COV_UNIT", "0"), + ("CANOPY_COV_UNIT_NAME", "Categories (0-4)"), + ("CANOPY_COV_MIN", "0"), + ("CANOPY_COV_MAX", "95"), + ("CANOPY_COV_NUM_CLASSES", "10"), + ("CANOPY_COV_FILE", "cancov.asc"), + ], + ), + ( + 22077, + [ + ("CANOPY_HT_UNIT", "3"), + ("CANOPY_HT_UNIT_NAME", "Meters x 10"), + ("CANOPY_HT_MIN", "0"), + ("CANOPY_HT_MAX", "375"), + ("CANOPY_HT_NUM_CLASSES", "5"), + ("CANOPY_HT_FILE", "canht.asc"), + ], + ), + ( + 30388, + [ + ("CBH_UNIT", "3"), + ("CBH_UNIT_NAME", "Meters x 10"), + ("CBH_MIN", "0"), + ("CBH_MAX", "100"), + ("CBH_NUM_CLASSES", "33"), + ("CBH_FILE", "cbh.asc"), + ], + ), + ( + 23249, + [ + ("CBD_UNIT", "3"), + ("CBD_UNIT_NAME", "kg/m^3 x 100"), + ("CBD_MIN", "0"), + ("CBD_MAX", "21"), + ("CBD_NUM_CLASSES", "20"), + ("CBD_FILE", "cbd.asc"), + ], + ), + ] for i in range(8): band = ds.GetRasterBand(i + 1) - assert band.Checksum() == dataPerBand[i][0], \ - ('wrong checksum for band %d. Got %d, expected %d' % (i + 1, band.Checksum(), dataPerBand[i][0])) + assert ( + band.Checksum() == dataPerBand[i][0] + ), "wrong checksum for band %d. Got %d, expected %d" % ( + i + 1, + band.Checksum(), + dataPerBand[i][0], + ) md = band.GetMetadata() for item in dataPerBand[i][1]: - assert md[item[0]] == item[1], \ - ('wrong metadataitem for band %d. md[\'%s\']=\'%s\', expected \'%s\'' % (i + 1, item[0], md[item[0]], item[1])) + assert ( + md[item[0]] == item[1] + ), "wrong metadataitem for band %d. md['%s']='%s', expected '%s'" % ( + i + 1, + item[0], + md[item[0]], + item[1], + ) ds = None + ############################################################################### # test test_USGS_LFNM_Alb83.lcp def test_lcp_2(): - ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') - assert ds.RasterCount == 8, 'wrong number of bands' + ds = gdal.Open("data/lcp/test_USGS_LFNM_Alb83.lcp") + assert ds.RasterCount == 8, "wrong number of bands" - metadata = [('LATITUDE', '48'), - ('LINEAR_UNIT', 'Meters'), - ('DESCRIPTION', '')] + metadata = [("LATITUDE", "48"), ("LINEAR_UNIT", "Meters"), ("DESCRIPTION", "")] md = ds.GetMetadata() for item in metadata: - assert md[item[0]] == item[1], \ - ('wrong metadataitem for dataset. md[\'%s\']=\'%s\', expected \'%s\'' % (item[0], md[item[0]], item[1])) + assert ( + md[item[0]] == item[1] + ), "wrong metadataitem for dataset. md['%s']='%s', expected '%s'" % ( + item[0], + md[item[0]], + item[1], + ) check_gt = (-1328145, 30, 0, 2961735, 0, -30) new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=1e-5): - print('') - print('old = ', check_gt) - print('new = ', new_gt) - pytest.fail('Geotransform differs.') - - dataPerBand = [(28381, [('ELEVATION_UNIT', '0'), - ('ELEVATION_UNIT_NAME', 'Meters'), - ('ELEVATION_MIN', '1064'), - ('ELEVATION_MAX', '1492'), - ('ELEVATION_NUM_CLASSES', '-1'), - ('ELEVATION_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_elevation_1.txt')]), - (25824, [('SLOPE_UNIT', '0'), - ('SLOPE_UNIT_NAME', 'Degrees'), - ('SLOPE_MIN', '0'), - ('SLOPE_MAX', '34'), - ('SLOPE_NUM_CLASSES', '35'), - ('SLOPE_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_slope_1.txt')]), - (28413, [('ASPECT_UNIT', '2'), - ('ASPECT_UNIT_NAME', 'Azimuth degrees'), - ('ASPECT_MIN', '0'), - ('ASPECT_MAX', '357'), - ('ASPECT_NUM_CLASSES', '-1'), - ('ASPECT_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_aspect_1.txt')]), - (19052, [('FUEL_MODEL_OPTION', '0'), - ('FUEL_MODEL_OPTION_DESC', 'no custom models AND no conversion file needed'), - ('FUEL_MODEL_MIN', '1'), - ('FUEL_MODEL_MAX', '10'), - ('FUEL_MODEL_NUM_CLASSES', '5'), - ('FUEL_MODEL_VALUES', '1,2,5,8,10'), - ('FUEL_MODEL_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_fuel1.txt')]), - (30164, [('CANOPY_COV_UNIT', '1'), - ('CANOPY_COV_UNIT_NAME', 'Percent'), - ('CANOPY_COV_MIN', '0'), - ('CANOPY_COV_MAX', '95'), - ('CANOPY_COV_NUM_CLASSES', '10'), - ('CANOPY_COV_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_canopy1.txt')]), - (22316, [('CANOPY_HT_UNIT', '3'), - ('CANOPY_HT_UNIT_NAME', 'Meters x 10'), - ('CANOPY_HT_MIN', '0'), - ('CANOPY_HT_MAX', '375'), - ('CANOPY_HT_NUM_CLASSES', '5'), - ('CANOPY_HT_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_height_1.txt')]), - (30575, [('CBH_UNIT', '3'), - ('CBH_UNIT_NAME', 'Meters x 10'), - ('CBH_MIN', '0'), - ('CBH_MAX', '100'), - ('CBH_NUM_CLASSES', '33'), - ('CBH_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_base_1.txt')]), - (23304, [('CBD_UNIT', '3'), - ('CBD_UNIT_NAME', 'kg/m^3 x 100'), - ('CBD_MIN', '0'), - ('CBD_MAX', '21'), - ('CBD_NUM_CLASSES', '20'), - ('CBD_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_density_1.txt')]) - ] + print("") + print("old = ", check_gt) + print("new = ", new_gt) + pytest.fail("Geotransform differs.") + + dataPerBand = [ + ( + 28381, + [ + ("ELEVATION_UNIT", "0"), + ("ELEVATION_UNIT_NAME", "Meters"), + ("ELEVATION_MIN", "1064"), + ("ELEVATION_MAX", "1492"), + ("ELEVATION_NUM_CLASSES", "-1"), + ( + "ELEVATION_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_elevation_1.txt", + ), + ], + ), + ( + 25824, + [ + ("SLOPE_UNIT", "0"), + ("SLOPE_UNIT_NAME", "Degrees"), + ("SLOPE_MIN", "0"), + ("SLOPE_MAX", "34"), + ("SLOPE_NUM_CLASSES", "35"), + ( + "SLOPE_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_slope_1.txt", + ), + ], + ), + ( + 28413, + [ + ("ASPECT_UNIT", "2"), + ("ASPECT_UNIT_NAME", "Azimuth degrees"), + ("ASPECT_MIN", "0"), + ("ASPECT_MAX", "357"), + ("ASPECT_NUM_CLASSES", "-1"), + ( + "ASPECT_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_aspect_1.txt", + ), + ], + ), + ( + 19052, + [ + ("FUEL_MODEL_OPTION", "0"), + ( + "FUEL_MODEL_OPTION_DESC", + "no custom models AND no conversion file needed", + ), + ("FUEL_MODEL_MIN", "1"), + ("FUEL_MODEL_MAX", "10"), + ("FUEL_MODEL_NUM_CLASSES", "5"), + ("FUEL_MODEL_VALUES", "1,2,5,8,10"), + ( + "FUEL_MODEL_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_fuel1.txt", + ), + ], + ), + ( + 30164, + [ + ("CANOPY_COV_UNIT", "1"), + ("CANOPY_COV_UNIT_NAME", "Percent"), + ("CANOPY_COV_MIN", "0"), + ("CANOPY_COV_MAX", "95"), + ("CANOPY_COV_NUM_CLASSES", "10"), + ( + "CANOPY_COV_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_canopy1.txt", + ), + ], + ), + ( + 22316, + [ + ("CANOPY_HT_UNIT", "3"), + ("CANOPY_HT_UNIT_NAME", "Meters x 10"), + ("CANOPY_HT_MIN", "0"), + ("CANOPY_HT_MAX", "375"), + ("CANOPY_HT_NUM_CLASSES", "5"), + ( + "CANOPY_HT_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_height_1.txt", + ), + ], + ), + ( + 30575, + [ + ("CBH_UNIT", "3"), + ("CBH_UNIT_NAME", "Meters x 10"), + ("CBH_MIN", "0"), + ("CBH_MAX", "100"), + ("CBH_NUM_CLASSES", "33"), + ("CBH_FILE", "d:\\scratch\\dist\\79990093\\Output\\rastert_base_1.txt"), + ], + ), + ( + 23304, + [ + ("CBD_UNIT", "3"), + ("CBD_UNIT_NAME", "kg/m^3 x 100"), + ("CBD_MIN", "0"), + ("CBD_MAX", "21"), + ("CBD_NUM_CLASSES", "20"), + ( + "CBD_FILE", + "d:\\scratch\\dist\\79990093\\Output\\rastert_density_1.txt", + ), + ], + ), + ] for i in range(8): band = ds.GetRasterBand(i + 1) - assert band.Checksum() == dataPerBand[i][0], \ - ('wrong checksum for band %d. Got %d, expected %d' % (i + 1, band.Checksum(), dataPerBand[i][0])) + assert ( + band.Checksum() == dataPerBand[i][0] + ), "wrong checksum for band %d. Got %d, expected %d" % ( + i + 1, + band.Checksum(), + dataPerBand[i][0], + ) md = band.GetMetadata() for item in dataPerBand[i][1]: - assert md[item[0]] == item[1], \ - ('wrong metadataitem for band %d. md[\'%s\']=\'%s\', expected \'%s\'' % (i + 1, item[0], md[item[0]], item[1])) + assert ( + md[item[0]] == item[1] + ), "wrong metadataitem for band %d. md['%s']='%s', expected '%s'" % ( + i + 1, + item[0], + md[item[0]], + item[1], + ) ds = None + ############################################################################### # Test for empty prj def test_lcp_3(): - ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') + ds = gdal.Open("data/lcp/test_USGS_LFNM_Alb83.lcp") assert ds is not None wkt = ds.GetProjection() - assert wkt is not None, 'Got None from GetProjection()' + assert wkt is not None, "Got None from GetProjection()" + ############################################################################### # Test that the prj file isn't added to the sibling list if it isn't there. @@ -235,10 +382,11 @@ def test_lcp_3(): def test_lcp_4(): - ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') + ds = gdal.Open("data/lcp/test_USGS_LFNM_Alb83.lcp") assert ds is not None fl = ds.GetFileList() - assert len(fl) == 1, 'Invalid file list' + assert len(fl) == 1, "Invalid file list" + ############################################################################### # Test for valid prj @@ -246,10 +394,11 @@ def test_lcp_4(): def test_lcp_5(): - ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') + ds = gdal.Open("data/lcp/test_FARSITE_UTM12.LCP") assert ds is not None wkt = ds.GetProjection() - assert not (wkt is None or wkt == ''), 'Got invalid wkt from GetProjection()' + assert not (wkt is None or wkt == ""), "Got invalid wkt from GetProjection()" + ############################################################################### # Test for valid sibling list @@ -257,374 +406,389 @@ def test_lcp_5(): def test_lcp_6(): - retval = 'success' - ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') + retval = "success" + ds = gdal.Open("data/lcp/test_FARSITE_UTM12.LCP") assert ds is not None fl = ds.GetFileList() if len(fl) != 2: - gdaltest.post_reason('Invalid file list') - retval = 'fail' + gdaltest.post_reason("Invalid file list") + retval = "fail" ds = None try: - os.remove('data/lcp/test_FARSITE_UTM12.LCP.aux.xml') + os.remove("data/lcp/test_FARSITE_UTM12.LCP.aux.xml") except OSError: pass return retval + ############################################################################### # Test create copy that copies data over def test_lcp_7(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - lcp_drv = gdal.GetDriverByName('LCP') + lcp_drv = gdal.GetDriverByName("LCP") assert lcp_drv is not None # Make sure all available band counts work. - retval = 'success' - co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] + retval = "success" + co = ["LATITUDE=0", "LINEAR_UNIT=METER"] for i in [5, 7, 8, 10]: - src_ds = mem_drv.Create('/vsimem/lcptest', 10, 20, i, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/lcptest", 10, 20, i, gdal.GDT_Int16) assert src_ds is not None - dst_ds = lcp_drv.CreateCopy('tmp/lcp_7.lcp', src_ds, False, co) + dst_ds = lcp_drv.CreateCopy("tmp/lcp_7.lcp", src_ds, False, co) if dst_ds is None: - gdaltest.post_reason('Failed to create lcp with %d bands' % i) - retval = 'fail' + gdaltest.post_reason("Failed to create lcp with %d bands" % i) + retval = "fail" break dst_ds = None src_ds = None dst_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_7.' + ext) + os.remove("tmp/lcp_7." + ext) except OSError: pass return retval + ############################################################################### # Test create copy with invalid bands def test_lcp_8(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - lcp_drv = gdal.GetDriverByName('LCP') + lcp_drv = gdal.GetDriverByName("LCP") assert lcp_drv is not None - gdal.PushErrorHandler('CPLQuietErrorHandler') - retval = 'success' - co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] + gdal.PushErrorHandler("CPLQuietErrorHandler") + retval = "success" + co = ["LATITUDE=0", "LINEAR_UNIT=METER"] for i in [0, 1, 2, 3, 4, 6, 9, 11]: - src_ds = mem_drv.Create('', 10, 10, i, gdal.GDT_Int16) + src_ds = mem_drv.Create("", 10, 10, i, gdal.GDT_Int16) if src_ds is None: - retval = 'fail' + retval = "fail" break - dst_ds = lcp_drv.CreateCopy('tmp/lcp_8.lcp', src_ds, False, co) + dst_ds = lcp_drv.CreateCopy("tmp/lcp_8.lcp", src_ds, False, co) src_ds = None if dst_ds is not None: - gdaltest.post_reason('Created invalid lcp') - retval = 'fail' + gdaltest.post_reason("Created invalid lcp") + retval = "fail" dst_ds = None break dst_ds = None gdal.PopErrorHandler() - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_8.' + ext) + os.remove("tmp/lcp_8." + ext) except OSError: pass return retval + ############################################################################### # Test create copy def test_lcp_9(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - lcp_drv = gdal.GetDriverByName('LCP') + lcp_drv = gdal.GetDriverByName("LCP") assert lcp_drv is not None - src_ds = mem_drv.Create('', 10, 20, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("", 10, 20, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] - lcp_ds = lcp_drv.CreateCopy('tmp/lcp_9.lcp', src_ds, False, co) + retval = "success" + co = ["LATITUDE=0", "LINEAR_UNIT=METER"] + lcp_ds = lcp_drv.CreateCopy("tmp/lcp_9.lcp", src_ds, False, co) assert lcp_ds is not None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_9.' + ext) + os.remove("tmp/lcp_9." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_10(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['METERS', 'FEET']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'ELEVATION_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_10.lcp', src_ds, False, co) + retval = "success" + for option in ["METERS", "FEET"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "ELEVATION_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_10.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(1).GetMetadataItem("ELEVATION_UNIT_NAME") if units.lower() != option.lower(): - gdaltest.post_reason('Could not set ELEVATION_UNIT') - retval = 'fail' + gdaltest.post_reason("Could not set ELEVATION_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_10.' + ext) + os.remove("tmp/lcp_10." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_11(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['DEGREES', 'PERCENT']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'SLOPE_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_11.lcp', src_ds, False, co) + retval = "success" + for option in ["DEGREES", "PERCENT"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "SLOPE_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_11.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(2).GetMetadataItem("SLOPE_UNIT_NAME") if units.lower() != option.lower(): - gdaltest.post_reason('Could not set SLOPE_UNIT') - retval = 'fail' + gdaltest.post_reason("Could not set SLOPE_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_11.' + ext) + os.remove("tmp/lcp_11." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_12(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['GRASS_CATEGORIES', 'AZIMUTH_DEGREES', 'GRASS_DEGREES']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'ASPECT_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_12.lcp', src_ds, False, co) + retval = "success" + for option in ["GRASS_CATEGORIES", "AZIMUTH_DEGREES", "GRASS_DEGREES"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "ASPECT_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_12.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(3).GetMetadataItem("ASPECT_UNIT_NAME") - if units.lower() != option.replace('_', ' ').lower(): - gdaltest.post_reason('Could not set ASPECT_UNIT') - retval = 'fail' + if units.lower() != option.replace("_", " ").lower(): + gdaltest.post_reason("Could not set ASPECT_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_12.' + ext) + os.remove("tmp/lcp_12." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_13(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['PERCENT', 'CATEGORIES']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CANOPY_COV_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_13.lcp', src_ds, False, co) + retval = "success" + for option in ["PERCENT", "CATEGORIES"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "CANOPY_COV_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_13.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(5).GetMetadataItem("CANOPY_COV_UNIT_NAME") if units.lower()[:10] != option.lower()[:10]: - gdaltest.post_reason('Could not set CANOPY_COV_UNIT') - retval = 'fail' + gdaltest.post_reason("Could not set CANOPY_COV_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_13.' + ext) + os.remove("tmp/lcp_13." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_14(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['METERS', 'FEET', 'METERS_X_10', 'FEET_X_10']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CANOPY_HT_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_14.lcp', src_ds, False, co) + retval = "success" + for option in ["METERS", "FEET", "METERS_X_10", "FEET_X_10"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "CANOPY_HT_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_14.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(6).GetMetadataItem("CANOPY_HT_UNIT_NAME") - if units.lower() != option.replace('_', ' ').lower(): - gdaltest.post_reason('Could not set CANOPY_HT_UNIT') - retval = 'fail' + if units.lower() != option.replace("_", " ").lower(): + gdaltest.post_reason("Could not set CANOPY_HT_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_14.' + ext) + os.remove("tmp/lcp_14." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_15(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - for option in ['METERS', 'FEET', 'METERS_X_10', 'FEET_X_10']: - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CBH_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_15.lcp', src_ds, False, co) + retval = "success" + for option in ["METERS", "FEET", "METERS_X_10", "FEET_X_10"]: + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "CBH_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_15.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(7).GetMetadataItem("CBH_UNIT_NAME") - if units.lower() != option.replace('_', ' ').lower(): - gdaltest.post_reason('Could not set CBH_UNIT') - retval = 'fail' + if units.lower() != option.replace("_", " ").lower(): + gdaltest.post_reason("Could not set CBH_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'prj', 'lcp.aux.xml']: + for ext in ["lcp", "prj", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_15.' + ext) + os.remove("tmp/lcp_15." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_16(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - answers = ['kg/m^3', 'lb/ft^3', 'kg/m^3 x 100', 'lb/ft^3 x 1000', - 'tons/acre x 100'] - for i, option in enumerate(['KG_PER_CUBIC_METER', 'POUND_PER_CUBIC_FOOT', - 'KG_PER_CUBIC_METER_X_100', - 'POUND_PER_CUBIC_FOOT_X_1000']): - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CBD_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_16.lcp', src_ds, False, co) + retval = "success" + answers = ["kg/m^3", "lb/ft^3", "kg/m^3 x 100", "lb/ft^3 x 1000", "tons/acre x 100"] + for i, option in enumerate( + [ + "KG_PER_CUBIC_METER", + "POUND_PER_CUBIC_FOOT", + "KG_PER_CUBIC_METER_X_100", + "POUND_PER_CUBIC_FOOT_X_1000", + ] + ): + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "CBD_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_16.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(8).GetMetadataItem("CBD_UNIT_NAME") if units.lower() != answers[i].lower(): - gdaltest.post_reason('Could not set CBD_UNIT') - retval = 'fail' + gdaltest.post_reason("Could not set CBD_UNIT") + retval = "fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_16.' + ext) + os.remove("tmp/lcp_16." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure all unit metadata co work # It is unclear whether the metadata generated is correct, or the @@ -633,203 +797,211 @@ def test_lcp_16(): def test_lcp_17(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - answers = ['mg/ha', 't/ac x 10'] - for i, option in enumerate(['MG_PER_HECTARE_X_10', 'TONS_PER_ACRE_X_10']): - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'DUFF_UNIT=%s' % option] - lcp_ds = drv.CreateCopy('tmp/lcp_17.lcp', src_ds, False, co) + retval = "success" + answers = ["mg/ha", "t/ac x 10"] + for i, option in enumerate(["MG_PER_HECTARE_X_10", "TONS_PER_ACRE_X_10"]): + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "DUFF_UNIT=%s" % option] + lcp_ds = drv.CreateCopy("tmp/lcp_17.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' + retval = "fail" break units = lcp_ds.GetRasterBand(9).GetMetadataItem("DUFF_UNIT_NAME") if units.lower() != answers[i].lower(): # gdaltest.post_reason('Could not set DUFF_UNIT') - retval = 'expected_fail' + retval = "expected_fail" lcp_ds = None break lcp_ds = None src_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_17.' + ext) + os.remove("tmp/lcp_17." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure creation options work. def test_lcp_18(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - co = ['LATITUDE=45', 'LINEAR_UNIT=METER'] - lcp_ds = drv.CreateCopy('tmp/lcp_18.lcp', src_ds, False, co) + retval = "success" + co = ["LATITUDE=45", "LINEAR_UNIT=METER"] + lcp_ds = drv.CreateCopy("tmp/lcp_18.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' - if lcp_ds.GetMetadataItem('LATITUDE') != '45': - gdaltest.post_reason('Failed to set LATITUDE creation option') - retval = 'fail' + retval = "fail" + if lcp_ds.GetMetadataItem("LATITUDE") != "45": + gdaltest.post_reason("Failed to set LATITUDE creation option") + retval = "fail" src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_18.' + ext) + os.remove("tmp/lcp_18." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure creation options work. def test_lcp_19(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - co = ['LATITUDE=0', 'LINEAR_UNIT=FOOT'] - lcp_ds = drv.CreateCopy('tmp/lcp_19.lcp', src_ds, False, co) + retval = "success" + co = ["LATITUDE=0", "LINEAR_UNIT=FOOT"] + lcp_ds = drv.CreateCopy("tmp/lcp_19.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' - if lcp_ds.GetMetadataItem('LINEAR_UNIT') != 'Feet': - gdaltest.post_reason('Failed to set LINEAR_UNIT creation option') - retval = 'fail' + retval = "fail" + if lcp_ds.GetMetadataItem("LINEAR_UNIT") != "Feet": + gdaltest.post_reason("Failed to set LINEAR_UNIT creation option") + retval = "fail" src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_19.' + ext) + os.remove("tmp/lcp_19." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make sure DESCRIPTION co works def test_lcp_20(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - desc = 'test description' - co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'DESCRIPTION=%s' % desc] - lcp_ds = drv.CreateCopy('tmp/lcp_20.lcp', src_ds, False, co) + retval = "success" + desc = "test description" + co = ["LATITUDE=0", "LINEAR_UNIT=METER", "DESCRIPTION=%s" % desc] + lcp_ds = drv.CreateCopy("tmp/lcp_20.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' - if lcp_ds.GetMetadataItem('DESCRIPTION') != desc: - gdaltest.post_reason('Failed to set DESCRIPTION creation option') - retval = 'fail' + retval = "fail" + if lcp_ds.GetMetadataItem("DESCRIPTION") != desc: + gdaltest.post_reason("Failed to set DESCRIPTION creation option") + retval = "fail" src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_20.' + ext) + os.remove("tmp/lcp_20." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make data is copied over via checksums def test_lcp_21(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 3, 3, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 3, 3, 10, gdal.GDT_Int16) assert src_ds is not None for i in range(10): data = [random.randint(0, 100) for i in range(9)] - src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack('h' * 9, *data)) + src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack("h" * 9, *data)) - co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] - lcp_ds = drv.CreateCopy('tmp/lcp_21.lcp', src_ds, False, co) + co = ["LATITUDE=0", "LINEAR_UNIT=METER"] + lcp_ds = drv.CreateCopy("tmp/lcp_21.lcp", src_ds, False, co) if lcp_ds is None: - retval = 'fail' - retval = 'success' + retval = "fail" + retval = "success" for i in range(10): - if src_ds.GetRasterBand(i + 1).Checksum() != lcp_ds.GetRasterBand(i + 1).Checksum(): - gdaltest.post_reason('Did not get expected checksum') - retval = 'fail' + if ( + src_ds.GetRasterBand(i + 1).Checksum() + != lcp_ds.GetRasterBand(i + 1).Checksum() + ): + gdaltest.post_reason("Did not get expected checksum") + retval = "fail" src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_21.' + ext) + os.remove("tmp/lcp_21." + ext) except OSError: pass return retval + ############################################################################### # Test create copy and make data is copied over via numpy comparison. def test_lcp_22(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 3, 3, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 3, 3, 10, gdal.GDT_Int16) assert src_ds is not None for i in range(10): data = [random.randint(0, 100) for i in range(9)] - src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack('h' * 9, *data)) + src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack("h" * 9, *data)) - retval = 'success' - co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] - lcp_ds = drv.CreateCopy('tmp/lcp_22.lcp', src_ds, False, co) + retval = "success" + co = ["LATITUDE=0", "LINEAR_UNIT=METER"] + lcp_ds = drv.CreateCopy("tmp/lcp_22.lcp", src_ds, False, co) assert lcp_ds is not None - retval = 'success' + retval = "success" for i in range(10): src_data = src_ds.GetRasterBand(i + 1).ReadAsArray() dst_data = lcp_ds.GetRasterBand(i + 1).ReadAsArray() if not numpy.array_equal(src_data, dst_data): - gdaltest.post_reason('Did not copy data correctly') - retval = 'fail' + gdaltest.post_reason("Did not copy data correctly") + retval = "fail" src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_22.' + ext) + os.remove("tmp/lcp_22." + ext) except OSError: pass @@ -839,36 +1011,44 @@ def test_lcp_22(): ############################################################################### # Test create copy and make sure invalid creation options are caught. + def test_lcp_23(): - mem_drv = gdal.GetDriverByName('MEM') + mem_drv = gdal.GetDriverByName("MEM") assert mem_drv is not None - drv = gdal.GetDriverByName('LCP') + drv = gdal.GetDriverByName("LCP") assert drv is not None - src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) + src_ds = mem_drv.Create("/vsimem/", 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None - retval = 'success' - bad = 'NOT_A_REAL_OPTION' - gdal.PushErrorHandler('CPLQuietErrorHandler') - for option in ['ELEVATION_UNIT', 'SLOPE_UNIT', 'ASPECT_UNIT', - 'FUEL_MODEL_OPTION', 'CANOPY_COV_UNIT', 'CANOPY_HT_UNIT', - 'CBH_UNIT', 'CBD_UNIT', 'DUFF_UNIT']: - co = ['%s=%s' % (option, bad), ] - lcp_ds = drv.CreateCopy('tmp/lcp_23.lcp', src_ds, False, co) + retval = "success" + bad = "NOT_A_REAL_OPTION" + gdal.PushErrorHandler("CPLQuietErrorHandler") + for option in [ + "ELEVATION_UNIT", + "SLOPE_UNIT", + "ASPECT_UNIT", + "FUEL_MODEL_OPTION", + "CANOPY_COV_UNIT", + "CANOPY_HT_UNIT", + "CBH_UNIT", + "CBD_UNIT", + "DUFF_UNIT", + ]: + co = [ + "%s=%s" % (option, bad), + ] + lcp_ds = drv.CreateCopy("tmp/lcp_23.lcp", src_ds, False, co) if lcp_ds is not None: - retval = 'fail' + retval = "fail" gdal.PopErrorHandler() src_ds = None lcp_ds = None - for ext in ['lcp', 'lcp.aux.xml']: + for ext in ["lcp", "lcp.aux.xml"]: try: - os.remove('tmp/lcp_23.' + ext) + os.remove("tmp/lcp_23." + ext) except OSError: pass return retval - - - diff --git a/autotest/gdrivers/leveller.py b/autotest/gdrivers/leveller.py index f81822b0106a..142700d5ed19 100755 --- a/autotest/gdrivers/leveller.py +++ b/autotest/gdrivers/leveller.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,9 +37,5 @@ def test_leveller_1(): - tst = gdaltest.GDALTest('Leveller', 'leveller/ter6test.ter', 1, 33441) + tst = gdaltest.GDALTest("Leveller", "leveller/ter6test.ter", 1, 33441) return tst.testOpen() - - - - diff --git a/autotest/gdrivers/loslas.py b/autotest/gdrivers/loslas.py index 577ce39b89be..87dfb73778b6 100755 --- a/autotest/gdrivers/loslas.py +++ b/autotest/gdrivers/loslas.py @@ -29,6 +29,7 @@ ############################################################################### import os + import gdaltest ############################################################################### @@ -36,13 +37,16 @@ def test_loslas_1(): - tst = gdaltest.GDALTest('LOSLAS', 'data/loslas/wyhpgn.los', 1, 0, filename_absolute=1) + tst = gdaltest.GDALTest( + "LOSLAS", "data/loslas/wyhpgn.los", 1, 0, filename_absolute=1 + ) gt = (-111.625, 0.25, 0.0, 45.625, 0.0, -0.25) - stats = (-0.027868999168276787, 0.033906999975442886, 0.009716129862575248, 0.008260044951413324) - ret = tst.testOpen(check_gt=gt, check_stat=stats, check_prj='WGS84') - os.unlink('data/loslas/wyhpgn.los.aux.xml') + stats = ( + -0.027868999168276787, + 0.033906999975442886, + 0.009716129862575248, + 0.008260044951413324, + ) + ret = tst.testOpen(check_gt=gt, check_stat=stats, check_prj="WGS84") + os.unlink("data/loslas/wyhpgn.los.aux.xml") return ret - - - - diff --git a/autotest/gdrivers/mbtiles.py b/autotest/gdrivers/mbtiles.py index c71653a52eca..ba6199aca992 100755 --- a/autotest/gdrivers/mbtiles.py +++ b/autotest/gdrivers/mbtiles.py @@ -30,13 +30,12 @@ ############################################################################### import sys -from osgeo import gdal -from osgeo import ogr - import gdaltest -import webserver import pytest +import webserver + +from osgeo import gdal, ogr ############################################################################### # Get the mbtiles driver @@ -44,7 +43,8 @@ def test_mbtiles_1(): - gdaltest.mbtiles_drv = gdal.GetDriverByName('MBTiles') + gdaltest.mbtiles_drv = gdal.GetDriverByName("MBTiles") + ############################################################################### # Basic test @@ -55,27 +55,36 @@ def test_mbtiles_2(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() - ds = gdal.OpenEx('data/mbtiles/world_l1.mbtiles', open_options=['USE_BOUNDS=NO']) + ds = gdal.OpenEx("data/mbtiles/world_l1.mbtiles", open_options=["USE_BOUNDS=NO"]) assert ds is not None - assert ds.RasterCount == 4, 'expected 3 bands' + assert ds.RasterCount == 4, "expected 3 bands" - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get expected overview count" expected_cs_tab = [6324, 19386, 45258] expected_cs_tab_jpeg8 = [6016, 13996, 45168] expected_cs_tab_jpeg9b = [6016, 14034, 45168] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() - assert ds.GetRasterBand(i + 1).GetColorInterpretation() == gdal.GCI_RedBand + i, \ - 'bad color interpretation' + assert ( + ds.GetRasterBand(i + 1).GetColorInterpretation() == gdal.GCI_RedBand + i + ), "bad color interpretation" expected_cs = expected_cs_tab[i] - assert cs == expected_cs or cs == expected_cs_tab_jpeg8[i] or cs == expected_cs_tab_jpeg9b[i], \ - ('for band %d, cs = %d, different from expected_cs = %d' % (i + 1, cs, expected_cs)) + assert ( + cs == expected_cs + or cs == expected_cs_tab_jpeg8[i] + or cs == expected_cs_tab_jpeg9b[i] + ), "for band %d, cs = %d, different from expected_cs = %d" % ( + i + 1, + cs, + expected_cs, + ) expected_cs_tab = [16642, 15772, 10029] expected_cs_tab_jpeg8 = [16621, 14725, 8988] @@ -83,22 +92,38 @@ def test_mbtiles_2(): for i in range(3): cs = ds.GetRasterBand(i + 1).GetOverview(0).Checksum() expected_cs = expected_cs_tab[i] - assert cs == expected_cs or cs == expected_cs_tab_jpeg8[i] or cs == expected_cs_tab_jpeg9b[i], \ - ('for overview of band %d, cs = %d, different from expected_cs = %d' % (i + 1, cs, expected_cs)) - - assert ds.GetProjectionRef().find('3857') != -1, \ - ('projection_ref = %s' % ds.GetProjectionRef()) + assert ( + cs == expected_cs + or cs == expected_cs_tab_jpeg8[i] + or cs == expected_cs_tab_jpeg9b[i] + ), "for overview of band %d, cs = %d, different from expected_cs = %d" % ( + i + 1, + cs, + expected_cs, + ) + + assert ds.GetProjectionRef().find("3857") != -1, ( + "projection_ref = %s" % ds.GetProjectionRef() + ) gt = ds.GetGeoTransform() - expected_gt = (-20037508.342789244, 78271.516964020484, 0.0, 20037508.342789244, 0.0, -78271.516964020484) + expected_gt = ( + -20037508.342789244, + 78271.516964020484, + 0.0, + 20037508.342789244, + 0.0, + -78271.516964020484, + ) for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=1e-15), 'bad gt' + assert gt[i] == pytest.approx(expected_gt[i], abs=1e-15), "bad gt" md = ds.GetMetadata() - assert md['bounds'] == '-180.0,-85,180,85', 'bad metadata' + assert md["bounds"] == "-180.0,-85,180,85", "bad metadata" ds = None + ############################################################################### # Open a /vsicurl/ DB @@ -108,40 +133,48 @@ def test_mbtiles_3(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() - if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: + if sys.platform == "darwin" and gdal.GetConfigOption("TRAVIS", None) is not None: pytest.skip("Hangs on MacOSX Travis sometimes. Not sure why.") # Check that we have SQLite VFS support - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/mbtiles_3.db') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = ogr.GetDriverByName("SQLite").CreateDataSource("/vsimem/mbtiles_3.db") gdal.PopErrorHandler() if ds is None: pytest.skip() ds = None - gdal.Unlink('/vsimem/mbtiles_3.db') + gdal.Unlink("/vsimem/mbtiles_3.db") - ds = gdal.Open('/vsicurl/http://a.tiles.mapbox.com/v3/mapbox.geography-class.mbtiles') + ds = gdal.Open( + "/vsicurl/http://a.tiles.mapbox.com/v3/mapbox.geography-class.mbtiles" + ) if ds is None: # Just skip. The service isn't perfectly reliable sometimes pytest.skip() # long=2,lat=49 in WGS 84 --> x=222638,y=6274861 in Google Mercator - locationInfo = ds.GetRasterBand(1).GetMetadataItem('GeoPixel_222638_6274861', 'LocationInfo') + locationInfo = ds.GetRasterBand(1).GetMetadataItem( + "GeoPixel_222638_6274861", "LocationInfo" + ) if locationInfo is None or locationInfo.find("France") == -1: print(locationInfo) if gdaltest.skip_on_travis(): pytest.skip() - pytest.fail('did not get expected LocationInfo') + pytest.fail("did not get expected LocationInfo") - locationInfo2 = ds.GetRasterBand(1).GetOverview(5).GetMetadataItem('GeoPixel_222638_6274861', 'LocationInfo') + locationInfo2 = ( + ds.GetRasterBand(1) + .GetOverview(5) + .GetMetadataItem("GeoPixel_222638_6274861", "LocationInfo") + ) if locationInfo2 != locationInfo: print(locationInfo2) if gdaltest.skip_on_travis(): pytest.skip() - pytest.fail('did not get expected LocationInfo on overview') + pytest.fail("did not get expected LocationInfo on overview") ############################################################################### @@ -153,10 +186,12 @@ def test_mbtiles_start_webserver(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() - (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) + (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch( + handler=webserver.DispatcherHttpHandler + ) if gdaltest.webserver_port == 0: pytest.skip() @@ -170,21 +205,25 @@ def test_mbtiles_http_jpeg_three_bands(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.FileHandler( - {'/world_l1.mbtiles': open('data/mbtiles/world_l1.mbtiles', 'rb').read()}) + {"/world_l1.mbtiles": open("data/mbtiles/world_l1.mbtiles", "rb").read()} + ) with webserver.install_http_handler(handler): - ds = gdal.Open('/vsicurl/http://localhost:%d/world_l1.mbtiles' % gdaltest.webserver_port) + ds = gdal.Open( + "/vsicurl/http://localhost:%d/world_l1.mbtiles" % gdaltest.webserver_port + ) assert ds is not None + ############################################################################### # @@ -194,21 +233,25 @@ def test_mbtiles_http_jpeg_single_band(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.FileHandler( - {'/byte_jpeg.mbtiles': open('data/mbtiles/byte_jpeg.mbtiles', 'rb').read()}) + {"/byte_jpeg.mbtiles": open("data/mbtiles/byte_jpeg.mbtiles", "rb").read()} + ) with webserver.install_http_handler(handler): - ds = gdal.Open('/vsicurl/http://localhost:%d/byte_jpeg.mbtiles' % gdaltest.webserver_port) + ds = gdal.Open( + "/vsicurl/http://localhost:%d/byte_jpeg.mbtiles" % gdaltest.webserver_port + ) assert ds is not None + ############################################################################### # @@ -218,21 +261,25 @@ def test_mbtiles_http_png(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.FileHandler( - {'/byte.mbtiles': open('data/mbtiles/byte.mbtiles', 'rb').read()}) + {"/byte.mbtiles": open("data/mbtiles/byte.mbtiles", "rb").read()} + ) with webserver.install_http_handler(handler): - ds = gdal.Open('/vsicurl/http://localhost:%d/byte.mbtiles' % gdaltest.webserver_port) + ds = gdal.Open( + "/vsicurl/http://localhost:%d/byte.mbtiles" % gdaltest.webserver_port + ) assert ds is not None + ############################################################################### # @@ -242,7 +289,7 @@ def test_mbtiles_stop_webserver(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('HTTP') is None: + if gdal.GetDriverByName("HTTP") is None: pytest.skip() if gdaltest.webserver_port != 0: @@ -258,25 +305,34 @@ def test_mbtiles_4(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() - ds = gdal.Open('data/mbtiles/world_l1.mbtiles') + ds = gdal.Open("data/mbtiles/world_l1.mbtiles") assert ds is not None - assert ds.RasterCount == 4, 'expected 4 bands' + assert ds.RasterCount == 4, "expected 4 bands" - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get expected overview count" - assert ds.RasterXSize == 512 and ds.RasterYSize == 510, 'bad dimensions' + assert ds.RasterXSize == 512 and ds.RasterYSize == 510, "bad dimensions" gt = ds.GetGeoTransform() - expected_gt = (-20037508.342789244, 78271.516964020484, 0.0, 19971868.880408563, 0.0, -78271.516964020484) - assert gt == pytest.approx(expected_gt, rel=1e-15), 'bad gt' + expected_gt = ( + -20037508.342789244, + 78271.516964020484, + 0.0, + 19971868.880408563, + 0.0, + -78271.516964020484, + ) + assert gt == pytest.approx(expected_gt, rel=1e-15), "bad gt" ds = None + ############################################################################### # Test write support of a single band dataset @@ -286,18 +342,25 @@ def test_mbtiles_5(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') - gdaltest.mbtiles_drv.CreateCopy('/vsimem/mbtiles_5.mbtiles', src_ds) + src_ds = gdal.Open("data/byte.tif") + gdaltest.mbtiles_drv.CreateCopy("/vsimem/mbtiles_5.mbtiles", src_ds) src_ds = None - ds = gdal.OpenEx('/vsimem/mbtiles_5.mbtiles', open_options=['BAND_COUNT=2']) + ds = gdal.OpenEx("/vsimem/mbtiles_5.mbtiles", open_options=["BAND_COUNT=2"]) assert ds.RasterXSize == 19 and ds.RasterYSize == 19 assert ds.RasterCount == 2 got_gt = ds.GetGeoTransform() - expected_gt = (-13095853.550435878, 76.437028285176254, 0.0, 4015708.8887064462, 0.0, -76.437028285176254) + expected_gt = ( + -13095853.550435878, + 76.437028285176254, + 0.0, + 4015708.8887064462, + 0.0, + -76.437028285176254, + ) for i in range(6): assert expected_gt[i] == pytest.approx(got_gt[i], rel=1e-6) got_cs = ds.GetRasterBand(1).Checksum() @@ -305,13 +368,24 @@ def test_mbtiles_5(): got_cs = ds.GetRasterBand(2).Checksum() assert got_cs == 4406 got_md = ds.GetMetadata() - expected_md = {'ZOOM_LEVEL': '11', 'minzoom': '11', 'maxzoom': '11', 'name': 'mbtiles_5', 'format': 'png', 'bounds': '-117.6420540294745,33.89160566594387,-117.6290077648261,33.90243460427036', 'version': '1.1', 'type': 'overlay', 'description': 'mbtiles_5'} + expected_md = { + "ZOOM_LEVEL": "11", + "minzoom": "11", + "maxzoom": "11", + "name": "mbtiles_5", + "format": "png", + "bounds": "-117.6420540294745,33.89160566594387,-117.6290077648261,33.90243460427036", + "version": "1.1", + "type": "overlay", + "description": "mbtiles_5", + } assert set(got_md.keys()) == set(expected_md.keys()) for key in got_md: - assert key == 'bounds' or got_md[key] == expected_md[key] + assert key == "bounds" or got_md[key] == expected_md[key] ds = None - gdal.Unlink('/vsimem/mbtiles_5.mbtiles') + gdal.Unlink("/vsimem/mbtiles_5.mbtiles") + ############################################################################### # Test write support with options @@ -322,31 +396,41 @@ def test_mbtiles_6(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() # Test options - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") options = [] - options += ['TILE_FORMAT=JPEG'] - options += ['QUALITY=50'] - options += ['NAME=name'] - options += ['DESCRIPTION=description'] - options += ['TYPE=baselayer'] - options += ['VERSION=version'] - options += ['WRITE_BOUNDS=no'] - gdaltest.mbtiles_drv.CreateCopy('tmp/mbtiles_6.mbtiles', src_ds, options=options) + options += ["TILE_FORMAT=JPEG"] + options += ["QUALITY=50"] + options += ["NAME=name"] + options += ["DESCRIPTION=description"] + options += ["TYPE=baselayer"] + options += ["VERSION=version"] + options += ["WRITE_BOUNDS=no"] + gdaltest.mbtiles_drv.CreateCopy("tmp/mbtiles_6.mbtiles", src_ds, options=options) src_ds = None - ds = gdal.Open('tmp/mbtiles_6.mbtiles') + ds = gdal.Open("tmp/mbtiles_6.mbtiles") got_cs = ds.GetRasterBand(1).Checksum() assert got_cs != 0 got_md = ds.GetMetadata() - expected_md = {'ZOOM_LEVEL': '11', 'minzoom': '11', 'maxzoom': '11', 'format': 'jpg', 'version': 'version', 'type': 'baselayer', 'name': 'name', 'description': 'description'} + expected_md = { + "ZOOM_LEVEL": "11", + "minzoom": "11", + "maxzoom": "11", + "format": "jpg", + "version": "version", + "type": "baselayer", + "name": "name", + "description": "description", + } assert got_md == expected_md ds = None - gdal.Unlink('tmp/mbtiles_6.mbtiles') + gdal.Unlink("tmp/mbtiles_6.mbtiles") + ############################################################################### # Test building overview @@ -357,50 +441,63 @@ def test_mbtiles_7(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") data = src_ds.ReadRaster() - mem_ds = gdal.GetDriverByName('MEM').Create('', - src_ds.RasterXSize * 2, - src_ds.RasterYSize * 2, - src_ds.RasterCount) + mem_ds = gdal.GetDriverByName("MEM").Create( + "", src_ds.RasterXSize * 2, src_ds.RasterYSize * 2, src_ds.RasterCount + ) mem_ds.SetProjection(src_ds.GetProjectionRef()) gt = src_ds.GetGeoTransform() gt = [gt[i] for i in range(6)] gt[1] /= 2 gt[5] /= 2 mem_ds.SetGeoTransform(gt) - mem_ds.WriteRaster(0, 0, mem_ds.RasterXSize, mem_ds.RasterYSize, - data, src_ds.RasterXSize, src_ds.RasterYSize) + mem_ds.WriteRaster( + 0, + 0, + mem_ds.RasterXSize, + mem_ds.RasterYSize, + data, + src_ds.RasterXSize, + src_ds.RasterYSize, + ) src_ds = None - gdaltest.mbtiles_drv.CreateCopy('/vsimem/mbtiles_7.mbtiles', mem_ds, options=['TILE_FORMAT=PNG8', 'DITHER=YES', 'RESAMPLING=NEAREST']) + gdaltest.mbtiles_drv.CreateCopy( + "/vsimem/mbtiles_7.mbtiles", + mem_ds, + options=["TILE_FORMAT=PNG8", "DITHER=YES", "RESAMPLING=NEAREST"], + ) mem_ds = None - ds = gdal.Open('/vsimem/mbtiles_7.mbtiles', gdal.GA_Update) - ds.BuildOverviews('NEAR', [2, 4]) + ds = gdal.Open("/vsimem/mbtiles_7.mbtiles", gdal.GA_Update) + ds.BuildOverviews("NEAR", [2, 4]) ds = None - ds = gdal.Open('/vsimem/mbtiles_7.mbtiles') + ds = gdal.Open("/vsimem/mbtiles_7.mbtiles") assert ds.GetRasterBand(1).GetOverviewCount() == 1 expected_ovr_cs = [21179, 22577, 11996, 17849] - got_ovr_cs = [ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(ds.RasterCount)] + got_ovr_cs = [ + ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(ds.RasterCount) + ] assert expected_ovr_cs == got_ovr_cs - assert ds.GetMetadataItem('minzoom') == '0', ds.GetMetadata() + assert ds.GetMetadataItem("minzoom") == "0", ds.GetMetadata() ds = None - ds = gdal.Open('/vsimem/mbtiles_7.mbtiles', gdal.GA_Update) - ds.BuildOverviews('NONE', []) + ds = gdal.Open("/vsimem/mbtiles_7.mbtiles", gdal.GA_Update) + ds.BuildOverviews("NONE", []) ds = None - ds = gdal.Open('/vsimem/mbtiles_7.mbtiles') + ds = gdal.Open("/vsimem/mbtiles_7.mbtiles") assert ds.GetRasterBand(1).GetOverviewCount() == 0 - assert ds.GetMetadataItem('minzoom') == '1', ds.GetMetadata() + assert ds.GetMetadataItem("minzoom") == "1", ds.GetMetadata() ds = None - gdal.Unlink('/vsimem/mbtiles_7.mbtiles') + gdal.Unlink("/vsimem/mbtiles_7.mbtiles") + ############################################################################### # Single band with 24 bit color table, PNG @@ -411,16 +508,18 @@ def test_mbtiles_8(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - src_ds = gdal.Open('data/small_world_pct.tif') - out_ds = gdaltest.mbtiles_drv.CreateCopy('/vsimem/mbtiles_8.mbtiles', src_ds, options=['RESAMPLING=NEAREST']) + src_ds = gdal.Open("data/small_world_pct.tif") + out_ds = gdaltest.mbtiles_drv.CreateCopy( + "/vsimem/mbtiles_8.mbtiles", src_ds, options=["RESAMPLING=NEAREST"] + ) out_ds = None src_ds = None expected_cs = [993, 50461, 64354] - out_ds = gdal.Open('/vsimem/mbtiles_8.mbtiles') + out_ds = gdal.Open("/vsimem/mbtiles_8.mbtiles") got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() @@ -429,13 +528,17 @@ def test_mbtiles_8(): out_ds = None # 512 pixel tiles - src_ds = gdal.Open('data/small_world_pct.tif') - out_ds = gdaltest.mbtiles_drv.CreateCopy('/vsimem/mbtiles_8.mbtiles', src_ds, options=['RESAMPLING=NEAREST', 'BLOCKSIZE=512']) + src_ds = gdal.Open("data/small_world_pct.tif") + out_ds = gdaltest.mbtiles_drv.CreateCopy( + "/vsimem/mbtiles_8.mbtiles", + src_ds, + options=["RESAMPLING=NEAREST", "BLOCKSIZE=512"], + ) out_ds = None src_ds = None expected_cs = [580, 8742, 54747] - out_ds = gdal.Open('/vsimem/mbtiles_8.mbtiles') + out_ds = gdal.Open("/vsimem/mbtiles_8.mbtiles") assert out_ds.RasterXSize == 512 assert out_ds.RasterYSize == 512 got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] @@ -445,7 +548,8 @@ def test_mbtiles_8(): assert out_ds.GetRasterBand(1).GetBlockSize() == [512, 512] out_ds = None - gdal.Unlink('/vsimem/mbtiles_8.mbtiles') + gdal.Unlink("/vsimem/mbtiles_8.mbtiles") + ############################################################################### # Test we are robust to invalid bounds @@ -456,23 +560,26 @@ def test_mbtiles_9(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') - gdaltest.mbtiles_drv.CreateCopy('/vsimem/mbtiles_9.mbtiles', src_ds, options=['RESAMPLING=NEAREST']) + src_ds = gdal.Open("data/byte.tif") + gdaltest.mbtiles_drv.CreateCopy( + "/vsimem/mbtiles_9.mbtiles", src_ds, options=["RESAMPLING=NEAREST"] + ) src_ds = None - ds = ogr.Open('SQLITE:/vsimem/mbtiles_9.mbtiles', update=1) + ds = ogr.Open("SQLITE:/vsimem/mbtiles_9.mbtiles", update=1) ds.ExecuteSQL("UPDATE metadata SET value='invalid' WHERE name='bounds'") ds = None with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/mbtiles_9.mbtiles') + ds = gdal.Open("/vsimem/mbtiles_9.mbtiles") assert ds.RasterXSize == 256 and ds.RasterYSize == 256 assert ds.GetGeoTransform()[0] == pytest.approx(-13110479.091473430395126, abs=1e-6) ds = None - gdal.Unlink('/vsimem/mbtiles_9.mbtiles') + gdal.Unlink("/vsimem/mbtiles_9.mbtiles") + ############################################################################### # Test compaction of temporary database @@ -483,21 +590,30 @@ def test_mbtiles_10(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - old_val_GPKG_FORCE_TEMPDB_COMPACTION = gdal.GetConfigOption('GPKG_FORCE_TEMPDB_COMPACTION') - gdal.SetConfigOption('GPKG_FORCE_TEMPDB_COMPACTION', 'YES') + old_val_GPKG_FORCE_TEMPDB_COMPACTION = gdal.GetConfigOption( + "GPKG_FORCE_TEMPDB_COMPACTION" + ) + gdal.SetConfigOption("GPKG_FORCE_TEMPDB_COMPACTION", "YES") with gdaltest.SetCacheMax(0): - gdal.Translate('/vsimem/mbtiles_10.mbtiles', '../gcore/data/byte.tif', options='-of MBTILES -outsize 512 512') - gdal.SetConfigOption('GPKG_FORCE_TEMPDB_COMPACTION', old_val_GPKG_FORCE_TEMPDB_COMPACTION) - - ds = gdal.Open('/vsimem/mbtiles_10.mbtiles') + gdal.Translate( + "/vsimem/mbtiles_10.mbtiles", + "../gcore/data/byte.tif", + options="-of MBTILES -outsize 512 512", + ) + gdal.SetConfigOption( + "GPKG_FORCE_TEMPDB_COMPACTION", old_val_GPKG_FORCE_TEMPDB_COMPACTION + ) + + ds = gdal.Open("/vsimem/mbtiles_10.mbtiles") cs = ds.GetRasterBand(1).Checksum() - assert cs in (29925, 30092, 29957) # 30092 on Mac, 29957 on Mac / Conda + assert cs in (29925, 30092, 29957) # 30092 on Mac, 29957 on Mac / Conda ds = None - gdal.Unlink('/vsimem/mbtiles_10.mbtiles') + gdal.Unlink("/vsimem/mbtiles_10.mbtiles") + ############################################################################### # Test opening a .mbtiles.sql file @@ -508,13 +624,14 @@ def test_mbtiles_11(): if gdaltest.mbtiles_drv is None: pytest.skip() - if gdaltest.mbtiles_drv.GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != 'YES': + if gdaltest.mbtiles_drv.GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != "YES": pytest.skip() - if gdal.GetDriverByName('PNG') is None: + if gdal.GetDriverByName("PNG") is None: pytest.skip() - ds = gdal.Open('data/mbtiles/byte.mbtiles.sql') - assert ds.GetRasterBand(1).Checksum() == 4118, 'validation failed' + ds = gdal.Open("data/mbtiles/byte.mbtiles.sql") + assert ds.GetRasterBand(1).Checksum() == 4118, "validation failed" + ############################################################################### @@ -524,9 +641,10 @@ def test_mbtiles_raster_open_in_vector_mode(): if gdaltest.mbtiles_drv is None: pytest.skip() - ds = ogr.Open('data/mbtiles/byte.mbtiles') + ds = ogr.Open("data/mbtiles/byte.mbtiles") assert ds is None + ############################################################################### @@ -535,14 +653,14 @@ def test_mbtiles_create(): if gdaltest.mbtiles_drv is None: pytest.skip() - filename = '/vsimem/mbtiles_create.mbtiles' + filename = "/vsimem/mbtiles_create.mbtiles" gdaltest.mbtiles_drv.Create(filename, 1, 1, 1) with gdaltest.error_handler(): assert gdal.Open(filename) is None # Nominal case gdal.Unlink(filename) - src_ds = gdal.Open('data/mbtiles/byte.mbtiles') + src_ds = gdal.Open("data/mbtiles/byte.mbtiles") ds = gdaltest.mbtiles_drv.Create(filename, src_ds.RasterXSize, src_ds.RasterYSize) ds.SetGeoTransform(src_ds.GetGeoTransform()) ds.SetProjection(src_ds.GetProjectionRef()) @@ -553,7 +671,7 @@ def test_mbtiles_create(): assert ret != 0 ds = None - ds = gdal.Open('data/mbtiles/byte.mbtiles') + ds = gdal.Open("data/mbtiles/byte.mbtiles") # SetGeoTransform() not supported on read-only dataset" with gdaltest.error_handler(): ret = ds.SetGeoTransform(src_ds.GetGeoTransform()) @@ -594,6 +712,7 @@ def test_mbtiles_create(): ############################################################################### # Cleanup + def test_mbtiles_cleanup(): if gdaltest.mbtiles_drv is None: diff --git a/autotest/gdrivers/mem.py b/autotest/gdrivers/mem.py index 35d33026bd23..85d289e7585e 100755 --- a/autotest/gdrivers/mem.py +++ b/autotest/gdrivers/mem.py @@ -32,11 +32,11 @@ import ctypes import struct -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Create a MEM dataset, and set some data, then test it. @@ -45,20 +45,18 @@ def test_mem_1(): ####################################################### # Setup dataset - drv = gdal.GetDriverByName('MEM') - gdaltest.mem_ds = drv.Create('mem_1.mem', 50, 3) + drv = gdal.GetDriverByName("MEM") + gdaltest.mem_ds = drv.Create("mem_1.mem", 50, 3) ds = gdaltest.mem_ds - assert ds.GetProjection() == '', 'projection wrong' + assert ds.GetProjection() == "", "projection wrong" - assert ds.GetGeoTransform(can_return_null=True) is None, 'geotransform wrong' + assert ds.GetGeoTransform(can_return_null=True) is None, "geotransform wrong" - raw_data = b''.join(struct.pack('f', v) for v in range(150)) - ds.WriteRaster(0, 0, 50, 3, raw_data, - buf_type=gdal.GDT_Float32, - band_list=[1]) + raw_data = b"".join(struct.pack("f", v) for v in range(150)) + ds.WriteRaster(0, 0, 50, 3, raw_data, buf_type=gdal.GDT_Float32, band_list=[1]) - wkt = gdaltest.user_srs_to_wkt('EPSG:26711') + wkt = gdaltest.user_srs_to_wkt("EPSG:26711") ds.SetProjection(wkt) gt = (440720, 5, 0, 3751320, 0, -5) @@ -68,7 +66,7 @@ def test_mem_1(): band.SetNoDataValue(-1.0) # Set GCPs() - wkt_gcp = gdaltest.user_srs_to_wkt('EPSG:4326') + wkt_gcp = gdaltest.user_srs_to_wkt("EPSG:4326") gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs([], "") ds.SetGCPs(gcps, wkt_gcp) @@ -79,37 +77,38 @@ def test_mem_1(): ####################################################### # Verify dataset. - assert band.GetNoDataValue() == -1.0, 'no data is wrong' + assert band.GetNoDataValue() == -1.0, "no data is wrong" - assert ds.GetProjection() == wkt, 'projection wrong' + assert ds.GetProjection() == wkt, "projection wrong" - assert ds.GetGeoTransform() == gt, 'geotransform wrong' + assert ds.GetGeoTransform() == gt, "geotransform wrong" - assert band.Checksum() == 1531, 'checksum wrong' + assert band.Checksum() == 1531, "checksum wrong" - assert ds.GetGCPCount() == 1, 'GetGCPCount wrong' + assert ds.GetGCPCount() == 1, "GetGCPCount wrong" - assert len(ds.GetGCPs()) == 1, 'GetGCPs wrong' + assert len(ds.GetGCPs()) == 1, "GetGCPs wrong" - assert ds.GetGCPProjection() == wkt_gcp, 'GetGCPProjection wrong' + assert ds.GetGCPProjection() == wkt_gcp, "GetGCPProjection wrong" - assert band.DeleteNoDataValue() == 0, 'wrong return code' - assert band.GetNoDataValue() is None, 'got nodata value whereas none was expected' + assert band.DeleteNoDataValue() == 0, "wrong return code" + assert band.GetNoDataValue() is None, "got nodata value whereas none was expected" gdaltest.mem_ds = None + ############################################################################### # Open an in-memory array. def test_mem_2(): - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('MEM:::') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("MEM:::") gdal.PopErrorHandler() - assert ds is None, 'opening MEM dataset should have failed.' + assert ds is None, "opening MEM dataset should have failed." - for libname in ['msvcrt', 'libc.so.6']: + for libname in ["msvcrt", "libc.so.6"]: try: crt = ctypes.CDLL(libname) except OSError: @@ -137,8 +136,12 @@ def test_mem_2(): float_p = ctypes.cast(p, ctypes.POINTER(ctypes.c_float)) # build ds name. - dsnames = ['MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,BANDS=1,DATATYPE=Float32,PIXELOFFSET=4,LINEOFFSET=%d,BANDOFFSET=0' % (p, width, height, width * 4), - 'MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,DATATYPE=Float32' % (p, width, height)] + dsnames = [ + "MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,BANDS=1,DATATYPE=Float32,PIXELOFFSET=4,LINEOFFSET=%d,BANDOFFSET=0" + % (p, width, height, width * 4), + "MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,DATATYPE=Float32" + % (p, width, height), + ] for dsname in dsnames: @@ -148,19 +151,19 @@ def test_mem_2(): dsro = gdal.Open(dsname) if dsro is None: free(p) - pytest.fail('opening MEM dataset failed in read only mode.') + pytest.fail("opening MEM dataset failed in read only mode.") chksum = dsro.GetRasterBand(1).Checksum() if chksum != 750: print(chksum) free(p) - pytest.fail('checksum failed.') + pytest.fail("checksum failed.") dsro = None dsup = gdal.Open(dsname, gdal.GA_Update) if dsup is None: free(p) - pytest.fail('opening MEM dataset failed in update mode.') + pytest.fail("opening MEM dataset failed in update mode.") dsup.GetRasterBand(1).Fill(100.0) dsup.FlushCache() @@ -168,146 +171,157 @@ def test_mem_2(): if float_p[0] != 100.0: print(float_p[0]) free(p) - pytest.fail('fill seems to have failed.') + pytest.fail("fill seems to have failed.") dsup = None free(p) + ############################################################################### # Test creating a MEM dataset with the "MEM:::" name def test_mem_3(): - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('MEM:::', 1, 1, 1) + drv = gdal.GetDriverByName("MEM") + ds = drv.Create("MEM:::", 1, 1, 1) assert ds is not None ds = None + ############################################################################### # Test creating a band interleaved multi-band MEM dataset def test_mem_4(): - drv = gdal.GetDriverByName('MEM') + drv = gdal.GetDriverByName("MEM") - ds = drv.Create('', 100, 100, 3) + ds = drv.Create("", 100, 100, 3) expected_cs = [0, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() - assert cs == expected_cs[i], \ - ('did not get expected checksum for band %d' % (i + 1)) + assert cs == expected_cs[i], "did not get expected checksum for band %d" % ( + i + 1 + ) ds.GetRasterBand(1).Fill(255) expected_cs = [57182, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() - assert cs == expected_cs[i], \ - ('did not get expected checksum for band %d after fill' % (i + 1)) + assert ( + cs == expected_cs[i] + ), "did not get expected checksum for band %d after fill" % (i + 1) ds = None + ############################################################################### # Test creating a pixel interleaved multi-band MEM dataset def test_mem_5(): - drv = gdal.GetDriverByName('MEM') + drv = gdal.GetDriverByName("MEM") - ds = drv.Create('', 100, 100, 3, options=['INTERLEAVE=PIXEL']) + ds = drv.Create("", 100, 100, 3, options=["INTERLEAVE=PIXEL"]) expected_cs = [0, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() - assert cs == expected_cs[i], \ - ('did not get expected checksum for band %d' % (i + 1)) + assert cs == expected_cs[i], "did not get expected checksum for band %d" % ( + i + 1 + ) ds.GetRasterBand(1).Fill(255) expected_cs = [57182, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() - assert cs == expected_cs[i], \ - ('did not get expected checksum for band %d after fill' % (i + 1)) + assert ( + cs == expected_cs[i] + ), "did not get expected checksum for band %d after fill" % (i + 1) - assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL', \ - 'did not get expected INTERLEAVE value' + assert ( + ds.GetMetadataItem("INTERLEAVE", "IMAGE_STRUCTURE") == "PIXEL" + ), "did not get expected INTERLEAVE value" ds = None + ############################################################################### # Test out-of-memory situations def test_mem_6(): - if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: + if gdal.GetConfigOption("SKIP_MEM_INTENSIVE_TEST") is not None: pytest.skip() - drv = gdal.GetDriverByName('MEM') + drv = gdal.GetDriverByName("MEM") # Multiplication overflow with gdaltest.error_handler(): - ds = drv.Create('', 1, 1, 0x7FFFFFFF, gdal.GDT_Float64) + ds = drv.Create("", 1, 1, 0x7FFFFFFF, gdal.GDT_Float64) assert ds is None ds = None # Multiplication overflow with gdaltest.error_handler(): - ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 16) + ds = drv.Create("", 0x7FFFFFFF, 0x7FFFFFFF, 16) assert ds is None ds = None # Multiplication overflow with gdaltest.error_handler(): - ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1, gdal.GDT_Float64) + ds = drv.Create("", 0x7FFFFFFF, 0x7FFFFFFF, 1, gdal.GDT_Float64) assert ds is None ds = None # Out of memory error with gdaltest.error_handler(): - ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1, options=['INTERLEAVE=PIXEL']) + ds = drv.Create("", 0x7FFFFFFF, 0x7FFFFFFF, 1, options=["INTERLEAVE=PIXEL"]) assert ds is None ds = None # Out of memory error with gdaltest.error_handler(): - ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1) + ds = drv.Create("", 0x7FFFFFFF, 0x7FFFFFFF, 1) assert ds is None ds = None # 32 bit overflow on 32-bit builds, or possible out of memory error - ds = drv.Create('', 0x7FFFFFFF, 1, 0) + ds = drv.Create("", 0x7FFFFFFF, 1, 0) with gdaltest.error_handler(): ds.AddBand(gdal.GDT_Float64) # Will raise out of memory error in all cases - ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 0) + ds = drv.Create("", 0x7FFFFFFF, 0x7FFFFFFF, 0) with gdaltest.error_handler(): ret = ds.AddBand(gdal.GDT_Float64) assert ret != 0 + ############################################################################### # Test AddBand() def test_mem_7(): - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('MEM:::', 1, 1, 1) + drv = gdal.GetDriverByName("MEM") + ds = drv.Create("MEM:::", 1, 1, 1) ds.AddBand(gdal.GDT_Byte, []) assert ds.RasterCount == 2 ds = None + ############################################################################### # Test SetDefaultHistogram() / GetDefaultHistogram() def test_mem_8(): - drv = gdal.GetDriverByName('MEM') - ds = drv.Create('MEM:::', 1, 1, 1) + drv = gdal.GetDriverByName("MEM") + ds = drv.Create("MEM:::", 1, 1, 1) ds.GetRasterBand(1).SetDefaultHistogram(0, 255, []) ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [5, 6]) ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [3000000000, 4]) @@ -316,6 +330,7 @@ def test_mem_8(): assert hist == (1.0, 2.0, 2, [3000000000, 4]) + ############################################################################### # Test RasterIO() @@ -323,21 +338,26 @@ def test_mem_8(): def test_mem_9(): # Test IRasterIO(GF_Read,) - src_ds = gdal.Open('data/rgbsmall.tif') - drv = gdal.GetDriverByName('MEM') + src_ds = gdal.Open("data/rgbsmall.tif") + drv = gdal.GetDriverByName("MEM") - for interleave in ['BAND', 'PIXEL']: - out_ds = drv.CreateCopy('', src_ds, options=['INTERLEAVE=%s' % interleave]) + for interleave in ["BAND", "PIXEL"]: + out_ds = drv.CreateCopy("", src_ds, options=["INTERLEAVE=%s" % interleave]) ref_data = src_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5) got_data = out_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5) if ref_data != got_data: import struct - print(struct.unpack('B' * 4 * 5, ref_data)) - print(struct.unpack('B' * 4 * 5, got_data)) + + print(struct.unpack("B" * 4 * 5, ref_data)) + print(struct.unpack("B" * 4 * 5, got_data)) pytest.fail(interleave) - ref_data = src_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100) - got_data = out_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100) + ref_data = src_ds.GetRasterBand(2).ReadRaster( + 20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100 + ) + got_data = out_ds.GetRasterBand(2).ReadRaster( + 20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100 + ) assert ref_data == got_data, interleave ref_data = src_ds.ReadRaster(20, 8, 4, 5) @@ -352,15 +372,34 @@ def test_mem_9(): got_data = out_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_band_space=1) assert ref_data == got_data, interleave - ref_data = src_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1) - got_data = out_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1) + ref_data = src_ds.ReadRaster( + 20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1 + ) + got_data = out_ds.ReadRaster( + 20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1 + ) assert ref_data == got_data, interleave - ref_data = src_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) - got_data = out_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) + ref_data = src_ds.ReadRaster( + 20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4 + ) + got_data = out_ds.ReadRaster( + 20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4 + ) assert ref_data == got_data, interleave - out_ds.WriteRaster(20, 20, 4, 5, got_data, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) - got_data = out_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) + out_ds.WriteRaster( + 20, + 20, + 4, + 5, + got_data, + buf_type=gdal.GDT_Int32, + buf_pixel_space=12, + buf_band_space=4, + ) + got_data = out_ds.ReadRaster( + 20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4 + ) assert ref_data == got_data, interleave # Test IReadBlock @@ -378,9 +417,15 @@ def test_mem_9(): assert ref_data == got_data # Test IRasterIO(GF_Write, change data type) + IWriteBlock() + IRasterIO(GF_Read, change data type) - ref_data = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5, buf_type=gdal.GDT_Int32) - out_ds.GetRasterBand(1).WriteRaster(10, 11, 4, 5, ref_data, buf_type=gdal.GDT_Int32) - got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5, buf_type=gdal.GDT_Int32) + ref_data = src_ds.GetRasterBand(1).ReadRaster( + 10, 11, 4, 5, buf_type=gdal.GDT_Int32 + ) + out_ds.GetRasterBand(1).WriteRaster( + 10, 11, 4, 5, ref_data, buf_type=gdal.GDT_Int32 + ) + got_data = out_ds.GetRasterBand(1).ReadRaster( + 10, 11, 4, 5, buf_type=gdal.GDT_Int32 + ) assert ref_data == got_data, interleave ref_data = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5) @@ -397,19 +442,25 @@ def test_mem_9(): got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 8, 10, 4, 5) assert ref_data == got_data, interleave - for interleave in ['BAND', 'PIXEL']: - out_ds = drv.CreateCopy('', src_ds, options=['INTERLEAVE=%s' % interleave]) + for interleave in ["BAND", "PIXEL"]: + out_ds = drv.CreateCopy("", src_ds, options=["INTERLEAVE=%s" % interleave]) for i in range(3): - out_ds.GetRasterBand(i+1).Fill(0) - ref_data = src_ds.ReadRaster(0, 10, out_ds.RasterXSize, 5, buf_pixel_space=3, buf_band_space=1) - out_ds.WriteRaster(0, 10, out_ds.RasterXSize, 5, ref_data, buf_pixel_space=3, buf_band_space=1) - got_data = out_ds.ReadRaster(0, 10, out_ds.RasterXSize, 5, buf_pixel_space=3, buf_band_space=1) + out_ds.GetRasterBand(i + 1).Fill(0) + ref_data = src_ds.ReadRaster( + 0, 10, out_ds.RasterXSize, 5, buf_pixel_space=3, buf_band_space=1 + ) + out_ds.WriteRaster( + 0, 10, out_ds.RasterXSize, 5, ref_data, buf_pixel_space=3, buf_band_space=1 + ) + got_data = out_ds.ReadRaster( + 0, 10, out_ds.RasterXSize, 5, buf_pixel_space=3, buf_band_space=1 + ) assert ref_data == got_data, interleave - for interleave in ['BAND', 'PIXEL']: - out_ds = drv.CreateCopy('', src_ds, options=['INTERLEAVE=%s' % interleave]) + for interleave in ["BAND", "PIXEL"]: + out_ds = drv.CreateCopy("", src_ds, options=["INTERLEAVE=%s" % interleave]) for i in range(3): - out_ds.GetRasterBand(i+1).Fill(0) + out_ds.GetRasterBand(i + 1).Fill(0) ref_data = src_ds.ReadRaster(4, 10, 15, 5, buf_pixel_space=3, buf_band_space=1) out_ds.WriteRaster(4, 10, 15, 5, ref_data, buf_pixel_space=3, buf_band_space=1) got_data = out_ds.ReadRaster(4, 10, 15, 5, buf_pixel_space=3, buf_band_space=1) @@ -423,26 +474,26 @@ def test_mem_9(): def test_mem_10(): # Error case: building overview on a 0 band dataset - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 0) with gdaltest.error_handler(): - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) # Requesting overviews when they are not - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(0) is None # Single band case - ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/byte.tif')) + ds = gdal.GetDriverByName("MEM").CreateCopy("", gdal.Open("data/byte.tif")) for _ in range(2): - ret = ds.BuildOverviews('NEAR', [2]) + ret = ds.BuildOverviews("NEAR", [2]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 1 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 - ret = ds.BuildOverviews('NEAR', [4]) + ret = ds.BuildOverviews("NEAR", [4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -450,7 +501,7 @@ def test_mem_10(): cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 328 - ret = ds.BuildOverviews('NEAR', [2, 4]) + ret = ds.BuildOverviews("NEAR", [2, 4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -462,7 +513,7 @@ def test_mem_10(): ds.GetRasterBand(1).GetOverview(0).Fill(0) ds.GetRasterBand(1).GetOverview(1).Fill(0) - ret = ds.BuildOverviews('AVERAGE', [2, 4]) + ret = ds.BuildOverviews("AVERAGE", [2, 4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -473,8 +524,8 @@ def test_mem_10(): ds.GetRasterBand(1).GetOverview(0).Fill(0) ds.GetRasterBand(1).GetOverview(1).Fill(0) - ret = ds.BuildOverviews('AVERAGE', [2]) - ret = ds.BuildOverviews('AVERAGE', [4]) + ret = ds.BuildOverviews("AVERAGE", [2]) + ret = ds.BuildOverviews("AVERAGE", [4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -485,8 +536,8 @@ def test_mem_10(): ds = None # Multiple band case - ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/rgbsmall.tif')) - ret = ds.BuildOverviews('NEAR', [2]) + ds = gdal.GetDriverByName("MEM").CreateCopy("", gdal.Open("data/rgbsmall.tif")) + ret = ds.BuildOverviews("NEAR", [2]) assert ret == 0 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 5057 @@ -497,14 +548,15 @@ def test_mem_10(): ds = None # Clean overviews - ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/byte.tif')) - ret = ds.BuildOverviews('NEAR', [2]) + ds = gdal.GetDriverByName("MEM").CreateCopy("", gdal.Open("data/byte.tif")) + ret = ds.BuildOverviews("NEAR", [2]) assert ret == 0 - ret = ds.BuildOverviews('NONE', []) + ret = ds.BuildOverviews("NONE", []) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None + ############################################################################### # Test CreateMaskBand() @@ -512,11 +564,11 @@ def test_mem_10(): def test_mem_11(): # Error case: building overview on a 0 band dataset - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 0) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) != 0 # Per dataset mask on single band dataset - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) == 0 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert not ds.GetRasterBand(1).IsMaskBand() @@ -529,7 +581,7 @@ def test_mem_11(): assert cs == 3 # Check that the per dataset mask is shared by all bands - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) == 0 mask1 = ds.GetRasterBand(1).GetMaskBand() mask1.Fill(255) @@ -538,7 +590,7 @@ def test_mem_11(): assert cs == 3 # Same but call it on band 2 - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) assert ds.GetRasterBand(2).CreateMaskBand(gdal.GMF_PER_DATASET) == 0 mask2 = ds.GetRasterBand(2).GetMaskBand() mask2.Fill(255) @@ -547,7 +599,7 @@ def test_mem_11(): assert cs == 3 # Per band masks - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) assert ds.GetRasterBand(1).CreateMaskBand(0) == 0 assert ds.GetRasterBand(2).CreateMaskBand(0) == 0 mask1 = ds.GetRasterBand(1).GetMaskBand() @@ -557,6 +609,7 @@ def test_mem_11(): cs2 = mask2.Checksum() assert cs1 == 0 and cs2 == 3 + ############################################################################### # Test CreateMaskBand() and overviews. @@ -564,10 +617,10 @@ def test_mem_11(): def test_mem_12(): # Test on per-band mask - ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 2) + ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 2) ds.GetRasterBand(1).CreateMaskBand(0) ds.GetRasterBand(1).GetMaskBand().Fill(127) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) cs = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() assert cs == 267 @@ -576,36 +629,38 @@ def test_mem_12(): assert cs == 283 # Test on per-dataset mask - ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 2) + ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 2) ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetMaskBand().Fill(127) - ds.BuildOverviews('NEAR', [2]) + ds.BuildOverviews("NEAR", [2]) cs = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() assert cs == 267 cs2 = ds.GetRasterBand(2).GetOverview(0).GetMaskBand().Checksum() assert cs2 == cs + ############################################################################### # Check RAT support def test_mem_rat(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) ds.GetRasterBand(1).SetDefaultRAT(gdal.RasterAttributeTable()) assert ds.GetRasterBand(1).GetDefaultRAT() is not None ds.GetRasterBand(1).SetDefaultRAT(None) assert ds.GetRasterBand(1).GetDefaultRAT() is None + ############################################################################### # Check CategoryNames support def test_mem_categorynames(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - ds.GetRasterBand(1).SetCategoryNames(['foo']) - assert ds.GetRasterBand(1).GetCategoryNames() == ['foo'] + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + ds.GetRasterBand(1).SetCategoryNames(["foo"]) + assert ds.GetRasterBand(1).GetCategoryNames() == ["foo"] ds.GetRasterBand(1).SetCategoryNames([]) assert ds.GetRasterBand(1).GetCategoryNames() is None @@ -613,9 +668,10 @@ def test_mem_categorynames(): ############################################################################### # Check ColorTable support + def test_mem_colortable(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ds.GetRasterBand(1).SetColorTable(ct) @@ -627,19 +683,20 @@ def test_mem_colortable(): ############################################################################### # Test dataset RasterIO with non nearest resampling + def test_mem_dataset_rasterio_non_nearest_resampling_source_with_ovr(): - ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 3) + ds = gdal.GetDriverByName("MEM").Create("", 10, 10, 3) ds.GetRasterBand(1).Fill(255) - ds.BuildOverviews('NONE', [2]) + ds.BuildOverviews("NONE", [2]) ds.GetRasterBand(1).GetOverview(0).Fill(10) - got_data = ds.ReadRaster(0,0,10,10,5,5) - got_data = struct.unpack('B' * 5 * 5 * 3, got_data) + got_data = ds.ReadRaster(0, 0, 10, 10, 5, 5) + got_data = struct.unpack("B" * 5 * 5 * 3, got_data) assert got_data[0] == 10 - got_data = ds.ReadRaster(0,0,10,10,5,5,resample_alg=gdal.GRIORA_Cubic) - got_data = struct.unpack('B' * 5 * 5 * 3, got_data) + got_data = ds.ReadRaster(0, 0, 10, 10, 5, 5, resample_alg=gdal.GRIORA_Cubic) + got_data = struct.unpack("B" * 5 * 5 * 3, got_data) assert got_data[0] == 10 @@ -649,7 +706,7 @@ def test_mem_dataset_rasterio_non_nearest_resampling_source_with_ovr(): def test_mem_nodata_int64(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_Int64) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_Int64) val = -(1 << 63) assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None assert ds.GetRasterBand(1).GetNoDataValue() == val @@ -661,8 +718,8 @@ def test_mem_nodata_int64(): def test_mem_nodata_uint64(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_UInt64) - val = (1 << 64)-1 + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1, gdal.GDT_UInt64) + val = (1 << 64) - 1 assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None assert ds.GetRasterBand(1).GetNoDataValue() == val @@ -673,7 +730,7 @@ def test_mem_nodata_uint64(): def test_mem_alpha_ismaskband(): - ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) + ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 2) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) assert not ds.GetRasterBand(1).IsMaskBand() assert ds.GetRasterBand(2).IsMaskBand() @@ -682,8 +739,6 @@ def test_mem_alpha_ismaskband(): ############################################################################### # cleanup + def test_mem_cleanup(): gdaltest.mem_ds = None - - - diff --git a/autotest/gdrivers/memmultidim.py b/autotest/gdrivers/memmultidim.py index cd2a1ca5bcd9..b7a22526423f 100755 --- a/autotest/gdrivers/memmultidim.py +++ b/autotest/gdrivers/memmultidim.py @@ -28,27 +28,27 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr - import array -import gdaltest import math -import pytest import struct +import gdaltest +import pytest + +from osgeo import gdal, osr + def test_mem_md_basic(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") assert ds - assert ds.GetDescription() == 'myds' + assert ds.GetDescription() == "myds" rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' - assert rg.GetFullName() == '/' + assert rg.GetName() == "/" + assert rg.GetFullName() == "/" assert not rg.GetMDArrayNames() assert not rg.GetGroupNames() assert not rg.GetAttributes() @@ -64,75 +64,78 @@ def test_mem_md_basic(): def test_mem_md_subgroup(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() with gdaltest.error_handler(): - assert not rg.CreateGroup('') # unnamed group not supported + assert not rg.CreateGroup("") # unnamed group not supported with pytest.raises(ValueError): assert not rg.CreateGroup(None) - subg = rg.CreateGroup('subgroup') + subg = rg.CreateGroup("subgroup") assert subg - assert subg.GetName() == 'subgroup' - assert subg.GetFullName() == '/subgroup' - assert rg.GetGroupNames() == [ 'subgroup' ] - assert rg.OpenGroup('subgroup').GetName() == 'subgroup' + assert subg.GetName() == "subgroup" + assert subg.GetFullName() == "/subgroup" + assert rg.GetGroupNames() == ["subgroup"] + assert rg.OpenGroup("subgroup").GetName() == "subgroup" - subsubg = subg.CreateGroup('subsubgroup') - assert subsubg.GetFullName() == '/subgroup/subsubgroup' + subsubg = subg.CreateGroup("subsubgroup") + assert subsubg.GetFullName() == "/subgroup/subsubgroup" - subsubg = rg.OpenGroupFromFullname('/subgroup/subsubgroup') + subsubg = rg.OpenGroupFromFullname("/subgroup/subsubgroup") assert subsubg is not None - assert subsubg.GetFullName() == '/subgroup/subsubgroup' + assert subsubg.GetFullName() == "/subgroup/subsubgroup" subg.CreateMDArray("myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) - array = rg.OpenMDArrayFromFullname('/subgroup/myarray') + array = rg.OpenMDArrayFromFullname("/subgroup/myarray") assert array is not None - assert array.GetFullName() == '/subgroup/myarray' + assert array.GetFullName() == "/subgroup/myarray" - copy_ds = drv.CreateCopy('', ds) + copy_ds = drv.CreateCopy("", ds) assert copy_ds copy_rg = copy_ds.GetRootGroup() assert copy_rg - assert copy_rg.GetGroupNames() == [ 'subgroup' ] + assert copy_rg.GetGroupNames() == ["subgroup"] def test_mem_md_array_unnamed_array(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - edt = gdal.ExtendedDataType.Create(gdal.GDT_Byte) + edt = gdal.ExtendedDataType.Create(gdal.GDT_Byte) with gdaltest.error_handler(): assert not rg.CreateMDArray("", [], edt) def test_mem_md_array_duplicated_array_name(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - assert rg.CreateMDArray("same_name", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + assert rg.CreateMDArray( + "same_name", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) with gdaltest.error_handler(): - assert not rg.CreateMDArray("same_name", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + assert not rg.CreateMDArray( + "same_name", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) def test_mem_md_array_nodim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_UInt16) + ) assert myarray - assert myarray.GetName() == 'myarray' - assert myarray.GetFullName() == '/myarray' - assert rg.GetMDArrayNames() == ['myarray'] - assert rg.OpenMDArray('myarray') + assert myarray.GetName() == "myarray" + assert myarray.GetFullName() == "/myarray" + assert rg.GetMDArrayNames() == ["myarray"] + assert rg.OpenMDArray("myarray") assert myarray.GetDimensionCount() == 0 assert myarray.GetTotalElementsCount() == 1 assert not myarray.GetDimensions() @@ -141,19 +144,19 @@ def test_mem_md_array_nodim(): assert myarray.GetDataType().GetNumericDataType() == gdal.GDT_UInt16 got_data = myarray.Read() assert len(got_data) == 2 - assert struct.unpack('H', got_data) == (0, ) - assert myarray.Write(struct.pack('H', 65535)) == gdal.CE_None + assert struct.unpack("H", got_data) == (0,) + assert myarray.Write(struct.pack("H", 65535)) == gdal.CE_None got_data = myarray.Read() assert len(got_data) == 2 - assert struct.unpack('H', got_data) == (65535, ) + assert struct.unpack("H", got_data) == (65535,) assert myarray.AdviseRead() == gdal.CE_None - copy_ds = drv.CreateCopy('', ds) + copy_ds = drv.CreateCopy("", ds) assert copy_ds copy_rg = copy_ds.GetRootGroup() assert copy_rg - copy_myarray = copy_rg.OpenMDArray('myarray') + copy_myarray = copy_rg.OpenMDArray("myarray") assert copy_myarray assert copy_myarray.Read() == got_data @@ -162,72 +165,76 @@ def test_mem_md_array_nodim(): def test_mem_md_array_single_dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dims = rg.GetDimensions() assert len(dims) == 1 - myarray = rg.CreateMDArray("myarray", [ dim ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - assert myarray.GetName() == 'myarray' - assert rg.GetMDArrayNames() == ['myarray'] - assert rg.OpenMDArray('myarray') + assert myarray.GetName() == "myarray" + assert rg.GetMDArrayNames() == ["myarray"] + assert rg.OpenMDArray("myarray") assert myarray.GetDimensionCount() == 1 assert myarray.GetTotalElementsCount() == 2 got_dims = myarray.GetDimensions() assert len(got_dims) == 1 - assert myarray.shape == (2, ) - assert got_dims[0].GetName() == 'dim0' - assert got_dims[0].GetType() == 'unspecified type' - assert got_dims[0].GetDirection() == 'unspecified direction' + assert myarray.shape == (2,) + assert got_dims[0].GetName() == "dim0" + assert got_dims[0].GetType() == "unspecified type" + assert got_dims[0].GetDirection() == "unspecified direction" assert got_dims[0].GetSize() == 2 got_data = myarray.Read() assert len(got_data) == 2 - assert struct.unpack('B' * 2, got_data) == (0, 0) + assert struct.unpack("B" * 2, got_data) == (0, 0) # Test writing a list with only integer values assert myarray.Write([0, 1]) == gdal.CE_None - assert struct.unpack('B' * 2, myarray.Read()) == (0, 1) + assert struct.unpack("B" * 2, myarray.Read()) == (0, 1) # Unsupported type in list with pytest.raises(Exception): - myarray.Write([0, 'aa']) + myarray.Write([0, "aa"]) # Test writing a list with a mix of int and double assert myarray.Write([0, 2.1]) == gdal.CE_None - assert struct.unpack('B' * 2, myarray.Read()) == (0, 2) + assert struct.unpack("B" * 2, myarray.Read()) == (0, 2) # Test writing a list with only double values assert myarray.Write([1.0, 2.1]) == gdal.CE_None - assert struct.unpack('B' * 2, myarray.Read()) == (1, 2) + assert struct.unpack("B" * 2, myarray.Read()) == (1, 2) # Test writing a list with only integer values, but one out of int32 range assert myarray.Write([1, 1 << 31]) == gdal.CE_None - assert struct.unpack('B' * 2, myarray.Read()) == (1, 255) + assert struct.unpack("B" * 2, myarray.Read()) == (1, 255) # Test writing a array - for typecode, in_ar, out_tuple in [ ('B', [1, 2], (1, 2)), - ('h', [-32768, 32767], (0, 255)), - ('H', [0, 65535], (0, 255)), - ('i', [-(1<<31), (1<<31)-1], (0, 255)), - ('I', [0, (1<<32)-1], (0, 255)), - ('f', [1.0, 2.1], (1, 2)), - ('d', [2.0, 3.1], (2, 3)) ]: + for typecode, in_ar, out_tuple in [ + ("B", [1, 2], (1, 2)), + ("h", [-32768, 32767], (0, 255)), + ("H", [0, 65535], (0, 255)), + ("i", [-(1 << 31), (1 << 31) - 1], (0, 255)), + ("I", [0, (1 << 32) - 1], (0, 255)), + ("f", [1.0, 2.1], (1, 2)), + ("d", [2.0, 3.1], (2, 3)), + ]: assert myarray.Write(array.array(typecode, in_ar)) == gdal.CE_None - assert struct.unpack('B' * 2, myarray.Read()) == out_tuple + assert struct.unpack("B" * 2, myarray.Read()) == out_tuple # Unsupported array type with pytest.raises(Exception): - myarray.Write(array.array('b', [1, 2])) + myarray.Write(array.array("b", [1, 2])) assert myarray.AdviseRead() == gdal.CE_None - attr = myarray.CreateAttribute('attr', [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + attr = myarray.CreateAttribute( + "attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert attr - assert attr.GetFullName() == '/myarray/attr' + assert attr.GetFullName() == "/myarray/attr" assert myarray.GetNoDataValueAsDouble() is None assert myarray.SetNoDataValueDouble(1) == gdal.CE_None @@ -236,10 +243,10 @@ def test_mem_md_array_single_dim(): assert myarray.GetNoDataValueAsUInt64() == 1 assert myarray.SetNoDataValue(1) == gdal.CE_None assert myarray.GetNoDataValue() == 1 - assert myarray.SetNoDataValueRaw(struct.pack('B', 127)) == gdal.CE_None + assert myarray.SetNoDataValueRaw(struct.pack("B", 127)) == gdal.CE_None with gdaltest.error_handler(): - assert myarray.SetNoDataValueRaw(struct.pack('h', 127)) != gdal.CE_None - assert struct.unpack('B', myarray.GetNoDataValueAsRaw()) == (127,) + assert myarray.SetNoDataValueRaw(struct.pack("h", 127)) != gdal.CE_None + assert struct.unpack("B", myarray.GetNoDataValueAsRaw()) == (127,) assert myarray.GetScale() is None assert myarray.GetOffset() is None @@ -249,13 +256,13 @@ def test_mem_md_array_single_dim(): assert myarray.SetScale(2.5) == gdal.CE_None assert myarray.GetScale() == 2.5 assert myarray.GetScaleStorageType() == gdal.GDT_Unknown - assert myarray.SetScale(2.5, storageType = gdal.GDT_Float32) == gdal.CE_None + assert myarray.SetScale(2.5, storageType=gdal.GDT_Float32) == gdal.CE_None assert myarray.GetScaleStorageType() == gdal.GDT_Float32 assert myarray.SetOffset(1.5) == gdal.CE_None assert myarray.GetOffset() == 1.5 assert myarray.GetOffsetStorageType() == gdal.GDT_Unknown - assert myarray.SetOffset(1.5, storageType = gdal.GDT_Float32) == gdal.CE_None + assert myarray.SetOffset(1.5, storageType=gdal.GDT_Float32) == gdal.CE_None assert myarray.GetOffsetStorageType() == gdal.GDT_Float32 def my_cbk(pct, _, arg): @@ -265,14 +272,13 @@ def my_cbk(pct, _, arg): got_data = myarray.Read() - tab = [ 0 ] - copy_ds = drv.CreateCopy('', ds, callback = my_cbk, - callback_data = tab) + tab = [0] + copy_ds = drv.CreateCopy("", ds, callback=my_cbk, callback_data=tab) assert tab[0] == 1 assert copy_ds copy_rg = copy_ds.GetRootGroup() assert copy_rg - copy_myarray = copy_rg.OpenMDArray('myarray') + copy_myarray = copy_rg.OpenMDArray("myarray") assert copy_myarray assert copy_myarray.Read() == got_data assert copy_myarray.GetNoDataValueAsRaw() == myarray.GetNoDataValueAsRaw() @@ -282,36 +288,35 @@ def my_cbk(pct, _, arg): with gdaltest.error_handler(): assert myarray.GetNoDataValueAsString() is None - assert myarray.SetUnit('foo') == gdal.CE_None - assert myarray.GetUnit() == 'foo' - + assert myarray.SetUnit("foo") == gdal.CE_None + assert myarray.GetUnit() == "foo" def test_mem_md_array_string(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) - var = rg.CreateMDArray('var', [dim], gdal.ExtendedDataType.CreateString()) + var = rg.CreateMDArray("var", [dim], gdal.ExtendedDataType.CreateString()) assert var assert var.Read() == [None, None] - assert var.Write(['', '0123456789']) == gdal.CE_None + assert var.Write(["", "0123456789"]) == gdal.CE_None assert var.GetNoDataValueAsString() is None assert var.SetNoDataValueString(None) == gdal.CE_None assert var.GetNoDataValueAsString() is None - assert var.SetNoDataValueString('123') == gdal.CE_None - assert var.GetNoDataValueAsString() == '123' - var = rg.OpenMDArray('var') + assert var.SetNoDataValueString("123") == gdal.CE_None + assert var.GetNoDataValueAsString() == "123" + var = rg.OpenMDArray("var") assert var - assert var.Read() == ['', '0123456789'] + assert var.Read() == ["", "0123456789"] def test_mem_md_datatypes(): dt_byte = gdal.ExtendedDataType.Create(gdal.GDT_Byte) assert dt_byte.GetClass() == gdal.GEDTC_NUMERIC - assert dt_byte.GetName() == '' + assert dt_byte.GetName() == "" assert dt_byte.GetNumericDataType() == gdal.GDT_Byte assert dt_byte.GetSize() == 1 assert dt_byte.CanConvertTo(dt_byte) @@ -326,7 +331,7 @@ def test_mem_md_datatypes(): dt_cint32 = gdal.ExtendedDataType.Create(gdal.GDT_CInt32) assert dt_cint32.GetClass() == gdal.GEDTC_NUMERIC - assert dt_cint32.GetName() == '' + assert dt_cint32.GetName() == "" assert dt_cint32.GetNumericDataType() == gdal.GDT_CInt32 assert dt_cint32.GetSize() == 2 * 4 assert dt_cint32.CanConvertTo(dt_cint32) @@ -337,9 +342,9 @@ def test_mem_md_datatypes(): dt_string = gdal.ExtendedDataType.CreateString() assert dt_string.GetClass() == gdal.GEDTC_STRING - assert dt_string.GetName() == '' + assert dt_string.GetName() == "" assert dt_string.GetNumericDataType() == gdal.GDT_Unknown - assert dt_string.GetSize() in (4, 8) # depends on 32 vs 64 build + assert dt_string.GetSize() in (4, 8) # depends on 32 vs 64 build assert dt_string.GetMaxStringLength() == 0 assert dt_string.CanConvertTo(dt_string) assert dt_string.Equals(dt_string) @@ -350,24 +355,31 @@ def test_mem_md_datatypes(): dt_string_limited_size = gdal.ExtendedDataType.CreateString(10) assert dt_string_limited_size.GetMaxStringLength() == 10 - comp0 = gdal.EDTComponent.Create('x', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - comp1 = gdal.EDTComponent.Create('y', 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + comp0 = gdal.EDTComponent.Create( + "x", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16) + ) + comp1 = gdal.EDTComponent.Create( + "y", 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) with gdaltest.error_handler(): assert gdal.ExtendedDataType.CreateCompound("mytype", 8, []) is None - assert gdal.ExtendedDataType.CreateCompound("mytype", 2000 * 1000 * 1000, [comp0]) is None + assert ( + gdal.ExtendedDataType.CreateCompound("mytype", 2000 * 1000 * 1000, [comp0]) + is None + ) compound_dt = gdal.ExtendedDataType.CreateCompound("mytype", 8, [comp0, comp1]) assert compound_dt.GetClass() == gdal.GEDTC_COMPOUND - assert compound_dt.GetName() == 'mytype' + assert compound_dt.GetName() == "mytype" assert compound_dt.GetNumericDataType() == gdal.GDT_Unknown assert compound_dt.GetSize() == 8 comps = compound_dt.GetComponents() assert len(comps) == 2 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int16 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int32 assert compound_dt.CanConvertTo(compound_dt) @@ -380,7 +392,9 @@ def test_mem_md_datatypes(): assert not gdal.ExtendedDataType.CreateCompound("mytype", 7, [comp0, comp1]) # Too big size - assert not gdal.ExtendedDataType.CreateCompound("mytype", 1 << 30, [comp0, comp1]) + assert not gdal.ExtendedDataType.CreateCompound( + "mytype", 1 << 30, [comp0, comp1] + ) # Wrongly ordered assert not gdal.ExtendedDataType.CreateCompound("mytype", 8, [comp1, comp0]) @@ -397,36 +411,50 @@ def test_mem_md_datatypes(): def test_mem_md_array_compoundtype(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", None, None, 2) - comp0 = gdal.EDTComponent.Create('x', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - comp1 = gdal.EDTComponent.Create('y', 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + comp0 = gdal.EDTComponent.Create( + "x", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16) + ) + comp1 = gdal.EDTComponent.Create( + "y", 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) dt = gdal.ExtendedDataType.CreateCompound("mytype", 8, [comp0, comp1]) - myarray = rg.CreateMDArray("myarray", [ dim ], dt) + myarray = rg.CreateMDArray("myarray", [dim], dt) assert myarray dt = myarray.GetDataType() - assert dt.GetName() == 'mytype' + assert dt.GetName() == "mytype" assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 8 comps = dt.GetComponents() assert len(comps) == 2 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int16 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int32 - assert myarray.Write(struct.pack('hi' * 2, 32767, 1000000, -32768, -1000000)) == gdal.CE_None - assert struct.unpack('hi' * 2, myarray.Read()) == (32767, 1000000, -32768, -1000000) - - extract_compound_dt = gdal.ExtendedDataType.CreateCompound("mytype", 4, - [gdal.EDTComponent.Create('y', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32))]) - got_data = myarray.Read(buffer_datatype = extract_compound_dt) + assert ( + myarray.Write(struct.pack("hi" * 2, 32767, 1000000, -32768, -1000000)) + == gdal.CE_None + ) + assert struct.unpack("hi" * 2, myarray.Read()) == (32767, 1000000, -32768, -1000000) + + extract_compound_dt = gdal.ExtendedDataType.CreateCompound( + "mytype", + 4, + [ + gdal.EDTComponent.Create( + "y", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) + ], + ) + got_data = myarray.Read(buffer_datatype=extract_compound_dt) assert len(got_data) == 8 - assert struct.unpack('i' * 2, got_data) == (1000000, -1000000) + assert struct.unpack("i" * 2, got_data) == (1000000, -1000000) with gdaltest.error_handler(): assert not myarray.GetView('["z') @@ -448,7 +476,7 @@ def test_mem_md_array_compoundtype(): assert myarray.SetUnit("foo") == gdal.CE_None assert myarray.SetScale(1) == gdal.CE_None assert myarray.SetOffset(2) == gdal.CE_None - assert myarray.SetNoDataValueRaw(struct.pack('hi', 32767, 1000000)) == gdal.CE_None + assert myarray.SetNoDataValueRaw(struct.pack("hi", 32767, 1000000)) == gdal.CE_None sr = osr.SpatialReference() sr.ImportFromEPSG(32631) assert myarray.SetSpatialRef(sr) == gdal.CE_None @@ -456,12 +484,12 @@ def test_mem_md_array_compoundtype(): assert y_ar.GetUnit() == myarray.GetUnit() assert y_ar.GetScale() == myarray.GetScale() assert y_ar.GetOffset() == myarray.GetOffset() - assert y_ar.GetNoDataValueAsRaw() == struct.pack('i', 1000000) + assert y_ar.GetNoDataValueAsRaw() == struct.pack("i", 1000000) assert y_ar.GetSpatialRef().IsSame(myarray.GetSpatialRef()) got_data = y_ar.Read() assert len(got_data) == 8 - assert struct.unpack('i' * 2, got_data) == (1000000, -1000000) + assert struct.unpack("i" * 2, got_data) == (1000000, -1000000) with gdaltest.error_handler(): assert not y_ar.GetView('["y"]') @@ -471,27 +499,29 @@ def test_mem_md_array_compoundtype(): y_ar = myarray["y"][1] got_data = y_ar.Read() assert len(got_data) == 4 - assert struct.unpack('i' * 1, got_data) == (-1000000,) + assert struct.unpack("i" * 1, got_data) == (-1000000,) y_ar = myarray[1]["y"] got_data = y_ar.Read() assert len(got_data) == 4 - assert struct.unpack('i' * 1, got_data) == (-1000000,) + assert struct.unpack("i" * 1, got_data) == (-1000000,) + def test_mem_md_array_3_dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) dim2 = rg.CreateDimension("dim2", None, None, 4) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2 ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - assert myarray.GetName() == 'myarray' - assert rg.GetMDArrayNames() == ['myarray'] - assert rg.OpenMDArray('myarray') + assert myarray.GetName() == "myarray" + assert rg.GetMDArrayNames() == ["myarray"] + assert rg.OpenMDArray("myarray") assert myarray.GetDimensionCount() == 3 assert myarray.GetTotalElementsCount() == 24 assert myarray.shape == (2, 3, 4) @@ -503,73 +533,101 @@ def test_mem_md_array_3_dim(): assert myarray.SetSpatialRef(sr) == gdal.CE_None assert myarray.GetSpatialRef() is not None - data = array.array('B', list(range(24))).tobytes() + data = array.array("B", list(range(24))).tobytes() assert myarray.Write(data) == gdal.CE_None got_data = myarray.Read() assert got_data == data - got_data = myarray.Read([0,0,0],[2,3,4],[1,1,1],[12,4,1], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + got_data = myarray.Read( + [0, 0, 0], + [2, 3, 4], + [1, 1, 1], + [12, 4, 1], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ) assert got_data == data - data = myarray.Read(array_start_idx = [1, 0, 2], count = [1, 2, 2], array_step = [1, 2, 1]) - assert struct.unpack('B' * len(data), data) == (14, 15, 22, 23) + data = myarray.Read( + array_start_idx=[1, 0, 2], count=[1, 2, 2], array_step=[1, 2, 1] + ) + assert struct.unpack("B" * len(data), data) == (14, 15, 22, 23) - data = myarray.Read(array_start_idx = [1, 0, 3], count = [1, 2, 2], array_step = [1, 2, -1]) - assert struct.unpack('B' * len(data), data) == (15, 14, 23, 22) + data = myarray.Read( + array_start_idx=[1, 0, 3], count=[1, 2, 2], array_step=[1, 2, -1] + ) + assert struct.unpack("B" * len(data), data) == (15, 14, 23, 22) - data = struct.pack('d' * 1, 25.0) + data = struct.pack("d" * 1, 25.0) float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) - assert myarray.Write(data, [1,2,3],[1,1,1], buffer_datatype = float64dt) == gdal.CE_None + assert ( + myarray.Write(data, [1, 2, 3], [1, 1, 1], buffer_datatype=float64dt) + == gdal.CE_None + ) - got_data = myarray.Read([1,2,3],[1,1,1], buffer_datatype = float64dt) - got_data = struct.unpack('d' * 1, got_data)[0] + got_data = myarray.Read([1, 2, 3], [1, 1, 1], buffer_datatype=float64dt) + got_data = struct.unpack("d" * 1, got_data)[0] assert got_data == 25.0 def test_mem_md_array_4_dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) dim2 = rg.CreateDimension("dim2", None, None, 4) dim3 = rg.CreateDimension("dim3", None, None, 5) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2, dim3 ], - gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + myarray = rg.CreateMDArray( + "myarray", + [dim0, dim1, dim2, dim3], + gdal.ExtendedDataType.Create(gdal.GDT_Int16), + ) assert myarray - assert myarray.GetName() == 'myarray' - assert rg.GetMDArrayNames() == ['myarray'] - assert rg.OpenMDArray('myarray') + assert myarray.GetName() == "myarray" + assert rg.GetMDArrayNames() == ["myarray"] + assert rg.OpenMDArray("myarray") assert myarray.GetDimensionCount() == 4 assert myarray.GetTotalElementsCount() == 2 * 3 * 4 * 5 - data = array.array('h', [-i for i in range(2 * 3 * 4 * 5)]).tobytes() + data = array.array("h", [-i for i in range(2 * 3 * 4 * 5)]).tobytes() assert myarray.Write(data) == gdal.CE_None got_data = myarray.Read() assert got_data == data - data = myarray.Read(array_start_idx = [1, 0, 2, 3], count = [1, 2, 2, 2], array_step = [1, 2, 1, 1]) - assert struct.unpack('h' * (len(data)//2), data) == (-73, -74, -78, -79, -113, -114, -118, -119) + data = myarray.Read( + array_start_idx=[1, 0, 2, 3], count=[1, 2, 2, 2], array_step=[1, 2, 1, 1] + ) + assert struct.unpack("h" * (len(data) // 2), data) == ( + -73, + -74, + -78, + -79, + -113, + -114, + -118, + -119, + ) def test_mem_md_copy_array(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 20) dim1 = rg.CreateDimension("dim1", None, None, 30) dim2 = rg.CreateDimension("dim2", None, None, 10) dim3 = rg.CreateDimension("dim3", None, None, 51) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2, dim3 ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt32)) + myarray = rg.CreateMDArray( + "myarray", + [dim0, dim1, dim2, dim3], + gdal.ExtendedDataType.Create(gdal.GDT_UInt32), + ) - data = array.array('I', - list(range(myarray.GetTotalElementsCount()))).tobytes() + data = array.array("I", list(range(myarray.GetTotalElementsCount()))).tobytes() assert myarray.Write(data) == gdal.CE_None def my_cbk(pct, _, arg): @@ -577,89 +635,92 @@ def my_cbk(pct, _, arg): tab[0] = pct return 1 - tab = [ 0 ] - with gdaltest.config_option('GDAL_SWATH_SIZE', str(100* 1000)): - copy_ds = drv.CreateCopy('', ds, callback = my_cbk, - callback_data = tab) + tab = [0] + with gdaltest.config_option("GDAL_SWATH_SIZE", str(100 * 1000)): + copy_ds = drv.CreateCopy("", ds, callback=my_cbk, callback_data=tab) assert tab[0] == 1 assert copy_ds copy_rg = copy_ds.GetRootGroup() assert copy_rg - copy_myarray = copy_rg.OpenMDArray('myarray') + copy_myarray = copy_rg.OpenMDArray("myarray") assert copy_myarray assert copy_myarray.Read() == data def test_mem_md_array_read_write_errors(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) dim2 = rg.CreateDimension("dim2", None, None, 4) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2 ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - assert myarray.Read([0,0,0],[1,1,1],[1,1,1],[0,0,0]) + assert myarray.Read([0, 0, 0], [1, 1, 1], [1, 1, 1], [0, 0, 0]) with gdaltest.error_handler(): # Invalid number of values in array_idx array - assert not myarray.Read([0,0],[1,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([0, 0], [1, 1, 1], [1, 1, 1], [0, 0, 0]) # Invalid number of values in count array - assert not myarray.Read([0,0,0],[1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [1, 1], [1, 1, 1], [0, 0, 0]) # Invalid number of values in step array - assert not myarray.Read([0,0,0],[1,1,1],[1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [1, 1, 1], [1, 1], [0, 0, 0]) # Invalid number of values in buffer_stride array - assert not myarray.Read([0,0,0],[1,1,1],[1,1,1],[0,0]) + assert not myarray.Read([0, 0, 0], [1, 1, 1], [1, 1, 1], [0, 0]) # Invalid start_index[0] - assert not myarray.Read([-1,0,0],[1,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([-1, 0, 0], [1, 1, 1], [1, 1, 1], [0, 0, 0]) # Invalid start_index[0] - assert not myarray.Read([2,0,0],[1,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([2, 0, 0], [1, 1, 1], [1, 1, 1], [0, 0, 0]) # Invalid count[0] - assert not myarray.Read([0,0,0],[-1,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [-1, 1, 1], [1, 1, 1], [0, 0, 0]) # Invalid count[0] - assert not myarray.Read([0,0,0],[0,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 0]) # Invalid count[0] - assert not myarray.Read([0,0,0],[3,1,1],[1,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [3, 1, 1], [1, 1, 1], [0, 0, 0]) # start_idx[0] + (count[0]-1) * step[0] >= dim[0].size - assert not myarray.Read([0,0,0],[2,1,1],[2,1,1],[0,0,0]) - assert not myarray.Read([0,0,0],[2<<50,1,1],[2<<50,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [2, 1, 1], [2, 1, 1], [0, 0, 0]) + assert not myarray.Read([0, 0, 0], [2 << 50, 1, 1], [2 << 50, 1, 1], [0, 0, 0]) # Overflow with step[0] - assert not myarray.Read([0,0,0],[2,1,1],[-(1<<63),1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [2, 1, 1], [-(1 << 63), 1, 1], [0, 0, 0]) # start_idx[0] + (count[0]-1) * step[0] < 0 - assert not myarray.Read([0,0,0],[2,1,1],[-1,1,1],[0,0,0]) - assert not myarray.Read([0,0,0],[2,1,1],[-2<<50,1,1],[0,0,0]) + assert not myarray.Read([0, 0, 0], [2, 1, 1], [-1, 1, 1], [0, 0, 0]) + assert not myarray.Read([0, 0, 0], [2, 1, 1], [-2 << 50, 1, 1], [0, 0, 0]) # Too big stride - assert not myarray.Read([1,0,0],[2,1,1],[1,1,1],[(1 << 63)-1,0,0]) + assert not myarray.Read([1, 0, 0], [2, 1, 1], [1, 1, 1], [(1 << 63) - 1, 0, 0]) # Negative stride not supported in SWIG bindings - assert not myarray.Read([0,0,0],[1,1,1],[1,1,1],[-1,0,0]) + assert not myarray.Read([0, 0, 0], [1, 1, 1], [1, 1, 1], [-1, 0, 0]) - data = struct.pack('d' * 1, 25.0) + data = struct.pack("d" * 1, 25.0) float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) with gdaltest.error_handler(): - assert myarray.Write('', [1,2,3],[1,1,1]) == gdal.CE_Failure - assert myarray.Write(data[0:7], [1,2,3],[1,1,1], buffer_datatype = float64dt) == gdal.CE_Failure + assert myarray.Write("", [1, 2, 3], [1, 1, 1]) == gdal.CE_Failure + assert ( + myarray.Write(data[0:7], [1, 2, 3], [1, 1, 1], buffer_datatype=float64dt) + == gdal.CE_Failure + ) def test_mem_md_invalid_dims(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() assert rg.CreateDimension("dim1", None, None, 1) with gdaltest.error_handler(): @@ -671,8 +732,8 @@ def test_mem_md_invalid_dims(): def test_mem_md_array_invalid_args(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() edt = gdal.ExtendedDataType.Create(gdal.GDT_Byte) dim = rg.CreateDimension("dim0", None, None, 1) @@ -690,39 +751,42 @@ def test_mem_md_array_invalid_args(): def test_mem_md_array_too_large(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - dim = rg.CreateDimension("dim0", None, None, (1 << 64)-1) + dim = rg.CreateDimension("dim0", None, None, (1 << 64) - 1) with gdaltest.error_handler(): - assert not rg.CreateMDArray("myarray", [dim], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + assert not rg.CreateMDArray( + "myarray", [dim], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) def test_mem_md_array_too_large_overflow_dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 1 << 25) dim1 = rg.CreateDimension("dim1", None, None, 1 << 25) dim2 = rg.CreateDimension("dim2", None, None, 1 << 25) with gdaltest.error_handler(): - assert not rg.CreateMDArray("myarray", [dim0, dim1, dim2], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + assert not rg.CreateMDArray( + "myarray", [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) def test_mem_md_array_30dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dims = [] for i in range(30): dim = rg.CreateDimension("dim%d" % i, None, None, 1 + (i % 2)) dims.append(dim) - myarray = rg.CreateMDArray("myarray", dims, - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", dims, gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray assert myarray.GetDimensionCount() == 30 assert myarray.GetTotalElementsCount() == 2**15 @@ -732,49 +796,50 @@ def test_mem_md_array_30dim(): def test_mem_md_array_32dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dims = [] for i in range(32): dim = rg.CreateDimension("dim%d" % i, None, None, 1 + (i % 2)) dims.append(dim) - myarray = rg.CreateMDArray("myarray", dims, - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", dims, gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert len(myarray.Read()) == 2**16 def test_mem_md_group_attribute_single_numeric(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) with gdaltest.error_handler(): - assert not rg.CreateAttribute('', [1], float64dt) # unnamed attr not supported + assert not rg.CreateAttribute("", [1], float64dt) # unnamed attr not supported with pytest.raises(ValueError): assert not rg.CreateAttribute(None, [1], float64dt) - attr = rg.CreateAttribute('attr', [1], float64dt) + attr = rg.CreateAttribute("attr", [1], float64dt) assert attr - assert attr.GetName() == 'attr' - assert rg.GetAttribute('attr').GetName() == 'attr' - assert rg.GetAttributes()[0].GetName() == 'attr' + assert attr.GetName() == "attr" + assert rg.GetAttribute("attr").GetName() == "attr" + assert rg.GetAttributes()[0].GetName() == "attr" assert attr.GetDimensionsSize() == [1] assert attr.GetTotalElementsCount() == 1 assert attr.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert attr.Read() == 0.0 - assert attr.ReadAsString() == '0' + assert attr.ReadAsString() == "0" assert attr.Write(1) == gdal.CE_None assert attr.Read() == 1 assert attr.Write(1.25) == gdal.CE_None assert attr.Read() == 1.25 assert attr.ReadAsDouble() == 1.25 assert attr.ReadAsDoubleArray() == (1.25,) - assert attr.ReadAsString() == '1.25' - assert attr.ReadAsStringArray() == ['1.25'] + assert attr.ReadAsString() == "1.25" + assert attr.ReadAsStringArray() == ["1.25"] assert attr.Write([2]) == gdal.CE_None assert attr.Read() == 2 assert attr.Write([2.25]) == gdal.CE_None @@ -786,122 +851,128 @@ def test_mem_md_group_attribute_single_numeric(): def test_mem_md_group_attribute_multiple_numeric(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) - attr = rg.CreateAttribute('attr', [2,3], float64dt) + attr = rg.CreateAttribute("attr", [2, 3], float64dt) assert attr - assert attr.GetFullName() == '/_GLOBAL_/attr' - assert attr.GetDimensionsSize() == [2,3] + assert attr.GetFullName() == "/_GLOBAL_/attr" + assert attr.GetDimensionsSize() == [2, 3] assert attr.GetTotalElementsCount() == 6 assert attr.Read() == (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) - assert attr.Write([1.1,2,3,4,5,6]) == gdal.CE_None - assert attr.Read() == (1.1,2,3,4,5,6) - assert attr.ReadAsIntArray() == (1,2,3,4,5,6) + assert attr.Write([1.1, 2, 3, 4, 5, 6]) == gdal.CE_None + assert attr.Read() == (1.1, 2, 3, 4, 5, 6) + assert attr.ReadAsIntArray() == (1, 2, 3, 4, 5, 6) assert attr.ReadAsInt() == 1 assert attr.ReadAsDouble() == 1.1 - subg = rg.CreateGroup('subgroup') - attr = subg.CreateAttribute('attr', [2,3], float64dt) + subg = rg.CreateGroup("subgroup") + attr = subg.CreateAttribute("attr", [2, 3], float64dt) assert attr - assert attr.GetFullName() == '/subgroup/_GLOBAL_/attr' + assert attr.GetFullName() == "/subgroup/_GLOBAL_/attr" def test_mem_md_group_attribute_single_string(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - attr = rg.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) + attr = rg.CreateAttribute("attr", [1], gdal.ExtendedDataType.CreateString()) assert attr assert attr.Read() is None - assert attr.ReadAsStringArray() == [''] - assert attr.Write('foo') == gdal.CE_None - assert attr.Read() == 'foo' - assert attr.ReadAsStringArray() == ['foo'] - assert attr.Write(['bar']) == gdal.CE_None - assert attr.Read() == 'bar' + assert attr.ReadAsStringArray() == [""] + assert attr.Write("foo") == gdal.CE_None + assert attr.Read() == "foo" + assert attr.ReadAsStringArray() == ["foo"] + assert attr.Write(["bar"]) == gdal.CE_None + assert attr.Read() == "bar" def test_mem_md_group_attribute_string_json(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - attr = rg.CreateAttribute('attr', [], gdal.ExtendedDataType.CreateString(0, gdal.GEDTST_JSON)) + attr = rg.CreateAttribute( + "attr", [], gdal.ExtendedDataType.CreateString(0, gdal.GEDTST_JSON) + ) assert attr assert attr.GetDataType().GetSubType() == gdal.GEDTST_JSON assert attr.Read() is None - assert attr.Write({"foo":"bar"}) == gdal.CE_None - assert attr.Read() == {"foo" : "bar"} + assert attr.Write({"foo": "bar"}) == gdal.CE_None + assert attr.Read() == {"foo": "bar"} def test_mem_md_group_attribute_multiple_string(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - attr = rg.CreateAttribute('attr', [2,3], gdal.ExtendedDataType.CreateString()) + attr = rg.CreateAttribute("attr", [2, 3], gdal.ExtendedDataType.CreateString()) assert attr - assert attr.GetDimensionsSize() == [2,3] + assert attr.GetDimensionsSize() == [2, 3] assert attr.GetTotalElementsCount() == 6 - assert attr.Read() == ['', '', '', '', '', ''] - assert attr.Write(['foo','bar','baz','FOO','BAR','BAZ']) == gdal.CE_None - assert attr.Read() == ['foo','bar','baz','FOO','BAR','BAZ'] + assert attr.Read() == ["", "", "", "", "", ""] + assert attr.Write(["foo", "bar", "baz", "FOO", "BAR", "BAZ"]) == gdal.CE_None + assert attr.Read() == ["foo", "bar", "baz", "FOO", "BAR", "BAZ"] def test_mem_md_array_attribute(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) with gdaltest.error_handler(): - assert not myarray.CreateAttribute('', [1], float64dt) # unnamed attr not supported + assert not myarray.CreateAttribute( + "", [1], float64dt + ) # unnamed attr not supported with pytest.raises(ValueError): assert not myarray.CreateAttribute(None, [1], float64dt) - attr = myarray.CreateAttribute('attr', [1], float64dt) + attr = myarray.CreateAttribute("attr", [1], float64dt) assert attr - assert attr.GetName() == 'attr' - assert myarray.GetAttribute('attr').GetName() == 'attr' - assert myarray.GetAttributes()[0].GetName() == 'attr' + assert attr.GetName() == "attr" + assert myarray.GetAttribute("attr").GetName() == "attr" + assert myarray.GetAttributes()[0].GetName() == "attr" assert not myarray.GetAttribute("not existing") def test_mem_md_array_slice(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim_2 = rg.CreateDimension("dim_2", None, None, 2) dim_3 = rg.CreateDimension("dim_3", None, None, 3) dim_4 = rg.CreateDimension("dim_4", None, None, 4) - ar = rg.CreateMDArray("nodim", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) - assert ar.Write(struct.pack('B', 1)) == gdal.CE_None + ar = rg.CreateMDArray("nodim", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + assert ar.Write(struct.pack("B", 1)) == gdal.CE_None with gdaltest.error_handler(): assert not ar[:] - ar = rg.CreateMDArray("array", [dim_2, dim_3, dim_4], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) - data = array.array('B', list(range(24))).tobytes() + ar = rg.CreateMDArray( + "array", [dim_2, dim_3, dim_4], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) + data = array.array("B", list(range(24))).tobytes() assert ar.Write(data) == gdal.CE_None with pytest.raises(Exception): ar.GetView(None) - attr = ar.CreateAttribute('attr', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = ar.CreateAttribute( + "attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert attr.Write(1) == gdal.CE_None with gdaltest.error_handler(): @@ -917,62 +988,60 @@ def test_mem_md_array_slice(): assert not ar.GetView("[...,0,...]") assert not ar.GetView("[-3]") assert not ar.GetView("[2]") - assert not ar.GetView('[::0]') - assert not ar.GetView('[0:0:1]') - assert not ar.GetView('[1:1:1]') - assert not ar.GetView('[1:1:-1]') - assert not ar.GetView('[0,0,0][:]') + assert not ar.GetView("[::0]") + assert not ar.GetView("[0:0:1]") + assert not ar.GetView("[1:1:1]") + assert not ar.GetView("[1:1:-1]") + assert not ar.GetView("[0,0,0][:]") sliced_ar = ar[1] assert sliced_ar - assert sliced_ar.GetAttribute('attr') is not None + assert sliced_ar.GetAttribute("attr") is not None assert len(sliced_ar.GetAttributes()) == 1 assert sliced_ar.GetBlockSize() == ar.GetBlockSize()[1:] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - 1 assert sliced_ar.GetDataType() == ar.GetDataType() dims = sliced_ar.GetDimensions() - assert dims[0].GetName() == 'dim_3' - assert dims[1].GetName() == 'dim_4' - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 0, 0], count = [1, 3, 4]) + assert dims[0].GetName() == "dim_3" + assert dims[1].GetName() == "dim_4" + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 0, 0], count=[1, 3, 4]) - sliced_ar = ar[1,2,3] + sliced_ar = ar[1, 2, 3] assert sliced_ar.GetDimensionCount() == 0 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 2, 3], count = [1, 1, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 2, 3], count=[1, 1, 1]) - sliced_ar = ar[1,'newaxis',2,3] + sliced_ar = ar[1, "newaxis", 2, 3] assert sliced_ar.GetDimensionCount() == 1 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 2, 3], count = [1, 1, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 2, 3], count=[1, 1, 1]) try: import numpy as np - sliced_ar = ar[1,np.newaxis,2,3] + + sliced_ar = ar[1, np.newaxis, 2, 3] assert sliced_ar.GetDimensionCount() == 1 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 2, 3], count = [1, 1, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 2, 3], count=[1, 1, 1]) except ImportError: pass sliced_ar = ar[1][2][3] assert sliced_ar.GetDimensionCount() == 0 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 2, 3], count = [1, 1, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 2, 3], count=[1, 1, 1]) - sliced_ar = ar.GetView('[1][2][3]') + sliced_ar = ar.GetView("[1][2][3]") assert sliced_ar.GetDimensionCount() == 0 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 2, 3], count = [1, 1, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 2, 3], count=[1, 1, 1]) orig_data = sliced_ar.Read() - assert sliced_ar.Write(struct.pack('B', 123)) == gdal.CE_None - assert struct.unpack('B', sliced_ar.Read()) == (123, ) + assert sliced_ar.Write(struct.pack("B", 123)) == gdal.CE_None + assert struct.unpack("B", sliced_ar.Read()) == (123,) assert sliced_ar.Write(orig_data) == gdal.CE_None sliced_ar = ar[...] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() assert sliced_ar.Read() == ar.Read() - assert sliced_ar.Read(array_start_idx = [1, 0, 0], - count = [1, 3, 2], - array_step = [1, 1, 2]) == \ - ar.Read(array_start_idx = [1, 0, 0], - count = [1, 3, 2], - array_step = [1, 1, 2]) + assert sliced_ar.Read( + array_start_idx=[1, 0, 0], count=[1, 3, 2], array_step=[1, 1, 2] + ) == ar.Read(array_start_idx=[1, 0, 0], count=[1, 3, 2], array_step=[1, 1, 2]) assert sliced_ar.GetUnit() == ar.GetUnit() assert sliced_ar.GetScale() == ar.GetScale() @@ -995,24 +1064,24 @@ def test_mem_md_array_slice(): assert sliced_ar.GetNoDataValueAsRaw() == ar.GetNoDataValueAsRaw() assert sliced_ar.GetSpatialRef().IsSame(ar.GetSpatialRef()) - sliced_ar = ar[1,...] - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 0, 0], count = [1, 3, 4]) + sliced_ar = ar[1, ...] + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 0, 0], count=[1, 3, 4]) - sliced_ar = ar[...,1] + sliced_ar = ar[..., 1] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - 1 - assert sliced_ar.Read() == ar.Read(array_start_idx = [0, 0, 1], count = [2, 3, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[0, 0, 1], count=[2, 3, 1]) - sliced_ar = ar[1,...,2] + sliced_ar = ar[1, ..., 2] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - 2 - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 0, 2], count = [1, 3, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 0, 2], count=[1, 3, 1]) - sliced_ar = ar.GetView('[:]') + sliced_ar = ar.GetView("[:]") assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() assert sliced_ar.Read() == ar.Read() - sliced_ar = ar.GetView('[:,:,1]') + sliced_ar = ar.GetView("[:,:,1]") assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - 1 - assert sliced_ar.Read() == ar.Read(array_start_idx = [0, 0, 1], count = [2, 3, 1]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[0, 0, 1], count=[2, 3, 1]) sliced_ar = ar[::] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() @@ -1028,155 +1097,178 @@ def test_mem_md_array_slice(): sliced_ar = ar[0:-1:1] assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - assert sliced_ar.Read() == ar.Read(array_start_idx = [0, 0, 0], count = [1, 3, 4]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[0, 0, 0], count=[1, 3, 4]) sliced_ar = ar[1:2:1] assert sliced_ar assert sliced_ar.GetDimensionCount() == ar.GetDimensionCount() - assert sliced_ar.Read() == ar.Read(array_start_idx = [1, 0, 0], count = [1, 3, 4]) + assert sliced_ar.Read() == ar.Read(array_start_idx=[1, 0, 0], count=[1, 3, 4]) - sliced_ar = ar[::-1,0,0] + sliced_ar = ar[::-1, 0, 0] assert sliced_ar assert sliced_ar.GetDimensionCount() == 1 assert sliced_ar.GetDimensions()[0].GetSize() == 2 read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 12)[::-1] + assert struct.unpack("B" * len(read), read) == (0, 12)[::-1] - sliced_ar = ar[0,0,::-1] + sliced_ar = ar[0, 0, ::-1] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[::-1] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[::-1] - sliced_ar = ar[0,0,2::-1] + sliced_ar = ar[0, 0, 2::-1] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[2::-1] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[2::-1] - sliced_ar = ar[0,0,2:0:-1] + sliced_ar = ar[0, 0, 2:0:-1] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[2:0:-1] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[2:0:-1] - sliced_ar = ar[0,0,0:4:1] + sliced_ar = ar[0, 0, 0:4:1] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[0:4:1] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[0:4:1] - sliced_ar = ar[0,0,0:4:2] + sliced_ar = ar[0, 0, 0:4:2] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[0:4:2] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[0:4:2] - sliced_ar = ar[0,0,0:3:2] + sliced_ar = ar[0, 0, 0:3:2] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[0:3:2] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[0:3:2] - sliced_ar = ar[0,0,3:0:-2] + sliced_ar = ar[0, 0, 3:0:-2] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[3:0:-2] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[3:0:-2] - sliced_ar = ar[0,0,3:1:-2] + sliced_ar = ar[0, 0, 3:1:-2] assert sliced_ar read = sliced_ar.Read() - assert struct.unpack('B' * len(read), read) == (0, 1, 2, 3)[3:1:-2] + assert struct.unpack("B" * len(read), read) == (0, 1, 2, 3)[3:1:-2] def test_mem_md_band_as_mdarray(): - drv = gdal.GetDriverByName('MEM') + drv = gdal.GetDriverByName("MEM") def get_array(): - ds = drv.Create('my_ds', 10, 5, 2, gdal.GDT_UInt16) - ds.SetGeoTransform([2,0.1,0,49,0,-0.1]) + ds = drv.Create("my_ds", 10, 5, 2, gdal.GDT_UInt16) + ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) ds.SetSpatialRef(sr) band = ds.GetRasterBand(1) - band.SetUnitType('foo') + band.SetUnitType("foo") band.SetNoDataValue(2) band.SetOffset(1.5) band.SetScale(2.5) - band.SetMetadataItem('FOO', 'BAR') - band.WriteRaster(0, 0, 10, 5, struct.pack('H', 1), 1, 1) - band.WriteRaster(0, 1, 1, 1, struct.pack('H', 2)) - band.WriteRaster(1, 0, 1, 1, struct.pack('H', 3)) + band.SetMetadataItem("FOO", "BAR") + band.WriteRaster(0, 0, 10, 5, struct.pack("H", 1), 1, 1) + band.WriteRaster(0, 1, 1, 1, struct.pack("H", 2)) + band.WriteRaster(1, 0, 1, 1, struct.pack("H", 3)) return (band.AsMDArray(), band.ReadRaster()) ar, expected_data = get_array() assert ar - assert ar.GetView('[...]') - assert ar.GetBlockSize() == [ 1, 10 ] + assert ar.GetView("[...]") + assert ar.GetBlockSize() == [1, 10] assert ar.GetDimensionCount() == 2 dims = ar.GetDimensions() - assert dims[0].GetName() == 'Y' + assert dims[0].GetName() == "Y" assert dims[0].GetSize() == 5 var_y = dims[0].GetIndexingVariable() assert var_y assert var_y.GetDimensions()[0].GetSize() == 5 - assert struct.unpack('d' * 5, var_y.Read()) == (48.95, 48.85, 48.75, 48.65, 48.55) - assert dims[1].GetName() == 'X' + assert struct.unpack("d" * 5, var_y.Read()) == (48.95, 48.85, 48.75, 48.65, 48.55) + assert dims[1].GetName() == "X" assert dims[1].GetSize() == 10 var_x = dims[1].GetIndexingVariable() assert var_x assert var_x.GetDimensions()[0].GetSize() == 10 - assert struct.unpack('d' * 10, var_x.Read()) == (2.05, 2.15, 2.25, 2.35, 2.45, 2.55, 2.65, 2.75, 2.85, 2.95) + assert struct.unpack("d" * 10, var_x.Read()) == ( + 2.05, + 2.15, + 2.25, + 2.35, + 2.45, + 2.55, + 2.65, + 2.75, + 2.85, + 2.95, + ) assert ar.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert ar.GetDataType().GetNumericDataType() == gdal.GDT_UInt16 assert ar.Read() == expected_data - assert struct.unpack('H' * 4, ar.Read(array_start_idx = [1,1], count = [2, 2], array_step = [-1, -1])) == (1,2,3,1) - assert struct.unpack('H' * 4, ar[1::-1,1::-1].Read(array_start_idx = [0,0], count = [2, 2], array_step = [1, 1])) == (1,2,3,1) - assert struct.unpack('H' * 4, ar.Read(array_start_idx = [0,0], count = [2, 2], array_step = [1, 1])) == (1,3,2,1) - assert struct.unpack('H' * 4, ar[1::-1,1::-1].Read(array_start_idx = [1,1], count = [2, 2], array_step = [-1, -1])) == (1,3,2,1) + assert struct.unpack( + "H" * 4, ar.Read(array_start_idx=[1, 1], count=[2, 2], array_step=[-1, -1]) + ) == (1, 2, 3, 1) + assert struct.unpack( + "H" * 4, + ar[1::-1, 1::-1].Read(array_start_idx=[0, 0], count=[2, 2], array_step=[1, 1]), + ) == (1, 2, 3, 1) + assert struct.unpack( + "H" * 4, ar.Read(array_start_idx=[0, 0], count=[2, 2], array_step=[1, 1]) + ) == (1, 3, 2, 1) + assert struct.unpack( + "H" * 4, + ar[1::-1, 1::-1].Read( + array_start_idx=[1, 1], count=[2, 2], array_step=[-1, -1] + ), + ) == (1, 3, 2, 1) assert ar.Write(expected_data) == gdal.CE_None assert ar.Read() == expected_data - assert ar.GetUnit() == 'foo' + assert ar.GetUnit() == "foo" assert ar.GetNoDataValueAsDouble() == 2 assert ar.GetOffset() == 1.5 assert ar.GetScale() == 2.5 assert ar.GetSpatialRef() is not None assert len(ar.GetAttributes()) == 1 - attr = ar.GetAttribute('FOO') + attr = ar.GetAttribute("FOO") assert attr - assert attr.Read() == 'BAR' + assert attr.Read() == "BAR" def get_array(): - ds = drv.Create('my_ds', 10, 5, 2) + ds = drv.Create("my_ds", 10, 5, 2) band = ds.GetRasterBand(1) return (band.AsMDArray(), band.ReadRaster()) ar, expected_data = get_array() assert ar.GetSpatialRef() is None - assert ar.GetUnit() == '' + assert ar.GetUnit() == "" assert ar.GetNoDataValueAsRaw() is None def test_mem_md_array_as_classic_dataset(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim_y = rg.CreateDimension("dim_y", None, None, 2) dim_x = rg.CreateDimension("dim_x", None, None, 3) - dim_x_var = rg.CreateMDArray("dim_x", [dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - dim_x_var.Write( struct.pack('d' * 3, 1.25, 2.25, 3.25) ) + dim_x_var = rg.CreateMDArray( + "dim_x", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + dim_x_var.Write(struct.pack("d" * 3, 1.25, 2.25, 3.25)) dim_x.SetIndexingVariable(dim_x_var) - dim_y_var = rg.CreateMDArray("dim_y", [dim_y], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - dim_y_var.Write( struct.pack('d' * 2, 10, 8) ) + dim_y_var = rg.CreateMDArray( + "dim_y", [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + dim_y_var.Write(struct.pack("d" * 2, 10, 8)) dim_y.SetIndexingVariable(dim_y_var) - ar = rg.CreateMDArray("nodim", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + ar = rg.CreateMDArray("nodim", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) with gdaltest.error_handler(): assert not ar.AsClassicDataset(0, 0) - ar = rg.CreateMDArray("1d", [ dim_x ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + ar = rg.CreateMDArray("1d", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) with gdaltest.error_handler(): assert not ar.AsClassicDataset(1, 0) ds = ar.AsClassicDataset(0, 0) @@ -1184,28 +1276,35 @@ def test_mem_md_array_as_classic_dataset(): assert ds.RasterYSize == 1 assert ds.RasterCount == 1 assert not ds.GetSpatialRef() - data = struct.pack('B' * 3, 0, 1, 2) + data = struct.pack("B" * 3, 0, 1, 2) assert ar.Write(data) == gdal.CE_None band = ds.GetRasterBand(1) - assert len(band.ReadRaster(buf_type = gdal.GDT_UInt16)) == len(data) * 2 - assert band.ReadRaster(buf_type = gdal.GDT_UInt16) == struct.pack('H' * 3, 0, 1, 2) - assert band.WriteRaster(0, 0, 3, 1, struct.pack('H' * 3, 0, 1, 2), buf_type = gdal.GDT_UInt16) == gdal.CE_None + assert len(band.ReadRaster(buf_type=gdal.GDT_UInt16)) == len(data) * 2 + assert band.ReadRaster(buf_type=gdal.GDT_UInt16) == struct.pack("H" * 3, 0, 1, 2) + assert ( + band.WriteRaster( + 0, 0, 3, 1, struct.pack("H" * 3, 0, 1, 2), buf_type=gdal.GDT_UInt16 + ) + == gdal.CE_None + ) assert band.ReadRaster() == data - ar = rg.CreateMDArray("2d_string", [ dim_y, dim_x ], - gdal.ExtendedDataType.CreateString()) + ar = rg.CreateMDArray( + "2d_string", [dim_y, dim_x], gdal.ExtendedDataType.CreateString() + ) with gdaltest.error_handler(): assert not ar.AsClassicDataset(0, 1) # 2D - ar = rg.CreateMDArray("2d", [ dim_y, dim_x ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - attr = ar.CreateAttribute('attr_float64', [1], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "2d", [dim_y, dim_x], gdal.ExtendedDataType.Create(gdal.GDT_UInt16) + ) + attr = ar.CreateAttribute( + "attr_float64", [1], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) attr.Write(1.25) - attr = ar.CreateAttribute('attr_strings', [2], - gdal.ExtendedDataType.CreateString()) - attr.Write(['foo', 'bar']) + attr = ar.CreateAttribute("attr_strings", [2], gdal.ExtendedDataType.CreateString()) + attr.Write(["foo", "bar"]) with gdaltest.error_handler(): assert not ar.AsClassicDataset(0, 0) assert not ar.AsClassicDataset(0, 2) @@ -1216,22 +1315,22 @@ def test_mem_md_array_as_classic_dataset(): assert ds.RasterYSize == 2 assert ds.RasterCount == 1 assert ds.GetGeoTransform() == (0.75, 1.0, 0.0, 11.0, 0.0, -2.0) - assert ds.GetMetadata() == {'attr_float64': '1.25', 'attr_strings': '{foo,bar}'} + assert ds.GetMetadata() == {"attr_float64": "1.25", "attr_strings": "{foo,bar}"} band = ds.GetRasterBand(1) assert band.DataType == gdal.GDT_UInt16 assert band.GetBlockSize() == [3, 1] - data = struct.pack('H' * 6, 0, 1, 2, 3, 4, 5) + data = struct.pack("H" * 6, 0, 1, 2, 3, 4, 5) assert ar.Write(data) == gdal.CE_None assert len(band.ReadRaster()) == len(data) assert band.ReadRaster() == data assert band.WriteRaster(0, 0, 3, 2, data) == gdal.CE_None assert band.ReadRaster() == data - assert band.ReadBlock(0, 0) == struct.pack('H' * 3, 0, 1, 2) - assert band.ReadBlock(0, 1) == struct.pack('H' * 3, 3, 4, 5) + assert band.ReadBlock(0, 0) == struct.pack("H" * 3, 0, 1, 2) + assert band.ReadBlock(0, 1) == struct.pack("H" * 3, 3, 4, 5) assert not band.GetNoDataValue() assert not band.GetScale() assert not band.GetOffset() - assert band.GetUnitType() == '' + assert band.GetUnitType() == "" assert ds.GetSpatialRef() is None sr = osr.SpatialReference() @@ -1241,114 +1340,134 @@ def test_mem_md_array_as_classic_dataset(): got_sr = ds.GetSpatialRef() assert got_sr is not None assert got_sr.GetDataAxisToSRSAxisMapping() == [1, 2] - got_sr.SetDataAxisToSRSAxisMapping([2,1]) + got_sr.SetDataAxisToSRSAxisMapping([2, 1]) assert got_sr.IsSame(sr) ar.SetNoDataValueDouble(2) ar.SetScale(1.5) ar.SetOffset(2.5) - ar.SetUnit('foo') + ar.SetUnit("foo") assert band.GetNoDataValue() == 2 assert band.GetScale() == 1.5 assert band.GetOffset() == 2.5 - assert band.GetUnitType() == 'foo' + assert band.GetUnitType() == "foo" # 3D with band dimension first dim_bands = rg.CreateDimension("dim_bands", None, None, 2) - dim_bands_var = rg.CreateMDArray("dim_bands", [dim_bands], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - dim_bands_var.Write( struct.pack('d' * 2, 1.25, 2.25) ) - dim_bands_var.SetUnit('my_unit') + dim_bands_var = rg.CreateMDArray( + "dim_bands", [dim_bands], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + dim_bands_var.Write(struct.pack("d" * 2, 1.25, 2.25)) + dim_bands_var.SetUnit("my_unit") dim_bands.SetIndexingVariable(dim_bands_var) - ar = rg.CreateMDArray("3d_band_first", [ dim_bands, dim_y, dim_x ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ar = rg.CreateMDArray( + "3d_band_first", + [dim_bands, dim_y, dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) ds = ar.AsClassicDataset(2, 1) assert ds assert ds.RasterXSize == 3 assert ds.RasterYSize == 2 assert ds.RasterCount == 2 band = ds.GetRasterBand(2) - assert band.GetMetadata() == {'DIM_dim_bands_INDEX': '1', - 'DIM_dim_bands_UNIT': 'my_unit', - 'DIM_dim_bands_VALUE': '2.25'} + assert band.GetMetadata() == { + "DIM_dim_bands_INDEX": "1", + "DIM_dim_bands_UNIT": "my_unit", + "DIM_dim_bands_VALUE": "2.25", + } assert band.GetBlockSize() == [3, 1] - data = struct.pack('H' * 6, 0, 1, 2, 3, 4, 5) - assert ar.Write(data, array_start_idx = [1, 0, 0], count = [1, 2, 3]) == gdal.CE_None + data = struct.pack("H" * 6, 0, 1, 2, 3, 4, 5) + assert ar.Write(data, array_start_idx=[1, 0, 0], count=[1, 2, 3]) == gdal.CE_None assert band.ReadRaster() == data assert band.WriteRaster(0, 0, 3, 2, data) == gdal.CE_None assert band.ReadRaster() == data - # 3D with band dimension last - ar = rg.CreateMDArray("3d_band_last", [ dim_y, dim_x, dim_bands ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ar = rg.CreateMDArray( + "3d_band_last", + [dim_y, dim_x, dim_bands], + gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) ds = ar.AsClassicDataset(1, 0) assert ds assert ds.RasterXSize == 3 assert ds.RasterYSize == 2 assert ds.RasterCount == 2 band = ds.GetRasterBand(2) - assert band.GetMetadata() == {'DIM_dim_bands_INDEX': '1', - 'DIM_dim_bands_UNIT': 'my_unit', - 'DIM_dim_bands_VALUE': '2.25'} + assert band.GetMetadata() == { + "DIM_dim_bands_INDEX": "1", + "DIM_dim_bands_UNIT": "my_unit", + "DIM_dim_bands_VALUE": "2.25", + } assert band.GetBlockSize() == [3, 1] - data = struct.pack('H' * 6, 0, 1, 2, 3, 4, 5) - assert ar.Write(data, array_start_idx = [0, 0, 1], count = [2, 3, 1]) == gdal.CE_None + data = struct.pack("H" * 6, 0, 1, 2, 3, 4, 5) + assert ar.Write(data, array_start_idx=[0, 0, 1], count=[2, 3, 1]) == gdal.CE_None assert band.ReadRaster() == data assert band.WriteRaster(0, 0, 3, 2, data) == gdal.CE_None assert band.ReadRaster() == data # 4D dim_time_subset = rg.CreateDimension("subset_time_1_2_3", None, None, 3) - dim_time_subset_var = rg.CreateMDArray("subset_time_1_2_3", [dim_time_subset], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - dim_time_subset_var.Write( struct.pack('d' * 3, 1.5, 2.5, 3.5) ) + dim_time_subset_var = rg.CreateMDArray( + "subset_time_1_2_3", + [dim_time_subset], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + dim_time_subset_var.Write(struct.pack("d" * 3, 1.5, 2.5, 3.5)) dim_time_subset.SetIndexingVariable(dim_time_subset_var) - ar = rg.CreateMDArray("4d", [ dim_time_subset, dim_y, dim_x, dim_bands ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ar = rg.CreateMDArray( + "4d", + [dim_time_subset, dim_y, dim_x, dim_bands], + gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) ds = ar.AsClassicDataset(2, 1) band = ds.GetRasterBand(5) - assert band.GetMetadata() == {'DIM_dim_bands_INDEX': '0', - 'DIM_dim_bands_UNIT': 'my_unit', - 'DIM_dim_bands_VALUE': '1.25', - 'DIM_time_INDEX': '5', - 'DIM_time_VALUE': '3.5'} + assert band.GetMetadata() == { + "DIM_dim_bands_INDEX": "0", + "DIM_dim_bands_UNIT": "my_unit", + "DIM_dim_bands_VALUE": "1.25", + "DIM_time_INDEX": "5", + "DIM_time_VALUE": "3.5", + } def test_mem_md_array_transpose(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim_z = rg.CreateDimension("dim_z", None, None, 4) dim_y = rg.CreateDimension("dim_y", None, None, 2) dim_x = rg.CreateDimension("dim_x", None, None, 3) - ar = rg.CreateMDArray("ar", [ dim_z, dim_y, dim_x ], - gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ar = rg.CreateMDArray( + "ar", [dim_z, dim_y, dim_x], gdal.ExtendedDataType.Create(gdal.GDT_UInt16) + ) - attr = ar.CreateAttribute('attr', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = ar.CreateAttribute( + "attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert attr.Write(1) == gdal.CE_None - data = array.array('H', list(range(24))).tobytes() + data = array.array("H", list(range(24))).tobytes() assert ar.Write(data) == gdal.CE_None with gdaltest.error_handler(): - assert not ar.Transpose([]) # 0 axis - assert not ar.Transpose([0, 1]) # missing axis - assert not ar.Transpose([0, 1, 2, 3]) # too many axis - assert not ar.Transpose([0, 1, 3]) # invalid axis number - assert not ar.Transpose([0, 1, -2]) # invalid axis number - assert not ar.Transpose([0, 1, -1]) # missing axis - assert not ar.Transpose([0, 1, 1]) # repeated axis + assert not ar.Transpose([]) # 0 axis + assert not ar.Transpose([0, 1]) # missing axis + assert not ar.Transpose([0, 1, 2, 3]) # too many axis + assert not ar.Transpose([0, 1, 3]) # invalid axis number + assert not ar.Transpose([0, 1, -2]) # invalid axis number + assert not ar.Transpose([0, 1, -1]) # missing axis + assert not ar.Transpose([0, 1, 1]) # repeated axis # Idendity transposed = ar.Transpose([0, 1, 2]) assert transposed.GetDimensionCount() == 3 dims = transposed.GetDimensions() - assert dims[0].GetName() == 'dim_z' - assert dims[1].GetName() == 'dim_y' - assert dims[2].GetName() == 'dim_x' + assert dims[0].GetName() == "dim_z" + assert dims[1].GetName() == "dim_y" + assert dims[2].GetName() == "dim_x" assert transposed.Read() == data assert transposed.GetUnit() == ar.GetUnit() @@ -1356,7 +1475,7 @@ def test_mem_md_array_transpose(): assert transposed.GetOffset() == ar.GetOffset() assert transposed.GetNoDataValueAsRaw() == ar.GetNoDataValueAsRaw() assert transposed.GetSpatialRef() is None - assert transposed.GetAttribute('attr') is not None + assert transposed.GetAttribute("attr") is not None assert len(transposed.GetAttributes()) == 1 assert ar.SetUnit("foo") == gdal.CE_None @@ -1379,10 +1498,10 @@ def test_mem_md_array_transpose(): transposed = ar.Transpose([0, 1, -1, 2]) assert transposed.GetDimensionCount() == 4 dims = transposed.GetDimensions() - assert dims[0].GetName() == 'dim_z' - assert dims[1].GetName() == 'dim_y' - assert dims[2].GetName() == 'newaxis' - assert dims[3].GetName() == 'dim_x' + assert dims[0].GetName() == "dim_z" + assert dims[1].GetName() == "dim_y" + assert dims[2].GetName() == "newaxis" + assert dims[3].GetName() == "dim_x" assert transposed.Read() == data assert transposed.GetBlockSize() == [0, 0, 0, 0] @@ -1394,53 +1513,90 @@ def test_mem_md_array_transpose(): transposed = ar.Transpose([2, 1, 0]) assert transposed.GetDimensionCount() == 3 dims = transposed.GetDimensions() - assert dims[0].GetName() == 'dim_x' - assert dims[1].GetName() == 'dim_y' - assert dims[2].GetName() == 'dim_z' + assert dims[0].GetName() == "dim_x" + assert dims[1].GetName() == "dim_y" + assert dims[2].GetName() == "dim_z" transposed_data = transposed.Read() - assert struct.unpack('H' * 24, transposed_data) == (0, 6, 12, 18, 3, 9, 15, 21, 1, 7, 13, 19, 4, 10, 16, 22, 2, 8, 14, 20, 5, 11, 17, 23) - assert transposed.Read(buffer_stride = [1, 3, 6]) == data - assert transposed.Write(struct.pack('H', 0) * 24) == gdal.CE_None - assert ar.Read() == struct.pack('H', 0) * 24 + assert struct.unpack("H" * 24, transposed_data) == ( + 0, + 6, + 12, + 18, + 3, + 9, + 15, + 21, + 1, + 7, + 13, + 19, + 4, + 10, + 16, + 22, + 2, + 8, + 14, + 20, + 5, + 11, + 17, + 23, + ) + assert transposed.Read(buffer_stride=[1, 3, 6]) == data + assert transposed.Write(struct.pack("H", 0) * 24) == gdal.CE_None + assert ar.Read() == struct.pack("H", 0) * 24 assert transposed.Write(transposed_data) == gdal.CE_None assert ar.Read() == data # Rotation of axis transposed = ar.Transpose([1, 2, 0]) - assert transposed.Read(buffer_stride = [3, 1, 6]) == data + assert transposed.Read(buffer_stride=[3, 1, 6]) == data def test_mem_md_array_single_dim_non_contiguous_copy(): - drv = gdal.GetDriverByName('MEM') + drv = gdal.GetDriverByName("MEM") nvalues = 30 spacing = 63 - data = array.array('B', list(range(nvalues))).tobytes() - for t in (gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_Int32, gdal.GDT_Float64, gdal.GDT_CFloat64): - ds = drv.CreateMultiDimensional('myds') + data = array.array("B", list(range(nvalues))).tobytes() + for t in ( + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_Int32, + gdal.GDT_Float64, + gdal.GDT_CFloat64, + ): + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim = rg.CreateDimension("dim0", "", "", nvalues) - ar = rg.CreateMDArray("ar", [ dim ], - gdal.ExtendedDataType.Create(t)) + ar = rg.CreateMDArray("ar", [dim], gdal.ExtendedDataType.Create(t)) assert ar - assert ar.Write(data, buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Byte)) == gdal.CE_None - got_data = ar.Read( buffer_stride = [spacing], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Byte) ) + assert ( + ar.Write(data, buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + == gdal.CE_None + ) + got_data = ar.Read( + buffer_stride=[spacing], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ) assert len(got_data) == (nvalues - 1) * spacing + 1 - got_data = struct.unpack('B' * len(got_data), got_data) + got_data = struct.unpack("B" * len(got_data), got_data) for i in range(nvalues): assert got_data[i * spacing] == i def test_mem_md_array_get_unscaled_0dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - data = array.array('B', [1]).tobytes() + data = array.array("B", [1]).tobytes() assert myarray.Write(data) == gdal.CE_None myarray.SetOffset(1.5) @@ -1448,34 +1604,41 @@ def test_mem_md_array_get_unscaled_0dim(): unscaled = myarray.GetUnscaled() assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_Float64 - assert struct.unpack('d' * 1, unscaled.Read())[0] == 1 * 200.5 + 1.5 + assert struct.unpack("d" * 1, unscaled.Read())[0] == 1 * 200.5 + 1.5 float32dt = gdal.ExtendedDataType.Create(gdal.GDT_Float32) - assert struct.unpack('f' * 1, unscaled.Read(buffer_datatype = float32dt))[0] == 1 * 200.5 + 1.5 + assert ( + struct.unpack("f" * 1, unscaled.Read(buffer_datatype=float32dt))[0] + == 1 * 200.5 + 1.5 + ) - assert unscaled.Write(struct.pack('d' * 1, 2 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 2 + assert unscaled.Write(struct.pack("d" * 1, 2 * 200.5 + 1.5)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 2 - assert unscaled.Write(struct.pack('d' * 1, 2.1 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 2 + assert unscaled.Write(struct.pack("d" * 1, 2.1 * 200.5 + 1.5)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 2 - assert unscaled.Write(struct.pack('d' * 1, 1.9 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 2 + assert unscaled.Write(struct.pack("d" * 1, 1.9 * 200.5 + 1.5)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 2 - assert unscaled.Write(struct.pack('f' * 1, 3 * 200.5 + 1.5), buffer_datatype = float32dt) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 3 + assert ( + unscaled.Write(struct.pack("f" * 1, 3 * 200.5 + 1.5), buffer_datatype=float32dt) + == gdal.CE_None + ) + assert struct.unpack("B" * 1, myarray.Read())[0] == 3 def test_mem_md_array_get_unscaled_0dim_complex(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_CInt16)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_CInt16) + ) assert myarray - data = array.array('H', [1, 2]).tobytes() + data = array.array("H", [1, 2]).tobytes() assert myarray.Write(data) == gdal.CE_None myarray.SetOffset(1.5) @@ -1483,28 +1646,41 @@ def test_mem_md_array_get_unscaled_0dim_complex(): unscaled = myarray.GetUnscaled() assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_CFloat64 - assert struct.unpack('d' * 2, unscaled.Read()) == (1 * 200.5 + 1.5, 2 * 200.5 + 1.5) + assert struct.unpack("d" * 2, unscaled.Read()) == (1 * 200.5 + 1.5, 2 * 200.5 + 1.5) cfloat32dt = gdal.ExtendedDataType.Create(gdal.GDT_CFloat32) - assert struct.unpack('f' * 2, unscaled.Read(buffer_datatype = cfloat32dt)) == (1 * 200.5 + 1.5, 2 * 200.5 + 1.5) - - assert unscaled.Write(struct.pack('d' * 2, 3 * 200.5 + 1.5, 4 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('H' * 2, myarray.Read()) == (3, 4) - - assert unscaled.Write(struct.pack('f' * 2, 5 * 200.5 + 1.5, 6 * 200.5 + 1.5), buffer_datatype = cfloat32dt) == gdal.CE_None - assert struct.unpack('H' * 2, myarray.Read()) == (5, 6) + assert struct.unpack("f" * 2, unscaled.Read(buffer_datatype=cfloat32dt)) == ( + 1 * 200.5 + 1.5, + 2 * 200.5 + 1.5, + ) + + assert ( + unscaled.Write(struct.pack("d" * 2, 3 * 200.5 + 1.5, 4 * 200.5 + 1.5)) + == gdal.CE_None + ) + assert struct.unpack("H" * 2, myarray.Read()) == (3, 4) + + assert ( + unscaled.Write( + struct.pack("f" * 2, 5 * 200.5 + 1.5, 6 * 200.5 + 1.5), + buffer_datatype=cfloat32dt, + ) + == gdal.CE_None + ) + assert struct.unpack("H" * 2, myarray.Read()) == (5, 6) def test_mem_md_array_get_unscaled_0dim_non_matching_nodata(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - data = array.array('B', [1]).tobytes() + data = array.array("B", [1]).tobytes() assert myarray.Write(data) == gdal.CE_None myarray.SetOffset(1.5) @@ -1515,23 +1691,32 @@ def test_mem_md_array_get_unscaled_0dim_non_matching_nodata(): assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_Float64 nodata = unscaled.GetNoDataValueAsDouble() assert math.isnan(nodata) - assert struct.unpack('d' * 1, unscaled.Read())[0] == 1 * 200.5 + 1.5 - assert struct.unpack('f' * 1, unscaled.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)))[0] == 1 * 200.5 + 1.5 + assert struct.unpack("d" * 1, unscaled.Read())[0] == 1 * 200.5 + 1.5 + assert ( + struct.unpack( + "f" * 1, + unscaled.Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32) + ), + )[0] + == 1 * 200.5 + 1.5 + ) - assert unscaled.Write(struct.pack('d' * 1, 2 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 2 + assert unscaled.Write(struct.pack("d" * 1, 2 * 200.5 + 1.5)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 2 def test_mem_md_array_get_unscaled_0dim_matching_nodata(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - data = array.array('B', [1]).tobytes() + data = array.array("B", [1]).tobytes() assert myarray.Write(data) == gdal.CE_None myarray.SetOffset(1.5) @@ -1542,55 +1727,57 @@ def test_mem_md_array_get_unscaled_0dim_matching_nodata(): assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_Float64 nodata = unscaled.GetNoDataValueAsDouble() assert math.isnan(nodata) - assert math.isnan(struct.unpack('d' * 1, unscaled.Read())[0]) + assert math.isnan(struct.unpack("d" * 1, unscaled.Read())[0]) - assert unscaled.Write(struct.pack('d' * 1, 2 * 200.5 + 1.5)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 2 + assert unscaled.Write(struct.pack("d" * 1, 2 * 200.5 + 1.5)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 2 - assert unscaled.Write(struct.pack('d' * 1, nodata)) == gdal.CE_None - assert struct.unpack('B' * 1, myarray.Read())[0] == 1 + assert unscaled.Write(struct.pack("d" * 1, nodata)) == gdal.CE_None + assert struct.unpack("B" * 1, myarray.Read())[0] == 1 def test_mem_md_array_get_unscaled_0dim_matching_nodata_complex(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray", [], - gdal.ExtendedDataType.Create(gdal.GDT_CInt16)) + myarray = rg.CreateMDArray( + "myarray", [], gdal.ExtendedDataType.Create(gdal.GDT_CInt16) + ) assert myarray - data = array.array('H', [1, 2]).tobytes() + data = array.array("H", [1, 2]).tobytes() assert myarray.Write(data) == gdal.CE_None myarray.SetOffset(1.5) myarray.SetScale(200.5) - myarray.SetNoDataValueRaw(struct.pack('H' * 2, 1, 2)) + myarray.SetNoDataValueRaw(struct.pack("H" * 2, 1, 2)) unscaled = myarray.GetUnscaled() assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_CFloat64 nodata = unscaled.GetNoDataValueAsDouble() assert math.isnan(nodata) - assert math.isnan(struct.unpack('d' * 2, unscaled.Read())[0]) - assert math.isnan(struct.unpack('d' * 2, unscaled.Read())[1]) + assert math.isnan(struct.unpack("d" * 2, unscaled.Read())[0]) + assert math.isnan(struct.unpack("d" * 2, unscaled.Read())[1]) - assert unscaled.Write(struct.pack('d' * 2, nodata, nodata)) == gdal.CE_None - assert struct.unpack('H' * 2, myarray.Read()) == (1, 2) + assert unscaled.Write(struct.pack("d" * 2, nodata, nodata)) == gdal.CE_None + assert struct.unpack("H" * 2, myarray.Read()) == (1, 2) def test_mem_md_array_get_unscaled_3dim(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) dim2 = rg.CreateDimension("dim2", None, None, 4) - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2 ], - gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert myarray - data = array.array('B', list(range(24))).tobytes() + data = array.array("B", list(range(24))).tobytes() assert myarray.Write(data) == gdal.CE_None assert myarray.GetUnscaled().Read() == myarray.Read() @@ -1605,40 +1792,48 @@ def test_mem_md_array_get_unscaled_3dim(): assert unscaled.GetSpatialRef() is None assert unscaled.GetUnit() == myarray.GetUnit() assert unscaled.GetBlockSize() == myarray.GetBlockSize() - assert [x.GetSize() for x in unscaled.GetDimensions()] == [x.GetSize() for x in myarray.GetDimensions() ] + assert [x.GetSize() for x in unscaled.GetDimensions()] == [ + x.GetSize() for x in myarray.GetDimensions() + ] assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_Float64 expected_data = [x * 200.5 + 1.5 for x in range(24)] unscaled_data = unscaled.Read() - assert [x for x in struct.unpack('d' * 24, unscaled_data)] == expected_data + assert [x for x in struct.unpack("d" * 24, unscaled_data)] == expected_data float32_dt = gdal.ExtendedDataType.Create(gdal.GDT_Float32) - unscaled_data_float32 = unscaled.Read(buffer_datatype = float32_dt) - assert [x for x in struct.unpack('f' * 24, unscaled_data_float32)] == expected_data + unscaled_data_float32 = unscaled.Read(buffer_datatype=float32_dt) + assert [x for x in struct.unpack("f" * 24, unscaled_data_float32)] == expected_data - assert myarray.Write(b'\x00' * 24) == gdal.CE_None + assert myarray.Write(b"\x00" * 24) == gdal.CE_None assert myarray.Read() != data assert unscaled.Write(unscaled_data) == gdal.CE_None assert myarray.Read() == data - assert myarray.Write(b'\x00' * 24) == gdal.CE_None + assert myarray.Write(b"\x00" * 24) == gdal.CE_None assert myarray.Read() != data - assert unscaled.Write(unscaled_data_float32, buffer_datatype = float32_dt) == gdal.CE_None + assert ( + unscaled.Write(unscaled_data_float32, buffer_datatype=float32_dt) + == gdal.CE_None + ) assert myarray.Read() == data myarray.SetNoDataValueDouble(1) unscaled = myarray.GetUnscaled() assert math.isnan(unscaled.GetNoDataValueAsDouble()) unscaled_data_with_nan = unscaled.Read() - got_data = [x for x in struct.unpack('d' * 24, unscaled_data_with_nan)] - expected_data = [float('nan') if x == 1 else x * 200.5 + 1.5 for x in struct.unpack('B' * 24, myarray.Read())] + got_data = [x for x in struct.unpack("d" * 24, unscaled_data_with_nan)] + expected_data = [ + float("nan") if x == 1 else x * 200.5 + 1.5 + for x in struct.unpack("B" * 24, myarray.Read()) + ] for i in range(24): if math.isnan(expected_data[i]): assert math.isnan(got_data[i]) else: assert got_data[i] == expected_data[i] - assert myarray.Write(b'\x00' * 24) == gdal.CE_None + assert myarray.Write(b"\x00" * 24) == gdal.CE_None assert myarray.Read() != data assert unscaled.Write(unscaled_data_with_nan) == gdal.CE_None @@ -1647,15 +1842,16 @@ def test_mem_md_array_get_unscaled_3dim(): def test_mem_md_array_get_unscaled_1dim_complex(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", None, None, 2) - myarray = rg.CreateMDArray("myarray", [ dim0 ], - gdal.ExtendedDataType.Create(gdal.GDT_CInt16)) + myarray = rg.CreateMDArray( + "myarray", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_CInt16) + ) assert myarray - data = array.array('H', [1, 2, 3, 4]).tobytes() + data = array.array("H", [1, 2, 3, 4]).tobytes() assert myarray.Write(data) == gdal.CE_None assert myarray.GetUnscaled().Read() == myarray.Read() @@ -1664,12 +1860,12 @@ def test_mem_md_array_get_unscaled_1dim_complex(): myarray.SetOffset(1.5) myarray.SetScale(200.5) - myarray.SetNoDataValueRaw(struct.pack('H' * 2, 1, 2)) + myarray.SetNoDataValueRaw(struct.pack("H" * 2, 1, 2)) unscaled = myarray.GetUnscaled() assert unscaled.GetDataType().GetNumericDataType() == gdal.GDT_CFloat64 unscaled_data_with_nan = unscaled.Read() - got_data = [x for x in struct.unpack('d' * 4, unscaled_data_with_nan)] + got_data = [x for x in struct.unpack("d" * 4, unscaled_data_with_nan)] assert math.isnan(got_data[0]) assert math.isnan(got_data[1]) assert got_data[2] == 3 * 200.5 + 1.5 @@ -1681,35 +1877,48 @@ def test_mem_md_array_get_unscaled_1dim_complex(): def test_mem_md_array_get_mask(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() - myarray = rg.CreateMDArray("myarray_emptydim", [], - gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + myarray = rg.CreateMDArray( + "myarray_emptydim", [], gdal.ExtendedDataType.Create(gdal.GDT_Int16) + ) mask = myarray.GetMask() assert mask is not None - assert struct.unpack('B', mask.Read())[0] == 1 - assert struct.unpack('H', mask.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16)))[0] == 1 + assert struct.unpack("B", mask.Read())[0] == 1 + assert ( + struct.unpack( + "H", mask.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + )[0] + == 1 + ) myarray.SetNoDataValueDouble(0) - assert struct.unpack('B', mask.Read())[0] == 0 - assert struct.unpack('H', mask.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16)))[0] == 0 + assert struct.unpack("B", mask.Read())[0] == 0 + assert ( + struct.unpack( + "H", mask.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + )[0] + == 0 + ) assert myarray.GetMask().AdviseRead() == gdal.CE_None dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) dim2 = rg.CreateDimension("dim2", None, None, 4) - myarray = rg.CreateMDArray("myarray_string", [dim0], - gdal.ExtendedDataType.CreateString()) + myarray = rg.CreateMDArray( + "myarray_string", [dim0], gdal.ExtendedDataType.CreateString() + ) # Non-numeric array unsupported with gdaltest.error_handler(): assert not myarray.GetMask() - myarray = rg.CreateMDArray("myarray", [ dim0, dim1, dim2 ], - gdal.ExtendedDataType.Create(gdal.GDT_Int32)) - data = array.array('I', list(range(24))).tobytes() + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) + data = array.array("I", list(range(24))).tobytes() assert myarray.Write(data) == gdal.CE_None mask = myarray.GetMask() @@ -1721,98 +1930,165 @@ def test_mem_md_array_get_mask(): assert mask.GetSpatialRef() is None assert mask.GetUnit() == myarray.GetUnit() assert mask.GetBlockSize() == myarray.GetBlockSize() - assert [x.GetSize() for x in mask.GetDimensions()] == [x.GetSize() for x in myarray.GetDimensions() ] + assert [x.GetSize() for x in mask.GetDimensions()] == [ + x.GetSize() for x in myarray.GetDimensions() + ] assert mask.GetDataType().GetNumericDataType() == gdal.GDT_Byte # Case when we don't need to read the underlying array at all: the mask is always valid - assert [x for x in struct.unpack('B' * 24, mask.Read())] == [ 1 ] * 24 - assert [x for x in struct.unpack('B' * 24, mask.Read(buffer_stride = [1, 2, 6]))] == [ 1 ] * 24 - assert [x for x in struct.unpack('H' * 24, mask.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16)))] == [ 1 ] * 24 - assert [x for x in struct.unpack('H' * 24, mask.Read( - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16), buffer_stride = [1, 2, 6]))] == [ 1 ] * 24 + assert [x for x in struct.unpack("B" * 24, mask.Read())] == [1] * 24 + assert [x for x in struct.unpack("B" * 24, mask.Read(buffer_stride=[1, 2, 6]))] == [ + 1 + ] * 24 + assert [ + x + for x in struct.unpack( + "H" * 24, + mask.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)), + ) + ] == [1] * 24 + assert [ + x + for x in struct.unpack( + "H" * 24, + mask.Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16), + buffer_stride=[1, 2, 6], + ), + ) + ] == [1] * 24 # Test no data value myarray.SetNoDataValueDouble(10) - expected_data = [ 1 ] * 24 + expected_data = [1] * 24 expected_data[10] = 0 - assert [x for x in struct.unpack('B' * 24, mask.Read())] == expected_data - assert [x for x in struct.unpack('B' * 24, mask.Read(buffer_stride = [1, 2, 6]))] == [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1] - assert [x for x in struct.unpack('H' * 24, mask.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16)))] == expected_data + assert [x for x in struct.unpack("B" * 24, mask.Read())] == expected_data + assert [x for x in struct.unpack("B" * 24, mask.Read(buffer_stride=[1, 2, 6]))] == [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + ] + assert [ + x + for x in struct.unpack( + "H" * 24, + mask.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)), + ) + ] == expected_data # Test missing_value, _FillValue, valid_min, valid_max bytedt = gdal.ExtendedDataType.Create(gdal.GDT_Byte) - attr = myarray.CreateAttribute('missing_value', [1], bytedt) + attr = myarray.CreateAttribute("missing_value", [1], bytedt) assert attr.Write(8) == gdal.CE_None - attr = myarray.CreateAttribute('_FillValue', [1], bytedt) + attr = myarray.CreateAttribute("_FillValue", [1], bytedt) assert attr.Write(9) == gdal.CE_None - attr = myarray.CreateAttribute('valid_min', [1], bytedt) + attr = myarray.CreateAttribute("valid_min", [1], bytedt) assert attr.Write(2) == gdal.CE_None - attr = myarray.CreateAttribute('valid_max', [1], bytedt) + attr = myarray.CreateAttribute("valid_max", [1], bytedt) assert attr.Write(22) == gdal.CE_None - expected_data = [ 1 ] * 24 + expected_data = [1] * 24 expected_data[0] = 0 expected_data[1] = 0 expected_data[8] = 0 expected_data[9] = 0 expected_data[10] = 0 expected_data[23] = 0 - assert [x for x in struct.unpack('B' * 24, mask.Read())] == expected_data + assert [x for x in struct.unpack("B" * 24, mask.Read())] == expected_data # Test valid_range - myarray = rg.CreateMDArray("myarray_valid_range", [ dim0, dim1, dim2 ], - gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - data = array.array('H', list(range(24))).tobytes() + myarray = rg.CreateMDArray( + "myarray_valid_range", + [dim0, dim1, dim2], + gdal.ExtendedDataType.Create(gdal.GDT_Int16), + ) + data = array.array("H", list(range(24))).tobytes() assert myarray.Write(data) == gdal.CE_None - attr = myarray.CreateAttribute('valid_range', [2], bytedt) - assert attr.Write([1,22]) == gdal.CE_None + attr = myarray.CreateAttribute("valid_range", [2], bytedt) + assert attr.Write([1, 22]) == gdal.CE_None mask = myarray.GetMask() - expected_data = [ 1 ] * 24 + expected_data = [1] * 24 expected_data[0] = 0 expected_data[23] = 0 - assert [x for x in struct.unpack('B' * 24, mask.Read())] == expected_data + assert [x for x in struct.unpack("B" * 24, mask.Read())] == expected_data try: import numpy + has_numpy = True except ImportError: has_numpy = False if has_numpy: ma = myarray.ReadAsMaskedArray() - assert ma[0,0,0] is numpy.ma.masked - assert ma[0,0,1] is not numpy.ma.masked + assert ma[0, 0, 0] is numpy.ma.masked + assert ma[0, 0, 1] is not numpy.ma.masked # Test array with nan - myarray = rg.CreateMDArray("myarray_with_nan", [ dim0 ], - gdal.ExtendedDataType.Create(gdal.GDT_Float32)) - assert myarray.Write(struct.pack('f' * 2, 0, float('nan'))) == gdal.CE_None + myarray = rg.CreateMDArray( + "myarray_with_nan", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_Float32) + ) + assert myarray.Write(struct.pack("f" * 2, 0, float("nan"))) == gdal.CE_None mask = myarray.GetMask() - assert [x for x in struct.unpack('B' * 2, mask.Read())] == [1, 0] + assert [x for x in struct.unpack("B" * 2, mask.Read())] == [1, 0] # Test all data types - for dt, v, nv, expected in [ (gdal.GDT_Byte, 1, 1,[1, 0]), - (gdal.GDT_Byte, 1, 1.5, [1, 1]), - (gdal.GDT_Int16, 1, 1, [1, 0]), - (gdal.GDT_UInt16, 1, 1, [1, 0]), - (gdal.GDT_Int32, 1, 1, [1, 0]), - (gdal.GDT_UInt32, 1, 1, [1, 0]), - (gdal.GDT_Float32, 1, 1, [1, 0]), - (gdal.GDT_Float32, 1.5, 1.5, [1, 0]), - (gdal.GDT_Float64, 1, 1, [1, 0]), - (gdal.GDT_Float64, 1.5, 1.5, [1, 0]), - (gdal.GDT_CInt16, 1, 1, [1, 0]) ]: - myarray = rg.CreateMDArray("array_dt_" + gdal.GetDataTypeName(dt) + '_' + str(v) + '_' + str(nv), [ dim0 ], - gdal.ExtendedDataType.Create(dt)) - assert myarray.Write(struct.pack('d' * 2, 0, v), buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == gdal.CE_None + for dt, v, nv, expected in [ + (gdal.GDT_Byte, 1, 1, [1, 0]), + (gdal.GDT_Byte, 1, 1.5, [1, 1]), + (gdal.GDT_Int16, 1, 1, [1, 0]), + (gdal.GDT_UInt16, 1, 1, [1, 0]), + (gdal.GDT_Int32, 1, 1, [1, 0]), + (gdal.GDT_UInt32, 1, 1, [1, 0]), + (gdal.GDT_Float32, 1, 1, [1, 0]), + (gdal.GDT_Float32, 1.5, 1.5, [1, 0]), + (gdal.GDT_Float64, 1, 1, [1, 0]), + (gdal.GDT_Float64, 1.5, 1.5, [1, 0]), + (gdal.GDT_CInt16, 1, 1, [1, 0]), + ]: + myarray = rg.CreateMDArray( + "array_dt_" + gdal.GetDataTypeName(dt) + "_" + str(v) + "_" + str(nv), + [dim0], + gdal.ExtendedDataType.Create(dt), + ) + assert ( + myarray.Write( + struct.pack("d" * 2, 0, v), + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + == gdal.CE_None + ) myarray.SetNoDataValueDouble(nv) mask = myarray.GetMask() - assert [x for x in struct.unpack('B' * 2, mask.Read())] == expected, myarray.GetName() + assert [ + x for x in struct.unpack("B" * 2, mask.Read()) + ] == expected, myarray.GetName() def test_mem_md_array_resolvemdarray(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() a = rg.CreateGroup("a") @@ -1852,15 +2128,15 @@ def test_mem_md_array_resolvemdarray(): def test_mem_md_array_statistics(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) ar = rg.CreateMDArray("myarray", [dim0, dim1], float64dt) ar.SetNoDataValueDouble(6) - data = struct.pack('d' * 6, 1, 2, 3, 4, 5, 6) + data = struct.pack("d" * 6, 1, 2, 3, 4, 5, 6) ar.Write(data) stats = ar.ComputeStatistics(False) @@ -1884,15 +2160,15 @@ def test_mem_md_array_statistics(): def test_mem_md_array_statistics_float32(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) float32dt = gdal.ExtendedDataType.Create(gdal.GDT_Float32) ar = rg.CreateMDArray("myarray", [dim0, dim1], float32dt) ar.SetNoDataValueDouble(6) - data = struct.pack('f' * 6, 1, 2, 3, 4, 5, 6) + data = struct.pack("f" * 6, 1, 2, 3, 4, 5, 6) ar.Write(data) stats = ar.ComputeStatistics(False) @@ -1905,97 +2181,120 @@ def test_mem_md_array_statistics_float32(): def test_mem_md_array_copy_autoscale(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) float32dt = gdal.ExtendedDataType.Create(gdal.GDT_Float32) ar = rg.CreateMDArray("myarray", [dim0, dim1], float32dt) - data = struct.pack('f' * 6, 1.5, 2, 3, 4, 5, 6.5) + data = struct.pack("f" * 6, 1.5, 2, 3, 4, 5, 6.5) ar.Write(data) - attr = ar.CreateAttribute('attr_float64', [1], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = ar.CreateAttribute( + "attr_float64", [1], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) attr.Write(1.25) - attr = ar.CreateAttribute('valid_min', [1], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = ar.CreateAttribute( + "valid_min", [1], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) attr.Write(1.25) - out_ds = drv.CreateCopy('', ds, options = ['ARRAY:AUTOSCALE=YES']) + out_ds = drv.CreateCopy("", ds, options=["ARRAY:AUTOSCALE=YES"]) out_rg = out_ds.GetRootGroup() - out_ar = out_rg.OpenMDArray('myarray') - assert out_ar.GetAttribute('attr_float64') is not None - assert out_ar.GetAttribute('valid_min') is None + out_ar = out_rg.OpenMDArray("myarray") + assert out_ar.GetAttribute("attr_float64") is not None + assert out_ar.GetAttribute("valid_min") is None assert out_ar.GetDataType() == gdal.ExtendedDataType.Create(gdal.GDT_UInt16) assert out_ar.GetOffset() == 1.5 - assert out_ar.GetScale() == (6.5 - 1.5) / 65535. - assert struct.unpack('H' * 6, out_ar.Read()) == (0, 6554, 19661, 32768, 45875, 65535) - assert struct.unpack('d' * 6, out_ar.GetUnscaled().Read()) == pytest.approx( (1.5, 2, 3, 4, 5, 6.5), abs = out_ar.GetScale() / 2 ) + assert out_ar.GetScale() == (6.5 - 1.5) / 65535.0 + assert struct.unpack("H" * 6, out_ar.Read()) == ( + 0, + 6554, + 19661, + 32768, + 45875, + 65535, + ) + assert struct.unpack("d" * 6, out_ar.GetUnscaled().Read()) == pytest.approx( + (1.5, 2, 3, 4, 5, 6.5), abs=out_ar.GetScale() / 2 + ) def test_mem_md_array_copy_autoscale_with_explicit_data_type_and_nodata(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) float32dt = gdal.ExtendedDataType.Create(gdal.GDT_Float32) ar = rg.CreateMDArray("myarray", [dim0, dim1], float32dt) ar.SetNoDataValueDouble(5) - data = struct.pack('f' * 6, 1.5, 2, 3, 4, 6.5, 5) + data = struct.pack("f" * 6, 1.5, 2, 3, 4, 6.5, 5) ar.Write(data) - out_ds = drv.CreateCopy('', ds, options = ['ARRAY:AUTOSCALE=YES', - 'ARRAY:AUTOSCALE_DATA_TYPE=Int16']) + out_ds = drv.CreateCopy( + "", ds, options=["ARRAY:AUTOSCALE=YES", "ARRAY:AUTOSCALE_DATA_TYPE=Int16"] + ) out_rg = out_ds.GetRootGroup() - out_ar = out_rg.OpenMDArray('myarray') + out_ar = out_rg.OpenMDArray("myarray") assert out_ar.GetDataType() == gdal.ExtendedDataType.Create(gdal.GDT_Int16) - assert out_ar.GetScale() == (6.5 - 1.5) / (65535. - 1) + assert out_ar.GetScale() == (6.5 - 1.5) / (65535.0 - 1) assert out_ar.GetOffset() == 1.5 - (-32768) * out_ar.GetScale() - assert out_ar.GetNoDataValueAsDouble() == 32767. - assert struct.unpack('h' * 6, out_ar.Read()) == (-32768, -26215, -13108, -1, 32766, 32767) - unscaled = struct.unpack('d' * 6, out_ar.GetUnscaled().Read()) - assert unscaled[0:5] == pytest.approx( (1.5, 2, 3, 4, 6.5), abs = out_ar.GetScale() / 2 ) + assert out_ar.GetNoDataValueAsDouble() == 32767.0 + assert struct.unpack("h" * 6, out_ar.Read()) == ( + -32768, + -26215, + -13108, + -1, + 32766, + 32767, + ) + unscaled = struct.unpack("d" * 6, out_ar.GetUnscaled().Read()) + assert unscaled[0:5] == pytest.approx( + (1.5, 2, 3, 4, 6.5), abs=out_ar.GetScale() / 2 + ) assert math.isnan(unscaled[5]) def test_mem_md_array_nodata_int64(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 2) - myarray = rg.CreateMDArray("myarray", [dim0, dim1], - gdal.ExtendedDataType.Create(gdal.GDT_Int64)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1], gdal.ExtendedDataType.Create(gdal.GDT_Int64) + ) assert myarray val = -(1 << 63) assert myarray.SetNoDataValue(val) == gdal.CE_None assert myarray.GetNoDataValue() == val # Test MultiDim -> GDALDataset bridge - ds = myarray.AsClassicDataset(0,1) + ds = myarray.AsClassicDataset(0, 1) assert ds.GetRasterBand(1).GetNoDataValue() == val def test_mem_md_array_nodata_uint64(): - drv = gdal.GetDriverByName('MEM') - ds = drv.CreateMultiDimensional('myds') + drv = gdal.GetDriverByName("MEM") + ds = drv.CreateMultiDimensional("myds") rg = ds.GetRootGroup() dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 2) - myarray = rg.CreateMDArray("myarray", [dim0, dim1], - gdal.ExtendedDataType.Create(gdal.GDT_UInt64)) + myarray = rg.CreateMDArray( + "myarray", [dim0, dim1], gdal.ExtendedDataType.Create(gdal.GDT_UInt64) + ) assert myarray - val = (1 << 64)-1 + val = (1 << 64) - 1 assert myarray.SetNoDataValue(val) == gdal.CE_None assert myarray.GetNoDataValue() == val # Test MultiDim -> GDALDataset bridge - ds = myarray.AsClassicDataset(0,1) + ds = myarray.AsClassicDataset(0, 1) assert ds.GetRasterBand(1).GetNoDataValue() == val diff --git a/autotest/gdrivers/mff.py b/autotest/gdrivers/mff.py index 5b49d57613f3..8b0c73d0ad3e 100755 --- a/autotest/gdrivers/mff.py +++ b/autotest/gdrivers/mff.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,26 +37,25 @@ def test_mff_1(): - tst = gdaltest.GDALTest('MFF', 'mff/fakemff.hdr', 1, 1) + tst = gdaltest.GDALTest("MFF", "mff/fakemff.hdr", 1, 1) return tst.testOpen() + ############################################################################### # Test reading a - fake - tiled MFF dataset def test_mff_2(): - tst = gdaltest.GDALTest('MFF', 'mff/fakemfftiled.hdr', 1, 1) + tst = gdaltest.GDALTest("MFF", "mff/fakemfftiled.hdr", 1, 1) return tst.testOpen() ############################################################################### # Test reading a MFF file generated by CreateCopy() + def test_mff_3(): - tst = gdaltest.GDALTest('MFF', 'mff/bytemff.hdr', 1, 4672) + tst = gdaltest.GDALTest("MFF", "mff/bytemff.hdr", 1, 4672) return tst.testOpen() - - - diff --git a/autotest/gdrivers/mff2.py b/autotest/gdrivers/mff2.py index 2ebad833ca52..42e04c26f936 100755 --- a/autotest/gdrivers/mff2.py +++ b/autotest/gdrivers/mff2.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,5 @@ def test_mff2_1(): - tst = gdaltest.GDALTest('MFF2', 'mff2/bytemff2', 1, 4672) + tst = gdaltest.GDALTest("MFF2", "mff2/bytemff2", 1, 4672) return tst.testOpen() - - - diff --git a/autotest/gdrivers/mrf.py b/autotest/gdrivers/mrf.py index 87e4e450e800..b9faf4eea2d9 100755 --- a/autotest/gdrivers/mrf.py +++ b/autotest/gdrivers/mrf.py @@ -29,117 +29,176 @@ ############################################################################### import glob + +import gdaltest import pytest + from osgeo import gdal -import gdaltest -pytestmark = pytest.mark.require_driver('MRF') +pytestmark = pytest.mark.require_driver("MRF") mrf_tests = ( - ('byte.tif', 4672, [4672], []), - ('byte.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('byte.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('byte.tif', 4672, [4672], ['COMPRESS=NONE']), - ('byte.tif', 4672, [4672], ['COMPRESS=LERC']), - ('byte.tif', 4672, [4672], ['COMPRESS=QB3']), - ('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=ZSTD']), - ('int16.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('int16.tif', 4672, [4672], ['COMPRESS=LERC']), - ('int16.tif', 4672, [4672], ['COMPRESS=QB3']), - ('int16.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('../../gcore/data/uint16.tif', 4672, [4672], []), - ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=LERC']), - ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=QB3']), - ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('int32.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('int32.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('int32.tif', 4672, [4672], ['COMPRESS=TIF']), - ('int32.tif', 4672, [4672], ['COMPRESS=LERC']), - ('int32.tif', 4672, [4672], ['COMPRESS=QB3']), - ('int32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=TIF']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=LERC']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=QB3']), - ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('float32.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('float32.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('float32.tif', 4672, [4672], ['COMPRESS=TIF']), - ('float32.tif', 4672, [4672], ['COMPRESS=LERC']), - ('float32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('float64.tif', 4672, [4672], ['COMPRESS=DEFLATE']), - ('float64.tif', 4672, [4672], ['COMPRESS=ZSTD']), - ('float64.tif', 4672, [4672], ['COMPRESS=TIF']), - ('float64.tif', 4672, [4672], ['COMPRESS=LERC']), - ('float64.tif', 4672, [5015], ['COMPRESS=LERC', 'OPTIONS:LERC_PREC=10']), - ('float64.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), - ('../../gcore/data/utmsmall.tif', 50054, [50054], []), - ('small_world.tif', 30111, [30111], ['COMPRESS=ZSTD']), - ('small_world.tif', 30111, [30111], ['COMPRESS=ZSTD', 'INTERLEAVE=PIXEL']), - ('small_world.tif', 30111, [30111], ['COMPRESS=QB3']), - ('small_world.tif', 30111, [30111], ['COMPRESS=QB3', 'INTERLEAVE=PIXEL']), - ('small_world.tif', 30111, [30111], ['COMPRESS=QB3', 'QUALITY=99']), - ('small_world.tif', 30111, [30111], ['COMPRESS=LERC', 'INTERLEAVE=PIXEL']), - ('small_world.tif', 30111, [30111], ['COMPRESS=LERC', 'OPTIONS=V1:1', 'INTERLEAVE=PIXEL']), - ('small_world_pct.tif', 14890, [14890], ['COMPRESS=PPNG']), - ('byte.tif', 4672, [4603, 4652], ['COMPRESS=JPEG', 'QUALITY=99']), + ("byte.tif", 4672, [4672], []), + ("byte.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("byte.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("byte.tif", 4672, [4672], ["COMPRESS=NONE"]), + ("byte.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("byte.tif", 4672, [4672], ["COMPRESS=QB3"]), + ("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=ZSTD"]), + ("int16.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("int16.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("int16.tif", 4672, [4672], ["COMPRESS=QB3"]), + ("int16.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("../../gcore/data/uint16.tif", 4672, [4672], []), + ("../../gcore/data/uint16.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("../../gcore/data/uint16.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("../../gcore/data/uint16.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("../../gcore/data/uint16.tif", 4672, [4672], ["COMPRESS=QB3"]), + ("../../gcore/data/uint16.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("int32.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("int32.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("int32.tif", 4672, [4672], ["COMPRESS=TIF"]), + ("int32.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("int32.tif", 4672, [4672], ["COMPRESS=QB3"]), + ("int32.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=TIF"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=QB3"]), + ("../../gcore/data/uint32.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("float32.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("float32.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("float32.tif", 4672, [4672], ["COMPRESS=TIF"]), + ("float32.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("float32.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("float64.tif", 4672, [4672], ["COMPRESS=DEFLATE"]), + ("float64.tif", 4672, [4672], ["COMPRESS=ZSTD"]), + ("float64.tif", 4672, [4672], ["COMPRESS=TIF"]), + ("float64.tif", 4672, [4672], ["COMPRESS=LERC"]), + ("float64.tif", 4672, [5015], ["COMPRESS=LERC", "OPTIONS:LERC_PREC=10"]), + ("float64.tif", 4672, [4672], ["COMPRESS=LERC", "OPTIONS=V1:YES"]), + ("../../gcore/data/utmsmall.tif", 50054, [50054], []), + ("small_world.tif", 30111, [30111], ["COMPRESS=ZSTD"]), + ("small_world.tif", 30111, [30111], ["COMPRESS=ZSTD", "INTERLEAVE=PIXEL"]), + ("small_world.tif", 30111, [30111], ["COMPRESS=QB3"]), + ("small_world.tif", 30111, [30111], ["COMPRESS=QB3", "INTERLEAVE=PIXEL"]), + ("small_world.tif", 30111, [30111], ["COMPRESS=QB3", "QUALITY=99"]), + ("small_world.tif", 30111, [30111], ["COMPRESS=LERC", "INTERLEAVE=PIXEL"]), + ( + "small_world.tif", + 30111, + [30111], + ["COMPRESS=LERC", "OPTIONS=V1:1", "INTERLEAVE=PIXEL"], + ), + ("small_world_pct.tif", 14890, [14890], ["COMPRESS=PPNG"]), + ("byte.tif", 4672, [4603, 4652], ["COMPRESS=JPEG", "QUALITY=99"]), # following expected checksums are for: gcc 4.4 debug, mingw/vc9 32-bit, mingw-w64/vc12 64bit, MacOSX - ('rgbsmall.tif', 21212, [21162, 21110, 21155, 21116], ['COMPRESS=JPEG', 'QUALITY=99']), - ('rgbsmall.tif', 21212, [21266, 21369, 21256, 21495], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99']), - ('rgbsmall.tif', 21212, [21261, 21209, 21254, 21215], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99', 'PHOTOMETRIC=RGB']), - ('rgbsmall.tif', 21212, [21283, 21127, 21278, 21124], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99', 'PHOTOMETRIC=YCC']), - ('jpeg/12bit_rose_extract.jpg', 30075, [29650, 29680, 29680, 29650], ['COMPRESS=JPEG']), + ( + "rgbsmall.tif", + 21212, + [21162, 21110, 21155, 21116], + ["COMPRESS=JPEG", "QUALITY=99"], + ), + ( + "rgbsmall.tif", + 21212, + [21266, 21369, 21256, 21495], + ["INTERLEAVE=PIXEL", "COMPRESS=JPEG", "QUALITY=99"], + ), + ( + "rgbsmall.tif", + 21212, + [21261, 21209, 21254, 21215], + ["INTERLEAVE=PIXEL", "COMPRESS=JPEG", "QUALITY=99", "PHOTOMETRIC=RGB"], + ), + ( + "rgbsmall.tif", + 21212, + [21283, 21127, 21278, 21124], + ["INTERLEAVE=PIXEL", "COMPRESS=JPEG", "QUALITY=99", "PHOTOMETRIC=YCC"], + ), + ( + "jpeg/12bit_rose_extract.jpg", + 30075, + [29650, 29680, 29680, 29650], + ["COMPRESS=JPEG"], + ), # checksum depends on floating point precision - ('f32nan_data.tif', 54061, [54052, 54050], ['COMPRESS=LERC', 'OPTIONS=V1:Yes LERC_PREC:0.01']), + ( + "f32nan_data.tif", + 54061, + [54052, 54050], + ["COMPRESS=LERC", "OPTIONS=V1:Yes LERC_PREC:0.01"], + ), ) + @pytest.mark.parametrize( - 'src_filename,chksum,chksum_after_reopening,options', + "src_filename,chksum,chksum_after_reopening,options", mrf_tests, - ids=('{0}-{3}'.format(*r) for r in mrf_tests), + ids=("{0}-{3}".format(*r) for r in mrf_tests), ) def test_mrf(src_filename, chksum, chksum_after_reopening, options): - mrf_co = gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST') + mrf_co = gdal.GetDriverByName("MRF").GetMetadataItem("DMD_CREATIONOPTIONLIST") for comp in "LERC", "ZSTD", "QB3": if ("COMPRESS=" + comp) in options and comp not in mrf_co: pytest.skip() - if 'jpg' in src_filename: + if "jpg" in src_filename: import jpeg + jpeg.test_jpeg_1() - if gdaltest.jpeg_version == '9b': + if gdaltest.jpeg_version == "9b": pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open('data/' + src_filename) + 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) + ut = gdaltest.GDALTest( + "MRF", + src_filename, + 1, + chksum, + options=options, + chksum_after_reopening=chksum_after_reopening, + ) - check_minmax = 'COMPRESS=JPEG' not in ut.options + check_minmax = "COMPRESS=JPEG" not in ut.options for x in ut.options: - if 'OPTIONS:LERC_PREC=' in x: + if "OPTIONS:LERC_PREC=" in x: check_minmax = False return ut.testCreateCopy(check_minmax=check_minmax) -def cleanup(base = '/vsimem/out.'): - for ext in 'mrf', 'mrf.aux.xml', 'idx', 'ppg', 'til', 'lrc', 'pjg', 'pzp', 'psz', 'pq3': + +def cleanup(base="/vsimem/out."): + for ext in ( + "mrf", + "mrf.aux.xml", + "idx", + "ppg", + "til", + "lrc", + "pjg", + "pzp", + "psz", + "pq3", + ): gdal.Unlink(base + ext) + def test_mrf_zen_test(): - result = 'success' + result = "success" expectedCS = 770 - testvrt = ''' + testvrt = """ Gray @@ -153,17 +212,25 @@ def test_mrf_zen_test(): -''' - for interleave in 'PIXEL', 'BAND': - co = ['COMPRESS=JPEG', 'INTERLEAVE=' + interleave] - gdal.Translate('tmp/masked.mrf', 'data/jpeg/masked.jpg', format='MRF', creationOptions=co) +""" + for interleave in "PIXEL", "BAND": + co = ["COMPRESS=JPEG", "INTERLEAVE=" + interleave] + gdal.Translate( + "tmp/masked.mrf", "data/jpeg/masked.jpg", format="MRF", creationOptions=co + ) ds = gdal.Open(testvrt) cs = ds.GetRasterBand(1).Checksum() if cs != expectedCS: - gdaltest.post_reason('Interleave=' + interleave + - ' expected checksum ' + str(expectedCS) + ' got ' + str(cs)) - result = 'fail' - for f in glob.glob('tmp/masked.*'): + 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 @@ -172,18 +239,27 @@ def test_mrf_zen_test(): 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]) + 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, gdal.GetDataTypeName(dt) ds = None @@ -193,19 +269,28 @@ def test_mrf_overview_nnb_fact_2(): 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]) + 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, gdal.GetDataTypeName(dt) ds = None @@ -214,20 +299,29 @@ def test_mrf_overview_nnb_with_nodata_fact_2(): 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]) + 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, gdal.GetDataTypeName(dt) ds = None @@ -236,21 +330,30 @@ def test_mrf_overview_avg_fact_2(): 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]) + 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, gdal.GetDataTypeName(dt) ds = None @@ -259,12 +362,16 @@ def test_mrf_overview_avg_with_nodata_fact_2(): 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 = 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 ds = None @@ -276,21 +383,25 @@ 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 = 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') + 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') + ds = gdal.Open("/vsimem/out.mrf:MRF:L3") assert ds is None - ds = gdal.Open('/vsimem/out.mrf:MRF:L2') + ds = gdal.Open("/vsimem/out.mrf:MRF:L2") cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs ds = None @@ -299,12 +410,12 @@ def test_mrf_overview_nnb_implicit_level(): 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]) + 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') + ds = gdal.Open("/vsimem/out.mrf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 1087 assert cs == expected_cs @@ -314,13 +425,18 @@ def test_mrf_overview_external(): def test_mrf_lerc_nodata(): - mrf_co = gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST') - if 'LERC' not in mrf_co: + mrf_co = gdal.GetDriverByName("MRF").GetMetadataItem("DMD_CREATIONOPTIONLIST") + if "LERC" not in mrf_co: pytest.skip() - gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', - noData=107, creationOptions=['COMPRESS=LERC']) - ds = gdal.Open('/vsimem/out.mrf') + 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() @@ -332,33 +448,41 @@ def test_mrf_lerc_nodata(): def test_mrf_lerc_with_huffman(): - mrf_co = gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST') - if 'LERC' not in mrf_co: + mrf_co = gdal.GetDriverByName("MRF").GetMetadataItem("DMD_CREATIONOPTIONLIST") + if "LERC" not in mrf_co: pytest.skip() - gdal.Translate('/vsimem/out.mrf', 'data/small_world.tif', format='MRF', - width=5000, height=5000, creationOptions=['COMPRESS=LERC']) - ds = gdal.Open('/vsimem/out.mrf') + 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 cleanup() + def test_raw_lerc(): - mrf_co = gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST') - if 'LERC' not in mrf_co: + mrf_co = gdal.GetDriverByName("MRF").GetMetadataItem("DMD_CREATIONOPTIONLIST") + if "LERC" not in mrf_co: pytest.skip() # Defaults to LERC2 - for opt in 'OPTIONS=V1:1', None: - co = ['COMPRESS=LERC'] + for opt in "OPTIONS=V1:1", None: + co = ["COMPRESS=LERC"] if opt: co.append(opt) - gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', - creationOptions = co) - ds = gdal.Open('/vsimem/out.lrc') + gdal.Translate( + "/vsimem/out.mrf", "data/byte.tif", format="MRF", creationOptions=co + ) + ds = gdal.Open("/vsimem/out.lrc") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() expected_cs = 4819 @@ -366,7 +490,9 @@ def test_raw_lerc(): ds = None # Test open options for raw LERC1, it accepts NDV and datatype overrides if opt: - ds = gdal.OpenEx('/vsimem/out.lrc', open_options = ['@NDV=100, @datatype=UInt32']) + ds = gdal.OpenEx( + "/vsimem/out.lrc", open_options=["@NDV=100, @datatype=UInt32"] + ) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() print(cs, opt) @@ -374,12 +500,17 @@ def test_raw_lerc(): ds = None cleanup() + def test_mrf_cached_source(): # Test empty cache creation - gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', - creationOptions=['CACHEDSOURCE=invalid_source', 'NOCOPY=TRUE']) - ds = gdal.Open('/vsimem/out.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 @@ -387,27 +518,31 @@ def test_mrf_cached_source(): ds = None cleanup() - 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') + 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') + 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 - cleanup('tmp/out.') + cleanup("tmp/out.") # Caching MRF in mp_safe mode - open('tmp/byte.tif', 'wb').write(open('data/byte.tif', 'rb').read()) - open('tmp/out.mrf', 'wt').write( -""" + open("tmp/byte.tif", "wb").write(open("data/byte.tif", "rb").read()) + open("tmp/out.mrf", "wt").write( + """ byte.tif @@ -415,16 +550,17 @@ def test_mrf_cached_source(): -""") - ds = gdal.Open('tmp/out.mrf') +""" + ) + ds = gdal.Open("tmp/out.mrf") cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None # Read it again, from the cache - gdal.Unlink('tmp/byte.tif') - ds = gdal.Open('tmp/out.mrf') + gdal.Unlink("tmp/byte.tif") + ds = gdal.Open("tmp/out.mrf") cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs @@ -432,8 +568,8 @@ def test_mrf_cached_source(): # No cleanup, will test cloning next # Cloning MRF - open('tmp/cloning.mrf', 'wt').write( -""" + open("tmp/cloning.mrf", "wt").write( + """ out.mrf @@ -441,57 +577,61 @@ def test_mrf_cached_source(): -""") - ds = gdal.Open('tmp/cloning.mrf') +""" + ) + ds = gdal.Open("tmp/cloning.mrf") cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None - cleanup('tmp/out.') + cleanup("tmp/out.") # Read it again, from the cache - ds = gdal.Open('tmp/cloning.mrf') + ds = gdal.Open("tmp/cloning.mrf") cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None - cleanup('tmp/cloning.') + cleanup("tmp/cloning.") + def test_mrf_versioned(): # Caching MRF - gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF') - gdal.FileFromMemBuffer('/vsimem/out.mrf', -""" + gdal.Translate("/vsimem/out.mrf", "data/byte.tif", format="MRF") + gdal.FileFromMemBuffer( + "/vsimem/out.mrf", + """ -""") - ds = gdal.Open('/vsimem/out.mrf', gdal.GA_Update) +""", + ) + ds = gdal.Open("/vsimem/out.mrf", gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None - ds = gdal.Open('/vsimem/out.mrf') + 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') + 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') + 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') + ds = gdal.Open("/vsimem/out.mrf:MRF:V2") assert ds is None cleanup() @@ -500,23 +640,23 @@ def test_mrf_versioned(): def test_mrf_cleanup(): files = ( - '12bit_rose_extract.jpg.*', - 'byte.tif.*', - 'int16.tif.*', - 'rgbsmall.tif.*', - 'small_world*', - 'float32.tif.*', - 'float64.tif.*', - 'int32.tif.*', - 'uint16.tif.*', - 'uint32.tif.*', - 'utmsmall.tif.*', - 'cloning.*', - 'f32nan_data.*' + "12bit_rose_extract.jpg.*", + "byte.tif.*", + "int16.tif.*", + "rgbsmall.tif.*", + "small_world*", + "float32.tif.*", + "float64.tif.*", + "int32.tif.*", + "uint16.tif.*", + "uint32.tif.*", + "utmsmall.tif.*", + "cloning.*", + "f32nan_data.*", ) - for f in (fname for n in files for fname in glob.glob('tmp/' + n)): + for f in (fname for n in files for fname in glob.glob("tmp/" + n)): gdal.Unlink(f) cleanup() - cleanup('tmp/out.') + cleanup("tmp/out.") diff --git a/autotest/gdrivers/mrsid.py b/autotest/gdrivers/mrsid.py index 7a1605c03b9d..6d8a42b4c54f 100755 --- a/autotest/gdrivers/mrsid.py +++ b/autotest/gdrivers/mrsid.py @@ -31,40 +31,41 @@ import os import shutil -from osgeo import gdal -from osgeo import osr import gdaltest import pytest -pytestmark = pytest.mark.require_driver('MrSID') +from osgeo import gdal, osr + +pytestmark = pytest.mark.require_driver("MrSID") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.mrsid_drv = gdal.GetDriverByName('MrSID') - gdaltest.jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') + gdaltest.mrsid_drv = gdal.GetDriverByName("MrSID") + gdaltest.jp2mrsid_drv = gdal.GetDriverByName("JP2MrSID") if gdaltest.jp2mrsid_drv: - gdaltest.deregister_all_jpeg2000_drivers_but('JP2MrSID') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2MrSID") yield gdaltest.reregister_all_jpeg2000_drivers() try: - os.remove('data/sid/mercator.sid.aux.xml') - os.remove('data/sid/mercator_new.sid.aux.xml') + os.remove("data/sid/mercator.sid.aux.xml") + os.remove("data/sid/mercator_new.sid.aux.xml") except OSError: pass + ############################################################################### # Read a simple byte file, checking projections and geotransform. def test_mrsid_1(): - tst = gdaltest.GDALTest('MrSID', 'sid/mercator.sid', 1, None) + tst = gdaltest.GDALTest("MrSID", "sid/mercator.sid", 1, None) gt = (-15436.385771224039, 60.0, 0.0, 3321987.8617962394, 0.0, -60.0) # @@ -128,21 +129,22 @@ def test_mrsid_1(): 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)) + tst.testOpen( + check_gt=gt, + check_stat=(0.0, 255.0, 103.319, 55.153), + check_approx_stat=(2.0, 243.0, 103.131, 43.978), + ) - ds = gdal.Open('data/sid/mercator.sid') + ds = gdal.Open("data/sid/mercator.sid") got_prj = ds.GetProjectionRef() ds = None - if prj.find('North_American_Datum_1927') == -1 or \ - prj.find('Mercator_1SP') == -1: + if prj.find("North_American_Datum_1927") == -1 or prj.find("Mercator_1SP") == -1: print(got_prj) - pytest.fail('did not get expected projection') + pytest.fail("did not get expected projection") if got_prj != prj: - print('Warning: did not get exactly expected projection. Got %s' % got_prj) + print("Warning: did not get exactly expected projection. Got %s" % got_prj) ############################################################################### @@ -153,19 +155,20 @@ def test_mrsid_1(): def test_mrsid_2(): - ds = gdal.Open('data/sid/mercator.sid') + ds = gdal.Open("data/sid/mercator.sid") try: data = ds.ReadRaster(0, 0, 515, 515, buf_xsize=10, buf_ysize=10) except: - pytest.fail('Small overview read failed: ' + gdal.GetLastErrorMsg()) + pytest.fail("Small overview read failed: " + gdal.GetLastErrorMsg()) ds = None total = sum(data) mean = float(total) / len(data) - assert mean >= 95 and mean <= 105, 'image mean out of range.' + assert mean >= 95 and mean <= 105, "image mean out of range." + ############################################################################### # Test overview reading. @@ -173,10 +176,10 @@ def test_mrsid_2(): def test_mrsid_3(): - ds = gdal.Open('data/sid/mercator.sid') + ds = gdal.Open("data/sid/mercator.sid") band = ds.GetRasterBand(1) - assert band.GetOverviewCount() == 4, 'did not get expected overview count' + assert band.GetOverviewCount() == 4, "did not get expected overview count" new_stat = band.GetOverview(3).GetStatistics(0, 1) @@ -185,10 +188,10 @@ def test_mrsid_3(): stat_epsilon = 0.0001 for i in range(4): if new_stat[i] != pytest.approx(check_stat[i], abs=stat_epsilon): - print('') - print('old = ', check_stat) - print('new = ', new_stat) - pytest.fail('Statistics differ.') + print("") + print("old = ", check_stat) + print("new = ", new_stat) + pytest.fail("Statistics differ.") ############################################################################### @@ -198,11 +201,11 @@ def test_mrsid_3(): def test_mrsid_4(): try: - os.remove('data/sid/mercator_new.sid.aux.xml') + os.remove("data/sid/mercator_new.sid.aux.xml") except OSError: pass - tst = gdaltest.GDALTest('MrSID', 'sid/mercator_new.sid', 1, None) + tst = gdaltest.GDALTest("MrSID", "sid/mercator_new.sid", 1, None) gt = (-15436.385771224039, 60.0, 0.0, 3321987.8617962394, 0.0, -60.0) prj = """PROJCS["MER E000", @@ -223,17 +226,21 @@ def test_mrsid_4(): 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)) + ret = tst.testOpen( + check_gt=gt, + check_prj=prj, + check_stat=(0.0, 255.0, 103.112, 52.477), + check_approx_stat=(0.0, 255.0, 102.684, 51.614), + ) try: - os.remove('data/sid/mercator_new.sid.aux.xml') + os.remove("data/sid/mercator_new.sid.aux.xml") except OSError: pass return ret + ############################################################################### # Open byte.jp2 @@ -264,20 +271,21 @@ def test_mrsid_6(): """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('JP2MrSID', 'jpeg2000/byte.jp2', 1, 50054) + tst = gdaltest.GDALTest("JP2MrSID", "jpeg2000/byte.jp2", 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Open int16.jp2 + def test_mrsid_7(): if gdaltest.jp2mrsid_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/int16.jp2') - ds_ref = gdal.Open('data/int16.tif') + ds = gdal.Open("data/jpeg2000/int16.jp2") + ds_ref = gdal.Open("data/int16.tif") maxdiff = gdaltest.compare_ds(ds, ds_ref) @@ -287,11 +295,12 @@ def test_mrsid_7(): ds = None ds_ref = None - pytest.fail('Image too different from reference') + pytest.fail("Image too different from reference") ds = None ds_ref = None + ############################################################################### # Test PAM override for nodata, coordsys, and geotransform. @@ -302,30 +311,31 @@ def test_mrsid_8(): srs = osr.SpatialReference() srs.ImportFromEPSG(27700) - gdal.PushErrorHandler('CPLQuietErrorHandler') - gdal.GetDriverByName('MrSID').Delete('tmp/mercator.sid') + gdal.PushErrorHandler("CPLQuietErrorHandler") + gdal.GetDriverByName("MrSID").Delete("tmp/mercator.sid") gdal.PopErrorHandler() - shutil.copyfile('data/sid/mercator.sid', 'tmp/mercator.sid') + shutil.copyfile("data/sid/mercator.sid", "tmp/mercator.sid") - ds = gdal.Open('tmp/mercator.sid') + ds = gdal.Open("tmp/mercator.sid") ds.SetGeoTransform(new_gt) ds.SetSpatialRef(srs) ds.GetRasterBand(1).SetNoDataValue(255) ds = None - ds = gdal.Open('tmp/mercator.sid') + ds = gdal.Open("tmp/mercator.sid") - assert ds.GetSpatialRef().IsSame(srs), 'SRS Override failed.' + assert ds.GetSpatialRef().IsSame(srs), "SRS Override failed." - assert new_gt == ds.GetGeoTransform(), 'Geotransform Override failed.' + assert new_gt == ds.GetGeoTransform(), "Geotransform Override failed." - assert ds.GetRasterBand(1).GetNoDataValue() == 255, 'Nodata override failed.' + assert ds.GetRasterBand(1).GetNoDataValue() == 255, "Nodata override failed." ds = None - gdal.GetDriverByName('MrSID').Delete('tmp/mercator.sid') + gdal.GetDriverByName("MrSID").Delete("tmp/mercator.sid") + ############################################################################### # Test VSI*L IO with .sid @@ -333,19 +343,20 @@ def test_mrsid_8(): def test_mrsid_9(): - f = open('data/sid/mercator.sid', 'rb') + f = open("data/sid/mercator.sid", "rb") data = f.read() f.close() - f = gdal.VSIFOpenL('/vsimem/mrsid_9.sid', 'wb') + 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') + ds = gdal.Open("/vsimem/mrsid_9.sid") assert ds is not None ds = None - gdal.Unlink('/vsimem/mrsid_9.sid') + gdal.Unlink("/vsimem/mrsid_9.sid") + ############################################################################### # Test VSI*L IO with .jp2 @@ -356,19 +367,20 @@ def test_mrsid_10(): if gdaltest.jp2mrsid_drv is None: pytest.skip() - f = open('data/jpeg2000/int16.jp2', 'rb') + f = open("data/jpeg2000/int16.jp2", "rb") data = f.read() f.close() - f = gdal.VSIFOpenL('/vsimem/mrsid_10.jp2', 'wb') + 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') + ds = gdal.Open("/vsimem/mrsid_10.jp2") assert ds is not None ds = None - gdal.Unlink('/vsimem/mrsid_10.jp2') + gdal.Unlink("/vsimem/mrsid_10.jp2") + ############################################################################### # Check that we can use .j2w world files (#4651) @@ -379,14 +391,21 @@ def test_mrsid_11(): if gdaltest.jp2mrsid_drv is None: pytest.skip() - ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') + ds = gdal.Open("data/jpeg2000/byte_without_geotransform.jp2") geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(440720, abs=0.1) + and geotransform[1] == pytest.approx(60, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(3751320, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-60, abs=0.001) + ), "geotransform differs from expected" ds = None + ############################################################################### @@ -395,18 +414,24 @@ 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'): + 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 = gdaltest.GDALTest( + "JP2MrSID", "tmp/cache/7sisters200.j2k", 1, None, filename_absolute=1 + ) tst.testOpen() - ds = gdal.Open('tmp/cache/7sisters200.j2k') + ds = gdal.Open("tmp/cache/7sisters200.j2k") ds.GetRasterBand(1).Checksum() ds = None + ############################################################################### @@ -415,16 +440,20 @@ 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'): + 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 = 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 = gdal.Open("tmp/cache/gcp.jp2") ds.GetRasterBand(1).Checksum() # if len(ds.GetGCPs()) != 15: # gdaltest.post_reason('bad number of GCP') @@ -437,6 +466,7 @@ def test_mrsid_online_2(): ds = None + ############################################################################### @@ -445,18 +475,24 @@ 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'): + 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'): + 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 = 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') + 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 @@ -468,7 +504,7 @@ def test_mrsid_online_3(): print(ds_ref.GetRasterBand(1).Checksum()) gdaltest.compare_ds(ds, ds_ref, verbose=1) - pytest.fail('Image too different from reference') + pytest.fail("Image too different from reference") ############################################################################### @@ -479,18 +515,24 @@ 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'): + 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'): + 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 = 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') + 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 @@ -500,4 +542,4 @@ def test_mrsid_online_4(): if maxdiff > 1: print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) - pytest.fail('Image too different from reference') + pytest.fail("Image too different from reference") diff --git a/autotest/gdrivers/ndf.py b/autotest/gdrivers/ndf.py index f0a5be6f8fa2..604ed96ce92c 100755 --- a/autotest/gdrivers/ndf.py +++ b/autotest/gdrivers/ndf.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,16 @@ def test_ndf_1(): - tst = gdaltest.GDALTest('NDF', 'ndf/LE7134052000500350.H3', 1, 6510, - xoff=0, yoff=0, xsize=15620, ysize=1) + tst = gdaltest.GDALTest( + "NDF", + "ndf/LE7134052000500350.H3", + 1, + 6510, + xoff=0, + yoff=0, + xsize=15620, + ysize=1, + ) gt = (320325.75, 14.25, 0, 1383062.25, 0, -14.25) @@ -65,8 +72,4 @@ def test_ndf_1(): PARAMETER["false_northing",0], UNIT["Meter",1]]""" - return tst.testOpen(check_gt=gt, gt_epsilon=0.0001, - check_prj=wkt) - - - + return tst.testOpen(check_gt=gt, gt_epsilon=0.0001, check_prj=wkt) diff --git a/autotest/gdrivers/netcdf.py b/autotest/gdrivers/netcdf.py index 19264bbef94b..2a478200dbc1 100755 --- a/autotest/gdrivers/netcdf.py +++ b/autotest/gdrivers/netcdf.py @@ -33,23 +33,18 @@ import json import os -import sys import shutil import struct -from osgeo import gdal -from osgeo import ogr -from osgeo import osr - - -import pytest +import sys import gdaltest - +import pytest import test_cli_utilities - from uffd import uffd_compare -pytestmark = pytest.mark.require_driver('netCDF') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("netCDF") ############################################################################### # Netcdf Functions @@ -59,53 +54,55 @@ # Get netcdf version and test for supported files -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def netcdf_setup(): # NOTE: this is also used by netcdf_cf.py - gdaltest.netcdf_drv_version = 'unknown' + gdaltest.netcdf_drv_version = "unknown" gdaltest.netcdf_drv_has_nc2 = False gdaltest.netcdf_drv_has_nc4 = False gdaltest.netcdf_drv_has_hdf4 = False gdaltest.netcdf_drv_silent = False - gdaltest.netcdf_drv = gdal.GetDriverByName('NETCDF') + gdaltest.netcdf_drv = gdal.GetDriverByName("NETCDF") # get capabilities from driver metadata = gdaltest.netcdf_drv.GetMetadata() if metadata is None: - pytest.skip('NOTICE: netcdf metadata not found, skipping checks') + pytest.skip("NOTICE: netcdf metadata not found, skipping checks") # netcdf library version "3.6.3" of Dec 22 2009 06:10:17 $ # netcdf library version 4.1.1 of Mar 4 2011 12:52:19 $ - if 'NETCDF_VERSION' in metadata: - v = metadata['NETCDF_VERSION'] - v = v[0: v.find(' ')].strip('"') + if "NETCDF_VERSION" in metadata: + v = metadata["NETCDF_VERSION"] + v = v[0 : v.find(" ")].strip('"') gdaltest.netcdf_drv_version = v - if 'NETCDF_HAS_NC2' in metadata \ - and metadata['NETCDF_HAS_NC2'] == 'YES': + if "NETCDF_HAS_NC2" in metadata and metadata["NETCDF_HAS_NC2"] == "YES": gdaltest.netcdf_drv_has_nc2 = True - if 'NETCDF_HAS_NC4' in metadata \ - and metadata['NETCDF_HAS_NC4'] == 'YES': + if "NETCDF_HAS_NC4" in metadata and metadata["NETCDF_HAS_NC4"] == "YES": gdaltest.netcdf_drv_has_nc4 = True - if 'NETCDF_HAS_HDF4' in metadata \ - and metadata['NETCDF_HAS_HDF4'] == 'YES': + if "NETCDF_HAS_HDF4" in metadata and metadata["NETCDF_HAS_HDF4"] == "YES": gdaltest.netcdf_drv_has_hdf4 = True - print('NOTICE: using netcdf version ' + gdaltest.netcdf_drv_version + - ' has_nc2: ' + str(gdaltest.netcdf_drv_has_nc2) + ' has_nc4: ' + - str(gdaltest.netcdf_drv_has_nc4)) + print( + "NOTICE: using netcdf version " + + gdaltest.netcdf_drv_version + + " has_nc2: " + + str(gdaltest.netcdf_drv_has_nc2) + + " has_nc4: " + + str(gdaltest.netcdf_drv_has_nc4) + ) gdaltest.count_opened_files = len(gdaltest.get_opened_files()) -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def netcdf_teardown(): diff = len(gdaltest.get_opened_files()) - gdaltest.count_opened_files - assert diff == 0, 'Leak of file handles: %d leaked' % diff + assert diff == 0, "Leak of file handles: %d leaked" % diff ############################################################################### @@ -113,17 +110,22 @@ def netcdf_teardown(): # helper function needed so we can call Process() on it from netcdf_test_copy_timeout() -def netcdf_test_copy(ifile, band, checksum, ofile, opts=None, driver='NETCDF'): +def netcdf_test_copy(ifile, band, checksum, ofile, opts=None, driver="NETCDF"): # pylint: disable=unused-argument opts = [] if opts is None else opts - test = gdaltest.GDALTest('NETCDF', '../' + ifile, band, checksum, options=opts) - return test.testCreateCopy(check_gt=0, check_srs=0, new_filename=ofile, delete_copy=0, check_minmax=0) + test = gdaltest.GDALTest("NETCDF", "../" + ifile, band, checksum, options=opts) + return test.testCreateCopy( + check_gt=0, check_srs=0, new_filename=ofile, delete_copy=0, check_minmax=0 + ) + ############################################################################### # test file copy, optional timeout arg -def netcdf_test_copy_timeout(ifile, band, checksum, ofile, opts=None, driver='NETCDF', timeout=None): +def netcdf_test_copy_timeout( + ifile, band, checksum, ofile, opts=None, driver="NETCDF", timeout=None +): from multiprocessing import Process @@ -136,10 +138,12 @@ def netcdf_test_copy_timeout(ifile, band, checksum, ofile, opts=None, driver='NE netcdf_test_copy(ifile, band, checksum, ofile, opts, driver) else: - sys.stdout.write('.') + sys.stdout.write(".") sys.stdout.flush() - proc = Process(target=netcdf_test_copy, args=(ifile, band, checksum, ofile, opts)) + proc = Process( + target=netcdf_test_copy, args=(ifile, band, checksum, ofile, opts) + ) proc.start() proc.join(timeout) @@ -150,7 +154,8 @@ def netcdf_test_copy_timeout(ifile, band, checksum, ofile, opts=None, driver='NE if os.path.exists(ofile): drv.Delete(ofile) pytest.fail( - f'testCreateCopy() for file {ofile} has reached timeout limit of {timeout} seconds') + f"testCreateCopy() for file {ofile} has reached timeout limit of {timeout} seconds" + ) ############################################################################### @@ -161,33 +166,36 @@ def netcdf_test_deflate(ifile, checksum, zlevel=1, timeout=None): try: from multiprocessing import Process + Process.is_alive except (ImportError, AttributeError): - pytest.skip('from multiprocessing import Process failed') + pytest.skip("from multiprocessing import Process failed") if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ofile1 = 'tmp/' + os.path.basename(ifile) + '-1.nc' - ofile1_opts = ['FORMAT=NC4C', 'COMPRESS=NONE'] - ofile2 = 'tmp/' + os.path.basename(ifile) + '-2.nc' - ofile2_opts = ['FORMAT=NC4C', 'COMPRESS=DEFLATE', 'ZLEVEL=' + str(zlevel)] + ofile1 = "tmp/" + os.path.basename(ifile) + "-1.nc" + ofile1_opts = ["FORMAT=NC4C", "COMPRESS=NONE"] + ofile2 = "tmp/" + os.path.basename(ifile) + "-2.nc" + ofile2_opts = ["FORMAT=NC4C", "COMPRESS=DEFLATE", "ZLEVEL=" + str(zlevel)] - assert os.path.exists(ifile), ('ifile %s does not exist' % ifile) + assert os.path.exists(ifile), "ifile %s does not exist" % ifile - netcdf_test_copy_timeout(ifile, 1, checksum, ofile1, ofile1_opts, 'NETCDF', timeout) + netcdf_test_copy_timeout(ifile, 1, checksum, ofile1, ofile1_opts, "NETCDF", timeout) - netcdf_test_copy_timeout(ifile, 1, checksum, ofile2, ofile2_opts, 'NETCDF', timeout) + netcdf_test_copy_timeout(ifile, 1, checksum, ofile2, ofile2_opts, "NETCDF", timeout) # make sure compressed file is smaller than uncompressed files try: size1 = os.path.getsize(ofile1) size2 = os.path.getsize(ofile2) except OSError: - pytest.fail('Error getting file sizes.') + pytest.fail("Error getting file sizes.") + + assert ( + size2 < size1 + ), "Compressed file is not smaller than reference, check your netcdf-4, HDF5 and zlib installation" - assert size2 < size1, \ - 'Compressed file is not smaller than reference, check your netcdf-4, HDF5 and zlib installation' ############################################################################### # check support for reading attributes (single values and array values) @@ -197,39 +205,44 @@ def netcdf_check_vars(ifile, vals_global=None, vals_band=None): src_ds = gdal.Open(ifile) - assert src_ds is not None, ('could not open dataset ' + ifile) + assert src_ds is not None, "could not open dataset " + ifile metadata_global = src_ds.GetMetadata() - assert metadata_global is not None, ('could not get global metadata from ' + ifile) + assert metadata_global is not None, "could not get global metadata from " + ifile missval = src_ds.GetRasterBand(1).GetNoDataValue() - assert missval == 1, ('got invalid nodata value %s for Band' % str(missval)) + assert missval == 1, "got invalid nodata value %s for Band" % str(missval) metadata_band = src_ds.GetRasterBand(1).GetMetadata() - assert metadata_band is not None, 'could not get Band metadata' + assert metadata_band is not None, "could not get Band metadata" metadata = metadata_global vals = vals_global if vals is None: vals = dict() for k, v in vals.items(): - assert k in metadata, ("missing metadata [%s]" % (str(k))) + assert k in metadata, "missing metadata [%s]" % (str(k)) # strip { and } as new driver uses these for array values - mk = metadata[k].lstrip('{ ').rstrip('} ') - assert mk == v, ("invalid value [%s] for metadata [%s]=[%s]" - % (str(mk), str(k), str(v))) + mk = metadata[k].lstrip("{ ").rstrip("} ") + assert mk == v, "invalid value [%s] for metadata [%s]=[%s]" % ( + str(mk), + str(k), + str(v), + ) metadata = metadata_band vals = vals_band if vals is None: vals = dict() for k, v in vals.items(): - assert k in metadata, ("missing metadata [%s]" % (str(k))) + assert k in metadata, "missing metadata [%s]" % (str(k)) # strip { and } as new driver uses these for array values - mk = metadata[k].lstrip('{ ').rstrip('} ') - assert mk == v, ("invalid value [%s] for metadata [%s]=[%s]" - % (str(mk), str(k), str(v))) - + mk = metadata[k].lstrip("{ ").rstrip("} ") + assert mk == v, "invalid value [%s] for metadata [%s]=[%s]" % ( + str(mk), + str(k), + str(v), + ) ############################################################################### @@ -239,17 +252,20 @@ def netcdf_check_vars(ifile, vals_global=None, vals_band=None): ############################################################################### # Perform simple read test. + def test_netcdf_1(): - tst = gdaltest.GDALTest('NetCDF', 'NETCDF:"data/netcdf/bug636.nc":tas', 1, 31621, - filename_absolute=1) + tst = gdaltest.GDALTest( + "NetCDF", 'NETCDF:"data/netcdf/bug636.nc":tas', 1, 31621, filename_absolute=1 + ) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") tst.testOpen() gdal.PopErrorHandler() + ############################################################################### # Verify a simple createcopy operation. We can't do the trivial gdaltest # operation because the new file will only be accessible via subdatasets. @@ -257,13 +273,11 @@ def test_netcdf_1(): def test_netcdf_2(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - gdaltest.netcdf_drv.CreateCopy('tmp/netcdf2.nc', src_ds) + gdaltest.netcdf_drv.CreateCopy("tmp/netcdf2.nc", src_ds) - tst = gdaltest.GDALTest('NetCDF', 'tmp/netcdf2.nc', - 1, 4672, - filename_absolute=1) + tst = gdaltest.GDALTest("NetCDF", "tmp/netcdf2.nc", 1, 4672, filename_absolute=1) wkt = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", @@ -287,51 +301,59 @@ def test_netcdf_2(): tst.testOpen(check_prj=wkt) # Check that no nodata value is reported for a Byte dataset - ds = gdal.Open('tmp/netcdf2.nc') + ds = gdal.Open("tmp/netcdf2.nc") assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None # Test update mode - ds = gdal.Open('tmp/netcdf2.nc', gdal.GA_Update) + ds = gdal.Open("tmp/netcdf2.nc", gdal.GA_Update) assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None gdaltest.clean_tmp() + ############################################################################### def test_netcdf_3(): - ds = gdal.Open('data/netcdf/sombrero.grd') + ds = gdal.Open("data/netcdf/sombrero.grd") bnd = ds.GetRasterBand(1) minmax = bnd.ComputeRasterMinMax() - assert minmax[0] == pytest.approx((-0.675758), abs=0.000001) and minmax[1] == pytest.approx(1.0, abs=0.000001), \ - 'Wrong min or max.' + assert minmax[0] == pytest.approx((-0.675758), abs=0.000001) and minmax[ + 1 + ] == pytest.approx(1.0, abs=0.000001), "Wrong min or max." bnd = None ds = None + ############################################################################### # In #2582 5dimensional files were causing problems. Verify use ok. def test_netcdf_4(): - tst = gdaltest.GDALTest('NetCDF', - 'NETCDF:data/netcdf/foo_5dimensional.nc:temperature', - 3, 1218, filename_absolute=1) + tst = gdaltest.GDALTest( + "NetCDF", + "NETCDF:data/netcdf/foo_5dimensional.nc:temperature", + 3, + 1218, + filename_absolute=1, + ) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") # don't test for checksum (see bug #4284) result = tst.testOpen(skip_checksum=True) gdal.PopErrorHandler() return result + ############################################################################### # In #2583 5dimensional files were having problems unrolling the highest # dimension - check handling now on band 7. @@ -339,19 +361,24 @@ def test_netcdf_4(): def test_netcdf_5(): - tst = gdaltest.GDALTest('NetCDF', - 'NETCDF:data/netcdf/foo_5dimensional.nc:temperature', - 7, 1227, filename_absolute=1) + tst = gdaltest.GDALTest( + "NetCDF", + "NETCDF:data/netcdf/foo_5dimensional.nc:temperature", + 7, + 1227, + filename_absolute=1, + ) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") # don't test for checksum (see bug #4284) result = tst.testOpen(skip_checksum=True) gdal.PopErrorHandler() return result + ############################################################################### # ticket #3324 check spatial reference reading for cf-1.4 lambert conformal # 1 standard parallel. @@ -359,18 +386,20 @@ def test_netcdf_5(): def test_netcdf_6(): - ds = gdal.Open('data/netcdf/cf_lcc1sp.nc') + ds = gdal.Open("data/netcdf/cf_lcc1sp.nc") prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) - lat_origin = sr.GetProjParm('latitude_of_origin') + lat_origin = sr.GetProjParm("latitude_of_origin") - assert lat_origin == 25, ('Latitude of origin does not match expected:\n%f' - % lat_origin) + assert lat_origin == 25, ( + "Latitude of origin does not match expected:\n%f" % lat_origin + ) ds = None + ############################################################################### # ticket #3324 check spatial reference reading for cf-1.4 lambert conformal # 2 standard parallels. @@ -378,21 +407,22 @@ def test_netcdf_6(): def test_netcdf_7(): - ds = gdal.Open('data/netcdf/cf_lcc2sp.nc') + ds = gdal.Open("data/netcdf/cf_lcc2sp.nc") prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) - std_p1 = sr.GetProjParm('standard_parallel_1') - std_p2 = sr.GetProjParm('standard_parallel_2') + std_p1 = sr.GetProjParm("standard_parallel_1") + std_p2 = sr.GetProjParm("standard_parallel_2") - assert std_p1 == 33.0 and std_p2 == 45.0, \ - ('Standard Parallels do not match expected:\n%f,%f' - % (std_p1, std_p2)) + assert ( + std_p1 == 33.0 and std_p2 == 45.0 + ), "Standard Parallels do not match expected:\n%f,%f" % (std_p1, std_p2) ds = None sr = None + ############################################################################### # check for cf convention read of albers equal area # Previous version compared entire wkt, which varies slightly among driver versions @@ -401,100 +431,116 @@ def test_netcdf_7(): def test_netcdf_8(): - ds = gdal.Open('data/netcdf/cf_aea2sp_invf.nc') + ds = gdal.Open("data/netcdf/cf_aea2sp_invf.nc") srs = osr.SpatialReference() srs.ImportFromWkt(ds.GetProjection()) - proj = srs.GetAttrValue('PROJECTION') - assert proj == 'Albers_Conic_Equal_Area', \ - ('Projection does not match expected : ' + proj) + proj = srs.GetAttrValue("PROJECTION") + assert proj == "Albers_Conic_Equal_Area", ( + "Projection does not match expected : " + proj + ) - param = srs.GetProjParm('latitude_of_center') - assert param == 37.5, ('Got wrong parameter value (%g)' % param) + param = srs.GetProjParm("latitude_of_center") + assert param == 37.5, "Got wrong parameter value (%g)" % param - param = srs.GetProjParm('longitude_of_center') - assert param == -96, ('Got wrong parameter value (%g)' % param) + param = srs.GetProjParm("longitude_of_center") + assert param == -96, "Got wrong parameter value (%g)" % param ds = None + ############################################################################### # check to see if projected systems default to wgs84 if no spheroid def def test_netcdf_9(): - ds = gdal.Open('data/netcdf/cf_no_sphere.nc') + ds = gdal.Open("data/netcdf/cf_no_sphere.nc") prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) - spheroid = sr.GetAttrValue('SPHEROID') + spheroid = sr.GetAttrValue("SPHEROID") - assert spheroid == 'WGS 84', ('Incorrect spheroid read from file\n%s' - % (spheroid)) + assert spheroid == "WGS 84", "Incorrect spheroid read from file\n%s" % (spheroid) ds = None sr = None + ############################################################################### # check if km pixel size makes it through to gt def test_netcdf_10(): - ds = gdal.Open('data/netcdf/cf_no_sphere.nc') + ds = gdal.Open("data/netcdf/cf_no_sphere.nc") prj = ds.GetProjection() gt = ds.GetGeoTransform() - gt1 = (-1897186.0290038721, 5079.3608398440065, - 0.0, 2674684.0244560046, - 0.0, -5079.4721679684635) - gt2 = (-1897.186029003872, 5.079360839844003, - 0.0, 2674.6840244560044, - 0.0, -5.079472167968456) + gt1 = ( + -1897186.0290038721, + 5079.3608398440065, + 0.0, + 2674684.0244560046, + 0.0, + -5079.4721679684635, + ) + gt2 = ( + -1897.186029003872, + 5.079360839844003, + 0.0, + 2674.6840244560044, + 0.0, + -5.079472167968456, + ) if gt != gt1: sr = osr.SpatialReference() sr.ImportFromWkt(prj) # new driver uses UNIT vattribute instead of scaling values - assert (sr.GetAttrValue("PROJCS|UNIT", 1) == "1000" and gt == gt2), \ - ('Incorrect geotransform, got ' + str(gt)) + assert ( + sr.GetAttrValue("PROJCS|UNIT", 1) == "1000" and gt == gt2 + ), "Incorrect geotransform, got " + str(gt) ds = None + ############################################################################### # check if ll gets caught in km pixel size check def test_netcdf_11(): - ds = gdal.Open('data/netcdf/cf_geog.nc') + ds = gdal.Open("data/netcdf/cf_geog.nc") gt = ds.GetGeoTransform() - assert gt == (-0.5, 1.0, 0.0, 10.5, 0.0, -1.0), 'Incorrect geotransform' + assert gt == (-0.5, 1.0, 0.0, 10.5, 0.0, -1.0), "Incorrect geotransform" ds = None + ############################################################################### # Check that we get a geotransform from a file with a long/lat grid mapping def test_netcdf_cf_geog_with_srs(): - ds = gdal.Open('data/netcdf/cf_geog_with_srs.nc') + ds = gdal.Open("data/netcdf/cf_geog_with_srs.nc") gt = ds.GetGeoTransform() - assert gt == pytest.approx([-0.1,0.2,0,-79.1,0,-0.2], rel=1e-5) + assert gt == pytest.approx([-0.1, 0.2, 0, -79.1, 0, -0.2], rel=1e-5) assert ds.GetSpatialRef() is not None ds = None + ############################################################################### # Check that we get a geotransform from a file with variable indexed by lon, lat # and lon, lat indicated as values of coordinates attribute @@ -502,7 +548,7 @@ def test_netcdf_cf_geog_with_srs(): def test_netcdf_cf_lon_lat_with_coordinates_no_crs(): - ds = gdal.Open('data/netcdf/cf_lon_lat_with_coordinates_no_crs.nc') + ds = gdal.Open("data/netcdf/cf_lon_lat_with_coordinates_no_crs.nc") gt = ds.GetGeoTransform() assert gt == pytest.approx([-0.5, 1.0, 0.0, 42.5, 0.0, -1.0], rel=1e-5) @@ -515,10 +561,21 @@ def test_netcdf_cf_lon_lat_with_coordinates_no_crs(): def test_netcdf_longitude_latitude(): - ds = gdal.Open('data/netcdf/longitude_latitude.nc') + ds = gdal.Open("data/netcdf/longitude_latitude.nc") gt = ds.GetGeoTransform() - assert gt == pytest.approx([-180.04166666666666, 0.08333333333333333, 0.0, -79.79167938232422, 0.0, -0.0833282470703125], rel=1e-5) + assert gt == pytest.approx( + [ + -180.04166666666666, + 0.08333333333333333, + 0.0, + -79.79167938232422, + 0.0, + -0.0833282470703125, + ], + rel=1e-5, + ) + ############################################################################### # check for scale/offset set/get. @@ -526,17 +583,17 @@ def test_netcdf_longitude_latitude(): def test_netcdf_12(): - ds = gdal.Open('data/netcdf/scale_offset.nc') + ds = gdal.Open("data/netcdf/scale_offset.nc") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 0.01 and offset == 1.5 - gdaltest.netcdf_drv.CreateCopy('tmp/tmp.nc', ds) + gdaltest.netcdf_drv.CreateCopy("tmp/tmp.nc", ds) ds = None - ds = gdal.Open('tmp/tmp.nc') + ds = gdal.Open("tmp/tmp.nc") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() @@ -544,7 +601,8 @@ def test_netcdf_12(): assert scale == 0.01 and offset == 1.5 ds = None - gdaltest.netcdf_drv.Delete('tmp/tmp.nc') + gdaltest.netcdf_drv.Delete("tmp/tmp.nc") + ############################################################################### # check for scale/offset = None if no scale or offset is available @@ -552,38 +610,44 @@ def test_netcdf_12(): def test_netcdf_13(): - ds = gdal.Open('data/netcdf/no_scale_offset.nc') + ds = gdal.Open("data/netcdf/no_scale_offset.nc") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() - assert scale is None and offset is None, 'Incorrect scale or offset' + assert scale is None and offset is None, "Incorrect scale or offset" ds = None + ############################################################################### # check for scale/offset for two variables def test_netcdf_two_vars_as_subdatasets(): - ds = gdal.Open('NETCDF:data/netcdf/two_vars_scale_offset.nc:z') + ds = gdal.Open("NETCDF:data/netcdf/two_vars_scale_offset.nc:z") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() - assert scale == 0.01 and offset == 1.5, \ - ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) + assert scale == 0.01 and offset == 1.5, "Incorrect scale(%f) or offset(%f)" % ( + scale, + offset, + ) ds = None - ds = gdal.Open('NETCDF:data/netcdf/two_vars_scale_offset.nc:q') + ds = gdal.Open("NETCDF:data/netcdf/two_vars_scale_offset.nc:q") scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() - assert scale == 0.1 and offset == 2.5, \ - ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) + assert scale == 0.1 and offset == 2.5, "Incorrect scale(%f) or offset(%f)" % ( + scale, + offset, + ) + ############################################################################### # check for opening similar variables as multiple bands of the @@ -592,21 +656,27 @@ def test_netcdf_two_vars_as_subdatasets(): def test_netcdf_two_vars_as_multiple_bands(): - ds = gdal.OpenEx('data/netcdf/two_vars_scale_offset.nc', - open_options = ['VARIABLES_AS_BANDS=YES']) + ds = gdal.OpenEx( + "data/netcdf/two_vars_scale_offset.nc", open_options=["VARIABLES_AS_BANDS=YES"] + ) assert ds.RasterCount == 2 scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() - assert scale == 0.01 and offset == 1.5, \ - ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) + assert scale == 0.01 and offset == 1.5, "Incorrect scale(%f) or offset(%f)" % ( + scale, + offset, + ) scale = ds.GetRasterBand(2).GetScale() offset = ds.GetRasterBand(2).GetOffset() - assert scale == 0.1 and offset == 2.5, \ - ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) + assert scale == 0.1 and offset == 2.5, "Incorrect scale(%f) or offset(%f)" % ( + scale, + offset, + ) + ############################################################################### # check support for netcdf-2 (64 bit) @@ -616,7 +686,7 @@ def test_netcdf_two_vars_as_multiple_bands(): def test_netcdf_15(): if gdaltest.netcdf_drv_has_nc2: - ds = gdal.Open('data/netcdf/trmm-nc2.nc') + ds = gdal.Open("data/netcdf/trmm-nc2.nc") assert ds is not None ds = None return @@ -630,23 +700,23 @@ def test_netcdf_15(): def test_netcdf_16(): - ifile = 'data/netcdf/trmm-nc4.nc' + ifile = "data/netcdf/trmm-nc4.nc" if gdaltest.netcdf_drv_has_nc4: # test with Open() ds = gdal.Open(ifile) if ds is None: - pytest.fail('GDAL did not open file') + pytest.fail("GDAL did not open file") else: name = ds.GetDriver().GetDescription() ds = None # return fail if did not open with the netCDF driver (i.e. HDF5Image) - assert name == 'netCDF', 'netcdf driver did not open file' + assert name == "netCDF", "netcdf driver did not open file" # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() - assert name == 'netCDF', 'netcdf driver did not identify file' + assert name == "netCDF", "netcdf driver did not identify file" else: pytest.skip() @@ -658,11 +728,13 @@ def test_netcdf_16(): def test_netcdf_17(): - ifile = 'data/hdf5/groups.h5' + ifile = "data/hdf5/groups.h5" # skip test if Hdf5 is not enabled - if gdal.GetDriverByName('HDF5') is None and \ - gdal.GetDriverByName('HDF5Image') is None: + if ( + gdal.GetDriverByName("HDF5") is None + and gdal.GetDriverByName("HDF5Image") is None + ): pytest.skip() if gdaltest.netcdf_drv_has_nc4: @@ -670,16 +742,16 @@ def test_netcdf_17(): # test with Open() ds = gdal.Open(ifile) if ds is None: - pytest.fail('GDAL did not open hdf5 file') + pytest.fail("GDAL did not open hdf5 file") else: name = ds.GetDriver().GetDescription() ds = None # return fail if opened with the netCDF driver - assert name != 'netCDF', 'netcdf driver opened hdf5 file' + assert name != "netCDF", "netcdf driver opened hdf5 file" # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() - assert name != 'netCDF', 'netcdf driver was identified for hdf5 file' + assert name != "netCDF", "netcdf driver was identified for hdf5 file" else: pytest.skip() @@ -691,7 +763,7 @@ def test_netcdf_17(): def test_netcdf_18(): - ifile = 'data/netcdf/trmm-nc4c.nc' + ifile = "data/netcdf/trmm-nc4c.nc" if gdaltest.netcdf_drv_has_nc4: @@ -703,11 +775,11 @@ def test_netcdf_18(): name = ds.GetDriver().GetDescription() ds = None # return fail if did not open with the netCDF driver (i.e. HDF5Image) - assert name == 'netCDF' + assert name == "netCDF" # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() - assert name == 'netCDF' + assert name == "netCDF" else: pytest.skip() @@ -722,13 +794,15 @@ def test_netcdf_19(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - tst = gdaltest.GDALTest('NetCDF', 'data/netcdf/trmm-nc4z.nc', 1, 50235, - filename_absolute=1) + tst = gdaltest.GDALTest( + "NetCDF", "data/netcdf/trmm-nc4z.nc", 1, 50235, filename_absolute=1 + ) result = tst.testOpen(skip_checksum=True) return result + ############################################################################### # check support for writing with DEFLATE compression, requires NC4 @@ -739,7 +813,7 @@ def test_netcdf_20(): pytest.skip() # simple test with tiny file - return netcdf_test_deflate('data/utm.tif', 50235) + return netcdf_test_deflate("data/utm.tif", 50235) ############################################################################### @@ -753,33 +827,37 @@ def test_netcdf_21(): if not gdaltest.run_slow_tests(): pytest.skip() - bigfile = 'tmp/cache/utm-big.tif' + bigfile = "tmp/cache/utm-big.tif" - sys.stdout.write('.') + sys.stdout.write(".") sys.stdout.flush() # create cache dir if absent - if not os.path.exists('tmp/cache'): - os.mkdir('tmp/cache') + if not os.path.exists("tmp/cache"): + os.mkdir("tmp/cache") # look for large gtiff in cache if not os.path.exists(bigfile): # create large gtiff if test_cli_utilities.get_gdalwarp_path() is None: - pytest.skip('gdalwarp not found') + pytest.skip("gdalwarp not found") - warp_cmd = test_cli_utilities.get_gdalwarp_path() +\ - ' -q -overwrite -r bilinear -ts 7680 7680 -of gtiff ' +\ - 'data/utm.tif ' + bigfile + warp_cmd = ( + test_cli_utilities.get_gdalwarp_path() + + " -q -overwrite -r bilinear -ts 7680 7680 -of gtiff " + + "data/utm.tif " + + bigfile + ) try: (ret, err) = gdaltest.runexternal_out_and_err(warp_cmd) except OSError: - pytest.fail('gdalwarp execution failed') + pytest.fail("gdalwarp execution failed") - assert not (err != '' or ret != ''), \ - ('gdalwarp returned error\n' + str(ret) + ' ' + str(err)) + assert not (err != "" or ret != ""), ( + "gdalwarp returned error\n" + str(ret) + " " + str(err) + ) # test compression of the file, with a conservative timeout of 60 seconds return netcdf_test_deflate(bigfile, 26695, 6, 60) @@ -792,15 +870,15 @@ def test_netcdf_22(): if not gdaltest.netcdf_drv_has_hdf4: pytest.skip() - ifile = 'data/hdf4/hdifftst2.hdf' + ifile = "data/hdf4/hdifftst2.hdf" # suppress warning - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('NETCDF:' + ifile) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("NETCDF:" + ifile) gdal.PopErrorHandler() if ds is None: - pytest.fail('netcdf driver did not open hdf4 file') + pytest.fail("netcdf driver did not open hdf4 file") else: ds = None @@ -812,25 +890,28 @@ def test_netcdf_22(): def test_netcdf_23(): # skip test if Hdf4 is not enabled in GDAL - if gdal.GetDriverByName('HDF4') is None and \ - gdal.GetDriverByName('HDF4Image') is None: + if ( + gdal.GetDriverByName("HDF4") is None + and gdal.GetDriverByName("HDF4Image") is None + ): pytest.skip() - ifile = 'data/hdf4/hdifftst2.hdf' + ifile = "data/hdf4/hdifftst2.hdf" # test with Open() ds = gdal.Open(ifile) if ds is None: - pytest.fail('GDAL did not open hdf4 file') + pytest.fail("GDAL did not open hdf4 file") else: name = ds.GetDriver().GetDescription() ds = None # return fail if opened with the netCDF driver - assert name != 'netCDF', 'netcdf driver opened hdf4 file' + assert name != "netCDF", "netcdf driver opened hdf4 file" # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() - assert name != 'netCDF', 'netcdf driver was identified for hdf4 file' + assert name != "netCDF", "netcdf driver was identified for hdf4 file" + ############################################################################### # check support for reading attributes (single values and array values) @@ -838,18 +919,23 @@ def test_netcdf_23(): def test_netcdf_24(): - vals_global = {'NC_GLOBAL#test': 'testval', - 'NC_GLOBAL#valid_range_i': '0,255', - 'NC_GLOBAL#valid_min': '10.1', - 'NC_GLOBAL#test_b': '1'} - vals_band = {'_Unsigned': 'true', - 'valid_min': '10.1', - 'valid_range_b': '1,10', - 'valid_range_d': '0.1111112222222,255.555555555556', - 'valid_range_f': '0.1111111,255.5556', - 'valid_range_s': '0,255'} + vals_global = { + "NC_GLOBAL#test": "testval", + "NC_GLOBAL#valid_range_i": "0,255", + "NC_GLOBAL#valid_min": "10.1", + "NC_GLOBAL#test_b": "1", + } + vals_band = { + "_Unsigned": "true", + "valid_min": "10.1", + "valid_range_b": "1,10", + "valid_range_d": "0.1111112222222,255.555555555556", + "valid_range_f": "0.1111111,255.5556", + "valid_range_s": "0,255", + } + + return netcdf_check_vars("data/netcdf/nc_vars.nc", vals_global, vals_band) - return netcdf_check_vars('data/netcdf/nc_vars.nc', vals_global, vals_band) ############################################################################### # check support for NC4 reading attributes (single values and array values) @@ -860,28 +946,33 @@ def netcdf_24_nc4(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - vals_global = {'NC_GLOBAL#test': 'testval', - 'NC_GLOBAL#test_string': 'testval_string', - 'NC_GLOBAL#valid_range_i': '0,255', - 'NC_GLOBAL#valid_min': '10.1', - 'NC_GLOBAL#test_b': '-100', - 'NC_GLOBAL#test_ub': '200', - 'NC_GLOBAL#test_s': '-16000', - 'NC_GLOBAL#test_us': '32000', - 'NC_GLOBAL#test_l': '-2000000000', - 'NC_GLOBAL#test_ul': '4000000000'} - vals_band = {'test_string_arr': 'test,string,arr', - 'valid_min': '10.1', - 'valid_range_b': '1,10', - 'valid_range_ub': '1,200', - 'valid_range_s': '0,255', - 'valid_range_us': '0,32000', - 'valid_range_l': '0,255', - 'valid_range_ul': '0,4000000000', - 'valid_range_d': '0.1111112222222,255.555555555556', - 'valid_range_f': '0.1111111,255.5556'} - - return netcdf_check_vars('data/netcdf/nc4_vars.nc', vals_global, vals_band) + vals_global = { + "NC_GLOBAL#test": "testval", + "NC_GLOBAL#test_string": "testval_string", + "NC_GLOBAL#valid_range_i": "0,255", + "NC_GLOBAL#valid_min": "10.1", + "NC_GLOBAL#test_b": "-100", + "NC_GLOBAL#test_ub": "200", + "NC_GLOBAL#test_s": "-16000", + "NC_GLOBAL#test_us": "32000", + "NC_GLOBAL#test_l": "-2000000000", + "NC_GLOBAL#test_ul": "4000000000", + } + vals_band = { + "test_string_arr": "test,string,arr", + "valid_min": "10.1", + "valid_range_b": "1,10", + "valid_range_ub": "1,200", + "valid_range_s": "0,255", + "valid_range_us": "0,32000", + "valid_range_l": "0,255", + "valid_range_ul": "0,4000000000", + "valid_range_d": "0.1111112222222,255.555555555556", + "valid_range_f": "0.1111111,255.5556", + } + + return netcdf_check_vars("data/netcdf/nc4_vars.nc", vals_global, vals_band) + ############################################################################### # check support for writing attributes (single values and array values) @@ -889,20 +980,25 @@ def netcdf_24_nc4(): def test_netcdf_25(): - netcdf_test_copy('data/netcdf/nc_vars.nc', 1, None, 'tmp/netcdf_25.nc') + netcdf_test_copy("data/netcdf/nc_vars.nc", 1, None, "tmp/netcdf_25.nc") + + vals_global = { + "NC_GLOBAL#test": "testval", + "NC_GLOBAL#valid_range_i": "0,255", + "NC_GLOBAL#valid_min": "10.1", + "NC_GLOBAL#test_b": "1", + } + vals_band = { + "_Unsigned": "true", + "valid_min": "10.1", + "valid_range_b": "1,10", + "valid_range_d": "0.1111112222222,255.555555555556", + "valid_range_f": "0.1111111,255.5556", + "valid_range_s": "0,255", + } - vals_global = {'NC_GLOBAL#test': 'testval', - 'NC_GLOBAL#valid_range_i': '0,255', - 'NC_GLOBAL#valid_min': '10.1', - 'NC_GLOBAL#test_b': '1'} - vals_band = {'_Unsigned': 'true', - 'valid_min': '10.1', - 'valid_range_b': '1,10', - 'valid_range_d': '0.1111112222222,255.555555555556', - 'valid_range_f': '0.1111111,255.5556', - 'valid_range_s': '0,255'} + return netcdf_check_vars("tmp/netcdf_25.nc", vals_global, vals_band) - return netcdf_check_vars('tmp/netcdf_25.nc', vals_global, vals_band) ############################################################################### # check support for NC4 writing attributes (single values and array values) @@ -913,30 +1009,37 @@ def netcdf_25_nc4(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - netcdf_test_copy('data/netcdf/nc4_vars.nc', 1, None, 'tmp/netcdf_25_nc4.nc', ['FORMAT=NC4']) - - vals_global = {'NC_GLOBAL#test': 'testval', - 'NC_GLOBAL#test_string': 'testval_string', - 'NC_GLOBAL#valid_range_i': '0,255', - 'NC_GLOBAL#valid_min': '10.1', - 'NC_GLOBAL#test_b': '-100', - 'NC_GLOBAL#test_ub': '200', - 'NC_GLOBAL#test_s': '-16000', - 'NC_GLOBAL#test_us': '32000', - 'NC_GLOBAL#test_l': '-2000000000', - 'NC_GLOBAL#test_ul': '4000000000'} - vals_band = {'test_string_arr': 'test,string,arr', - 'valid_min': '10.1', - 'valid_range_b': '1,10', - 'valid_range_ub': '1,200', - 'valid_range_us': '0,32000', - 'valid_range_l': '0,255', - 'valid_range_ul': '0,4000000000', - 'valid_range_d': '0.1111112222222,255.555555555556', - 'valid_range_f': '0.1111111,255.5556', - 'valid_range_s': '0,255'} - - return netcdf_check_vars('tmp/netcdf_25_nc4.nc', vals_global, vals_band) + netcdf_test_copy( + "data/netcdf/nc4_vars.nc", 1, None, "tmp/netcdf_25_nc4.nc", ["FORMAT=NC4"] + ) + + vals_global = { + "NC_GLOBAL#test": "testval", + "NC_GLOBAL#test_string": "testval_string", + "NC_GLOBAL#valid_range_i": "0,255", + "NC_GLOBAL#valid_min": "10.1", + "NC_GLOBAL#test_b": "-100", + "NC_GLOBAL#test_ub": "200", + "NC_GLOBAL#test_s": "-16000", + "NC_GLOBAL#test_us": "32000", + "NC_GLOBAL#test_l": "-2000000000", + "NC_GLOBAL#test_ul": "4000000000", + } + vals_band = { + "test_string_arr": "test,string,arr", + "valid_min": "10.1", + "valid_range_b": "1,10", + "valid_range_ub": "1,200", + "valid_range_us": "0,32000", + "valid_range_l": "0,255", + "valid_range_ul": "0,4000000000", + "valid_range_d": "0.1111112222222,255.555555555556", + "valid_range_f": "0.1111111,255.5556", + "valid_range_s": "0,255", + } + + return netcdf_check_vars("tmp/netcdf_25_nc4.nc", vals_global, vals_band) + ############################################################################### # check reading a file with valid_range with float values @@ -944,8 +1047,11 @@ def netcdf_25_nc4(): def test_netcdf_float_valid_range(): - ds = gdal.Open('data/netcdf/float_valid_range.nc') - assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((0.1, 0.9), abs=1e-6) + ds = gdal.Open("data/netcdf/float_valid_range.nc") + assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx( + (0.1, 0.9), abs=1e-6 + ) + ############################################################################### # check reading a file with valid_min and valid_max with float values @@ -953,8 +1059,11 @@ def test_netcdf_float_valid_range(): def test_netcdf_float_valid_min_max(): - ds = gdal.Open('data/netcdf/float_valid_min_max.nc') - assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((0.1, 0.9), abs=1e-6) + ds = gdal.Open("data/netcdf/float_valid_min_max.nc") + assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx( + (0.1, 0.9), abs=1e-6 + ) + ############################################################################### # check support for WRITE_BOTTOMUP file creation option @@ -965,14 +1074,15 @@ def test_netcdf_float_valid_min_max(): def test_netcdf_26(): # test default config - test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4672) - gdal.PushErrorHandler('CPLQuietErrorHandler') + test = gdaltest.GDALTest("NETCDF", "netcdf/int16-nogeo.nc", 1, 4672) + gdal.PushErrorHandler("CPLQuietErrorHandler") test.testCreateCopy(check_gt=0, check_srs=0, check_minmax=0) gdal.PopErrorHandler() # test WRITE_BOTTOMUP=NO - test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4855, - options=['WRITE_BOTTOMUP=NO']) + test = gdaltest.GDALTest( + "NETCDF", "netcdf/int16-nogeo.nc", 1, 4855, options=["WRITE_BOTTOMUP=NO"] + ) test.testCreateCopy(check_gt=0, check_srs=0, check_minmax=0) @@ -983,18 +1093,18 @@ def test_netcdf_26(): def test_netcdf_27(): # test default config - test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4672) - config_bak = gdal.GetConfigOption('GDAL_NETCDF_BOTTOMUP') - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', None) + test = gdaltest.GDALTest("NETCDF", "netcdf/int16-nogeo.nc", 1, 4672) + config_bak = gdal.GetConfigOption("GDAL_NETCDF_BOTTOMUP") + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", None) test.testOpen() - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', config_bak) + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", config_bak) # test GDAL_NETCDF_BOTTOMUP=NO - test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4855) - config_bak = gdal.GetConfigOption('GDAL_NETCDF_BOTTOMUP') - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', 'NO') + test = gdaltest.GDALTest("NETCDF", "netcdf/int16-nogeo.nc", 1, 4855) + config_bak = gdal.GetConfigOption("GDAL_NETCDF_BOTTOMUP") + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", "NO") test.testOpen() - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', config_bak) + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", config_bak) ############################################################################### @@ -1005,44 +1115,48 @@ def netcdf_test_4dfile(ofile): # test result file has 8 bands and 0 subdasets (instead of 0 bands and 8 subdatasets) ds = gdal.Open(ofile) - assert ds is not None, 'open of copy failed' - md = ds.GetMetadata('SUBDATASETS') + assert ds is not None, "open of copy failed" + md = ds.GetMetadata("SUBDATASETS") subds_count = 0 if md is not None: subds_count = len(md) / 2 - assert ds.RasterCount == 8 and subds_count == 0, \ - ('copy has %d bands (expected 8) and has %d subdatasets' - ' (expected 0)' % (ds.RasterCount, subds_count)) + assert ( + ds.RasterCount == 8 and subds_count == 0 + ), "copy has %d bands (expected 8) and has %d subdatasets" " (expected 0)" % ( + ds.RasterCount, + subds_count, + ) ds = None # get file header with ncdump (if available) try: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h") except OSError: - print('NOTICE: ncdump not found') + print("NOTICE: ncdump not found") return - if err is None or 'netcdf library version' not in err: - print('NOTICE: ncdump not found') + if err is None or "netcdf library version" not in err: + print("NOTICE: ncdump not found") return - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h ' + ofile) - assert ret != '' and err == '', 'ncdump failed' + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h " + ofile) + assert ret != "" and err == "", "ncdump failed" # simple dimension tests using ncdump output err = "" - if 'int t(time, levelist, lat, lon) ;' not in ret: - err = err + 'variable (t) has wrong dimensions or is missing\n' - if 'levelist = 2 ;' not in ret: - err = err + 'levelist dimension is missing or incorrect\n' - if 'int levelist(levelist) ;' not in ret: - err = err + 'levelist variable is missing or incorrect\n' - if 'time = 4 ;' not in ret: - err = err + 'time dimension is missing or incorrect\n' - if 'double time(time) ;' not in ret: - err = err + 'time variable is missing or incorrect\n' + if "int t(time, levelist, lat, lon) ;" not in ret: + err = err + "variable (t) has wrong dimensions or is missing\n" + if "levelist = 2 ;" not in ret: + err = err + "levelist dimension is missing or incorrect\n" + if "int levelist(levelist) ;" not in ret: + err = err + "levelist variable is missing or incorrect\n" + if "time = 4 ;" not in ret: + err = err + "time dimension is missing or incorrect\n" + if "double time(time) ;" not in ret: + err = err + "time variable is missing or incorrect\n" # uncomment this to get full header in output # if err != '': # err = err + ret - assert err == '' + assert err == "" + ############################################################################### # check support for writing multi-dimensional files using CreateCopy() @@ -1050,8 +1164,8 @@ def netcdf_test_4dfile(ofile): def test_netcdf_28(): - ifile = 'data/netcdf/netcdf-4d.nc' - ofile = 'tmp/netcdf_28.nc' + ifile = "data/netcdf/netcdf-4d.nc" + ofile = "tmp/netcdf_28.nc" # copy file netcdf_test_copy(ifile, 0, None, ofile) @@ -1059,6 +1173,7 @@ def test_netcdf_28(): # test file return netcdf_test_4dfile(ofile) + ############################################################################### # Check support for writing multi-dimensional files using gdalwarp. # Requires metadata copy support in gdalwarp (see bug #3898). @@ -1073,21 +1188,25 @@ def test_netcdf_29(): # create tif file using gdalwarp if test_cli_utilities.get_gdalwarp_path() is None: - pytest.skip('gdalwarp not found') + pytest.skip("gdalwarp not found") - ifile = 'data/netcdf/netcdf-4d.nc' - ofile1 = 'tmp/netcdf_29.vrt' - ofile = 'tmp/netcdf_29.nc' + ifile = "data/netcdf/netcdf-4d.nc" + ofile1 = "tmp/netcdf_29.vrt" + ofile = "tmp/netcdf_29.nc" - warp_cmd = '%s -q -overwrite -of vrt %s %s' %\ - (test_cli_utilities.get_gdalwarp_path(), ifile, ofile1) + warp_cmd = "%s -q -overwrite -of vrt %s %s" % ( + test_cli_utilities.get_gdalwarp_path(), + ifile, + ofile1, + ) try: (ret, err) = gdaltest.runexternal_out_and_err(warp_cmd) except OSError: - pytest.fail('gdalwarp execution failed') + pytest.fail("gdalwarp execution failed") - assert not (err != '' or ret != ''), \ - ('gdalwarp returned error\n' + str(ret) + ' ' + str(err)) + assert not (err != "" or ret != ""), ( + "gdalwarp returned error\n" + str(ret) + " " + str(err) + ) # copy vrt to netcdf, with proper dimension rolling netcdf_test_copy(ofile1, 0, None, ofile) @@ -1095,22 +1214,24 @@ def test_netcdf_29(): # test file netcdf_test_4dfile(ofile) + ############################################################################### # check support for file with nan values (bug #4705) def test_netcdf_30(): - tst = gdaltest.GDALTest('NetCDF', 'netcdf/trmm-nan.nc', 1, 62519) + tst = gdaltest.GDALTest("NetCDF", "netcdf/trmm-nan.nc", 1, 62519) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") result = tst.testOpen() gdal.PopErrorHandler() return result + ############################################################################### # check if 2x2 file has proper geotransform # 1 pixel (in width or height) still unsupported because we can't get the pixel dimensions @@ -1118,7 +1239,7 @@ def test_netcdf_30(): def test_netcdf_31(): - ds = gdal.Open('data/netcdf/trmm-2x2.nc') + ds = gdal.Open("data/netcdf/trmm-2x2.nc") ds.GetProjection() @@ -1126,10 +1247,11 @@ def test_netcdf_31(): gt1 = (-80.0, 0.25, 0.0, -19.5, 0.0, -0.25) - assert gt == gt1, ('Incorrect geotransform, got ' + str(gt)) + assert gt == gt1, "Incorrect geotransform, got " + str(gt) ds = None + ############################################################################### # Test NC_UBYTE write/read - netcdf-4 (FORMAT=NC4) only (#5053) @@ -1139,14 +1261,15 @@ def test_netcdf_32(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ifile = 'data/byte.tif' - ofile = 'tmp/netcdf_32.nc' + ifile = "data/byte.tif" + ofile = "tmp/netcdf_32.nc" # gdal.SetConfigOption('CPL_DEBUG', 'ON') # test basic read/write - netcdf_test_copy(ifile, 1, 4672, ofile, ['FORMAT=NC4']) - netcdf_test_copy(ifile, 1, 4672, ofile, ['FORMAT=NC4C']) + netcdf_test_copy(ifile, 1, 4672, ofile, ["FORMAT=NC4"]) + netcdf_test_copy(ifile, 1, 4672, ofile, ["FORMAT=NC4C"]) + ############################################################################### # TEST NC_UBYTE metadata read - netcdf-4 (FORMAT=NC4) only (#5053) @@ -1154,12 +1277,13 @@ def test_netcdf_32(): def test_netcdf_33(): - ifile = 'data/netcdf/nc_vars.nc' - ofile = 'tmp/netcdf_33.nc' + ifile = "data/netcdf/nc_vars.nc" + ofile = "tmp/netcdf_33.nc" + + netcdf_test_copy(ifile, 1, None, ofile, ["FORMAT=NC4"]) - netcdf_test_copy(ifile, 1, None, ofile, ['FORMAT=NC4']) + return netcdf_check_vars("tmp/netcdf_33.nc") - return netcdf_check_vars('tmp/netcdf_33.nc') ############################################################################### # check support for reading large file with chunking and DEFLATE compression @@ -1168,7 +1292,7 @@ def test_netcdf_33(): def test_netcdf_34(): - filename = 'utm-big-chunks.nc' + filename = "utm-big-chunks.nc" # this timeout is more than enough - on my system takes <1s with fix, about 25 seconds without timeout = 5 @@ -1181,18 +1305,20 @@ def test_netcdf_34(): try: from multiprocessing import Process except ImportError: - pytest.skip('from multiprocessing import Process failed') + pytest.skip("from multiprocessing import Process failed") - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/netcdf/' + filename, filename): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/netcdf/" + filename, filename + ): pytest.skip() - sys.stdout.write('.') + sys.stdout.write(".") sys.stdout.flush() - tst = gdaltest.GDALTest('NetCDF', '../tmp/cache/' + filename, 1, 31621) + tst = gdaltest.GDALTest("NetCDF", "../tmp/cache/" + filename, 1, 31621) # tst.testOpen() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") proc = Process(target=tst.testOpen) proc.start() proc.join(timeout) @@ -1203,7 +1329,8 @@ def test_netcdf_34(): if proc.is_alive(): proc.terminate() pytest.fail( - f'testOpen() for file {filename} has reached timeout limit of {timeout} seconds') + f"testOpen() for file {filename} has reached timeout limit of {timeout} seconds" + ) ############################################################################### @@ -1212,22 +1339,27 @@ def test_netcdf_34(): def test_netcdf_35(): - ifile = 'data/netcdf/netcdf_fixes.nc' - ofile = 'tmp/netcdf_35.nc' + ifile = "data/netcdf/netcdf_fixes.nc" + ofile = "tmp/netcdf_35.nc" # copy file netcdf_test_copy(ifile, 0, None, ofile) # test long metadata is copied correctly ds = gdal.Open(ofile) - assert ds is not None, 'open of copy failed' - md = ds.GetMetadata('') - assert 'U#bla' in md, 'U#bla metadata absent' - bla = md['U#bla'] - assert len(bla) == 9591, \ - ('U#bla metadata is of length %d, expecting %d' % (len(bla), 9591)) - assert bla[-4:] == '_bla', \ - ('U#bla metadata ends with [%s], expecting [%s]' % (bla[-4:], '_bla')) + assert ds is not None, "open of copy failed" + md = ds.GetMetadata("") + assert "U#bla" in md, "U#bla metadata absent" + bla = md["U#bla"] + assert len(bla) == 9591, "U#bla metadata is of length %d, expecting %d" % ( + len(bla), + 9591, + ) + assert bla[-4:] == "_bla", "U#bla metadata ends with [%s], expecting [%s]" % ( + bla[-4:], + "_bla", + ) + ############################################################################### # test for correct geotransform (bug #5114) @@ -1235,16 +1367,25 @@ def test_netcdf_35(): def test_netcdf_36(): - ifile = 'data/netcdf/netcdf_fixes.nc' + ifile = "data/netcdf/netcdf_fixes.nc" ds = gdal.Open(ifile) - assert ds is not None, 'open failed' + assert ds is not None, "open failed" gt = ds.GetGeoTransform() - assert gt is not None, 'got no GeoTransform' - gt_expected = (-3.498749944898817, 0.0025000042385525173, 0.0, 46.61749818589952, 0.0, -0.001666598849826389) - assert gt == gt_expected, \ - ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) + assert gt is not None, "got no GeoTransform" + gt_expected = ( + -3.498749944898817, + 0.0025000042385525173, + 0.0, + 46.61749818589952, + 0.0, + -0.001666598849826389, + ) + assert gt == gt_expected, "got GeoTransform %s, expected %s" % ( + str(gt), + str(gt_expected), + ) ############################################################################### @@ -1253,16 +1394,18 @@ def test_netcdf_36(): def test_netcdf_36_lonwrap(): - ifile = 'data/netcdf/nc_lonwrap.nc' + ifile = "data/netcdf/nc_lonwrap.nc" ds = gdal.Open(ifile) - assert ds is not None, 'open failed' + assert ds is not None, "open failed" gt = ds.GetGeoTransform() - assert gt is not None, 'got no GeoTransform' + assert gt is not None, "got no GeoTransform" gt_expected = (-2.25, 2.5, 0.0, 16.25, 0.0, -2.5) - assert gt == gt_expected, \ - ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) + assert gt == gt_expected, "got GeoTransform %s, expected %s" % ( + str(gt), + str(gt_expected), + ) ############################################################################### @@ -1271,24 +1414,30 @@ def test_netcdf_36_lonwrap(): def test_netcdf_37(): - ifile = 'data/netcdf/reduce-cgcms.nc' + ifile = "data/netcdf/reduce-cgcms.nc" - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds = gdal.Open(ifile) gdal.PopErrorHandler() - assert ds is not None, 'open failed' + assert ds is not None, "open failed" gt = ds.GetGeoTransform() - assert gt is not None, 'got no GeoTransform' + assert gt is not None, "got no GeoTransform" gt_expected = (-1.875, 3.75, 0.0, 89.01354337620016, 0.0, -3.7088976406750063) - assert gt == gt_expected, \ - ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) + assert gt == gt_expected, "got GeoTransform %s, expected %s" % ( + str(gt), + str(gt_expected), + ) + + md = ds.GetMetadata("GEOLOCATION2") + assert md and "Y_VALUES" in md, "did not get 1D geolocation" + y_vals = md["Y_VALUES"] + assert y_vals.startswith( + "{-87.15909455586265,-83.47893666931698," + ) and y_vals.endswith( + ",83.47893666931698,87.15909455586265}" + ), "got incorrect values in 1D geolocation" - md = ds.GetMetadata('GEOLOCATION2') - assert md and 'Y_VALUES' in md, 'did not get 1D geolocation' - y_vals = md['Y_VALUES'] - assert y_vals.startswith('{-87.15909455586265,-83.47893666931698,') and y_vals.endswith(',83.47893666931698,87.15909455586265}'), \ - 'got incorrect values in 1D geolocation' ############################################################################### # test for correct geotransform of projected data in km units (bug #5118) @@ -1296,18 +1445,28 @@ def test_netcdf_37(): def test_netcdf_38(): - ifile = 'data/netcdf/bug5118.nc' + ifile = "data/netcdf/bug5118.nc" - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds = gdal.Open(ifile) gdal.PopErrorHandler() - assert ds is not None, 'open failed' + assert ds is not None, "open failed" gt = ds.GetGeoTransform() - assert gt is not None, 'got no GeoTransform' - gt_expected = (-1659.3478178136488, 13.545000861672793, 0.0, 2330.054725283668, 0.0, -13.54499744233631) - assert gt == gt_expected, \ - ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) + assert gt is not None, "got no GeoTransform" + gt_expected = ( + -1659.3478178136488, + 13.545000861672793, + 0.0, + 2330.054725283668, + 0.0, + -13.54499744233631, + ) + assert gt == gt_expected, "got GeoTransform %s, expected %s" % ( + str(gt), + str(gt_expected), + ) + ############################################################################### # Test VRT and NETCDF: @@ -1315,67 +1474,76 @@ def test_netcdf_38(): def test_netcdf_39(): - shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') - src_ds = gdal.Open('NETCDF:tmp/two_vars_scale_offset.nc:z') - out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) + shutil.copy("data/netcdf/two_vars_scale_offset.nc", "tmp") + src_ds = gdal.Open("NETCDF:tmp/two_vars_scale_offset.nc:z") + out_ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/netcdf_39.vrt", src_ds) del out_ds src_ds = None - ds = gdal.Open('tmp/netcdf_39.vrt') + ds = gdal.Open("tmp/netcdf_39.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/two_vars_scale_offset.nc') - gdal.Unlink('tmp/netcdf_39.vrt') + gdal.Unlink("tmp/two_vars_scale_offset.nc") + gdal.Unlink("tmp/netcdf_39.vrt") assert cs == 65463 - shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') + shutil.copy("data/netcdf/two_vars_scale_offset.nc", "tmp") src_ds = gdal.Open('NETCDF:"tmp/two_vars_scale_offset.nc":z') - out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) + out_ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/netcdf_39.vrt", src_ds) del out_ds src_ds = None - ds = gdal.Open('tmp/netcdf_39.vrt') + ds = gdal.Open("tmp/netcdf_39.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/two_vars_scale_offset.nc') - gdal.Unlink('tmp/netcdf_39.vrt') + gdal.Unlink("tmp/two_vars_scale_offset.nc") + gdal.Unlink("tmp/netcdf_39.vrt") assert cs == 65463 def test_netcdf_39_absolute(): - if gdal.Open("%s/data/netcdf/two_vars_scale_offset.nc" % os.getcwd()) is None and \ - gdal.Open("data/netcdf/two_vars_scale_offset.nc") is not None: - pytest.skip("netcdf library can't handle absolute paths. Known to happen with some versions of msys mingw-w64-x86_64-netcdf package") + if ( + gdal.Open("%s/data/netcdf/two_vars_scale_offset.nc" % os.getcwd()) is None + and gdal.Open("data/netcdf/two_vars_scale_offset.nc") is not None + ): + pytest.skip( + "netcdf library can't handle absolute paths. Known to happen with some versions of msys mingw-w64-x86_64-netcdf package" + ) - shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') + shutil.copy("data/netcdf/two_vars_scale_offset.nc", "tmp") src_ds = gdal.Open('NETCDF:"%s/tmp/two_vars_scale_offset.nc":z' % os.getcwd()) - out_ds = gdal.GetDriverByName('VRT').CreateCopy('%s/tmp/netcdf_39.vrt' % os.getcwd(), src_ds) + out_ds = gdal.GetDriverByName("VRT").CreateCopy( + "%s/tmp/netcdf_39.vrt" % os.getcwd(), src_ds + ) del out_ds src_ds = None - ds = gdal.Open('tmp/netcdf_39.vrt') + ds = gdal.Open("tmp/netcdf_39.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/two_vars_scale_offset.nc') - gdal.Unlink('tmp/netcdf_39.vrt') + gdal.Unlink("tmp/two_vars_scale_offset.nc") + gdal.Unlink("tmp/netcdf_39.vrt") assert cs == 65463 - src_ds = gdal.Open('NETCDF:"%s/data/netcdf/two_vars_scale_offset.nc":z' % os.getcwd()) - out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) + src_ds = gdal.Open( + 'NETCDF:"%s/data/netcdf/two_vars_scale_offset.nc":z' % os.getcwd() + ) + out_ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/netcdf_39.vrt", src_ds) del out_ds src_ds = None - ds = gdal.Open('tmp/netcdf_39.vrt') + ds = gdal.Open("tmp/netcdf_39.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/netcdf_39.vrt') + gdal.Unlink("tmp/netcdf_39.vrt") assert cs == 65463 + ############################################################################### # Check support of reading of chunked bottom-up files. @@ -1385,7 +1553,8 @@ def test_netcdf_40(): if gdaltest.netcdf_drv is None or not gdaltest.netcdf_drv_has_nc4: pytest.skip() - return netcdf_test_copy('data/netcdf/bug5291.nc', 0, None, 'tmp/netcdf_40.nc') + return netcdf_test_copy("data/netcdf/bug5291.nc", 0, None, "tmp/netcdf_40.nc") + ############################################################################### # Test support for georeferenced file without CF convention @@ -1394,9 +1563,10 @@ def test_netcdf_40(): def test_netcdf_41(): with gdaltest.error_handler(): - ds = gdal.Open('data/netcdf/byte_no_cf.nc') + ds = gdal.Open("data/netcdf/byte_no_cf.nc") assert ds.GetGeoTransform() == (440720, 60, 0, 3751320, 0, -60) - assert ds.GetProjectionRef().find('26711') >= 0, ds.GetGeoTransform() + assert ds.GetProjectionRef().find("26711") >= 0, ds.GetGeoTransform() + ############################################################################### # Test writing & reading GEOLOCATION array @@ -1404,38 +1574,43 @@ def test_netcdf_41(): def test_netcdf_42(): - src_ds = gdal.GetDriverByName('MEM').Create('', 60, 39, 1) - src_ds.SetMetadata([ - 'LINE_OFFSET=0', - 'LINE_STEP=1', - 'PIXEL_OFFSET=0', - 'PIXEL_STEP=1', - 'SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]', - 'X_BAND=1', - 'X_DATASET=../gcore/data/sstgeo.tif', - 'Y_BAND=2', - 'Y_DATASET=../gcore/data/sstgeo.tif'], 'GEOLOCATION') + src_ds = gdal.GetDriverByName("MEM").Create("", 60, 39, 1) + src_ds.SetMetadata( + [ + "LINE_OFFSET=0", + "LINE_STEP=1", + "PIXEL_OFFSET=0", + "PIXEL_STEP=1", + 'SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]', + "X_BAND=1", + "X_DATASET=../gcore/data/sstgeo.tif", + "Y_BAND=2", + "Y_DATASET=../gcore/data/sstgeo.tif", + ], + "GEOLOCATION", + ) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) src_ds.SetProjection(sr.ExportToWkt()) - gdaltest.netcdf_drv.CreateCopy('tmp/netcdf_42.nc', src_ds) - - ds = gdal.Open('tmp/netcdf_42.nc') - assert (ds.GetMetadata('GEOLOCATION') == { - 'LINE_OFFSET': '0', - 'X_DATASET': 'NETCDF:"tmp/netcdf_42.nc":lon', - 'PIXEL_STEP': '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'PIXEL_OFFSET': '0', - 'X_BAND': '1', - 'LINE_STEP': '1', - 'Y_DATASET': 'NETCDF:"tmp/netcdf_42.nc":lat', - 'Y_BAND': '1', - 'GEOREFERENCING_CONVENTION': 'PIXEL_CENTER'}) + gdaltest.netcdf_drv.CreateCopy("tmp/netcdf_42.nc", src_ds) + + ds = gdal.Open("tmp/netcdf_42.nc") + assert ds.GetMetadata("GEOLOCATION") == { + "LINE_OFFSET": "0", + "X_DATASET": 'NETCDF:"tmp/netcdf_42.nc":lon', + "PIXEL_STEP": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "PIXEL_OFFSET": "0", + "X_BAND": "1", + "LINE_STEP": "1", + "Y_DATASET": 'NETCDF:"tmp/netcdf_42.nc":lat', + "Y_BAND": "1", + "GEOREFERENCING_CONVENTION": "PIXEL_CENTER", + } wkt = ds.GetProjectionRef() - assert ds.GetMetadataItem('transverse_mercator#spatial_ref') == wkt - assert ds.GetMetadataItem('transverse_mercator#crs_wkt') == wkt + assert ds.GetMetadataItem("transverse_mercator#spatial_ref") == wkt + assert ds.GetMetadataItem("transverse_mercator#crs_wkt") == wkt ds = gdal.Open('NETCDF:"tmp/netcdf_42.nc":lon') assert ds.GetRasterBand(1).Checksum() == 36043 @@ -1443,99 +1618,113 @@ def test_netcdf_42(): ds = gdal.Open('NETCDF:"tmp/netcdf_42.nc":lat') assert ds.GetRasterBand(1).Checksum() == 33501 + ############################################################################### # Test writing & reading GEOLOCATION array with no projected CRS -@pytest.mark.parametrize('write_bottomup', [True, False]) -@pytest.mark.parametrize('read_bottomup', [True, False]) +@pytest.mark.parametrize("write_bottomup", [True, False]) +@pytest.mark.parametrize("read_bottomup", [True, False]) def test_netcdf_geolocation_array_no_srs(write_bottomup, read_bottomup): - lon_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif', 3, 2, 1) - lon_ds.GetRasterBand(1).WriteRaster(0, 0, 3, 2, struct.pack('B' * 6, - 10, 11, 12, - 13, 14, 15)) + lon_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif", 3, 2, 1 + ) + lon_ds.GetRasterBand(1).WriteRaster( + 0, 0, 3, 2, struct.pack("B" * 6, 10, 11, 12, 13, 14, 15) + ) lon_ds = None - lat_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif', 3, 2, 1) - lat_ds.GetRasterBand(1).WriteRaster(0, 0, 3, 2, struct.pack('B' * 6, - 20, 21, 22, - 23, 24, 25)) + lat_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif", 3, 2, 1 + ) + lat_ds.GetRasterBand(1).WriteRaster( + 0, 0, 3, 2, struct.pack("B" * 6, 20, 21, 22, 23, 24, 25) + ) lat_ds = None - src_ds = gdal.GetDriverByName('MEM').Create('', 3, 2, 1) - src_ds.SetMetadata([ - 'LINE_OFFSET=0', - 'LINE_STEP=1', - 'PIXEL_OFFSET=0', - 'PIXEL_STEP=1', - 'SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]', - 'X_BAND=1', - 'X_DATASET=/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif', - 'Y_BAND=1', - 'Y_DATASET=/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif'], 'GEOLOCATION') - src_ds.GetRasterBand(1).WriteRaster(0, 0, 3, 2, struct.pack('B' * 6, - 0, 1, 2, - 3, 4, 5)) - - options = ['WRITE_BOTTOMUP=' + ('YES' if write_bottomup else 'NO')] - gdaltest.netcdf_drv.CreateCopy('tmp/test_netcdf_geolocation_array_no_srs.nc', src_ds, - options = options) - - ds = gdal.Open('tmp/test_netcdf_geolocation_array_no_srs.nc') - assert (ds.GetMetadata('GEOLOCATION') == { - 'LINE_OFFSET': '0', - 'X_DATASET': 'NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lon', - 'PIXEL_STEP': '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'PIXEL_OFFSET': '0', - 'X_BAND': '1', - 'LINE_STEP': '1', - 'Y_DATASET': 'NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lat', - 'Y_BAND': '1', - 'GEOREFERENCING_CONVENTION': 'PIXEL_CENTER'}) - assert ds.GetGeoTransform(can_return_null = True) is None - - with gdaltest.config_option('GDAL_NETCDF_BOTTOMUP', 'YES' if read_bottomup else 'NO'): + src_ds = gdal.GetDriverByName("MEM").Create("", 3, 2, 1) + src_ds.SetMetadata( + [ + "LINE_OFFSET=0", + "LINE_STEP=1", + "PIXEL_OFFSET=0", + "PIXEL_STEP=1", + 'SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]', + "X_BAND=1", + "X_DATASET=/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif", + "Y_BAND=1", + "Y_DATASET=/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif", + ], + "GEOLOCATION", + ) + src_ds.GetRasterBand(1).WriteRaster( + 0, 0, 3, 2, struct.pack("B" * 6, 0, 1, 2, 3, 4, 5) + ) + + options = ["WRITE_BOTTOMUP=" + ("YES" if write_bottomup else "NO")] + gdaltest.netcdf_drv.CreateCopy( + "tmp/test_netcdf_geolocation_array_no_srs.nc", src_ds, options=options + ) + + ds = gdal.Open("tmp/test_netcdf_geolocation_array_no_srs.nc") + assert ds.GetMetadata("GEOLOCATION") == { + "LINE_OFFSET": "0", + "X_DATASET": 'NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lon', + "PIXEL_STEP": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "PIXEL_OFFSET": "0", + "X_BAND": "1", + "LINE_STEP": "1", + "Y_DATASET": 'NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lat', + "Y_BAND": "1", + "GEOREFERENCING_CONVENTION": "PIXEL_CENTER", + } + assert ds.GetGeoTransform(can_return_null=True) is None + + with gdaltest.config_option( + "GDAL_NETCDF_BOTTOMUP", "YES" if read_bottomup else "NO" + ): ds = gdal.Open('NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":Band1') - got_data = struct.unpack('B' * 6, - ds.GetRasterBand(1).ReadRaster( - 0, 0, 3, 2, buf_type = gdal.GDT_Byte)) - if (write_bottomup and not read_bottomup) or (not write_bottomup and read_bottomup): - assert got_data == (3, 4, 5, - 0, 1, 2) + got_data = struct.unpack( + "B" * 6, ds.GetRasterBand(1).ReadRaster(0, 0, 3, 2, buf_type=gdal.GDT_Byte) + ) + if (write_bottomup and not read_bottomup) or ( + not write_bottomup and read_bottomup + ): + assert got_data == (3, 4, 5, 0, 1, 2) else: - assert got_data == (0, 1, 2, - 3, 4, 5) + assert got_data == (0, 1, 2, 3, 4, 5) ds = None ds = gdal.Open('NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lon') - got_data = struct.unpack('B' * 6, - ds.GetRasterBand(1).ReadRaster( - 0, 0, 3, 2, buf_type = gdal.GDT_Byte)) - if (write_bottomup and not read_bottomup) or (not write_bottomup and read_bottomup): - assert got_data == (13, 14, 15, - 10, 11, 12) + got_data = struct.unpack( + "B" * 6, ds.GetRasterBand(1).ReadRaster(0, 0, 3, 2, buf_type=gdal.GDT_Byte) + ) + if (write_bottomup and not read_bottomup) or ( + not write_bottomup and read_bottomup + ): + assert got_data == (13, 14, 15, 10, 11, 12) else: - assert got_data == (10, 11, 12, - 13, 14, 15) + assert got_data == (10, 11, 12, 13, 14, 15) ds = None ds = gdal.Open('NETCDF:"tmp/test_netcdf_geolocation_array_no_srs.nc":lat') - got_data = struct.unpack('B' * 6, - ds.GetRasterBand(1).ReadRaster( - 0, 0, 3, 2, buf_type = gdal.GDT_Byte)) - if (write_bottomup and not read_bottomup) or (not write_bottomup and read_bottomup): - assert got_data == (23, 24, 25, - 20, 21, 22) + got_data = struct.unpack( + "B" * 6, ds.GetRasterBand(1).ReadRaster(0, 0, 3, 2, buf_type=gdal.GDT_Byte) + ) + if (write_bottomup and not read_bottomup) or ( + not write_bottomup and read_bottomup + ): + assert got_data == (23, 24, 25, 20, 21, 22) else: - assert got_data == (20, 21, 22, - 23, 24, 25) + assert got_data == (20, 21, 22, 23, 24, 25) ds = None - gdal.Unlink('tmp/test_netcdf_geolocation_array_no_srs.nc') - gdal.Unlink('/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif') - gdal.Unlink('/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif') + gdal.Unlink("tmp/test_netcdf_geolocation_array_no_srs.nc") + gdal.Unlink("/vsimem/test_netcdf_geolocation_array_no_srs_lon.tif") + gdal.Unlink("/vsimem/test_netcdf_geolocation_array_no_srs_lat.tif") + ############################################################################### # Test reading GEOLOCATION array from geotransform (non default) @@ -1543,23 +1732,26 @@ def test_netcdf_geolocation_array_no_srs(write_bottomup, read_bottomup): def test_netcdf_43(): - src_ds = gdal.Open('data/byte.tif') - gdaltest.netcdf_drv.CreateCopy('tmp/netcdf_43.nc', src_ds, options=['WRITE_LONLAT=YES']) - - ds = gdal.Open('tmp/netcdf_43.nc') - assert (ds.GetMetadata('GEOLOCATION') == { - 'LINE_OFFSET': '0', - 'X_DATASET': 'NETCDF:"tmp/netcdf_43.nc":lon', - 'PIXEL_STEP': '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'PIXEL_OFFSET': '0', - 'X_BAND': '1', - 'LINE_STEP': '1', - 'Y_DATASET': 'NETCDF:"tmp/netcdf_43.nc":lat', - 'Y_BAND': '1', - 'GEOREFERENCING_CONVENTION': 'PIXEL_CENTER'}) - - tmp_ds = gdal.Warp('', 'tmp/netcdf_43.nc', options = '-f MEM -geoloc') + src_ds = gdal.Open("data/byte.tif") + gdaltest.netcdf_drv.CreateCopy( + "tmp/netcdf_43.nc", src_ds, options=["WRITE_LONLAT=YES"] + ) + + ds = gdal.Open("tmp/netcdf_43.nc") + assert ds.GetMetadata("GEOLOCATION") == { + "LINE_OFFSET": "0", + "X_DATASET": 'NETCDF:"tmp/netcdf_43.nc":lon', + "PIXEL_STEP": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "PIXEL_OFFSET": "0", + "X_BAND": "1", + "LINE_STEP": "1", + "Y_DATASET": 'NETCDF:"tmp/netcdf_43.nc":lat', + "Y_BAND": "1", + "GEOREFERENCING_CONVENTION": "PIXEL_CENTER", + } + + tmp_ds = gdal.Warp("", "tmp/netcdf_43.nc", options="-f MEM -geoloc") gt = tmp_ds.GetGeoTransform() assert gt[0] == pytest.approx(-117.3, abs=1), gt assert gt[3] == pytest.approx(33.9, abs=1), gt @@ -1574,8 +1766,9 @@ def test_netcdf_44(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - for f, md5 in ('data/netcdf/ushort.nc', 18), ('data/netcdf/uint.nc', 10): - netcdf_test_copy(f, 1, md5, 'tmp/netcdf_44.nc', ['FORMAT=NC4']) + for f, md5 in ("data/netcdf/ushort.nc", 18), ("data/netcdf/uint.nc", 10): + netcdf_test_copy(f, 1, md5, "tmp/netcdf_44.nc", ["FORMAT=NC4"]) + ############################################################################### # Test reading a vector NetCDF 3 file @@ -1584,21 +1777,31 @@ def test_netcdf_44(): def test_netcdf_45(): # Test that a vector cannot be opened in raster-only mode - ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_RASTER) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc3.nc", gdal.OF_RASTER) assert ds is None # Test that a raster cannot be opened in vector-only mode - ds = gdal.OpenEx('data/netcdf/cf-bug636.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/cf-bug636.nc", gdal.OF_VECTOR) assert ds is None - ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc3.nc", gdal.OF_VECTOR) with gdaltest.error_handler(): - gdal.VectorTranslate('/vsimem/netcdf_45.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_45.csv', 'rb') + gdal.VectorTranslate( + "/vsimem/netcdf_45.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "CREATE_CSVT=YES", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_45.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 @@ -1607,16 +1810,17 @@ def test_netcdf_45(): """ assert content == expected_content - fp = gdal.VSIFOpenL('/vsimem/netcdf_45.csvt', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_45.csvt", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_45.csv') - gdal.Unlink('/vsimem/netcdf_45.csvt') - gdal.Unlink('/vsimem/netcdf_45.prj') + gdal.Unlink("/vsimem/netcdf_45.csv") + gdal.Unlink("/vsimem/netcdf_45.csvt") + gdal.Unlink("/vsimem/netcdf_45.prj") + ############################################################################### # Test reading a vector NetCDF 3 file @@ -1627,9 +1831,12 @@ def test_netcdf_46(): if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() - ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/netcdf/test_ogr_nc3.nc') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " -ro data/netcdf/test_ogr_nc3.nc" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test reading a vector NetCDF 4 file @@ -1642,17 +1849,27 @@ def test_netcdf_47(): # Test that a vector cannot be opened in raster-only mode with gdaltest.error_handler(): - ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_RASTER) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc4.nc", gdal.OF_RASTER) assert ds is None - ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc4.nc", gdal.OF_VECTOR) with gdaltest.error_handler(): - gdal.VectorTranslate('/vsimem/netcdf_47.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_47.csv', 'rb') + gdal.VectorTranslate( + "/vsimem/netcdf_47.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "CREATE_CSVT=YES", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_47.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string3chars,twodimstringchar,date,datetime,datetime_explicit_fillValue,int64,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field,ubyte_field,ubyte_field_explicit_fillValue,ushort_field,ushort_field_explicit_fillValue,uint_field,uint_field_explicit_fillValue,uint64_field,uint64_field_explicit_fillValue "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,,1,1,1.2,1.2,123,12,5,-125,254,255,65534,65535,4000000000,4294967295,1234567890123, @@ -1661,16 +1878,17 @@ def test_netcdf_47(): """ assert content == expected_content - fp = gdal.VSIFOpenL('/vsimem/netcdf_47.csvt', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_47.csvt", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer,Integer,Integer,Integer,Integer,Integer64,Integer64,Real,Real """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_47.csv') - gdal.Unlink('/vsimem/netcdf_47.csvt') - gdal.Unlink('/vsimem/netcdf_47.prj') + gdal.Unlink("/vsimem/netcdf_47.csv") + gdal.Unlink("/vsimem/netcdf_47.csvt") + gdal.Unlink("/vsimem/netcdf_47.prj") + ############################################################################### # Test reading a vector NetCDF 3 file without any geometry @@ -1679,11 +1897,12 @@ def test_netcdf_47(): def test_netcdf_48(): with gdaltest.error_handler(): - ds = gdal.OpenEx('data/netcdf/test_ogr_no_xyz_var.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/test_ogr_no_xyz_var.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone f = lyr.GetNextFeature() - assert f['int32'] == 1 + assert f["int32"] == 1 + ############################################################################### # Test reading a vector NetCDF 3 file with X,Y,Z vars as float @@ -1692,12 +1911,21 @@ def test_netcdf_48(): def test_netcdf_49(): with gdaltest.error_handler(): - ds = gdal.OpenEx('data/netcdf/test_ogr_xyz_float.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('/vsimem/netcdf_49.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_49.csv', 'rb') + ds = gdal.OpenEx("data/netcdf/test_ogr_xyz_float.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "/vsimem/netcdf_49.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_49.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32 "POINT Z (1 2 3)",1 @@ -1706,7 +1934,8 @@ def test_netcdf_49(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_49.csv') + gdal.Unlink("/vsimem/netcdf_49.csv") + ############################################################################### # Test creating a vector NetCDF 3 file with WKT geometry field @@ -1714,8 +1943,14 @@ def test_netcdf_49(): def test_netcdf_50(): - ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) - out_ds = gdal.VectorTranslate('tmp/netcdf_50.nc', ds, format='netCDF', layerCreationOptions=['WKT_DEFAULT_WIDTH=1'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) + ds = gdal.OpenEx("../ogr/data/poly.shp", gdal.OF_VECTOR) + out_ds = gdal.VectorTranslate( + "tmp/netcdf_50.nc", + ds, + format="netCDF", + layerCreationOptions=["WKT_DEFAULT_WIDTH=1"], + datasetCreationOptions=["GEOMETRY_ENCODING=WKT"], + ) src_lyr = ds.GetLayer(0) src_lyr.ResetReading() out_lyr = out_ds.GetLayer(0) @@ -1729,7 +1964,7 @@ def test_netcdf_50(): assert src_json == out_json out_ds = None - out_ds = gdal.OpenEx('tmp/netcdf_50.nc', gdal.OF_VECTOR) + out_ds = gdal.OpenEx("tmp/netcdf_50.nc", gdal.OF_VECTOR) out_lyr = out_ds.GetLayer(0) srs = out_lyr.GetSpatialRef().ExportToWkt() assert 'PROJCS["OSGB' in srs @@ -1739,7 +1974,8 @@ def test_netcdf_50(): assert src_json == out_json out_ds = None - gdal.Unlink('tmp/netcdf_50.nc') + gdal.Unlink("tmp/netcdf_50.nc") + ############################################################################### # Test creating a vector NetCDF 3 file with X,Y,Z fields @@ -1747,18 +1983,35 @@ def test_netcdf_50(): def test_netcdf_51(): - ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc3.nc", gdal.OF_VECTOR) # Test autogrow of string fields - gdal.VectorTranslate('tmp/netcdf_51.nc', ds, format='netCDF', layerCreationOptions=['STRING_DEFAULT_WIDTH=1'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) + gdal.VectorTranslate( + "tmp/netcdf_51.nc", + ds, + format="netCDF", + layerCreationOptions=["STRING_DEFAULT_WIDTH=1"], + datasetCreationOptions=["GEOMETRY_ENCODING=WKT"], + ) with gdaltest.error_handler(): - ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('/vsimem/netcdf_51.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) + ds = gdal.OpenEx("tmp/netcdf_51.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "/vsimem/netcdf_51.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "CREATE_CSVT=YES", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + datasetCreationOptions=["GEOMETRY_ENCODING=WKT"], + ) ds = None - fp = gdal.VSIFOpenL('/vsimem/netcdf_51.csv', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_51.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 @@ -1767,43 +2020,45 @@ def test_netcdf_51(): """ assert content == expected_content - fp = gdal.VSIFOpenL('/vsimem/netcdf_51.csvt', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_51.csvt", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content - ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) + ds = gdal.OpenEx("tmp/netcdf_51.nc", gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) - lyr.CreateField(ogr.FieldDefn('extra', ogr.OFTInteger)) - lyr.CreateField(ogr.FieldDefn('extra_str', ogr.OFTString)) + lyr.CreateField(ogr.FieldDefn("extra", ogr.OFTInteger)) + lyr.CreateField(ogr.FieldDefn("extra_str", ogr.OFTString)) f = lyr.GetNextFeature() assert f is not None - f['extra'] = 5 - f['extra_str'] = 'foobar' + f["extra"] = 5 + f["extra_str"] = "foobar" assert lyr.CreateFeature(f) == 0 ds = None - ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("tmp/netcdf_51.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) - assert f['int32'] == 1 and f['extra'] == 5 and f['extra_str'] == 'foobar' + assert f["int32"] == 1 and f["extra"] == 5 and f["extra_str"] == "foobar" f = None ds = None import netcdf_cf + netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: - netcdf_cf.netcdf_cf_check_file('tmp/netcdf_51.nc', 'auto', False) + netcdf_cf.netcdf_cf_check_file("tmp/netcdf_51.nc", "auto", False) + + gdal.Unlink("tmp/netcdf_51.nc") + gdal.Unlink("tmp/netcdf_51.csv") + gdal.Unlink("tmp/netcdf_51.csvt") + gdal.Unlink("/vsimem/netcdf_51.csv") + gdal.Unlink("/vsimem/netcdf_51.csvt") + gdal.Unlink("/vsimem/netcdf_51.prj") - gdal.Unlink('tmp/netcdf_51.nc') - gdal.Unlink('tmp/netcdf_51.csv') - gdal.Unlink('tmp/netcdf_51.csvt') - gdal.Unlink('/vsimem/netcdf_51.csv') - gdal.Unlink('/vsimem/netcdf_51.csvt') - gdal.Unlink('/vsimem/netcdf_51.prj') ############################################################################### # Test creating a vector NetCDF 3 file with X,Y,Z fields with WRITE_GDAL_TAGS=NO @@ -1811,17 +2066,32 @@ def test_netcdf_51(): def test_netcdf_51_no_gdal_tags(): - ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('tmp/netcdf_51_no_gdal_tags.nc', ds, format='netCDF', datasetCreationOptions=['WRITE_GDAL_TAGS=NO', 'GEOMETRY_ENCODING=WKT']) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc3.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "tmp/netcdf_51_no_gdal_tags.nc", + ds, + format="netCDF", + datasetCreationOptions=["WRITE_GDAL_TAGS=NO", "GEOMETRY_ENCODING=WKT"], + ) with gdaltest.error_handler(): - ds = gdal.OpenEx('tmp/netcdf_51_no_gdal_tags.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('/vsimem/netcdf_51_no_gdal_tags.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) + ds = gdal.OpenEx("tmp/netcdf_51_no_gdal_tags.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "/vsimem/netcdf_51_no_gdal_tags.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "CREATE_CSVT=YES", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) ds = None - fp = gdal.VSIFOpenL('/vsimem/netcdf_51_no_gdal_tags.csv', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_51_no_gdal_tags.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x1,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 @@ -1830,20 +2100,21 @@ def test_netcdf_51_no_gdal_tags(): """ assert content == expected_content - fp = gdal.VSIFOpenL('/vsimem/netcdf_51_no_gdal_tags.csvt', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_51_no_gdal_tags.csvt", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String(10),Date,DateTime,DateTime,Real,Real,Integer,Integer,Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content - gdal.Unlink('tmp/netcdf_51_no_gdal_tags.nc') - gdal.Unlink('tmp/netcdf_51_no_gdal_tags.csv') - gdal.Unlink('tmp/netcdf_51_no_gdal_tags.csvt') - gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.csv') - gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.csvt') - gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.prj') + gdal.Unlink("tmp/netcdf_51_no_gdal_tags.nc") + gdal.Unlink("tmp/netcdf_51_no_gdal_tags.csv") + gdal.Unlink("tmp/netcdf_51_no_gdal_tags.csvt") + gdal.Unlink("/vsimem/netcdf_51_no_gdal_tags.csv") + gdal.Unlink("/vsimem/netcdf_51_no_gdal_tags.csvt") + gdal.Unlink("/vsimem/netcdf_51_no_gdal_tags.prj") + ############################################################################### # Test creating a vector NetCDF 4 file with X,Y,Z fields @@ -1854,20 +2125,37 @@ def test_netcdf_52(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - if gdaltest.netcdf_drv_version in ('4.6.3', '4.7.0'): - pytest.skip('buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442') + if gdaltest.netcdf_drv_version in ("4.6.3", "4.7.0"): + pytest.skip( + "buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442" + ) - ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('tmp/netcdf_52.nc', ds, format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) + ds = gdal.OpenEx("data/netcdf/test_ogr_nc4.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "tmp/netcdf_52.nc", + ds, + format="netCDF", + datasetCreationOptions=["FORMAT=NC4", "GEOMETRY_ENCODING=WKT"], + ) with gdaltest.error_handler(): - ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR) - gdal.VectorTranslate('/vsimem/netcdf_52.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) + ds = gdal.OpenEx("tmp/netcdf_52.nc", gdal.OF_VECTOR) + gdal.VectorTranslate( + "/vsimem/netcdf_52.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "CREATE_CSVT=YES", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) ds = None - fp = gdal.VSIFOpenL('/vsimem/netcdf_52.csv', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_52.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string3chars,twodimstringchar,date,datetime,datetime_explicit_fillValue,int64,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field,ubyte_field,ubyte_field_explicit_fillValue,ushort_field,ushort_field_explicit_fillValue,uint_field,uint_field_explicit_fillValue,uint64_field,uint64_field_explicit_fillValue "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,,1,1,1.2,1.2,123,12,5,-125,254,255,65534,65535,4000000000,4294967295,1234567890123, @@ -1876,41 +2164,43 @@ def test_netcdf_52(): """ assert content == expected_content - fp = gdal.VSIFOpenL('/vsimem/netcdf_52.csvt', 'rb') + fp = gdal.VSIFOpenL("/vsimem/netcdf_52.csvt", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer,Integer,Integer,Integer,Integer,Integer64,Integer64,Real,Real """ assert content == expected_content - ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) + ds = gdal.OpenEx("tmp/netcdf_52.nc", gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) - lyr.CreateField(ogr.FieldDefn('extra', ogr.OFTInteger)) + lyr.CreateField(ogr.FieldDefn("extra", ogr.OFTInteger)) f = lyr.GetNextFeature() assert f is not None - f['extra'] = 5 + f["extra"] = 5 assert lyr.CreateFeature(f) == 0 ds = None - ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("tmp/netcdf_52.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) - assert f['int32'] == 1 and f['extra'] == 5 + assert f["int32"] == 1 and f["extra"] == 5 f = None ds = None import netcdf_cf + netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: - netcdf_cf.netcdf_cf_check_file('tmp/netcdf_52.nc', 'auto', False) + netcdf_cf.netcdf_cf_check_file("tmp/netcdf_52.nc", "auto", False) + + gdal.Unlink("tmp/netcdf_52.nc") + gdal.Unlink("tmp/netcdf_52.csv") + gdal.Unlink("tmp/netcdf_52.csvt") + gdal.Unlink("/vsimem/netcdf_52.csv") + gdal.Unlink("/vsimem/netcdf_52.csvt") + gdal.Unlink("/vsimem/netcdf_52.prj") - gdal.Unlink('tmp/netcdf_52.nc') - gdal.Unlink('tmp/netcdf_52.csv') - gdal.Unlink('tmp/netcdf_52.csvt') - gdal.Unlink('/vsimem/netcdf_52.csv') - gdal.Unlink('/vsimem/netcdf_52.csvt') - gdal.Unlink('/vsimem/netcdf_52.prj') ############################################################################### # Test creating a vector NetCDF 4 file with WKT geometry field @@ -1921,8 +2211,13 @@ def test_netcdf_53(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) - out_ds = gdal.VectorTranslate('tmp/netcdf_53.nc', ds, format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) + ds = gdal.OpenEx("../ogr/data/poly.shp", gdal.OF_VECTOR) + out_ds = gdal.VectorTranslate( + "tmp/netcdf_53.nc", + ds, + format="netCDF", + datasetCreationOptions=["FORMAT=NC4", "GEOMETRY_ENCODING=WKT"], + ) src_lyr = ds.GetLayer(0) src_lyr.ResetReading() out_lyr = out_ds.GetLayer(0) @@ -1936,7 +2231,7 @@ def test_netcdf_53(): assert src_json == out_json out_ds = None - out_ds = gdal.OpenEx('tmp/netcdf_53.nc', gdal.OF_VECTOR) + out_ds = gdal.OpenEx("tmp/netcdf_53.nc", gdal.OF_VECTOR) out_lyr = out_ds.GetLayer(0) srs = out_lyr.GetSpatialRef().ExportToWkt() assert 'PROJCS["OSGB' in srs @@ -1946,7 +2241,8 @@ def test_netcdf_53(): assert src_json == out_json out_ds = None - gdal.Unlink('tmp/netcdf_53.nc') + gdal.Unlink("tmp/netcdf_53.nc") + ############################################################################### # Test appending to a vector NetCDF 4 file with unusual types (ubyte, ushort...) @@ -1957,23 +2253,25 @@ def test_netcdf_54(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - if gdaltest.netcdf_drv_version in ('4.6.3', '4.7.0'): - pytest.skip('buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442') + if gdaltest.netcdf_drv_version in ("4.6.3", "4.7.0"): + pytest.skip( + "buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442" + ) - shutil.copy('data/netcdf/test_ogr_nc4.nc', 'tmp/netcdf_54.nc') + shutil.copy("data/netcdf/test_ogr_nc4.nc", "tmp/netcdf_54.nc") - ds = gdal.OpenEx('tmp/netcdf_54.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) + ds = gdal.OpenEx("tmp/netcdf_54.nc", gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None - f['int32'] += 1 + f["int32"] += 1 f.SetFID(-1) f.ExportToJson() src_json = f.ExportToJson() assert lyr.CreateFeature(f) == 0 ds = None - ds = gdal.OpenEx('tmp/netcdf_54.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("tmp/netcdf_54.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) f.SetFID(-1) @@ -1981,10 +2279,11 @@ def test_netcdf_54(): f = None ds = None - gdal.Unlink('tmp/netcdf_54.nc') + gdal.Unlink("tmp/netcdf_54.nc") assert src_json == out_json + ############################################################################### # Test auto-grow of bidimensional char variables in a vector NetCDF 4 file @@ -1994,20 +2293,20 @@ def test_netcdf_55(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - shutil.copy('data/netcdf/test_ogr_nc4.nc', 'tmp/netcdf_55.nc') + shutil.copy("data/netcdf/test_ogr_nc4.nc", "tmp/netcdf_55.nc") - ds = gdal.OpenEx('tmp/netcdf_55.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) + ds = gdal.OpenEx("tmp/netcdf_55.nc", gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None - f['twodimstringchar'] = 'abcd' + f["twodimstringchar"] = "abcd" f.SetFID(-1) f.ExportToJson() src_json = f.ExportToJson() assert lyr.CreateFeature(f) == 0 ds = None - ds = gdal.OpenEx('tmp/netcdf_55.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("tmp/netcdf_55.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) f.SetFID(-1) @@ -2015,37 +2314,48 @@ def test_netcdf_55(): f = None ds = None - gdal.Unlink('tmp/netcdf_55.nc') + gdal.Unlink("tmp/netcdf_55.nc") assert src_json == out_json + ############################################################################### # Test truncation of bidimensional char variables and WKT in a vector NetCDF 3 file def test_netcdf_56(): - ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_56.nc', options=['GEOMETRY_ENCODING=WKT']) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "tmp/netcdf_56.nc", options=["GEOMETRY_ENCODING=WKT"] + ) # Test auto-grow of WKT field - lyr = ds.CreateLayer('netcdf_56', options=['AUTOGROW_STRINGS=NO', 'STRING_DEFAULT_WIDTH=5', 'WKT_DEFAULT_WIDTH=5']) - lyr.CreateField(ogr.FieldDefn('txt')) + lyr = ds.CreateLayer( + "netcdf_56", + options=[ + "AUTOGROW_STRINGS=NO", + "STRING_DEFAULT_WIDTH=5", + "WKT_DEFAULT_WIDTH=5", + ], + ) + lyr.CreateField(ogr.FieldDefn("txt")) f = ogr.Feature(lyr.GetLayerDefn()) - f['txt'] = '0123456789' - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) + f["txt"] = "0123456789" + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 2)")) with gdaltest.error_handler(): ret = lyr.CreateFeature(f) assert ret == 0 ds = None - ds = gdal.OpenEx('tmp/netcdf_56.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("tmp/netcdf_56.nc", gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) - if f['txt'] != '01234' or f.GetGeometryRef() is not None: + if f["txt"] != "01234" or f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('tmp/netcdf_56.nc') + gdal.Unlink("tmp/netcdf_56.nc") + ############################################################################### # Test one layer per file creation @@ -2054,39 +2364,49 @@ def test_netcdf_56(): def test_netcdf_57(): try: - shutil.rmtree('tmp/netcdf_57') + shutil.rmtree("tmp/netcdf_57") except OSError: pass with gdaltest.error_handler(): - ds = ogr.GetDriverByName('netCDF').CreateDataSource('/not_existing_dir/invalid_subdir', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "/not_existing_dir/invalid_subdir", + options=["MULTIPLE_LAYERS=SEPARATE_FILES", "GEOMETRY_ENCODING=WKT"], + ) assert ds is None - open('tmp/netcdf_57', 'wb').close() + open("tmp/netcdf_57", "wb").close() with gdaltest.error_handler(): - ds = ogr.GetDriverByName('netCDF').CreateDataSource('/not_existing_dir/invalid_subdir', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "/not_existing_dir/invalid_subdir", + options=["MULTIPLE_LAYERS=SEPARATE_FILES", "GEOMETRY_ENCODING=WKT"], + ) assert ds is None - os.unlink('tmp/netcdf_57') + os.unlink("tmp/netcdf_57") - ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_57', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "tmp/netcdf_57", + options=["MULTIPLE_LAYERS=SEPARATE_FILES", "GEOMETRY_ENCODING=WKT"], + ) for ilayer in range(2): - lyr = ds.CreateLayer('lyr%d' % ilayer) - lyr.CreateField(ogr.FieldDefn('lyr_id', ogr.OFTInteger)) + lyr = ds.CreateLayer("lyr%d" % ilayer) + lyr.CreateField(ogr.FieldDefn("lyr_id", ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) - f['lyr_id'] = ilayer + f["lyr_id"] = ilayer lyr.CreateFeature(f) ds = None for ilayer in range(2): - ds = ogr.Open('tmp/netcdf_57/lyr%d.nc' % ilayer) + ds = ogr.Open("tmp/netcdf_57/lyr%d.nc" % ilayer) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f['lyr_id'] == ilayer + assert f["lyr_id"] == ilayer ds = None - shutil.rmtree('tmp/netcdf_57') + shutil.rmtree("tmp/netcdf_57") + ############################################################################### # Test one layer per group (NC4) @@ -2097,24 +2417,36 @@ def test_netcdf_58(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_58.nc', options=['FORMAT=NC4', 'MULTIPLE_LAYERS=SEPARATE_GROUPS', 'GEOMETRY_ENCODING=WKT']) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "tmp/netcdf_58.nc", + options=[ + "FORMAT=NC4", + "MULTIPLE_LAYERS=SEPARATE_GROUPS", + "GEOMETRY_ENCODING=WKT", + ], + ) for ilayer in range(2): # Make sure auto-grow will happen to test this works well with multiple groups - lyr = ds.CreateLayer('lyr%d' % ilayer, geom_type=ogr.wkbNone, options=['USE_STRING_IN_NC4=NO', 'STRING_DEFAULT_WIDTH=1']) - lyr.CreateField(ogr.FieldDefn('lyr_id', ogr.OFTString)) + lyr = ds.CreateLayer( + "lyr%d" % ilayer, + geom_type=ogr.wkbNone, + options=["USE_STRING_IN_NC4=NO", "STRING_DEFAULT_WIDTH=1"], + ) + lyr.CreateField(ogr.FieldDefn("lyr_id", ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) - f['lyr_id'] = 'lyr_%d' % ilayer + f["lyr_id"] = "lyr_%d" % ilayer lyr.CreateFeature(f) ds = None - ds = ogr.Open('tmp/netcdf_58.nc') + ds = ogr.Open("tmp/netcdf_58.nc") for ilayer in range(2): lyr = ds.GetLayer(ilayer) f = lyr.GetNextFeature() - assert f['lyr_id'] == 'lyr_%d' % ilayer + assert f["lyr_id"] == "lyr_%d" % ilayer ds = None - gdal.Unlink('tmp/netcdf_58.nc') + gdal.Unlink("tmp/netcdf_58.nc") + ############################################################################### # check for UnitType set/get. @@ -2123,19 +2455,20 @@ def test_netcdf_58(): def test_netcdf_59(): # get - ds = gdal.Open('data/netcdf/unittype.nc') + ds = gdal.Open("data/netcdf/unittype.nc") unit = ds.GetRasterBand(1).GetUnitType() - assert unit == 'm/s', ('Incorrect unit(%s)' % unit) + assert unit == "m/s", "Incorrect unit(%s)" % unit ds = None # set - tst = gdaltest.GDALTest('NetCDF', 'netcdf/unittype.nc', 1, 4672) + tst = gdaltest.GDALTest("NetCDF", "netcdf/unittype.nc", 1, 4672) return tst.testSetUnitType() + ############################################################################### # Test reading a "Indexed ragged array representation of profiles" v1.6.0 H3.5 # http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#_indexed_ragged_array_representation_of_profiles @@ -2144,18 +2477,27 @@ def test_netcdf_59(): def test_netcdf_60(): # Test that a vector cannot be opened in raster-only mode - ds = gdal.OpenEx('data/netcdf/profile.nc', gdal.OF_RASTER) + ds = gdal.OpenEx("data/netcdf/profile.nc", gdal.OF_RASTER) assert ds is None - ds = gdal.OpenEx('data/netcdf/profile.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/netcdf/profile.nc", gdal.OF_VECTOR) assert ds is not None with gdaltest.error_handler(): - gdal.VectorTranslate('/vsimem/netcdf_60.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_60.csv', 'rb') + gdal.VectorTranslate( + "/vsimem/netcdf_60.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_60.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar @@ -2165,7 +2507,8 @@ def test_netcdf_60(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_60.csv') + gdal.Unlink("/vsimem/netcdf_60.csv") + ############################################################################### # Test appending to a "Indexed ragged array representation of profiles" v1.6.0 H3.5 @@ -2173,13 +2516,24 @@ def test_netcdf_60(): def test_netcdf_61(): - shutil.copy('data/netcdf/profile.nc', 'tmp/netcdf_61.nc') - ds = gdal.VectorTranslate('tmp/netcdf_61.nc', 'data/netcdf/profile.nc', accessMode='append') - gdal.VectorTranslate('/vsimem/netcdf_61.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_61.csv', 'rb') + shutil.copy("data/netcdf/profile.nc", "tmp/netcdf_61.nc") + ds = gdal.VectorTranslate( + "tmp/netcdf_61.nc", "data/netcdf/profile.nc", accessMode="append" + ) + gdal.VectorTranslate( + "/vsimem/netcdf_61.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_61.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar @@ -2193,8 +2547,9 @@ def test_netcdf_61(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_61.csv') - gdal.Unlink('/vsimem/netcdf_61.nc') + gdal.Unlink("/vsimem/netcdf_61.csv") + gdal.Unlink("/vsimem/netcdf_61.nc") + ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 @@ -2202,13 +2557,31 @@ def test_netcdf_61(): def test_netcdf_62(): - ds = gdal.VectorTranslate('tmp/netcdf_62.nc', 'data/netcdf/profile.nc', format='netCDF', layerCreationOptions=['FEATURE_TYPE=PROFILE', 'PROFILE_DIM_INIT_SIZE=1', - 'PROFILE_VARIABLES=station'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) - gdal.VectorTranslate('/vsimem/netcdf_62.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_62.csv', 'rb') + ds = gdal.VectorTranslate( + "tmp/netcdf_62.nc", + "data/netcdf/profile.nc", + format="netCDF", + layerCreationOptions=[ + "FEATURE_TYPE=PROFILE", + "PROFILE_DIM_INIT_SIZE=1", + "PROFILE_VARIABLES=station", + ], + datasetCreationOptions=["GEOMETRY_ENCODING=WKT"], + ) + gdal.VectorTranslate( + "/vsimem/netcdf_62.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_62.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo @@ -2219,38 +2592,41 @@ def test_netcdf_62(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_62.csv') + gdal.Unlink("/vsimem/netcdf_62.csv") def test_netcdf_62_ncdump_check(): # get file header with ncdump (if available) try: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h") except OSError: err = None - if err is not None and 'netcdf library version' in err: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_62.nc') - assert ('profile = 2' in ret and \ - 'record = UNLIMITED' in ret and \ - 'profile:cf_role = "profile_id"' in ret and \ - 'parentIndex:instance_dimension = "profile"' in ret and \ - ':featureType = "profile"' in ret and \ - 'char station(profile' in ret and \ - 'char foo(record' in ret) + if err is not None and "netcdf library version" in err: + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h tmp/netcdf_62.nc") + assert ( + "profile = 2" in ret + and "record = UNLIMITED" in ret + and 'profile:cf_role = "profile_id"' in ret + and 'parentIndex:instance_dimension = "profile"' in ret + and ':featureType = "profile"' in ret + and "char station(profile" in ret + and "char foo(record" in ret + ) else: pytest.skip() - def test_netcdf_62_cf_check(): import netcdf_cf + netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: - netcdf_cf.netcdf_cf_check_file('tmp/netcdf_62.nc', 'auto', False) + netcdf_cf.netcdf_cf_check_file("tmp/netcdf_62.nc", "auto", False) + + gdal.Unlink("/vsimem/netcdf_62.nc") - gdal.Unlink('/vsimem/netcdf_62.nc') ############################################################################### # Test creating a NC4 "Indexed ragged array representation of profiles" v1.6.0 H3.5 @@ -2261,15 +2637,32 @@ def test_netcdf_63(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - shutil.copy('data/netcdf/profile.nc', 'tmp/netcdf_63.nc') - ds = gdal.VectorTranslate('tmp/netcdf_63.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT'], - layerCreationOptions=['FEATURE_TYPE=PROFILE', \ - 'USE_STRING_IN_NC4=NO', 'STRING_DEFAULT_WIDTH=1']) - gdal.VectorTranslate('/vsimem/netcdf_63.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_63.csv', 'rb') + shutil.copy("data/netcdf/profile.nc", "tmp/netcdf_63.nc") + ds = gdal.VectorTranslate( + "tmp/netcdf_63.nc", + "data/netcdf/profile.nc", + format="netCDF", + datasetCreationOptions=["FORMAT=NC4", "GEOMETRY_ENCODING=WKT"], + layerCreationOptions=[ + "FEATURE_TYPE=PROFILE", + "USE_STRING_IN_NC4=NO", + "STRING_DEFAULT_WIDTH=1", + ], + ) + gdal.VectorTranslate( + "/vsimem/netcdf_63.csv", + ds, + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_63.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo @@ -2280,7 +2673,7 @@ def test_netcdf_63(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_63.csv') + gdal.Unlink("/vsimem/netcdf_63.csv") def test_netcdf_63_ncdump_check(): @@ -2290,22 +2683,25 @@ def test_netcdf_63_ncdump_check(): # get file header with ncdump (if available) try: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h") except OSError: err = None - if err is not None and 'netcdf library version' in err: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_63.nc') - assert ('profile = UNLIMITED' in ret and \ - 'record = UNLIMITED' in ret and \ - 'profile:cf_role = "profile_id"' in ret and \ - 'parentIndex:instance_dimension = "profile"' in ret and \ - ':featureType = "profile"' in ret and \ - 'char station(record' in ret) + if err is not None and "netcdf library version" in err: + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h tmp/netcdf_63.nc") + assert ( + "profile = UNLIMITED" in ret + and "record = UNLIMITED" in ret + and 'profile:cf_role = "profile_id"' in ret + and 'parentIndex:instance_dimension = "profile"' in ret + and ':featureType = "profile"' in ret + and "char station(record" in ret + ) else: - gdal.Unlink('/vsimem/netcdf_63.nc') + gdal.Unlink("/vsimem/netcdf_63.nc") pytest.skip() - gdal.Unlink('/vsimem/netcdf_63.nc') + gdal.Unlink("/vsimem/netcdf_63.nc") + ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 @@ -2314,13 +2710,33 @@ def test_netcdf_63_ncdump_check(): def test_netcdf_64(): - gdal.VectorTranslate('tmp/netcdf_64.nc', 'data/netcdf/profile.nc', format='netCDF', selectFields=['id,station,foo'], layerCreationOptions=['FEATURE_TYPE=PROFILE', - 'PROFILE_DIM_NAME=profile_dim', 'PROFILE_DIM_INIT_SIZE=1', 'LEGACY=WKT'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) - gdal.VectorTranslate('/vsimem/netcdf_64.csv', 'tmp/netcdf_64.nc', format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_64.csv', 'rb') + gdal.VectorTranslate( + "tmp/netcdf_64.nc", + "data/netcdf/profile.nc", + format="netCDF", + selectFields=["id,station,foo"], + layerCreationOptions=[ + "FEATURE_TYPE=PROFILE", + "PROFILE_DIM_NAME=profile_dim", + "PROFILE_DIM_INIT_SIZE=1", + "LEGACY=WKT", + ], + datasetCreationOptions=["GEOMETRY_ENCODING=WKT"], + ) + gdal.VectorTranslate( + "/vsimem/netcdf_64.csv", + "tmp/netcdf_64.nc", + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_64.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile_dim,id,station,foo @@ -2331,8 +2747,9 @@ def test_netcdf_64(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_64.csv') - gdal.Unlink('/vsimem/netcdf_64.nc') + gdal.Unlink("/vsimem/netcdf_64.csv") + gdal.Unlink("/vsimem/netcdf_64.nc") + ############################################################################### # Test creating a NC4 file with empty string fields / WKT fields @@ -2344,22 +2761,25 @@ def test_netcdf_65(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_65.nc', options=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) + ds = ogr.GetDriverByName("netCDF").CreateDataSource( + "tmp/netcdf_65.nc", options=["FORMAT=NC4", "GEOMETRY_ENCODING=WKT"] + ) + lyr = ds.CreateLayer("test") + lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None - ds = ogr.Open('tmp/netcdf_65.nc') + ds = ogr.Open("tmp/netcdf_65.nc") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['str'] != '': + if f["str"] != "": f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('tmp/netcdf_65.nc') + gdal.Unlink("tmp/netcdf_65.nc") + ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 @@ -2371,13 +2791,22 @@ def test_netcdf_66(): # First trying with no so good configs with gdaltest.error_handler(): - gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=not_existing']) + gdal.VectorTranslate( + "tmp/netcdf_66.nc", + "data/netcdf/profile.nc", + format="netCDF", + datasetCreationOptions=["CONFIG_FILE=not_existing"], + ) with gdaltest.error_handler(): - gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=']) - - myconfig = \ - """ + gdal.VectorTranslate( + "tmp/netcdf_66.nc", + "data/netcdf/profile.nc", + format="netCDF", + datasetCreationOptions=["CONFIG_FILE="], + ) + + myconfig = """ @@ -2413,11 +2842,15 @@ def test_netcdf_66(): """ with gdaltest.error_handler(): - gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=' + myconfig, 'GEOMETRY_ENCODING=WKT']) + gdal.VectorTranslate( + "tmp/netcdf_66.nc", + "data/netcdf/profile.nc", + format="netCDF", + datasetCreationOptions=["CONFIG_FILE=" + myconfig, "GEOMETRY_ENCODING=WKT"], + ) # Now with a correct configuration - myconfig = \ - """ + myconfig = """ @@ -2442,12 +2875,26 @@ def test_netcdf_66(): """ - gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=' + myconfig, 'GEOMETRY_ENCODING=WKT']) - gdal.VectorTranslate('/vsimem/netcdf_66.csv', 'tmp/netcdf_66.nc', format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) - - fp = gdal.VSIFOpenL('/vsimem/netcdf_66.csv', 'rb') + gdal.VectorTranslate( + "tmp/netcdf_66.nc", + "data/netcdf/profile.nc", + format="netCDF", + datasetCreationOptions=["CONFIG_FILE=" + myconfig, "GEOMETRY_ENCODING=WKT"], + ) + gdal.VectorTranslate( + "/vsimem/netcdf_66.csv", + "tmp/netcdf_66.nc", + format="CSV", + layerCreationOptions=[ + "LINEFORMAT=LF", + "GEOMETRY=AS_WKT", + "STRING_QUOTING=IF_NEEDED", + ], + ) + + fp = gdal.VSIFOpenL("/vsimem/netcdf_66.csv", "rb") if fp is not None: - content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + content = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,my_station,foo @@ -2458,31 +2905,34 @@ def test_netcdf_66(): """ assert content == expected_content - gdal.Unlink('/vsimem/netcdf_66.csv') + gdal.Unlink("/vsimem/netcdf_66.csv") def test_netcdf_66_ncdump_check(): # get file header with ncdump (if available) try: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h") except OSError: err = None - if err is not None and 'netcdf library version' in err: - (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_66.nc') - assert ('char my_station(obs, my_station_max_width)' in ret and \ - 'my_station:long_name = "my station attribute"' in ret and \ - 'lon:my_extra_lon_attribute = "foo"' in ret and \ - 'lat:long_name' not in ret and \ - 'id:my_extra_attribute = 5.23' in ret and \ - 'profile:cf_role = "profile_id"' in ret and \ - 'parentIndex:instance_dimension = "profile"' in ret and \ - ':featureType = "profile"' in ret) + if err is not None and "netcdf library version" in err: + (ret, err) = gdaltest.runexternal_out_and_err("ncdump -h tmp/netcdf_66.nc") + assert ( + "char my_station(obs, my_station_max_width)" in ret + and 'my_station:long_name = "my station attribute"' in ret + and 'lon:my_extra_lon_attribute = "foo"' in ret + and "lat:long_name" not in ret + and "id:my_extra_attribute = 5.23" in ret + and 'profile:cf_role = "profile_id"' in ret + and 'parentIndex:instance_dimension = "profile"' in ret + and ':featureType = "profile"' in ret + ) else: - gdal.Unlink('/vsimem/netcdf_66.nc') + gdal.Unlink("/vsimem/netcdf_66.nc") pytest.skip() - gdal.Unlink('/vsimem/netcdf_66.nc') + gdal.Unlink("/vsimem/netcdf_66.nc") + ############################################################################### # ticket #5950: optimize IReadBlock() and CheckData() handling of partial @@ -2500,28 +2950,30 @@ def test_netcdf_67(): pytest.skip() # disable bottom-up mode to use the real file's blocks size - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', 'NO') + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", "NO") # for the moment the next test using check_stat does not work, seems like # the last pixel (9) of the image is not handled by stats... -# tst = gdaltest.GDALTest( 'NetCDF', 'partial_block_ticket5950.nc', 1, 45 ) -# result = tst.testOpen( check_stat=(1, 9, 5, 2.582) ) + # tst = gdaltest.GDALTest( 'NetCDF', 'partial_block_ticket5950.nc', 1, 45 ) + # result = tst.testOpen( check_stat=(1, 9, 5, 2.582) ) # so for the moment compare the full image - ds = gdal.Open('data/netcdf/partial_block_ticket5950.nc', gdal.GA_ReadOnly) + ds = gdal.Open("data/netcdf/partial_block_ticket5950.nc", gdal.GA_ReadOnly) ref = numpy.arange(1, 10).reshape((3, 3)) if not numpy.array_equal(ds.GetRasterBand(1).ReadAsArray(), ref): pytest.fail() ds = None - gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', None) + gdal.SetConfigOption("GDAL_NETCDF_BOTTOMUP", None) ############################################################################### # Test reading SRS from srid attribute (#6613) + def test_netcdf_68(): - ds = gdal.Open('data/netcdf/srid.nc') + ds = gdal.Open("data/netcdf/srid.nc") wkt = ds.GetProjectionRef() - assert '6933' in wkt + assert "6933" in wkt + ############################################################################### # Test opening a dataset with a 1D variable with 0 record (#6645) @@ -2529,20 +2981,22 @@ def test_netcdf_68(): def test_netcdf_69(): - ds = gdal.Open('data/netcdf/test6645.nc') + ds = gdal.Open("data/netcdf/test6645.nc") assert ds is not None + ############################################################################### # Test that we don't erroneously identify non-longitude axis as longitude (#6759) def test_netcdf_70(): - ds = gdal.Open('data/netcdf/test6759.nc') + ds = gdal.Open("data/netcdf/test6759.nc") gt = ds.GetGeoTransform() expected_gt = [304250.0, 250.0, 0.0, 4952500.0, 0.0, -250.0] assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-3 + ############################################################################### # Test that we take into account x and y offset and scaling # (https://github.com/OSGeo/gdal/pull/200) @@ -2550,11 +3004,19 @@ def test_netcdf_70(): def test_netcdf_71(): - ds = gdal.Open('data/netcdf/test_coord_scale_offset.nc') + ds = gdal.Open("data/netcdf/test_coord_scale_offset.nc") gt = ds.GetGeoTransform() - expected_gt = (-690769.999174516, 1015.8812500000931, 0.0, 2042963.9463741186, 0.0, -1015.8812499996275) + expected_gt = ( + -690769.999174516, + 1015.8812500000931, + 0.0, + 2042963.9463741186, + 0.0, + -1015.8812499996275, + ) assert gt == pytest.approx(expected_gt, abs=1e-3) + ############################################################################### # test int64 attributes / dim @@ -2564,9 +3026,10 @@ def test_netcdf_72(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.Open('data/netcdf/int64dim.nc') - mdi = ds.GetRasterBand(1).GetMetadataItem('NETCDF_DIM_TIME') - assert mdi == '123456789012' + ds = gdal.Open("data/netcdf/int64dim.nc") + mdi = ds.GetRasterBand(1).GetMetadataItem("NETCDF_DIM_TIME") + assert mdi == "123456789012" + ############################################################################### # test geostationary with radian units (https://github.com/OSGeo/gdal/pull/220) @@ -2574,33 +3037,48 @@ def test_netcdf_72(): def test_netcdf_73(): - ds = gdal.Open('data/netcdf/geos_rad.nc') + ds = gdal.Open("data/netcdf/geos_rad.nc") gt = ds.GetGeoTransform() - expected_gt = (-5979486.362104082, 1087179.4077774752, 0.0, 5979486.362104082, 0.0, -1087179.4077774752) + expected_gt = ( + -5979486.362104082, + 1087179.4077774752, + 0.0, + 5979486.362104082, + 0.0, + -1087179.4077774752, + ) assert gt == pytest.approx(expected_gt, abs=1e-3) + ############################################################################### # test geostationary with microradian units (https://github.com/OSGeo/gdal/pull/220) def test_netcdf_74(): - ds = gdal.Open('data/netcdf/geos_microradian.nc') + ds = gdal.Open("data/netcdf/geos_microradian.nc") gt = ds.GetGeoTransform() - expected_gt = (-5739675.119757546, 615630.8078590936, 0.0, 5739675.119757546, 0.0, -615630.8078590936) + expected_gt = ( + -5739675.119757546, + 615630.8078590936, + 0.0, + 5739675.119757546, + 0.0, + -615630.8078590936, + ) assert gt == pytest.approx(expected_gt, abs=1e-3) + ############################################################################### # test opening a ncdump file def test_netcdf_75(): - if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != 'YES': + if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != "YES": pytest.skip() - tst = gdaltest.GDALTest('NetCDF', 'netcdf/byte.nc.txt', - 1, 4672) + tst = gdaltest.GDALTest("NetCDF", "netcdf/byte.nc.txt", 1, 4672) wkt = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", @@ -2623,16 +3101,17 @@ def test_netcdf_75(): return tst.testOpen(check_prj=wkt) + ############################################################################### # test opening a vector ncdump file def test_netcdf_76(): - if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != 'YES': + if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != "YES": pytest.skip() - ds = ogr.Open('data/netcdf/poly.nc.txt') + ds = ogr.Open("data/netcdf/poly.nc.txt") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f is None or f.GetGeometryRef() is None: @@ -2646,26 +3125,28 @@ def test_netcdf_76(): def test_netcdf_77(): - ds = gdal.Open('data/netcdf/fake_Oa01_radiance.nc') - subdatasets = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("data/netcdf/fake_Oa01_radiance.nc") + subdatasets = ds.GetMetadata("SUBDATASETS") assert len(subdatasets) == 2 * 2 ds = gdal.Open('NETCDF:"data/netcdf/fake_Oa01_radiance.nc":Oa01_radiance') - assert not ds.GetMetadata('GEOLOCATION') + assert not ds.GetMetadata("GEOLOCATION") ############################################################################### # test we handle correctly valid_range={0,255} for a byte dataset with # negative nodata value + def test_netcdf_78(): - ds = gdal.Open('data/netcdf/byte_with_valid_range.nc') + ds = gdal.Open("data/netcdf/byte_with_valid_range.nc") assert ds.GetRasterBand(1).GetNoDataValue() == 240 data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('B' * 4, data) + data = struct.unpack("B" * 4, data) assert data == (128, 129, 126, 127) + ############################################################################### # test we handle correctly _Unsigned="true" for a byte dataset with # negative nodata value @@ -2673,20 +3154,24 @@ def test_netcdf_78(): def test_netcdf_79(): - ds = gdal.Open('data/netcdf/byte_with_neg_fillvalue_and_unsigned_hint.nc') + ds = gdal.Open("data/netcdf/byte_with_neg_fillvalue_and_unsigned_hint.nc") assert ds.GetRasterBand(1).GetNoDataValue() == 240 data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('B' * 4, data) + data = struct.unpack("B" * 4, data) assert data == (128, 129, 126, 127) + ############################################################################### # Test creating and opening with accent def test_netcdf_80(): - test = gdaltest.GDALTest('NETCDF', '../data/byte.tif', 1, 4672) - return test.testCreateCopy(new_filename='test\xc3\xa9.nc', check_gt=0, check_srs=0, check_minmax=0) + test = gdaltest.GDALTest("NETCDF", "../data/byte.tif", 1, 4672) + return test.testCreateCopy( + new_filename="test\xc3\xa9.nc", check_gt=0, check_srs=0, check_minmax=0 + ) + ############################################################################### # netCDF file in rotated_pole projection @@ -2694,10 +3179,11 @@ def test_netcdf_80(): def test_netcdf_81(): - ds = gdal.Open('data/netcdf/rotated_pole.nc') + ds = gdal.Open("data/netcdf/rotated_pole.nc") - assert ds.RasterXSize == 137 and ds.RasterYSize == 108, \ - 'Did not get expected dimensions' + assert ( + ds.RasterXSize == 137 and ds.RasterYSize == 108 + ), "Did not get expected dimensions" projection = ds.GetProjectionRef() # Before PROJ 7.0.1 @@ -2707,12 +3193,18 @@ def test_netcdf_81(): newer_expected_projection = """GEOGCRS["Rotated_pole",BASEGEOGCRS["unknown",DATUM["unnamed",ELLIPSOID["Spheroid",6367470,594.313048347956,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (netCDF CF convention)",METHOD["Pole rotation (netCDF CF convention)"],PARAMETER["Grid north pole latitude (netCDF CF convention)",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Grid north pole longitude (netCDF CF convention)",-162,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["North pole grid longitude (netCDF CF convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" - assert projection in (newer_expected_projection, expected_projection, deprecated_expected_projection) + assert projection in ( + newer_expected_projection, + expected_projection, + deprecated_expected_projection, + ) gt = ds.GetGeoTransform() expected_gt = (-35.47, 0.44, 0.0, 23.65, 0.0, -0.44) - assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ - 'Did not get expected geotransform' + assert ( + max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3 + ), "Did not get expected geotransform" + ############################################################################### # Write netCDF file in rotated_pole projection @@ -2721,21 +3213,23 @@ def test_netcdf_81(): def test_netcdf_write_rotated_pole_from_method_proj(): if osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 < 70100: - pytest.skip('Not enough recent PROJ version') + pytest.skip("Not enough recent PROJ version") - ds = gdal.GetDriverByName('netCDF').Create('tmp/rotated_pole.nc', 2, 2) - gt = [2,1,0,49,0,-1] + ds = gdal.GetDriverByName("netCDF").Create("tmp/rotated_pole.nc", 2, 2) + gt = [2, 1, 0, 49, 0, -1] ds.SetGeoTransform(gt) - ds.SetProjection("""GEOGCRS["unnamed",BASEGEOGCRS["unknown",DATUM["unknown",ELLIPSOID["unknown",6367470,594.313048347956,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8901]]],DERIVINGCONVERSION["unknown",METHOD["PROJ ob_tran o_proj=longlat"],PARAMETER["lon_0",18,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lon_p",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lat_p",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["longitude",east,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["latitude",north,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""") + ds.SetProjection( + """GEOGCRS["unnamed",BASEGEOGCRS["unknown",DATUM["unknown",ELLIPSOID["unknown",6367470,594.313048347956,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8901]]],DERIVINGCONVERSION["unknown",METHOD["PROJ ob_tran o_proj=longlat"],PARAMETER["lon_0",18,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lon_p",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lat_p",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["longitude",east,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["latitude",north,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" + ) ds = None - ds = gdal.Open('tmp/rotated_pole.nc') + ds = gdal.Open("tmp/rotated_pole.nc") got_gt = ds.GetGeoTransform() wkt = ds.GetProjectionRef() md = ds.GetMetadata() ds = None - gdal.Unlink('tmp/rotated_pole.nc') + gdal.Unlink("tmp/rotated_pole.nc") older_wkt = """GEOGCRS["unnamed",BASEGEOGCRS["unknown",DATUM["unknown",ELLIPSOID["unknown",6367470,594.313048347956,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8901]]],DERIVINGCONVERSION["unknown",METHOD["PROJ ob_tran o_proj=longlat"],PARAMETER["lon_0",18,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lon_p",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lat_p",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["longitude",east,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["latitude",north,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" @@ -2743,8 +3237,9 @@ def test_netcdf_write_rotated_pole_from_method_proj(): assert wkt in (older_wkt, newer_wkt) assert got_gt == pytest.approx(gt, rel=1e-6) - assert md['rlat#standard_name'] == 'grid_latitude' - assert md['rlon#standard_name'] == 'grid_longitude' + assert md["rlat#standard_name"] == "grid_latitude" + assert md["rlon#standard_name"] == "grid_longitude" + ############################################################################### # Write netCDF file in rotated_pole projection @@ -2753,23 +3248,24 @@ def test_netcdf_write_rotated_pole_from_method_proj(): def test_netcdf_write_rotated_pole_from_method_netcdf_cf(): if osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 < 80200: - pytest.skip('Not enough recent PROJ version') + pytest.skip("Not enough recent PROJ version") expected_wkt = """GEOGCRS["Rotated_pole",BASEGEOGCRS["unknown",DATUM["unnamed",ELLIPSOID["Spheroid",6367470,594.313048347956,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (netCDF CF convention)",METHOD["Pole rotation (netCDF CF convention)"],PARAMETER["Grid north pole latitude (netCDF CF convention)",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Grid north pole longitude (netCDF CF convention)",-162,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["North pole grid longitude (netCDF CF convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" - ds = gdal.GetDriverByName('netCDF').Create('tmp/rotated_pole.nc', 2, 2) - ds.SetGeoTransform([2,1,0,49,0,-1]) + ds = gdal.GetDriverByName("netCDF").Create("tmp/rotated_pole.nc", 2, 2) + ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) ds.SetProjection(expected_wkt) ds = None - ds = gdal.Open('tmp/rotated_pole.nc') + ds = gdal.Open("tmp/rotated_pole.nc") wkt = ds.GetProjectionRef() ds = None - gdal.Unlink('tmp/rotated_pole.nc') + gdal.Unlink("tmp/rotated_pole.nc") assert wkt == expected_wkt + ############################################################################### # Write netCDF file in rotated_pole projection @@ -2777,18 +3273,20 @@ def test_netcdf_write_rotated_pole_from_method_netcdf_cf(): def test_netcdf_write_rotated_pole_from_method_grib(): if osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 < 70000: - pytest.skip('Not enough recent PROJ version') + pytest.skip("Not enough recent PROJ version") - ds = gdal.GetDriverByName('netCDF').Create('tmp/rotated_pole.nc', 2, 2) - ds.SetGeoTransform([2,1,0,49,0,-1]) - ds.SetProjection("""GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-30,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-15,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""") + ds = gdal.GetDriverByName("netCDF").Create("tmp/rotated_pole.nc", 2, 2) + ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) + ds.SetProjection( + """GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-30,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-15,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" + ) ds = None - ds = gdal.Open('tmp/rotated_pole.nc') + ds = gdal.Open("tmp/rotated_pole.nc") wkt = ds.GetProjectionRef() ds = None - gdal.Unlink('tmp/rotated_pole.nc') + gdal.Unlink("tmp/rotated_pole.nc") # Before PROJ 7.0.1 deprecated_expected_projection = """PROJCS["unnamed",GEOGCS["unknown",DATUM["unnamed",SPHEROID["Spheroid",6367470,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +o_proj=longlat +lon_0=-15 +o_lon_p=0 +o_lat_p=30 +a=6367470 +b=6367470 +to_meter=0.0174532925199 +wktext"]]""" @@ -2809,26 +3307,27 @@ def test_netcdf_write_rotated_pole_from_method_grib(): def test_netcdf_82(): with gdaltest.error_handler(): - ds = gdal.Open('data/netcdf/oddly_indexed_extra_dims.nc') + ds = gdal.Open("data/netcdf/oddly_indexed_extra_dims.nc") md = ds.GetMetadata() expected_md = { - 'NETCDF_DIM_extra_dim_with_var_of_different_name_VALUES': '{100,200}', - 'NETCDF_DIM_EXTRA': '{extra_dim_with_several_variables,extra_dim_without_variable,extra_dim_with_var_of_different_name}', - 'x#standard_name': 'projection_x_coordinate', - 'NC_GLOBAL#Conventions': 'CF-1.5', - 'y#standard_name': 'projection_y_coordinate', - 'NETCDF_DIM_extra_dim_with_var_of_different_name_DEF': '{2,6}' + "NETCDF_DIM_extra_dim_with_var_of_different_name_VALUES": "{100,200}", + "NETCDF_DIM_EXTRA": "{extra_dim_with_several_variables,extra_dim_without_variable,extra_dim_with_var_of_different_name}", + "x#standard_name": "projection_x_coordinate", + "NC_GLOBAL#Conventions": "CF-1.5", + "y#standard_name": "projection_y_coordinate", + "NETCDF_DIM_extra_dim_with_var_of_different_name_DEF": "{2,6}", } - assert md == expected_md, 'Did not get expected metadata' + assert md == expected_md, "Did not get expected metadata" md = ds.GetRasterBand(1).GetMetadata() expected_md = { - 'NETCDF_DIM_extra_dim_with_several_variables': '1', - 'NETCDF_DIM_extra_dim_with_var_of_different_name': '100', - 'NETCDF_DIM_extra_dim_without_variable': '1', - 'NETCDF_VARNAME': 'data' + "NETCDF_DIM_extra_dim_with_several_variables": "1", + "NETCDF_DIM_extra_dim_with_var_of_different_name": "100", + "NETCDF_DIM_extra_dim_without_variable": "1", + "NETCDF_VARNAME": "data", } - assert md == expected_md, 'Did not get expected metadata' + assert md == expected_md, "Did not get expected metadata" + ############################################################################### # Test complex data subsets @@ -2836,17 +3335,22 @@ def test_netcdf_82(): def test_netcdf_83(): - ds = gdal.Open('data/netcdf/complex.nc') - sds_list = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("data/netcdf/complex.nc") + sds_list = ds.GetMetadata("SUBDATASETS") - assert len(sds_list) == 6, 'Did not get expected complex subdataset count.' + assert len(sds_list) == 6, "Did not get expected complex subdataset count." - assert sds_list['SUBDATASET_1_NAME'] == 'NETCDF:"data/netcdf/complex.nc":f32' and sds_list['SUBDATASET_2_NAME'] == 'NETCDF:"data/netcdf/complex.nc":f64' and sds_list['SUBDATASET_3_NAME'] == 'NETCDF:"data/netcdf/complex.nc":/group/fmul', \ - 'did not get expected subdatasets.' + assert ( + sds_list["SUBDATASET_1_NAME"] == 'NETCDF:"data/netcdf/complex.nc":f32' + and sds_list["SUBDATASET_2_NAME"] == 'NETCDF:"data/netcdf/complex.nc":f64' + and sds_list["SUBDATASET_3_NAME"] + == 'NETCDF:"data/netcdf/complex.nc":/group/fmul' + ), "did not get expected subdatasets." ds = None - assert not gdaltest.is_file_open('data/netcdf/complex.nc'), 'file still opened.' + assert not gdaltest.is_file_open("data/netcdf/complex.nc"), "file still opened." + ############################################################################### # Confirm complex subset data access and checksum @@ -2859,7 +3363,8 @@ def test_netcdf_84(): assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat32 cs = ds.GetRasterBand(1).Checksum() - assert cs == 465, 'did not get expected checksum' + assert cs == 465, "did not get expected checksum" + # Repeat for Float64 @@ -2870,91 +3375,102 @@ def test_netcdf_85(): assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat64 cs = ds.GetRasterBand(1).Checksum() - assert cs == 546, 'did not get expected checksum' + assert cs == 546, "did not get expected checksum" # Check for groups support + def test_netcdf_86(): ds = gdal.Open('NETCDF:"data/netcdf/complex.nc":/group/fmul') assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat32 cs = ds.GetRasterBand(1).Checksum() - assert cs == 453, 'did not get expected checksum for band 1' + assert cs == 453, "did not get expected checksum for band 1" cs = ds.GetRasterBand(2).Checksum() - assert cs == 629, 'did not get expected checksum for band 2' + assert cs == 629, "did not get expected checksum for band 2" cs = ds.GetRasterBand(3).Checksum() - assert cs == 473, 'did not get expected checksum for band 3' + assert cs == 473, "did not get expected checksum for band 3" + ############################################################################### def test_netcdf_uffd(): - if uffd_compare('netcdf/orog_CRCM1.nc') is None: + if uffd_compare("netcdf/orog_CRCM1.nc") is None: pytest.skip() netcdf_files = [ - 'orog_CRCM1.nc', - 'orog_CRCM2.nc', - 'cf-bug636.nc', - 'bug636.nc', - 'rotated_pole.nc', - 'reduce-cgcms.nc' + "orog_CRCM1.nc", + "orog_CRCM2.nc", + "cf-bug636.nc", + "bug636.nc", + "rotated_pole.nc", + "reduce-cgcms.nc", ] for netcdf_file in netcdf_files: - assert uffd_compare('netcdf/' + netcdf_file) is True + assert uffd_compare("netcdf/" + netcdf_file) is True + ############################################################################### # netCDF file containing both rasters and vectors + def test_netcdf_mixed_raster_vector(): - ds = gdal.Open('NETCDF:data/netcdf/nc_mixed_raster_vector.nc:Band1') + ds = gdal.Open("NETCDF:data/netcdf/nc_mixed_raster_vector.nc:Band1") assert ds.GetRasterBand(1).Checksum() == 4672 - ds = ogr.Open('data/netcdf/nc_mixed_raster_vector.nc') + ds = ogr.Open("data/netcdf/nc_mixed_raster_vector.nc") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f['PRFEDEA'] == '35043411' + assert f["PRFEDEA"] == "35043411" ############################################################################### # Test opening a file with an empty double attribute # https://github.com/OSGeo/gdal/issues/1303 + def test_netcdf_open_empty_double_attr(): - ds = gdal.Open('data/netcdf/empty_double_attr.nc') + ds = gdal.Open("data/netcdf/empty_double_attr.nc") assert ds ############################################################################### # Test writing and reading a file with huge block size + def test_netcdf_huge_block_size(): if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: - pytest.skip('Test not available on 32 bit') + pytest.skip("Test not available on 32 bit") import psutil + if psutil.virtual_memory().available < 2 * 50000 * 50000: pytest.skip("Not enough virtual memory available") - tmpfilename = 'tmp/test_netcdf_huge_block_size.nc' + tmpfilename = "tmp/test_netcdf_huge_block_size.nc" with gdaltest.SetCacheMax(50000 * 50000 + 100000): - with gdaltest.config_option('BLOCKYSIZE', '50000'): - gdal.Translate(tmpfilename, - '../gcore/data/byte.tif', - options='-f netCDF -outsize 50000 50000 -co WRITE_BOTTOMUP=NO -co COMPRESS=DEFLATE -co FORMAT=NC4') + with gdaltest.config_option("BLOCKYSIZE", "50000"): + gdal.Translate( + tmpfilename, + "../gcore/data/byte.tif", + options="-f netCDF -outsize 50000 50000 -co WRITE_BOTTOMUP=NO -co COMPRESS=DEFLATE -co FORMAT=NC4", + ) ds = gdal.Open(tmpfilename) - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize=20, buf_ysize=20 + ) assert data - ref_ds = gdal.Open('../gcore/data/byte.tif') + ref_ds = gdal.Open("../gcore/data/byte.tif") assert data == ref_ds.ReadRaster() ds = None @@ -2968,65 +3484,133 @@ def test_netcdf_huge_block_size(): # Currently we expose it in a 'raw' way, but make sure that geotransform and # geoloc arrays reflect the georeferencing correctly + def test_netcdf_swapped_x_y_dimension(): - ds = gdal.Open('data/netcdf/swapedxy.nc') + ds = gdal.Open("data/netcdf/swapedxy.nc") assert ds.RasterXSize == 4 assert ds.RasterYSize == 8 assert ds.GetGeoTransform() == (90.0, -45.0, 0, -180, 0.0, 45.0) data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('h' * 4 * 8, data) - assert data == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13 ,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31) - md = ds.GetMetadata('GEOLOCATION') + data = struct.unpack("h" * 4 * 8, data) + assert data == ( + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + ) + md = ds.GetMetadata("GEOLOCATION") assert md == { - 'LINE_OFFSET': '0', - 'X_DATASET': 'NETCDF:"data/netcdf/swapedxy.nc":Latitude', - 'SWAP_XY': 'YES', - 'PIXEL_STEP': '1', - 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', - 'PIXEL_OFFSET': '0', - 'X_BAND': '1', - 'LINE_STEP': '1', - 'Y_DATASET': 'NETCDF:"data/netcdf/swapedxy.nc":Longitude', - 'Y_BAND': '1', - 'GEOREFERENCING_CONVENTION': 'PIXEL_CENTER'}, md - - ds = gdal.Open(md['X_DATASET']) + "LINE_OFFSET": "0", + "X_DATASET": 'NETCDF:"data/netcdf/swapedxy.nc":Latitude', + "SWAP_XY": "YES", + "PIXEL_STEP": "1", + "SRS": 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', + "PIXEL_OFFSET": "0", + "X_BAND": "1", + "LINE_STEP": "1", + "Y_DATASET": 'NETCDF:"data/netcdf/swapedxy.nc":Longitude', + "Y_BAND": "1", + "GEOREFERENCING_CONVENTION": "PIXEL_CENTER", + }, md + + ds = gdal.Open(md["X_DATASET"]) assert ds.RasterXSize == 4 assert ds.RasterYSize == 1 data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('f' * 4, data) + data = struct.unpack("f" * 4, data) assert data == (67.5, 22.5, -22.5, -67.5) - ds = gdal.Open(md['Y_DATASET']) + ds = gdal.Open(md["Y_DATASET"]) assert ds.RasterXSize == 8 assert ds.RasterYSize == 1 data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('f' * 8, data) + data = struct.unpack("f" * 8, data) assert data == (-157.5, -112.5, -67.5, -22.5, 22.5, 67.5, 112.5, 157.5) - ds = gdal.Warp('', 'data/netcdf/swapedxy.nc', options = '-f MEM -geoloc -ts 8 4') + ds = gdal.Warp("", "data/netcdf/swapedxy.nc", options="-f MEM -geoloc -ts 8 4") assert ds.RasterXSize == 8 assert ds.RasterYSize == 4 - assert ds.GetGeoTransform() == pytest.approx((-180.0, 45.0, 0.0, 90, 0.0, -45.0)), ds.GetGeoTransform() + assert ds.GetGeoTransform() == pytest.approx( + (-180.0, 45.0, 0.0, 90, 0.0, -45.0) + ), ds.GetGeoTransform() data = ds.GetRasterBand(1).ReadRaster() - data = struct.unpack('h' * 8 * 4, data) + data = struct.unpack("h" * 8 * 4, data) # transposed array - assert data == (0, 4, 8, 12, 16, 20, 24, 28, - 1, 5, 9, 13, 17, 21, 25, 29, - 2, 6, 10, 14, 18, 22, 26, 30, - 3, 7, 11, 15, 19, 23, 27, 31) + assert data == ( + 0, + 4, + 8, + 12, + 16, + 20, + 24, + 28, + 1, + 5, + 9, + 13, + 17, + 21, + 25, + 29, + 2, + 6, + 10, + 14, + 18, + 22, + 26, + 30, + 3, + 7, + 11, + 15, + 19, + 23, + 27, + 31, + ) ############################################################################### # Test reading a netCDF file whose grid_mapping attribute uses an # expanded form + def test_netcdf_expanded_form_of_grid_mapping(): - ds = gdal.Open('data/netcdf/expanded_form_of_grid_mapping.nc') + ds = gdal.Open("data/netcdf/expanded_form_of_grid_mapping.nc") wkt = ds.GetProjectionRef() - assert 'Transverse_Mercator' in wkt + assert "Transverse_Mercator" in wkt ############################################################################### @@ -3035,53 +3619,53 @@ def test_netcdf_expanded_form_of_grid_mapping(): # main tests list - ############################################################################### # basic file creation tests init_list = [ - ('byte.tif', 4672, []), - ('gtiff/byte_signed.tif', 4672, ['PIXELTYPE=SIGNEDBYTE']), - ('int16.tif', 4672, []), - ('int32.tif', 4672, []), - ('float32.tif', 4672, []), - ('float64.tif', 4672, []) + ("byte.tif", 4672, []), + ("gtiff/byte_signed.tif", 4672, ["PIXELTYPE=SIGNEDBYTE"]), + ("int16.tif", 4672, []), + ("int32.tif", 4672, []), + ("float32.tif", 4672, []), + ("float64.tif", 4672, []), ] # Some tests we don't need to do for each type. + @pytest.mark.parametrize( - 'testfunction', [ - 'testSetGeoTransform', - 'testSetProjection', + "testfunction", + [ + "testSetGeoTransform", + "testSetProjection", # SetMetadata() not supported # 'testSetMetadata' - ] + ], ) -@pytest.mark.require_driver('netcdf') +@pytest.mark.require_driver("netcdf") def test_netcdf_functions_1(testfunction): - ut = gdaltest.GDALTest('netcdf', 'byte.tif', 1, 4672, options=["GEOMETRY_ENCODING=WKT"]) + ut = gdaltest.GDALTest( + "netcdf", "byte.tif", 1, 4672, options=["GEOMETRY_ENCODING=WKT"] + ) getattr(ut, testfunction)() # Others we do for each pixel type. + @pytest.mark.parametrize( - 'filename,checksum,options', + "filename,checksum,options", init_list, - ids=[tup[0].split('.')[0] for tup in init_list], + ids=[tup[0].split(".")[0] for tup in init_list], ) @pytest.mark.parametrize( - 'testfunction', [ - 'testCreateCopy', - 'testCreate', - 'testSetNoDataValue' - ] + "testfunction", ["testCreateCopy", "testCreate", "testSetNoDataValue"] ) -@pytest.mark.require_driver('netcdf') +@pytest.mark.require_driver("netcdf") def test_netcdf_functions_2(filename, checksum, options, testfunction): - ut = gdaltest.GDALTest('netcdf', filename, 1, checksum, options=options) + ut = gdaltest.GDALTest("netcdf", filename, 1, checksum, options=options) getattr(ut, testfunction)() @@ -3109,6 +3693,7 @@ def test_bad_cf1_8(): assert corrupt_poly_3 is None assert uneq_x_y is None + def test_point_read(): singleton_pt = ogr.Open("data/netcdf-sg/point_test.nc") @@ -3145,6 +3730,7 @@ def test_point_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POINT (5 -5)" + def test_point3D_read(): singleton_pt = ogr.Open("data/netcdf-sg/point3D_test.nc") @@ -3181,6 +3767,7 @@ def test_point3D_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POINT (5 -5 5)" + def test_multipoint_read(): multipoints = ogr.Open("data/netcdf-sg/multipoint_test.nc") @@ -3216,6 +3803,7 @@ def test_multipoint_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTIPOINT (-7 7,-8 8,-9 9,-10 10)" + def test_multipoint3D_read(): multipoints = ogr.Open("data/netcdf-sg/multipoint3D_test.nc") @@ -3251,6 +3839,7 @@ def test_multipoint3D_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTIPOINT (-7 7 -7,-8 8 8,-9 9 -9,-10 10 10)" + def test_line_read(): line = ogr.Open("data/netcdf-sg/line_test.nc") @@ -3286,6 +3875,7 @@ def test_line_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "LINESTRING (-7 7,-8 8,-9 9,-10 10)" + def test_line3D_read(): line = ogr.Open("data/netcdf-sg/line3D_test.nc") @@ -3321,6 +3911,7 @@ def test_line3D_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "LINESTRING (-7 7 7,-8 8 -8,-9 9 9,-10 10 -10)" + def test_multiline_read(): multiline = ogr.Open("data/netcdf-sg/multiline_test.nc") @@ -3356,6 +3947,7 @@ def test_multiline_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTILINESTRING ((-7 7,-8 8,-9 9,-10 10))" + def test_multiline3D_read(): multiline = ogr.Open("data/netcdf-sg/multiline3D_test.nc") @@ -3391,6 +3983,7 @@ def test_multiline3D_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTILINESTRING ((-7 7 -7,-8 8 8,-9 9 -9,-10 10 10))" + def test_polygon_read(): polygon = ogr.Open("data/netcdf-sg/polygon_test.nc") @@ -3410,6 +4003,7 @@ def test_polygon_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POLYGON ((3 0,4 0,4 1,3 1,3 0))" + def test_polygon3D_read(): polygon = ogr.Open("data/netcdf-sg/polygon3D_test.nc") @@ -3429,6 +4023,7 @@ def test_polygon3D_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POLYGON ((3 0 1,4 0 1,4 1 1,3 1 1,3 0 1))" + def test_multipolygon_read(): multipolygon = ogr.Open("data/netcdf-sg/multipolygon_test.nc") @@ -3448,6 +4043,7 @@ def test_multipolygon_read(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))" + def test_multipolygon3D_read(): multipolygon = ogr.Open("data/netcdf-sg/multipolygon3D_test.nc") @@ -3465,7 +4061,11 @@ def test_multipolygon3D_read(): ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() - assert ft_wkt == "MULTIPOLYGON (((3 0 5,4 0 10,4 1 10,3 0 5)),((3 0 10,4 1 15,3 1 15,3 0 10)))" + assert ( + ft_wkt + == "MULTIPOLYGON (((3 0 5,4 0 10,4 1 10,3 0 5)),((3 0 10,4 1 15,3 1 15,3 0 10)))" + ) + def test_serpenski_two_ring(): @@ -3476,7 +4076,7 @@ def test_serpenski_two_ring(): lc = s.GetLayerCount() assert lc == 1 good_layer = s.GetLayerByName("serpenski") - assert good_layer != None # real layer + assert good_layer != None # real layer assert good_layer.GetFeatureCount() == 1 assert good_layer.GetGeomType() == ogr.wkbMultiPolygon @@ -3485,8 +4085,12 @@ def test_serpenski_two_ring(): triangle = serpenski.GetGeometryRef() st_wkt = triangle.ExportToWkt() - assert st_wkt == "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," \ - "0.25 0.433012701892219,0.5 0.0)))" + assert ( + st_wkt + == "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," + "0.25 0.433012701892219,0.5 0.0)))" + ) + def test_serpenski3D_two_ring(): @@ -3497,7 +4101,7 @@ def test_serpenski3D_two_ring(): lc = s.GetLayerCount() assert lc == 1 good_layer = s.GetLayerByName("serpenski") - assert good_layer != None # real layer + assert good_layer != None # real layer assert good_layer.GetFeatureCount() == 1 assert good_layer.GetGeomType() == ogr.wkbMultiPolygon25D @@ -3506,8 +4110,12 @@ def test_serpenski3D_two_ring(): triangle = serpenski.GetGeometryRef() st_wkt = triangle.ExportToWkt() - assert st_wkt == "MULTIPOLYGON (((0 0 1,1 0 1,0.5 0.866025403784439 1,0 0 1),(0.5 0.0 1,0.75 0.433012701892219 1," \ - "0.25 0.433012701892219 1,0.5 0.0 1)))" + assert ( + st_wkt + == "MULTIPOLYGON (((0 0 1,1 0 1,0.5 0.866025403784439 1,0 0 1),(0.5 0.0 1,0.75 0.433012701892219 1," + "0.25 0.433012701892219 1,0.5 0.0 1)))" + ) + def test_flipped_axis(): @@ -3523,6 +4131,7 @@ def test_flipped_axis(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POLYGON ((0 0,1 0,1 1,0 0))" + def test_arbitrary_3Daxis_order_(): polygon = ogr.Open("data/netcdf-sg/arbitrary_axis_order_test.nc") @@ -3540,6 +4149,7 @@ def test_arbitrary_3Daxis_order_(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "POLYGON ((3 0 1,4 0 1,4 1 1,3 1 1,3 0 1))" + def test_multiple_layers_one_nc(): # tests whether or not an NC with multiple geometry containers can be read @@ -3559,19 +4169,26 @@ def test_multiple_layers_one_nc(): triangle = triangle_ft.GetGeometryRef() assert triangle.GetGeometryType() == ogr.wkbMultiPolygon st_wkt = triangle.ExportToWkt() - assert st_wkt == "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," \ - "0.25 0.433012701892219,0.5 0.0)))" + assert ( + st_wkt + == "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," + "0.25 0.433012701892219,0.5 0.0)))" + ) outline_ft = s_outline.GetNextFeature() outline = outline_ft.GetGeometryRef() assert outline.GetGeometryType() == ogr.wkbMultiLineString so_wkt = outline.ExportToWkt() - assert so_wkt == "MULTILINESTRING ((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," \ - "0.25 0.433012701892219,0.5 0.0))" + assert ( + so_wkt + == "MULTILINESTRING ((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219," + "0.25 0.433012701892219,0.5 0.0))" + ) # advanced tests + def test_yahara(): yahara = ogr.Open("data/netcdf-sg/Yahara_alb.nc") @@ -3596,7 +4213,11 @@ def test_yahara(): # Check spatial ref is set correctly fSRS = y_layer.GetSpatialRef() assert fSRS is not None - assert fSRS.ExportToWkt() == "PROJCS[\"unnamed\",GEOGCS[\"unknown\",DATUM[\"unnamed\",SPHEROID[\"Spheroid\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]]],PROJECTION[\"Albers_Conic_Equal_Area\"],PARAMETER[\"latitude_of_center\",23],PARAMETER[\"longitude_of_center\",-96],PARAMETER[\"standard_parallel_1\",29.5],PARAMETER[\"standard_parallel_2\",45.5],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]" + assert ( + fSRS.ExportToWkt() + == 'PROJCS["unnamed",GEOGCS["unknown",DATUM["unnamed",SPHEROID["Spheroid",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",23],PARAMETER["longitude_of_center",-96],PARAMETER["standard_parallel_1",29.5],PARAMETER["standard_parallel_2",45.5],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' + ) + def test_states_full_layer(): @@ -3631,12 +4252,16 @@ def test_states_full_layer(): assert second.GetFieldAsString("STATE_FIPS") == "30" assert second.GetFieldAsString("STATE_ABBR") == "MT" + ############################################################################### # simple geometry writing tests + def test_point_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/point_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/point_write_test.json", gdal.OF_VECTOR + ) assert src is not None gdal.VectorTranslate("tmp/test_point_write.nc", src, format="netCDF") @@ -3678,9 +4303,12 @@ def test_point_write(): assert fWkt == "POINT (2 -2)" assert fnam == "FishingSpot4" + def test_point3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None gdal.VectorTranslate("tmp/test_point3D_write.nc", src, format="netCDF") @@ -3722,6 +4350,7 @@ def test_point3D_write(): assert fWkt == "POINT (2 -2 1.5)" assert fnam == "FishingSpot4" + def test_line_write(): src = gdal.OpenEx("data/netcdf-sg/write-tests/line_write_test.json", gdal.OF_VECTOR) @@ -3760,9 +4389,12 @@ def test_line_write(): assert fWkt == "LINESTRING (9 -9,10 -10,-1 1)" assert fnam == "seg3" + def test_line3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/line3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/line3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3798,9 +4430,12 @@ def test_line3D_write(): assert fWkt == "LINESTRING (7 -11 -7,-11 7 11,-6 1945 1918)" assert fnam == "path3" + def test_polygon_no_ir_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/polygon_no_ir_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3835,7 +4470,9 @@ def test_polygon_no_ir_write(): def test_polygon_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/polygon_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3864,7 +4501,10 @@ def test_polygon_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)))" + ) assert fnam == "Square_in_Square" feat = layer.GetNextFeature() @@ -3874,9 +4514,12 @@ def test_polygon_write(): assert fWkt == "MULTIPOLYGON (((0 0,-1 0,-1 -1,0 0)))" assert fnam == "Triangle_Flipped" + def test_polygon3D_no_ir_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon3D_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/polygon3D_no_ir_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3908,9 +4551,12 @@ def test_polygon3D_no_ir_write(): assert fWkt == "POLYGON ((3 0 -1,4 0 -2,4 1 0,3 1 -2,3 0 -1))" assert fid == 1 + def test_polygon3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/polygon3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3939,7 +4585,10 @@ def test_polygon3D_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 1,3.75 0.25 1,3.75 0.5 1,3.5 0.5 1,3.5 0.25 1)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 1,3.75 0.25 1,3.75 0.5 1,3.5 0.5 1,3.5 0.25 1)))" + ) assert fnam == "Prismthing" feat = layer.GetNextFeature() @@ -3949,9 +4598,12 @@ def test_polygon3D_write(): assert fWkt == "MULTIPOLYGON (((0 0 0,-1 0 1,-1 -1 2,0 0 3)))" assert fnam == "Trianglyflipped" + def test_multipoint_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipoint_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipoint_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -3987,9 +4639,12 @@ def test_multipoint_write(): assert fWkt == "MULTIPOINT (9 -9,10 -10,-2 2)" assert fnam == "Peaks3" + def test_multipoint3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipoint3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipoint3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4018,9 +4673,12 @@ def test_multipoint3D_write(): assert fWkt == "MULTIPOINT (7 -2 1,4 3 2,8 -8 3)" assert fnam == "site2" + def test_multiline_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multiline_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multiline_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4056,9 +4714,12 @@ def test_multiline_write(): assert fWkt == "MULTILINESTRING ((0 1,1 0),(2 0,-2 0))" assert fnam == "not_fresh_river" + def test_multiline3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multiline3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multiline3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4087,9 +4748,12 @@ def test_multiline3D_write(): assert fWkt == "MULTILINESTRING ((0 1 1,1 0 2),(2 0 1,-2 0 1))" assert fnam == "not_fresh_river" + def test_multipolygon_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4118,12 +4782,18 @@ def test_multipolygon_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)),((4 4,4 5,5 4,4 4)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)),((4 4,4 5,5 4,4 4)))" + ) assert fnam == "Square_in_Square_and_Triangle" + def test_multipolygon3D_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4144,7 +4814,10 @@ def test_multipolygon3D_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))" + assert ( + fWkt + == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))" + ) assert fnam == "Trianglies" # This second feature has an interior ring in it @@ -4152,7 +4825,10 @@ def test_multipolygon3D_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))" + ) assert fnam == "Prismy_and_Triangly" # This third feature is just a Polygon @@ -4163,9 +4839,12 @@ def test_multipolygon3D_write(): assert fWkt == "MULTIPOLYGON (((-2 0 -5,-2 1 -6,-1 1 -6,-2 0 -5)))" assert fnam == "Single_Triangly" + def test_multipolygon_with_no_ir_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4194,9 +4873,13 @@ def test_multipolygon_with_no_ir_write(): assert fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))" assert fnam == "DoubleTriangle" + def test_multipolygon3D_with_no_ir_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon3D_no_ir_write_test.json", + gdal.OF_VECTOR, + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4222,9 +4905,13 @@ def test_multipolygon3D_with_no_ir_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0 0,4 0 1,4 1 2,3 0 3)),((3 0 -1,4 1 -2,3 1 -3,3 0 -4)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0 0,4 0 1,4 1 2,3 0 3)),((3 0 -1,4 1 -2,3 1 -3,3 0 -4)))" + ) assert fnam == "DoubleTriangle" + def test_write_buffer_restrict_correctness(): # Tests whether or not having the write buffer restriction @@ -4233,7 +4920,12 @@ def test_write_buffer_restrict_correctness(): assert src is not None assert src.GetLayerCount() == 1 - gdal.VectorTranslate("tmp/Yahara_alb_4K_restrict.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096']) + gdal.VectorTranslate( + "tmp/Yahara_alb_4K_restrict.nc", + src, + format="netCDF", + layerCreationOptions=["BUFFER_SIZE=4096"], + ) gdal.VectorTranslate("tmp/Yahara_alb_default_buf.nc", src, format="netCDF") fk_ds = ogr.Open("tmp/Yahara_alb_4K_restrict.nc") @@ -4251,6 +4943,7 @@ def test_write_buffer_restrict_correctness(): dftgeo = dft.GetGeometryRef() assert lftgeo.Equal(dftgeo) + def test_write_nc_from_nc(): # Tests writing a netCDF file (of different name than source) out from another netCDF source file @@ -4290,16 +4983,24 @@ def test_write_nc_from_nc(): ft_wkt = ft_geo.ExportToWkt() assert ft_wkt == "MULTIPOINT (-7 7,-8 8,-9 9,-10 10)" + def test_multipolygon_with_no_ir_NC4_write(): # Almost identical to test_multipolygon_with_no_ir # except this time, it is writing an NC4 file - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 - gdal.VectorTranslate("tmp/multipolygon_no_ir_write_test.nc4", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4']) + gdal.VectorTranslate( + "tmp/multipolygon_no_ir_write_test.nc4", + src, + format="netCDF", + datasetCreationOptions=["FORMAT=NC4"], + ) nc_tsrc = ogr.Open("tmp/multipolygon_no_ir_write_test.nc4") assert src is not None @@ -4324,16 +5025,24 @@ def test_multipolygon_with_no_ir_NC4_write(): assert fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))" assert fnam == "DoubleTriangle" + def test_multipolygon3D_NC4C_write(): - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 # This test is identical to test_multipolygon3D_write # except it writes to NC4C - gdal.VectorTranslate("tmp/multipolygon3D_write_test.nc", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4C']) + gdal.VectorTranslate( + "tmp/multipolygon3D_write_test.nc", + src, + format="netCDF", + datasetCreationOptions=["FORMAT=NC4C"], + ) nc_tsrc = ogr.Open("tmp/multipolygon3D_write_test.nc") assert src is not None @@ -4350,7 +5059,10 @@ def test_multipolygon3D_NC4C_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))" + assert ( + fWkt + == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))" + ) assert fnam == "Trianglies" # This second feature has an interior ring in it @@ -4358,7 +5070,10 @@ def test_multipolygon3D_NC4C_write(): fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") - assert fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))" + assert ( + fWkt + == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))" + ) assert fnam == "Prismy_and_Triangly" # This third feature is just a Polygon @@ -4369,17 +5084,21 @@ def test_multipolygon3D_NC4C_write(): assert fWkt == "MULTIPOLYGON (((-2 0 -5,-2 1 -6,-1 1 -6,-2 0 -5)))" assert fnam == "Single_Triangly" + def test_netcdf_dimension_labels_with_null(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # Crashes with 4.1.3 of Ubuntu Precise - if gdaltest.netcdf_drv_version.startswith('4.0.') or gdaltest.netcdf_drv_version.startswith('4.1.'): - pytest.skip('Test crashes with this libnetcdf version') + if gdaltest.netcdf_drv_version.startswith( + "4.0." + ) or gdaltest.netcdf_drv_version.startswith("4.1."): + pytest.skip("Test crashes with this libnetcdf version") with gdaltest.error_handler(): - assert gdal.Open('data/netcdf/dimension_labels_with_null.nc') + assert gdal.Open("data/netcdf/dimension_labels_with_null.nc") + def test_write_multiple_layers_one_nc(): @@ -4387,13 +5106,17 @@ def test_write_multiple_layers_one_nc(): # each geometry container a layer # this also tests "update mode" for CF-1.8 - src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR + ) assert src is not None gdal.VectorTranslate("tmp/mlnc.nc", src, format="netCDF") - src = gdal.OpenEx("data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR + ) assert src is not None - gdal.VectorTranslate("tmp/mlnc.nc", src, format="netCDF", accessMode='update') + gdal.VectorTranslate("tmp/mlnc.nc", src, format="netCDF", accessMode="update") nc_tsrc = ogr.Open("tmp/mlnc.nc") assert nc_tsrc.GetLayerCount() == 2 @@ -4461,7 +5184,9 @@ def test_write_multiple_layers_one_nc_NC4(): src = gdal.OpenEx("tmp/mlnc.nc", gdal.OF_VECTOR) assert src is not None - gdal.VectorTranslate("tmp/mlnc4.nc4", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4']) + gdal.VectorTranslate( + "tmp/mlnc4.nc4", src, format="netCDF", datasetCreationOptions=["FORMAT=NC4"] + ) nc_tsrc = ogr.Open("tmp/mlnc4.nc4") assert nc_tsrc.GetLayerCount() == 2 @@ -4520,6 +5245,7 @@ def test_write_multiple_layers_one_nc_NC4(): assert fWkt == "POINT (2 -2 1.5)" assert fnam == "FishingSpot4" + def test_write_multiple_layers_one_nc_back_to_NC3(): # nearly identical to previous test except that @@ -4588,6 +5314,7 @@ def test_write_multiple_layers_one_nc_back_to_NC3(): assert fWkt == "POINT (2 -2 1.5)" assert fnam == "FishingSpot4" + def test_SG_NC3_field_write(): # Tests all the NC3 field writing capabilities with # buffering. @@ -4623,6 +5350,7 @@ def test_SG_NC3_field_write(): assert fflt == 1.5 assert fdbl == 99.5 + def test_states_full_layer_buffer_restrict_correctness(): # Tests whether or not having the write buffer restriction # Writes correct data. @@ -4633,7 +5361,12 @@ def test_states_full_layer_buffer_restrict_correctness(): assert src is not None assert src.GetLayerCount() == 1 - gdal.VectorTranslate("tmp/states_4K_restrict.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096']) + gdal.VectorTranslate( + "tmp/states_4K_restrict.nc", + src, + format="netCDF", + layerCreationOptions=["BUFFER_SIZE=4096"], + ) gdal.VectorTranslate("tmp/states_default_buf.nc", src, format="netCDF") fk_ds = ogr.Open("tmp/states_4K_restrict.nc") @@ -4651,9 +5384,12 @@ def test_states_full_layer_buffer_restrict_correctness(): dftgeo = dft.GetGeometryRef() assert lftgeo.Equal(dftgeo) + def test_empty_polygon_read_write(): # Tests writing features to a layer of empty polygons - src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_polygon_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/empty_polygon_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4671,9 +5407,12 @@ def test_empty_polygon_read_write(): assert second.GetFieldAsString("NAMES") == "Everywhere" assert second.GetGeometryRef().IsEmpty() + def test_empty_multiline_read_write(): # Tests writing features to a layer of empty polygons - src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_mline_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/empty_mline_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4691,9 +5430,12 @@ def test_empty_multiline_read_write(): assert second.GetFieldAsString("NAMES") == "Everywhere" assert second.GetGeometryRef().IsEmpty() + def test_empty_multipolygon_read_write(): # Tests writing features to a layer of empty polygons - src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_multipolygon_write_test.json", gdal.OF_VECTOR) + src = gdal.OpenEx( + "data/netcdf-sg/write-tests/empty_multipolygon_write_test.json", gdal.OF_VECTOR + ) assert src is not None assert src.GetLayerCount() == 1 @@ -4709,7 +5451,11 @@ def test_empty_multipolygon_read_write(): assert first.GetGeometryRef().IsEmpty() second = nc_layer.GetNextFeature() assert second.GetFieldAsString("NAMES") == "Somewhere" - assert second.GetGeometryRef().ExportToWkt() == "MULTIPOLYGON (((0 0,2 0,2 2,0 2,0 0)))" + assert ( + second.GetGeometryRef().ExportToWkt() + == "MULTIPOLYGON (((0 0,2 0,2 2,0 2,0 0)))" + ) + def test_states_full_layer_buffer_restrict_correctness_single_datum(): # Single datum regression test @@ -4718,7 +5464,12 @@ def test_states_full_layer_buffer_restrict_correctness_single_datum(): assert src is not None assert src.GetLayerCount() == 1 - gdal.VectorTranslate("tmp/states_4K_restrict_sd.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096', "GROUPLESS_WRITE_BACK=YES"]) + gdal.VectorTranslate( + "tmp/states_4K_restrict_sd.nc", + src, + format="netCDF", + layerCreationOptions=["BUFFER_SIZE=4096", "GROUPLESS_WRITE_BACK=YES"], + ) fk_ds = ogr.Open("tmp/states_4K_restrict_sd.nc") db_ds = ogr.Open("tmp/states_4K_restrict.nc") @@ -4734,6 +5485,7 @@ def test_states_full_layer_buffer_restrict_correctness_single_datum(): dftgeo = dft.GetGeometryRef() assert lftgeo.Equal(dftgeo) + def test_netcdf_uint16_netcdf4_without_fill(): if not gdaltest.netcdf_drv_has_nc4: @@ -4741,7 +5493,7 @@ def test_netcdf_uint16_netcdf4_without_fill(): # This dataset was created with nc_def_var_fill(cdfid, nZId, NC_NOFILL, NULL) # Check that we don't report a nodata value - ds = gdal.Open('data/netcdf/uint16_netcdf4_without_fill.nc') + ds = gdal.Open("data/netcdf/uint16_netcdf4_without_fill.nc") assert not ds.GetRasterBand(1).GetNoDataValue() @@ -4750,15 +5502,19 @@ def test_netcdf_sen3_sral_mwr_fake_standard_measurement(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', gdal.OF_RASTER) + ds = gdal.OpenEx( + "data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc", gdal.OF_RASTER + ) assert not ds - ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', gdal.OF_VECTOR) + ds = gdal.OpenEx( + "data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc", gdal.OF_VECTOR + ) assert ds assert ds.GetLayerCount() == 3 lyr = ds.GetLayer(0) - assert lyr.GetName() == 'sen3_sral_mwr_fake_standard_measurement_time_01' + assert lyr.GetName() == "sen3_sral_mwr_fake_standard_measurement_time_01" assert lyr.GetSpatialRef() is not None assert lyr.GetLayerDefn().GetFieldCount() == 5 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 @@ -4766,48 +5522,48 @@ def test_netcdf_sen3_sral_mwr_fake_standard_measurement(): assert lyr.TestCapability(ogr.OLCRandomWrite) == 0 assert lyr.GetFeatureCount() == 2 assert lyr.GetMetadata_Dict() == { - 'alt_01_comment': 'Altitude of satellite above the reference ellipsoid', - 'alt_01_long_name': 'altitude of the satellite : 1 Hz', - 'alt_01_standard_name': 'height_above_reference_ellipsoid', - 'alt_01_units': 'm', - 'orb_alt_rate_01_comment': 'The reference surface for the orbital altitude rate is the combined mean_sea_surface/geoid surface. It is used to compute the Doppler correction on the altimeter range', - 'orb_alt_rate_01_long_name': 'orbital altitude rate : 1 Hz', - 'orb_alt_rate_01_units': 'm/s', - 'surf_type_01_flag_meanings': 'ocean_or_semi_enclosed_sea enclosed_sea_or_lake continental_ice land', - 'surf_type_01_flag_values': '{0,1,2,3}', - 'surf_type_01_long_name': 'surface type : 1 Hz', - 'time_01_calendar': 'gregorian', - 'time_01_long_name': 'UTC: 1 Hz', - 'time_01_standard_name': 'time', - 'time_01_units': 'seconds since 2000-01-01 00:00:00.0', - 'total_electron_content_01_long_name': 'Altimeter-derived total electron content (TECU) : 1 Hz', - 'total_electron_content_01_units': 'count' + "alt_01_comment": "Altitude of satellite above the reference ellipsoid", + "alt_01_long_name": "altitude of the satellite : 1 Hz", + "alt_01_standard_name": "height_above_reference_ellipsoid", + "alt_01_units": "m", + "orb_alt_rate_01_comment": "The reference surface for the orbital altitude rate is the combined mean_sea_surface/geoid surface. It is used to compute the Doppler correction on the altimeter range", + "orb_alt_rate_01_long_name": "orbital altitude rate : 1 Hz", + "orb_alt_rate_01_units": "m/s", + "surf_type_01_flag_meanings": "ocean_or_semi_enclosed_sea enclosed_sea_or_lake continental_ice land", + "surf_type_01_flag_values": "{0,1,2,3}", + "surf_type_01_long_name": "surface type : 1 Hz", + "time_01_calendar": "gregorian", + "time_01_long_name": "UTC: 1 Hz", + "time_01_standard_name": "time", + "time_01_units": "seconds since 2000-01-01 00:00:00.0", + "total_electron_content_01_long_name": "Altimeter-derived total electron content (TECU) : 1 Hz", + "total_electron_content_01_units": "count", } - assert lyr.GetMetadataItem('alt_01_units') == 'm' + assert lyr.GetMetadataItem("alt_01_units") == "m" f = lyr.GetNextFeature() assert f.GetGeometryRef().GetX() == pytest.approx(2.234567, 1e-7) assert f.GetGeometryRef().GetY() == pytest.approx(49.234567, 1e-7) - assert f['time_01'] == 1.25 + assert f["time_01"] == 1.25 assert not f.IsFieldSet("surf_type_01") assert not f.IsFieldSet("orb_alt_rate_01") assert not f.IsFieldSet("total_electron_content_01") f = lyr.GetNextFeature() - assert f['time_01'] == 2.25 - assert f['surf_type_01'] == 1 - assert f['orb_alt_rate_01'] == 0.01 - assert f['total_electron_content_01'] == 10000000000.0 + assert f["time_01"] == 2.25 + assert f["surf_type_01"] == 1 + assert f["orb_alt_rate_01"] == 0.01 + assert f["total_electron_content_01"] == 10000000000.0 assert lyr.GetNextFeature() is None assert lyr.GetNextFeature() is None lyr.ResetReading() assert lyr.GetNextFeature() is not None - lyr.SetSpatialFilterRect(-50,-50,-50,-50) + lyr.SetSpatialFilterRect(-50, -50, -50, -50) lyr.ResetReading() assert lyr.GetNextFeature() is None assert lyr.GetFeatureCount() == 0 lyr.SetSpatialFilter(None) - lyr.SetAttributeFilter('0 = 1') + lyr.SetAttributeFilter("0 = 1") lyr.ResetReading() assert lyr.GetNextFeature() is None @@ -4816,11 +5572,11 @@ def test_netcdf_sen3_sral_mwr_fake_standard_measurement(): assert lyr.GetFeature(3) is None lyr = ds.GetLayer(1) - assert lyr.GetName() == 'sen3_sral_mwr_fake_standard_measurement_time_20_ku' + assert lyr.GetName() == "sen3_sral_mwr_fake_standard_measurement_time_20_ku" f = lyr.GetNextFeature() - assert not f.IsFieldSet('nb_stack_20_ku') + assert not f.IsFieldSet("nb_stack_20_ku") f = lyr.GetNextFeature() - assert f['nb_stack_20_ku'] == 1 + assert f["nb_stack_20_ku"] == 1 def test_netcdf_chunked_multiple(): @@ -4828,7 +5584,7 @@ def test_netcdf_chunked_multiple(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.Open('data/netcdf/byte_chunked_multiple.nc') + ds = gdal.Open("data/netcdf/byte_chunked_multiple.nc") assert ds.GetRasterBand(1).GetBlockSize() == [10, 10] assert ds.GetRasterBand(1).Checksum() == 4672 @@ -4838,22 +5594,22 @@ def test_netcdf_chunked_not_multiple(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.Open('data/netcdf/byte_chunked_not_multiple.nc') + ds = gdal.Open("data/netcdf/byte_chunked_not_multiple.nc") assert ds.GetRasterBand(1).GetBlockSize() == [15, 6] assert ds.GetRasterBand(1).Checksum() == 4672 def test_netcdf_create(): - ds = gdaltest.netcdf_drv.Create('tmp/test_create.nc', 2, 2) + ds = gdaltest.netcdf_drv.Create("tmp/test_create.nc", 2, 2) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) - ds.GetRasterBand(1).WriteRaster(0, 0, 2, 2, b'ABCD') + ds.GetRasterBand(1).WriteRaster(0, 0, 2, 2, b"ABCD") ds = None - ds = gdal.Open('tmp/test_create.nc') + ds = gdal.Open("tmp/test_create.nc") assert ds.GetGeoTransform() == pytest.approx([2, 0.1, 0, 49, 0, -0.1], rel=1e-10) - assert ds.GetRasterBand(1).ReadRaster() == b'ABCD' + assert ds.GetRasterBand(1).ReadRaster() == b"ABCD" ds = None - gdal.Unlink('tmp/test_create.nc') + gdal.Unlink("tmp/test_create.nc") def test_netcdf_sg1_8_max_variable_with_max_width_string_field_no_warning(): @@ -4867,7 +5623,7 @@ def test_netcdf_sg1_8_max_variable_with_max_width_string_field_no_warning(): assert ds assert ds.GetLayerCount() == 1 ds = None - gdal.Unlink('tmp/poly.nc') + gdal.Unlink("tmp/poly.nc") ############################################################################### @@ -4880,11 +5636,11 @@ def test_netcdf_hdf5_signature_not_at_beginning(): pytest.skip() # Works at least with since netCDF 4.7 - version = gdaltest.netcdf_drv_version.split('.') + version = gdaltest.netcdf_drv_version.split(".") if int(version[0]) * 100 + int(version[1]) < 407: pytest.skip() - ds = gdal.Open('data/netcdf/byte_hdf5_starting_at_offset_1024.nc') + ds = gdal.Open("data/netcdf/byte_hdf5_starting_at_offset_1024.nc") assert ds is not None @@ -4894,14 +5650,13 @@ def test_netcdf_hdf5_signature_not_at_beginning(): def test_netcdf_open_vsimem(): - if gdal.GetDriverByName('netCDF').GetMetadataItem('NETCDF_HAS_NETCDF_MEM') is None: - pytest.skip('NETCDF_HAS_NETCDF_MEM missing') + if gdal.GetDriverByName("netCDF").GetMetadataItem("NETCDF_HAS_NETCDF_MEM") is None: + pytest.skip("NETCDF_HAS_NETCDF_MEM missing") - gdal.FileFromMemBuffer('/vsimem/test.nc', - open('data/netcdf/trmm.nc', 'rb').read()) - ds = gdal.Open('/vsimem/test.nc') + gdal.FileFromMemBuffer("/vsimem/test.nc", open("data/netcdf/trmm.nc", "rb").read()) + ds = gdal.Open("/vsimem/test.nc") assert ds is not None - gdal.Unlink('/vsimem/test.nc') + gdal.Unlink("/vsimem/test.nc") assert ds.GetRasterBand(1).Checksum() == 14 @@ -4911,7 +5666,7 @@ def test_netcdf_open_vsimem(): def test_netcdf_open_coords_no_georef_indexing_variables(): - ds = gdal.Open('data/netcdf/sentinel5p_fake.nc') + ds = gdal.Open("data/netcdf/sentinel5p_fake.nc") assert ds is not None assert ds.GetGeoTransform(can_return_null=True) is None assert ds.GetMetadata("GEOLOCATION") is not None @@ -4923,45 +5678,33 @@ def test_netcdf_open_coords_no_georef_indexing_variables(): def test_netcdf_metadata_sentinel5(): - ds = gdal.Open('data/netcdf/fake_ISO_METADATA.nc') + ds = gdal.Open("data/netcdf/fake_ISO_METADATA.nc") assert ds is not None assert "json:ISO_METADATA" in ds.GetMetadataDomainList() md = ds.GetMetadata_List("json:ISO_METADATA") assert md is not None md = md[0] expected = { - "foo":"bar", - "bar":[ - "bar#1", - "bar#2" - ], - "grp":{ - "foo": 1.5 - }, - "array":[ - { - "foo":"bar1" - }, - { - "foo":"bar2" - } - ] + "foo": "bar", + "bar": ["bar#1", "bar#2"], + "grp": {"foo": 1.5}, + "array": [{"foo": "bar1"}, {"foo": "bar2"}], } assert json.loads(md) == expected - ds = gdal.OpenEx('data/netcdf/fake_ISO_METADATA.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/fake_ISO_METADATA.nc", gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() assert rg.GetGroupNames() is None - assert 'ISO_METADATA' in [attr.GetName() for attr in rg.GetAttributes()] - attr = rg.GetAttribute('ISO_METADATA') + assert "ISO_METADATA" in [attr.GetName() for attr in rg.GetAttributes()] + attr = rg.GetAttribute("ISO_METADATA") assert attr is not None assert attr.GetDataType().GetSubType() == gdal.GEDTST_JSON - j = gdal.MultiDimInfo('data/netcdf/fake_ISO_METADATA.nc') - assert 'attributes' in j - assert 'ISO_METADATA' in j['attributes'] - assert j['attributes']['ISO_METADATA'] == expected + j = gdal.MultiDimInfo("data/netcdf/fake_ISO_METADATA.nc") + assert "attributes" in j + assert "ISO_METADATA" in j["attributes"] + assert j["attributes"]["ISO_METADATA"] == expected ############################################################################### @@ -4970,7 +5713,7 @@ def test_netcdf_metadata_sentinel5(): def test_netcdf_modis_array(): - ds = gdal.Open('data/netcdf/MODIS_ARRAY.nc') + ds = gdal.Open("data/netcdf/MODIS_ARRAY.nc") assert ds.GetGeoTransform(can_return_null=True) is not None assert ds.GetSpatialRef() is not None @@ -4981,15 +5724,21 @@ def test_netcdf_modis_array(): def test_netcdf_polar_stereographic_variant_a(): - ds = gdal.Open('data/netcdf/polar_stero_variant_a.nc') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=stere +lat_0=90 +lon_0=-100 +k=0.93301243 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs' - - gdal.Translate('tmp/out.nc', ds, format='netCDF') - ds = gdal.Open('tmp/out.nc') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=stere +lat_0=90 +lon_0=-100 +k=0.93301243 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs' + ds = gdal.Open("data/netcdf/polar_stero_variant_a.nc") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=stere +lat_0=90 +lon_0=-100 +k=0.93301243 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs" + ) + + gdal.Translate("tmp/out.nc", ds, format="netCDF") + ds = gdal.Open("tmp/out.nc") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=stere +lat_0=90 +lon_0=-100 +k=0.93301243 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs" + ) ds = None - gdal.Unlink('tmp/out.nc') + gdal.Unlink("tmp/out.nc") ############################################################################### @@ -4998,15 +5747,21 @@ def test_netcdf_polar_stereographic_variant_a(): def test_netcdf_polar_stereographic_variant_b(): - ds = gdal.Open('data/netcdf/polar_stero_variant_b.nc') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=stere +lat_0=90 +lat_ts=59.9999376869521 +lon_0=-100 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs' - - gdal.Translate('tmp/out.nc', ds, format='netCDF') - ds = gdal.Open('tmp/out.nc') - assert ds.GetSpatialRef().ExportToProj4() == '+proj=stere +lat_0=90 +lat_ts=59.9999376869521 +lon_0=-100 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs' + ds = gdal.Open("data/netcdf/polar_stero_variant_b.nc") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=stere +lat_0=90 +lat_ts=59.9999376869521 +lon_0=-100 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs" + ) + + gdal.Translate("tmp/out.nc", ds, format="netCDF") + ds = gdal.Open("tmp/out.nc") + assert ( + ds.GetSpatialRef().ExportToProj4() + == "+proj=stere +lat_0=90 +lat_ts=59.9999376869521 +lon_0=-100 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs" + ) ds = None - gdal.Unlink('tmp/out.nc') + gdal.Unlink("tmp/out.nc") ############################################################################### @@ -5015,11 +5770,11 @@ def test_netcdf_polar_stereographic_variant_b(): def test_netcdf_open_userfaultfd(): - gdal.Unlink('tmp/test_netcdf_open_userfaultfd.zip') + gdal.Unlink("tmp/test_netcdf_open_userfaultfd.zip") - f = gdal.VSIFOpenL('/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc', 'wb') + f = gdal.VSIFOpenL("/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc", "wb") assert f - data = open('data/netcdf/byte_no_cf.nc', 'rb').read() + data = open("data/netcdf/byte_no_cf.nc", "rb").read() gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) @@ -5029,10 +5784,10 @@ def test_netcdf_open_userfaultfd(): ds = gdal.Open("/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc") success_expected = False - if 'CI' not in os.environ: - if sys.platform.startswith('linux'): + if "CI" not in os.environ: + if sys.platform.startswith("linux"): uname = os.uname() - version = uname.release.split('.') + version = uname.release.split(".") major = int(version[0]) minor = int(version[1]) if (major, minor) >= (5, 11): @@ -5040,10 +5795,9 @@ def test_netcdf_open_userfaultfd(): success_expected = True if ds and not success_expected: - print('/vsi access through userfaultfd succeeded') - - gdal.Unlink('tmp/test_netcdf_open_userfaultfd.zip') + print("/vsi access through userfaultfd succeeded") + gdal.Unlink("tmp/test_netcdf_open_userfaultfd.zip") def test_netcdf_write_4D(): @@ -5052,61 +5806,63 @@ def test_netcdf_write_4D(): # dimensions size_z = 2 size_time = 3 - src_ds = gdal.GetDriverByName('MEM').Create('', 4, 3, size_z * size_time) - src_ds.SetMetadataItem('NETCDF_DIM_EXTRA', '{time,Z}') + src_ds = gdal.GetDriverByName("MEM").Create("", 4, 3, size_z * size_time) + src_ds.SetMetadataItem("NETCDF_DIM_EXTRA", "{time,Z}") # 6 is NC_DOUBLE - src_ds.SetMetadataItem('NETCDF_DIM_Z_DEF', f"{{{size_z},6}}") - src_ds.SetMetadataItem('NETCDF_DIM_Z_VALUES', '{1.25,2.50}') - src_ds.SetMetadataItem('Z#axis', 'Z') - src_ds.SetMetadataItem('NETCDF_DIM_time_DEF', f"{{{size_time},6}}") - src_ds.SetMetadataItem('NETCDF_DIM_time_VALUES', '{1,2,3}') - src_ds.SetMetadataItem('time#axis', 'T') - src_ds.SetGeoTransform([2,1,0,49,0,-1]) + src_ds.SetMetadataItem("NETCDF_DIM_Z_DEF", f"{{{size_z},6}}") + src_ds.SetMetadataItem("NETCDF_DIM_Z_VALUES", "{1.25,2.50}") + src_ds.SetMetadataItem("Z#axis", "Z") + src_ds.SetMetadataItem("NETCDF_DIM_time_DEF", f"{{{size_time},6}}") + src_ds.SetMetadataItem("NETCDF_DIM_time_VALUES", "{1,2,3}") + src_ds.SetMetadataItem("time#axis", "T") + src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) # Create netCDF file - tmpfilename = 'tmp/test_netcdf_write_4D.nc' - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds) + tmpfilename = "tmp/test_netcdf_write_4D.nc" + gdal.GetDriverByName("netCDF").CreateCopy(tmpfilename, src_ds) # Checks ds = gdal.Open(tmpfilename) assert ds.RasterCount == size_z * size_time - assert ds.GetMetadataItem('NETCDF_DIM_EXTRA') == '{time,Z}' - assert ds.GetMetadataItem('NETCDF_DIM_Z_VALUES') == '{1.25,2.5}' - assert ds.GetMetadataItem('NETCDF_DIM_time_VALUES') == '{1,2,3}' + assert ds.GetMetadataItem("NETCDF_DIM_EXTRA") == "{time,Z}" + assert ds.GetMetadataItem("NETCDF_DIM_Z_VALUES") == "{1.25,2.5}" + assert ds.GetMetadataItem("NETCDF_DIM_time_VALUES") == "{1,2,3}" ds = None gdal.Unlink(tmpfilename) def test_netcdf__crs_wkt(): - ds = gdal.Open('data/netcdf/netcdf_crs_wkt.nc') + ds = gdal.Open("data/netcdf/netcdf_crs_wkt.nc") assert ds.GetSpatialRef().IsGeographic() def test_netcdf_default_metadata(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) - tmpfilename = 'tmp/test_netcdf_default_metadata.nc' - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds) + tmpfilename = "tmp/test_netcdf_default_metadata.nc" + gdal.GetDriverByName("netCDF").CreateCopy(tmpfilename, src_ds) ds = gdal.Open(tmpfilename) assert ds.GetMetadataItem("NC_GLOBAL#GDAL") == gdal.VersionInfo("") - assert 'GDAL CreateCopy' in ds.GetMetadataItem("NC_GLOBAL#history") - assert ds.GetMetadataItem("NC_GLOBAL#conventions").startswith('CF') + assert "GDAL CreateCopy" in ds.GetMetadataItem("NC_GLOBAL#history") + assert ds.GetMetadataItem("NC_GLOBAL#conventions").startswith("CF") ds = None gdal.Unlink(tmpfilename) def test_netcdf_default_metadata_with_existing_history_and_conventions(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_ds.SetMetadataItem("NC_GLOBAL#history", "past history") src_ds.SetMetadataItem("NC_GLOBAL#Conventions", "my conventions") - tmpfilename = 'tmp/test_netcdf_default_metadata_with_existing_history_and_conventions.nc' - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds) + tmpfilename = ( + "tmp/test_netcdf_default_metadata_with_existing_history_and_conventions.nc" + ) + gdal.GetDriverByName("netCDF").CreateCopy(tmpfilename, src_ds) ds = gdal.Open(tmpfilename) - assert 'GDAL CreateCopy' in ds.GetMetadataItem("NC_GLOBAL#history") - assert 'past history' in ds.GetMetadataItem("NC_GLOBAL#history") + assert "GDAL CreateCopy" in ds.GetMetadataItem("NC_GLOBAL#history") + assert "past history" in ds.GetMetadataItem("NC_GLOBAL#history") assert ds.GetMetadataItem("NC_GLOBAL#conventions") == "my conventions" ds = None gdal.Unlink(tmpfilename) @@ -5114,11 +5870,12 @@ def test_netcdf_default_metadata_with_existing_history_and_conventions(): def test_netcdf_default_metadata_disabled(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) - tmpfilename = 'tmp/test_netcdf_default_metadata_disabled.nc' - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds, - options = ['WRITE_GDAL_VERSION=NO', 'WRITE_GDAL_HISTORY=NO']) + tmpfilename = "tmp/test_netcdf_default_metadata_disabled.nc" + gdal.GetDriverByName("netCDF").CreateCopy( + tmpfilename, src_ds, options=["WRITE_GDAL_VERSION=NO", "WRITE_GDAL_HISTORY=NO"] + ) ds = gdal.Open(tmpfilename) assert ds.GetMetadataItem("NC_GLOBAL#GDAL") is None assert ds.GetMetadataItem("NC_GLOBAL#history") is None @@ -5128,44 +5885,51 @@ def test_netcdf_default_metadata_disabled(): def test_netcdf_update_metadata(): - tmpfilename = 'tmp/test_netcdf_update_metadata.nc' - ds = gdal.GetDriverByName('netCDF').Create(tmpfilename, 2, 2) - ds.GetRasterBand(1).SetMetadata({'foo': 'bar'}) - ds.SetMetadata({'NC_GLOBAL#bar': 'baz', - 'another_item': 'some_value', - 'bla#ignored': 'ignored'}) + tmpfilename = "tmp/test_netcdf_update_metadata.nc" + ds = gdal.GetDriverByName("netCDF").Create(tmpfilename, 2, 2) + ds.GetRasterBand(1).SetMetadata({"foo": "bar"}) + ds.SetMetadata( + {"NC_GLOBAL#bar": "baz", "another_item": "some_value", "bla#ignored": "ignored"} + ) ds = None ds = gdal.Open(tmpfilename) - assert ds.GetRasterBand(1).GetMetadataItem('foo') == 'bar' - assert ds.GetMetadataItem('NC_GLOBAL#bar') == 'baz' - assert ds.GetMetadataItem('NC_GLOBAL#GDAL_another_item') == 'some_value' - assert ds.GetMetadataItem('bla#ignored') is None + assert ds.GetRasterBand(1).GetMetadataItem("foo") == "bar" + assert ds.GetMetadataItem("NC_GLOBAL#bar") == "baz" + assert ds.GetMetadataItem("NC_GLOBAL#GDAL_another_item") == "some_value" + assert ds.GetMetadataItem("bla#ignored") is None ds = None gdal.Unlink(tmpfilename) def test_netcdf_read_gmt_file(): - """ Test reading a GMT generated file that doesn't completely follow - netCDF CF conventions regarding axis naming """ + """Test reading a GMT generated file that doesn't completely follow + netCDF CF conventions regarding axis naming""" - ds = gdal.Open('data/netcdf/gmt_file.nc') + ds = gdal.Open("data/netcdf/gmt_file.nc") gt = ds.GetGeoTransform() - assert gt == pytest.approx((-34.6671666666667, 0.001, 0.0, 35.58483333333329, 0.0, -0.001)), gt + assert gt == pytest.approx( + (-34.6671666666667, 0.001, 0.0, 35.58483333333329, 0.0, -0.001) + ), gt ############################################################################### + def test_netcdf_read_int64(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.Open('data/netcdf/int64.nc') + ds = gdal.Open("data/netcdf/int64.nc") assert ds.GetRasterBand(1).DataType == gdal.GDT_Int64 - assert struct.unpack('q' * 4, ds.ReadRaster()) == (10000000001, 1, - -10000000000, 10000000000) + assert struct.unpack("q" * 4, ds.ReadRaster()) == ( + 10000000001, + 1, + -10000000000, + 10000000000, + ) ############################################################################### @@ -5176,14 +5940,19 @@ def test_netcdf_write_int64(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - src_ds = gdal.Open('data/netcdf/int64.nc') - gdaltest.netcdf_drv.CreateCopy('tmp/int64.nc', src_ds) - ds = gdal.Open('tmp/int64.nc') + src_ds = gdal.Open("data/netcdf/int64.nc") + gdaltest.netcdf_drv.CreateCopy("tmp/int64.nc", src_ds) + ds = gdal.Open("tmp/int64.nc") assert ds.GetRasterBand(1).DataType == gdal.GDT_Int64 - assert struct.unpack('q' * 4, ds.ReadRaster()) == (10000000001, 1, - -10000000000, 10000000000) + assert struct.unpack("q" * 4, ds.ReadRaster()) == ( + 10000000001, + 1, + -10000000000, + 10000000000, + ) ds = None - os.unlink('tmp/int64.nc') + os.unlink("tmp/int64.nc") + ############################################################################### @@ -5193,10 +5962,9 @@ def test_netcdf_read_uint64(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - ds = gdal.Open('data/netcdf/uint64.nc') + ds = gdal.Open("data/netcdf/uint64.nc") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt64 - assert struct.unpack('Q' * 4, ds.ReadRaster()) == (10000000001, 1, - 0, 10000000000) + assert struct.unpack("Q" * 4, ds.ReadRaster()) == (10000000001, 1, 0, 10000000000) ############################################################################### @@ -5207,14 +5975,13 @@ def test_netcdf_write_uint64(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - src_ds = gdal.Open('data/netcdf/uint64.nc') - gdaltest.netcdf_drv.CreateCopy('tmp/uint64.nc', src_ds) - ds = gdal.Open('tmp/uint64.nc') + src_ds = gdal.Open("data/netcdf/uint64.nc") + gdaltest.netcdf_drv.CreateCopy("tmp/uint64.nc", src_ds) + ds = gdal.Open("tmp/uint64.nc") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt64 - assert struct.unpack('Q' * 4, ds.ReadRaster()) == (10000000001, 1, - 0, 10000000000) + assert struct.unpack("Q" * 4, ds.ReadRaster()) == (10000000001, 1, 0, 10000000000) ds = None - os.unlink('tmp/uint64.nc') + os.unlink("tmp/uint64.nc") ############################################################################### @@ -5225,24 +5992,24 @@ def test_netcdf_write_uint64_nodata(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - filename = 'tmp/test_tiff_write_uint64_nodata.nc' - ds = gdal.GetDriverByName('netCDF').Create(filename, 1, 1, 1, gdal.GDT_UInt64) - val = (1 << 64)-1 + filename = "tmp/test_tiff_write_uint64_nodata.nc" + ds = gdal.GetDriverByName("netCDF").Create(filename, 1, 1, 1, gdal.GDT_UInt64) + val = (1 << 64) - 1 assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None ds = None - filename_copy = 'tmp/test_tiff_write_uint64_nodata_filename_copy.nc' + filename_copy = "tmp/test_tiff_write_uint64_nodata_filename_copy.nc" ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == val - ds = gdal.GetDriverByName('netCDF').CreateCopy(filename_copy, ds) + ds = gdal.GetDriverByName("netCDF").CreateCopy(filename_copy, ds) ds = None ds = gdal.Open(filename_copy) assert ds.GetRasterBand(1).GetNoDataValue() == val ds = None - gdal.GetDriverByName('netCDF').Delete(filename) - gdal.GetDriverByName('netCDF').Delete(filename_copy) + gdal.GetDriverByName("netCDF").Delete(filename) + gdal.GetDriverByName("netCDF").Delete(filename_copy) ############################################################################### @@ -5253,24 +6020,24 @@ def test_netcdf_write_int64_nodata(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() - filename = 'tmp/test_tiff_write_int64_nodata.nc' - ds = gdal.GetDriverByName('netCDF').Create(filename, 1, 1, 1, gdal.GDT_Int64) + filename = "tmp/test_tiff_write_int64_nodata.nc" + ds = gdal.GetDriverByName("netCDF").Create(filename, 1, 1, 1, gdal.GDT_Int64) val = -(1 << 63) assert ds.GetRasterBand(1).SetNoDataValue(val) == gdal.CE_None ds = None - filename_copy = 'tmp/test_tiff_write_int64_nodata_filename_copy.nc' + filename_copy = "tmp/test_tiff_write_int64_nodata_filename_copy.nc" ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == val - ds = gdal.GetDriverByName('netCDF').CreateCopy(filename_copy, ds) + ds = gdal.GetDriverByName("netCDF").CreateCopy(filename_copy, ds) ds = None ds = gdal.Open(filename_copy) assert ds.GetRasterBand(1).GetNoDataValue() == val ds = None - gdal.GetDriverByName('netCDF').Delete(filename) - gdal.GetDriverByName('netCDF').Delete(filename_copy) + gdal.GetDriverByName("netCDF").Delete(filename) + gdal.GetDriverByName("netCDF").Delete(filename_copy) ############################################################################### @@ -5278,12 +6045,12 @@ def test_netcdf_write_int64_nodata(): def test_netcdf_read_geogcrs_component_names(): - ds = gdal.Open('data/netcdf/geogcrs_component_names.nc') + ds = gdal.Open("data/netcdf/geogcrs_component_names.nc") srs = ds.GetSpatialRef() - assert srs.GetAttrValue('GEOGCS') == 'WGS 84' - assert srs.GetAttrValue('GEOGCS|DATUM') == 'WGS_1984' - assert srs.GetAttrValue('GEOGCS|DATUM|SPHEROID') == 'WGS 84' - assert srs.GetAttrValue('GEOGCS|PRIMEM') == 'Greenwich' + assert srs.GetAttrValue("GEOGCS") == "WGS 84" + assert srs.GetAttrValue("GEOGCS|DATUM") == "WGS_1984" + assert srs.GetAttrValue("GEOGCS|DATUM|SPHEROID") == "WGS 84" + assert srs.GetAttrValue("GEOGCS|PRIMEM") == "Greenwich" ############################################################################### @@ -5291,19 +6058,21 @@ def test_netcdf_read_geogcrs_component_names(): def test_netcdf_stats(): - src_ds = gdal.Open('data/byte.tif') - filename = 'tmp/test_netcdf_stats.nc' - gdal.GetDriverByName('netCDF').CreateCopy(filename, src_ds) + src_ds = gdal.Open("data/byte.tif") + filename = "tmp/test_netcdf_stats.nc" + gdal.GetDriverByName("netCDF").CreateCopy(filename, src_ds) ds = gdal.Open(filename) gdal.ErrorReset() - assert ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx([74.0, 255.0, 126.765, 22.928470838675658]) - assert gdal.GetLastErrorMsg() == '' + assert ds.GetRasterBand(1).ComputeStatistics(False) == pytest.approx( + [74.0, 255.0, 126.765, 22.928470838675658] + ) + assert gdal.GetLastErrorMsg() == "" ds = None - assert gdal.VSIStatL(filename + '.aux.xml') is not None + assert gdal.VSIStatL(filename + ".aux.xml") is not None ds = gdal.Open(filename) - assert float(ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM')) == 74 + assert float(ds.GetRasterBand(1).GetMetadataItem("STATISTICS_MINIMUM")) == 74 ds = None - gdal.GetDriverByName('netCDF').Delete(filename) + gdal.GetDriverByName("netCDF").Delete(filename) def test_clean_tmp(): diff --git a/autotest/gdrivers/netcdf_cf.py b/autotest/gdrivers/netcdf_cf.py index 28a6709e0bd4..6464c5e09564 100755 --- a/autotest/gdrivers/netcdf_cf.py +++ b/autotest/gdrivers/netcdf_cf.py @@ -29,18 +29,19 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import os import imp # for netcdf_cf_setup() -from gdrivers.netcdf import netcdf_setup, netcdf_test_copy # noqa -netcdf_setup; # to please pyflakes -from osgeo import gdal -from osgeo import osr +import os +from gdrivers.netcdf import netcdf_setup, netcdf_test_copy # noqa +netcdf_setup import gdaltest import pytest -pytestmark = pytest.mark.require_driver('netCDF') +# to please pyflakes +from osgeo import gdal, osr + +pytestmark = pytest.mark.require_driver("netCDF") ############################################################################### # Netcdf CF compliance Functions @@ -55,160 +56,196 @@ def netcdf_cf_setup(): # global vars gdaltest.netcdf_cf_method = None gdaltest.netcdf_cf_files = None - gdaltest.netcdf_cf_check_error = '' + gdaltest.netcdf_cf_check_error = "" # if netcdf is not supported, skip detection if gdaltest.netcdf_drv is None: pytest.skip() # skip if on windows - if os.name != 'posix': - pytest.skip('NOTICE: will skip CF checks because OS is not posix!') + if os.name != "posix": + pytest.skip("NOTICE: will skip CF checks because OS is not posix!") # try local method cdms2_installed = False try: - imp.find_module('cdms2') + imp.find_module("cdms2") cdms2_installed = True except ImportError: - print('NOTICE: cdms2 not installed!') - print(' see installation notes at http://pypi.python.org/pypi/cfchecker') + print("NOTICE: cdms2 not installed!") + print(" see installation notes at http://pypi.python.org/pypi/cfchecker") if cdms2_installed: - xml_dir = './data/netcdf_cf_xml' - tmp_dir = './tmp/cache' + xml_dir = "./data/netcdf_cf_xml" + tmp_dir = "./tmp/cache" files = dict() - files['a'] = xml_dir + '/area-type-table.xml' - files['s'] = tmp_dir + '/cf-standard-name-table-v18.xml' + files["a"] = xml_dir + "/area-type-table.xml" + files["s"] = tmp_dir + "/cf-standard-name-table-v18.xml" # either find udunits path in UDUNITS_PATH, or based on location of udunits app, or copy all .xml files to data # opt_u = '/home/soft/share/udunits/udunits2.xml' - files['u'] = xml_dir + '/udunits2.xml' + files["u"] = xml_dir + "/udunits2.xml" # look for xml files - if not (os.path.exists(files['a']) and os.path.exists(files['s']) and os.path.exists(files['u'])): - print('NOTICE: cdms2 installed, but necessary xml files are not found!') - print(' the following files must exist:') - print(' ' + xml_dir + '/area-type-table.xml from http://cf-pcmdi.llnl.gov/documents/cf-standard-names/area-type-table/1/area-type-table.xml') - print(' ' + tmp_dir + '/cf-standard-name-table-v18.xml - http://cf-pcmdi.llnl.gov/documents/cf-standard-names/standard-name-table/18/cf-standard-name-table.xml') - print(' ' + xml_dir + '/udunits2*.xml from a UDUNITS2 install') + if not ( + os.path.exists(files["a"]) + and os.path.exists(files["s"]) + and os.path.exists(files["u"]) + ): + print("NOTICE: cdms2 installed, but necessary xml files are not found!") + print(" the following files must exist:") + print( + " " + + xml_dir + + "/area-type-table.xml from http://cf-pcmdi.llnl.gov/documents/cf-standard-names/area-type-table/1/area-type-table.xml" + ) + print( + " " + + tmp_dir + + "/cf-standard-name-table-v18.xml - http://cf-pcmdi.llnl.gov/documents/cf-standard-names/standard-name-table/18/cf-standard-name-table.xml" + ) + print(" " + xml_dir + "/udunits2*.xml from a UDUNITS2 install") # try to get cf-standard-name-table - if not os.path.exists(files['s']): + if not os.path.exists(files["s"]): # print ' downloading cf-standard-name-table.xml (v18) from http://cf-pcmdi.llnl.gov ...' - if not gdaltest.download_file('http://cf-pcmdi.llnl.gov/documents/cf-standard-names/standard-name-table/18/cf-standard-name-table.xml', - 'cf-standard-name-table-v18.xml'): - print(' Failed to download, please get it and try again.') - - if os.path.exists(files['a']) and os.path.exists(files['s']) and os.path.exists(files['u']): - gdaltest.netcdf_cf_method = 'local' + if not gdaltest.download_file( + "http://cf-pcmdi.llnl.gov/documents/cf-standard-names/standard-name-table/18/cf-standard-name-table.xml", + "cf-standard-name-table-v18.xml", + ): + print(" Failed to download, please get it and try again.") + + if ( + os.path.exists(files["a"]) + and os.path.exists(files["s"]) + and os.path.exists(files["u"]) + ): + gdaltest.netcdf_cf_method = "local" gdaltest.netcdf_cf_files = files - print('NOTICE: netcdf CF compliance checks: using local checker script') + print("NOTICE: netcdf CF compliance checks: using local checker script") return # skip http method if GDAL_DOWNLOAD_TEST_DATA and GDAL_RUN_SLOW_TESTS are not defined if not gdaltest.download_test_data(): - print('NOTICE: skipping netcdf CF compliance checks') - print('to enable remote http checker script, define GDAL_DOWNLOAD_TEST_DATA=YES') + print("NOTICE: skipping netcdf CF compliance checks") + print( + "to enable remote http checker script, define GDAL_DOWNLOAD_TEST_DATA=YES" + ) return if not gdaltest.run_slow_tests(): - print('NOTICE: skipping netcdf CF compliance checks') + print("NOTICE: skipping netcdf CF compliance checks") return # http method with curl, should use python module but easier for now success = False try: - gdaltest.runexternal_out_and_err('curl') + gdaltest.runexternal_out_and_err("curl") except OSError: - print('no curl executable') + print("no curl executable") else: # make sure script is responding handle = gdaltest.gdalurlopen("http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl") if handle is not None: success = True else: - print('script not responding') + print("script not responding") if success: - gdaltest.netcdf_cf_method = 'http' - print('NOTICE: netcdf CF compliance checks: using remote HTTP ' - 'checker script, consider installing cdms2 locally') + gdaltest.netcdf_cf_method = "http" + print( + "NOTICE: netcdf CF compliance checks: using remote HTTP " + "checker script, consider installing cdms2 locally" + ) return if gdaltest.netcdf_cf_method is None: - print('NOTICE: skipping netcdf CF compliance checks') + print("NOTICE: skipping netcdf CF compliance checks") ############################################################################### # build a command used to check ifile -def netcdf_cf_get_command(ifile, version='auto'): +def netcdf_cf_get_command(ifile, version="auto"): - command = '' + command = "" # fetch method obtained previously method = gdaltest.netcdf_cf_method if method is not None: - if method == 'local': - command = './netcdf_cfchecks.py -a ' + gdaltest.netcdf_cf_files['a'] \ - + ' -s ' + gdaltest.netcdf_cf_files['s'] \ - + ' -u ' + gdaltest.netcdf_cf_files['u'] \ - + ' -v ' + version + ' ' + ifile - elif method == 'http': + if method == "local": + command = ( + "./netcdf_cfchecks.py -a " + + gdaltest.netcdf_cf_files["a"] + + " -s " + + gdaltest.netcdf_cf_files["s"] + + " -u " + + gdaltest.netcdf_cf_files["u"] + + " -v " + + version + + " " + + ifile + ) + elif method == "http": # command = shlex.split( 'curl --form cfversion="1.5" --form upload=@' + ifile + ' --form submit=\"Check file\" "http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl"' ) # switch to 1.5 as driver now supports, and auto when it becomes available - version = '1.5' - command = 'curl --form cfversion=' + version + ' --form upload=@' + ifile + ' --form submit=\"Check file\" "http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl"' + version = "1.5" + command = ( + "curl --form cfversion=" + + version + + " --form upload=@" + + ifile + + ' --form submit="Check file" "http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl"' + ) return command ############################################################################### # Check a file for CF compliance -def netcdf_cf_check_file(ifile, version='auto', silent=True): +def netcdf_cf_check_file(ifile, version="auto", silent=True): # pylint: disable=unused-argument - gdaltest.netcdf_cf_check_error = '' + gdaltest.netcdf_cf_check_error = "" if not os.path.exists(ifile): pytest.skip() - output_all = '' + output_all = "" - command = netcdf_cf_get_command(ifile, version='auto') - if command is None or command == '': - pytest.skip('no suitable method found, skipping') + command = netcdf_cf_get_command(ifile, version="auto") + if command is None or command == "": + pytest.skip("no suitable method found, skipping") try: - if gdaltest.netcdf_cf_method == 'http': - print('calling ' + command) + if gdaltest.netcdf_cf_method == "http": + print("calling " + command) (ret, err) = gdaltest.runexternal_out_and_err(command) except OSError: - pytest.fail('ERROR with command - ' + command) + pytest.fail("ERROR with command - " + command) # There should be a ERRORS detected summary - if 'ERRORS detected' not in ret: + if "ERRORS detected" not in ret: print(err) - pytest.fail('ERROR with command - ' + command) + pytest.fail("ERROR with command - " + command) output_all = ret - output_err = '' - output_warn = '' + output_err = "" + output_warn = "" for line in output_all.splitlines(): # optimize this with regex - if 'ERROR' in line and 'ERRORS' not in line: - output_err = output_err + '\n' + line - elif 'WARNING' in line and 'WARNINGS' not in line: - output_warn = output_warn + '\n' + line + if "ERROR" in line and "ERRORS" not in line: + output_err = output_err + "\n" + line + elif "WARNING" in line and "WARNINGS" not in line: + output_warn = output_warn + "\n" + line - result = 'success' + result = "success" - if output_err != '': - result = 'fail' - if output_err != '': + if output_err != "": + result = "fail" + if output_err != "": gdaltest.netcdf_cf_check_error += output_err.strip() if not silent: - print('=> CF check ERRORS for file ' + ifile + ' : ' + output_err) + print("=> CF check ERRORS for file " + ifile + " : " + output_err) - if output_warn != '': + if output_warn != "": if not silent: - print('CF check WARNINGS for file ' + ifile + ' : ' + output_warn) + print("CF check WARNINGS for file " + ifile + " : " + output_warn) return result @@ -229,99 +266,181 @@ def netcdf_cf_check_file(ifile, version='auto', silent=True): # 5: List of required coordinate variable standard name attributes netcdf_cfproj_tuples = [ - ("AEA", "Albers Equal Area", "EPSG:3577", "albers_conical_equal_area", - ['standard_parallel', 'longitude_of_central_meridian', - 'latitude_of_projection_origin', 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("AZE", "Azimuthal Equidistant", + ( + "AEA", + "Albers Equal Area", + "EPSG:3577", + "albers_conical_equal_area", + [ + "standard_parallel", + "longitude_of_central_meridian", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "AZE", + "Azimuthal Equidistant", # Didn't have EPSG suitable for AU "+proj=aeqd +lat_0=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "azimuthal_equidistant", - ['longitude_of_projection_origin', - 'latitude_of_projection_origin', 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("LAZEA", "Lambert azimuthal equal area", + [ + "longitude_of_projection_origin", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "LAZEA", + "Lambert azimuthal equal area", # Specify proj4 since no appropriate LAZEA for AU. # "+proj=laea +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs", "+proj=laea +lat_0=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "lambert_azimuthal_equal_area", - ['longitude_of_projection_origin', - 'latitude_of_projection_origin', 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("LC_2SP", "Lambert conformal", "EPSG:3112", "lambert_conformal_conic", - ['standard_parallel', - 'longitude_of_central_meridian', - 'latitude_of_projection_origin', 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), + [ + "longitude_of_projection_origin", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "LC_2SP", + "Lambert conformal", + "EPSG:3112", + "lambert_conformal_conic", + [ + "standard_parallel", + "longitude_of_central_meridian", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), # TODO: Test LCC with 1SP - ("LCEA", "Lambert Cylindrical Equal Area", + ( + "LCEA", + "Lambert Cylindrical Equal Area", "+proj=cea +lat_ts=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "lambert_cylindrical_equal_area", - ['longitude_of_central_meridian', - 'standard_parallel', # TODO: OR 'scale_factor_at_projection_origin' - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), + [ + "longitude_of_central_meridian", + "standard_parallel", # TODO: OR 'scale_factor_at_projection_origin' + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), # 2 entries for Mercator, since attribs different for 1SP or 2SP - ("M-1SP", "Mercator", + ( + "M-1SP", + "Mercator", "+proj=merc +lon_0=145 +k_0=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "mercator", - ['longitude_of_projection_origin', - 'scale_factor_at_projection_origin', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), + [ + "longitude_of_projection_origin", + "scale_factor_at_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), # Commented out as it seems GDAL itself's support of Mercator with 2SP # is a bit dodgy - ("M-2SP", "Mercator", + ( + "M-2SP", + "Mercator", "+proj=merc +lat_ts=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", # Trying with full 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_2SP"], PARAMETER["central_meridian",146], PARAMETER["standard_parallel_1",-37], PARAMETER["latitude_of_origin",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""", "mercator", - ['longitude_of_projection_origin', - 'standard_parallel', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("Ortho", "Orthographic", + [ + "longitude_of_projection_origin", + "standard_parallel", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "Ortho", + "Orthographic", "+proj=ortho +lat_0=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "orthographic", - ['longitude_of_projection_origin', - 'latitude_of_projection_origin', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), + [ + "longitude_of_projection_origin", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), # Seems GDAL may have problems with Polar stereographic, as it # considers these "local coordinate systems" - ("PSt", "Polar stereographic", + ( + "PSt", + "Polar stereographic", "+proj=stere +lat_ts=-37 +lat_0=-90 +lon_0=145 +k_0=1.0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", "polar_stereographic", - ['straight_vertical_longitude_from_pole', - 'latitude_of_projection_origin', - 'standard_parallel', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("St", "Stereographic", + [ + "straight_vertical_longitude_from_pole", + "latitude_of_projection_origin", + "standard_parallel", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "St", + "Stereographic", "+proj=stere +lat_0=-37 +lon_0=145 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", # '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["Stereographic"], PARAMETER["latitude_of_origin",-37.5], PARAMETER["central_meridian",145], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]', "stereographic", - ['longitude_of_projection_origin', - 'latitude_of_projection_origin', - 'scale_factor_at_projection_origin', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), + [ + "longitude_of_projection_origin", + "latitude_of_projection_origin", + "scale_factor_at_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), # Note: Rotated Pole not in this list, as seems not GDAL-supported - ("TM", "Transverse Mercator", "EPSG:32655", # UTM Zone 55N + ( + "TM", + "Transverse Mercator", + "EPSG:32655", # UTM Zone 55N "transverse_mercator", - ['scale_factor_at_central_meridian', - 'longitude_of_central_meridian', - 'latitude_of_projection_origin', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']), - ("GEOS", "Geostationary_satellite", + [ + "scale_factor_at_central_meridian", + "longitude_of_central_meridian", + "latitude_of_projection_origin", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), + ( + "GEOS", + "Geostationary_satellite", "+proj=geos +h=35785831 +lon_0=145 +datum=WGS84 +sweep=y +units=m", "geostationary", - ['longitude_of_projection_origin', - 'perspective_point_height', - 'sweep_angle_axis', - 'false_easting', 'false_northing'], - ['projection_x_coordinate', 'projection_y_coordinate']) + [ + "longitude_of_projection_origin", + "perspective_point_height", + "sweep_angle_axis", + "false_easting", + "false_northing", + ], + ["projection_x_coordinate", "projection_y_coordinate"], + ), ] # By default, we will use GeoTIFF as the 'intermediate' raster format @@ -333,20 +452,23 @@ def netcdf_cf_check_file(ifile, version='auto', silent=True): netcdf_cfproj_def_int_format = "GTiff" -netcdf_cfproj_int_fmt_maps = { - "M-2SP": 'HFA' -} +netcdf_cfproj_int_fmt_maps = {"M-2SP": "HFA"} -netcdf_cfproj_format_fnames = {"HFA": "img", "GTiff": "tif", "NITF": "nitf", - "ERS": "ers"} +netcdf_cfproj_format_fnames = { + "HFA": "img", + "GTiff": "tif", + "NITF": "nitf", + "ERS": "ers", +} ############################################################################### # Check support for given projection tuple definitions # For each projection, warp the original file and then create a netcdf -def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, - resFilename): +def netcdf_cfproj_testcopy( + projTuples, origTiff, interFormats, inPath, outPath, resFilename +): """Test a Geotiff file can be converted to NetCDF, and projection in CF-1 conventions can be successfully maintained. Save results to file. @@ -361,21 +483,21 @@ def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, bWriteGdalTags = "YES" # silent = False gdaltest.netcdf_drv_silent = False -# bWriteGdalTags="NO" + # bWriteGdalTags="NO" - result = 'success' + result = "success" # Test if ncdump is available try: - (_, err) = gdaltest.runexternal_out_and_err('ncdump -h') + (_, err) = gdaltest.runexternal_out_and_err("ncdump -h") except OSError: # nothing is supported as ncdump not found - pytest.skip('NOTICE: netcdf version not found') + pytest.skip("NOTICE: netcdf version not found") - i = err.find('netcdf library version ') + i = err.find("netcdf library version ") # version not found if i == -1: - pytest.skip('NOTICE: netcdf version not found') + pytest.skip("NOTICE: netcdf version not found") if not os.path.exists(outPath): os.makedirs(outPath) @@ -388,8 +510,8 @@ def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, resFile.write(heading) resFile.write(len(heading) * "=" + "\n") -# now = datetime.datetime.now() -# resFile.write("*Date/time:* %s\n" % (now.strftime("%Y-%m-%d %H:%M"))) + # now = datetime.datetime.now() + # resFile.write("*Date/time:* %s\n" % (now.strftime("%Y-%m-%d %H:%M"))) resFile.write("\n") resPerProj = {} @@ -418,27 +540,41 @@ def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, print("About to create raster in chosen SRS") # projVrt = os.path.join(outPath, "%s_%s.vrt" % \ # (origTiff.rstrip('.tif'), proj[0] )) - projRaster = os.path.join(outPath, "%s_%s.%s" % - (os.path.basename(origTiff).rstrip('.tif'), proj[0], intExt)) + projRaster = os.path.join( + outPath, + "%s_%s.%s" % (os.path.basename(origTiff).rstrip(".tif"), proj[0], intExt), + ) srs = osr.SpatialReference() srs.SetFromUserInput(proj[2]) t_srs_wkt = srs.ExportToWkt() if not silent: - print("going to warp file " + origTiff + "\n" + s_srs_wkt + "\ninto file " + projRaster + "\n" + t_srs_wkt) - dswarp = gdal.AutoCreateWarpedVRT(dsTiff, s_srs_wkt, t_srs_wkt, gdal.GRA_NearestNeighbour, 0) + print( + "going to warp file " + + origTiff + + "\n" + + s_srs_wkt + + "\ninto file " + + projRaster + + "\n" + + t_srs_wkt + ) + dswarp = gdal.AutoCreateWarpedVRT( + dsTiff, s_srs_wkt, t_srs_wkt, gdal.GRA_NearestNeighbour, 0 + ) drv_inter = gdal.GetDriverByName(intFmt) drv_netcdf = gdal.GetDriverByName("netcdf") dsw = drv_inter.CreateCopy(projRaster, dswarp, 0) if not silent: print("Warped %s to %s" % (proj[0], projRaster)) - projNc = os.path.join(outPath, "%s_%s.nc" % - (origTiff.rstrip('.tif'), proj[0])) + projNc = os.path.join(outPath, "%s_%s.nc" % (origTiff.rstrip(".tif"), proj[0])) # Force GDAL tags to be written to make testing easier, with preserved datum etc # ncCoOpts = "-co WRITE_GDAL_TAGS=yes" if not silent: print("About to translate to NetCDF") - dst = drv_netcdf.CreateCopy(projNc, dsw, 0, ['WRITE_GDAL_TAGS=' + bWriteGdalTags]) + dst = drv_netcdf.CreateCopy( + projNc, dsw, 0, ["WRITE_GDAL_TAGS=" + bWriteGdalTags] + ) # For drivers like HFA, line below ESSENTIAL so that all info is # saved to new raster file - which we'll reopen later and want # to be fully updated. @@ -455,29 +591,34 @@ def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, resFile.write("OK\n") else: resFile.write("BAD\n") - if 'missingProjName' in resPerProj[proj[0]]: - resFile.write("\tMissing proj name '%s'\n" % - (resPerProj[proj[0]]['missingProjName'])) - for attrib in resPerProj[proj[0]]['missingAttrs']: + if "missingProjName" in resPerProj[proj[0]]: + resFile.write( + "\tMissing proj name '%s'\n" + % (resPerProj[proj[0]]["missingProjName"]) + ) + for attrib in resPerProj[proj[0]]["missingAttrs"]: resFile.write("\tMissing attrib '%s'\n" % (attrib)) - for cVarStdName in resPerProj[proj[0]]['missingCoordVarStdNames']: - resFile.write("\tMissing coord var with std name '%s'\n" - % (cVarStdName)) - if 'cfcheck_error' in resPerProj[proj[0]]: - resFile.write("\tFailed cf check: %s\n" % - (resPerProj[proj[0]]['cfcheck_error'])) + for cVarStdName in resPerProj[proj[0]]["missingCoordVarStdNames"]: + resFile.write( + "\tMissing coord var with std name '%s'\n" % (cVarStdName) + ) + if "cfcheck_error" in resPerProj[proj[0]]: + resFile.write( + "\tFailed cf check: %s\n" % (resPerProj[proj[0]]["cfcheck_error"]) + ) # test file copy # We now copy to a new file, just to be safe - projNc2 = projNc.rstrip('.nc') + '2.nc' - projRaster2 = os.path.join(outPath, "%s_%s2.%s" % - (origTiff.rstrip('.tif'), proj[0], intExt)) + projNc2 = projNc.rstrip(".nc") + "2.nc" + projRaster2 = os.path.join( + outPath, "%s_%s2.%s" % (origTiff.rstrip(".tif"), proj[0], intExt) + ) - tst_res[i_t + 1] = netcdf_test_copy(projRaster, 1, None, projNc2, [], 'NETCDF') + tst_res[i_t + 1] = netcdf_test_copy(projRaster, 1, None, projNc2, [], "NETCDF") tst_res[i_t + 2] = netcdf_test_copy(projNc2, 1, None, projRaster2, [], intFmt) - if tst_res[i_t + 1] == 'fail' or tst_res[i_t + 2] == 'fail': - result = 'fail' + if tst_res[i_t + 1] == "fail" or tst_res[i_t + 2] == "fail": + result = "fail" i_t = i_t + 2 @@ -490,14 +631,17 @@ def netcdf_cfproj_testcopy(projTuples, origTiff, interFormats, inPath, outPath, # result = 'success' resFile = open(os.path.join(outPath, resFilename), "r") resStr = resFile.read() - if resStr.find('BAD') != -1: - print('\nCF projection tests failed, here is the output (stored in file %s)\n' % - (os.path.join(outPath, resFilename))) + if resStr.find("BAD") != -1: + print( + "\nCF projection tests failed, here is the output (stored in file %s)\n" + % (os.path.join(outPath, resFilename)) + ) print(resStr) - result = 'fail' + result = "fail" return result + ############################################################################### # Test an NC file has valid conventions according to passed-in proj tuple # Note: current testing strategy is a fairly simple attribute search. @@ -508,25 +652,25 @@ def netcdf_cfproj_test_cf(proj, projNc): transWorked = True - command = 'ncdump -h ' + projNc + command = "ncdump -h " + projNc (ret, err) = gdaltest.runexternal_out_and_err(command) - if err != '': + if err != "": print(err) dumpStr = ret resDetails = {} - resDetails['missingAttrs'] = [] - resDetails['missingCoordVarStdNames'] = [] + resDetails["missingAttrs"] = [] + resDetails["missingCoordVarStdNames"] = [] if (':grid_mapping_name = "%s"' % (proj[3])) not in dumpStr: transWorked = False - resDetails['missingProjName'] = proj[3] + resDetails["missingProjName"] = proj[3] # Check attributes in the projection are included. for attrib in proj[4]: # The ':' prefix and ' ' suffix is to help check for exact name, # e.g. to catch the standard_parallel_1 and 2 issue. if (":" + attrib + " ") not in dumpStr: transWorked = False - resDetails['missingAttrs'].append(attrib) + resDetails["missingAttrs"].append(attrib) # print "**Error for proj '%s': CF-1 attrib '%s' not found.**" % \ # (proj[0], attrib) # Now we check the required X and Y attributes are included (e.g. Rotated @@ -534,12 +678,12 @@ def netcdf_cfproj_test_cf(proj, projNc): for coordVarStdName in proj[5]: if coordVarStdName not in dumpStr: transWorked = False - resDetails['missingCoordVarStdNames'].append(coordVarStdName) + resDetails["missingCoordVarStdNames"].append(coordVarStdName) # Final check use the cf-checker. - result_cf = netcdf_cf_check_file(projNc, 'auto', True) - if result_cf == 'fail': - resDetails['cfcheck_error'] = gdaltest.netcdf_cf_check_error + result_cf = netcdf_cf_check_file(projNc, "auto", True) + if result_cf == "fail": + resDetails["cfcheck_error"] = gdaltest.netcdf_cf_check_error transWorked = False return transWorked, resDetails @@ -560,17 +704,19 @@ def test_netcdf_cf_1(netcdf_setup): # noqa # tst1 = gdaltest.GDALTest( 'NETCDF', 'netcdf/trmm.tif', 1, 14 ) # result = tst1.testCreateCopy(check_gt=1, check_srs=1, new_filename='tmp/netcdf_cf_1.nc', delete_copy = 0) - result = netcdf_test_copy('data/netcdf/trmm.nc', 1, 14, 'tmp/netcdf_cf_1.nc') - if result != 'fail': + result = netcdf_test_copy("data/netcdf/trmm.nc", 1, 14, "tmp/netcdf_cf_1.nc") + if result != "fail": # tst2 = gdaltest.GDALTest( 'GTIFF', '../tmp/netcdf_cf_1.nc', 1, 14 ) # result = tst2.testCreateCopy(check_gt=1, check_srs=1, new_filename='tmp/netcdf_cf_1.tiff', delete_copy = 0) - result = netcdf_test_copy('tmp/netcdf_cf_1.nc', 1, 14, 'tmp/netcdf_cf_1.tif', [], 'GTIFF') + result = netcdf_test_copy( + "tmp/netcdf_cf_1.nc", 1, 14, "tmp/netcdf_cf_1.tif", [], "GTIFF" + ) - result_cf = 'success' + result_cf = "success" if gdaltest.netcdf_cf_method is not None: - result_cf = netcdf_cf_check_file('tmp/netcdf_18.nc', 'auto', False) + result_cf = netcdf_cf_check_file("tmp/netcdf_18.nc", "auto", False) - if result != 'fail' and result_cf != 'fail': + if result != "fail" and result_cf != "fail": return pytest.fail() @@ -582,13 +728,13 @@ def test_netcdf_cf_2(): if gdaltest.netcdf_drv is None: pytest.skip() - result = netcdf_test_copy('data/netcdf/trmm.nc', 1, 14, 'tmp/netcdf_cf_2.nc') + result = netcdf_test_copy("data/netcdf/trmm.nc", 1, 14, "tmp/netcdf_cf_2.nc") - result_cf = 'success' + result_cf = "success" if gdaltest.netcdf_cf_method is not None: - result_cf = netcdf_cf_check_file('tmp/netcdf_cf_2.nc', 'auto', False) + result_cf = netcdf_cf_check_file("tmp/netcdf_cf_2.nc", "auto", False) - if result != 'fail' and result_cf != 'fail': + if result != "fail" and result_cf != "fail": return pytest.fail() @@ -601,24 +747,27 @@ def test_netcdf_cf_3(): if gdaltest.netcdf_drv is None: pytest.skip() - result = 'success' - result_cf = 'success' + result = "success" + result_cf = "success" - result = netcdf_test_copy('data/netcdf/trmm-wgs84.tif', 1, 14, 'tmp/netcdf_cf_3.nc') + result = netcdf_test_copy("data/netcdf/trmm-wgs84.tif", 1, 14, "tmp/netcdf_cf_3.nc") - if result == 'success': + if result == "success": # tst = gdaltest.GDALTest( 'GTIFF', '../tmp/netcdf_cf_3.nc', 1, 14 ) # result = tst.testCreateCopy(check_gt=1, check_srs=1, new_filename='tmp/netcdf_cf_3.tif', delete_copy = 0) - result = netcdf_test_copy('tmp/netcdf_cf_3.nc', 1, 14, 'tmp/netcdf_cf_3.tif', [], 'GTIFF') + result = netcdf_test_copy( + "tmp/netcdf_cf_3.nc", 1, 14, "tmp/netcdf_cf_3.tif", [], "GTIFF" + ) - result_cf = 'success' + result_cf = "success" if gdaltest.netcdf_cf_method is not None: - result_cf = netcdf_cf_check_file('tmp/netcdf_cf_3.nc', 'auto', False) + result_cf = netcdf_cf_check_file("tmp/netcdf_cf_3.nc", "auto", False) - if result != 'fail' and result_cf != 'fail': + if result != "fail" and result_cf != "fail": return pytest.fail() + ############################################################################### # test support for various CF projections @@ -628,25 +777,34 @@ def test_netcdf_cf_4(): if gdaltest.netcdf_drv is None: pytest.skip() - result = netcdf_cfproj_testcopy(netcdf_cfproj_tuples, 'netcdf/melb-small.tif', - netcdf_cfproj_int_fmt_maps, - 'data', 'tmp', 'translate_results.txt') -# result = netcdf_cfproj_testcopy(netcdf_cfproj_tuples1, 'netcdf/melb-small.tif', \ -# 'data', 'tmp', 'translate_results.txt') + result = netcdf_cfproj_testcopy( + netcdf_cfproj_tuples, + "netcdf/melb-small.tif", + netcdf_cfproj_int_fmt_maps, + "data", + "tmp", + "translate_results.txt", + ) + # result = netcdf_cfproj_testcopy(netcdf_cfproj_tuples1, 'netcdf/melb-small.tif', \ + # 'data', 'tmp', 'translate_results.txt') return result + ############################################################################### # test CF support for dims and variables in different groups + def test_netcdf_cf_6(): if gdaltest.netcdf_drv is None: pytest.skip() - ifiles = ('data/netcdf/cf_dimsindiff_4326.nc', - 'NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/data/temp', - 'NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle') + ifiles = ( + "data/netcdf/cf_dimsindiff_4326.nc", + "NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/data/temp", + "NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle", + ) for ifile in ifiles: ds = gdal.Open(ifile) prj = ds.GetProjection() @@ -655,8 +813,8 @@ def test_netcdf_cf_6(): proj_out = sr.ExportToProj4() assert proj_out in ( - '+proj=longlat +ellps=WGS84 +no_defs', - '+proj=longlat +datum=WGS84 +no_defs' + "+proj=longlat +ellps=WGS84 +no_defs", + "+proj=longlat +datum=WGS84 +no_defs", ) @@ -669,12 +827,21 @@ def test_netcdf_cf_7(netcdf_setup): # noqa if gdaltest.netcdf_drv is None: pytest.skip() - checks = (('data/netcdf/cf_dimsindiff_4326.nc', 1, 2041), - ('NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/data/temp', 1, 2041), - ('NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle', 1, 476), - ('NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle', 4, 476)) + checks = ( + ("data/netcdf/cf_dimsindiff_4326.nc", 1, 2041), + ("NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/data/temp", 1, 2041), + ( + "NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle", + 1, + 476, + ), + ( + "NETCDF:data/netcdf/cf_nasa_4326.nc:/science/grids/imagingGeometry/lookAngle", + 4, + 476, + ), + ) for infile, band, checksum in checks: ds = gdal.Open(infile, gdal.GA_ReadOnly) assert ds.GetRasterBand(band).Checksum() == checksum - diff --git a/autotest/gdrivers/netcdf_cfchecks.py b/autotest/gdrivers/netcdf_cfchecks.py index 16d1a0e11246..e9474e2e18ac 100755 --- a/autotest/gdrivers/netcdf_cfchecks.py +++ b/autotest/gdrivers/netcdf_cfchecks.py @@ -27,7 +27,7 @@ # 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...] +""" 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. @@ -46,33 +46,34 @@ -v or --version: CF version to check against, use auto to auto-detect the file version. -''' +""" +import ctypes import re import sys -import ctypes -from xml.sax import ContentHandler -from xml.sax import make_parser +from xml.sax import ContentHandler, make_parser from xml.sax.handler import feature_namespaces -import numpy -import cdms2 as cdms -from cdms2.axis import FileAxis +import cdms2 as cdms +import numpy from cdms2.auxcoord import FileAuxAxis1D +from cdms2.axis import FileAxis # 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' +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()) + return " ".join(text.split()) def my_cmp(a, b): @@ -96,14 +97,14 @@ def __nonzero__(self): return bool(self.tuple) def __str__(self): - return "CF-%s" % '.'.join(map(str, self.tuple)) + 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)) + 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]) @@ -132,7 +133,7 @@ def __cmp__(self, other): class ConstructDict(ContentHandler): """Parse the xml standard_name table, reading all entries - into a dictionary; storing standard_name and units. + into a dictionary; storing standard_name and units. """ def __init__(self): @@ -144,26 +145,26 @@ def __init__(self): 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 name == "entry": + self.this_id = normalize_whitespace(attrs.get("id", "")) # If it's the start of a canonical_units element - elif name == 'canonical_units': + elif name == "canonical_units": self.inUnitsContent = 1 self.units = "" - elif name == 'alias': - self.this_id = normalize_whitespace(attrs.get('id', "")) + elif name == "alias": + self.this_id = normalize_whitespace(attrs.get("id", "")) - elif name == 'entry_id': + elif name == "entry_id": self.inEntryIdContent = 1 self.entry_id = "" - elif name == 'version_number': + elif name == "version_number": self.inVersionNoContent = 1 self.version_number = "" - elif name == 'last_modified': + elif name == "last_modified": self.inLastModifiedContent = 1 self.last_modified = "" @@ -182,37 +183,41 @@ def characters(self, ch): def endElement(self, name): # If it's the end of the canonical_units element, save the units - if name == 'canonical_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': + 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( + "**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': + 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': + 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. + into a list. """ def __init__(self): @@ -222,14 +227,14 @@ def __init__(self): 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', ""))) + if name == "entry": + self.list.append(normalize_whitespace(attrs.get("id", ""))) - elif name == 'version_number': + elif name == "version_number": self.inVersionNoContent = 1 self.version_number = "" - elif name == 'date': + elif name == "date": self.inLastModifiedContent = 1 self.last_modified = "" @@ -242,28 +247,33 @@ def characters(self, ch): def endElement(self, name): # If it's the end of the version_number element, save it - if name == 'version_number': + 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': + 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. + 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): + 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): + 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): @@ -272,19 +282,32 @@ def chkDerivedName(name): 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): + 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): + 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): + 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): + 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): + 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 @@ -295,8 +318,17 @@ def chkDerivedName(name): # 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): + 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 @@ -308,12 +340,16 @@ def __init__(self, uploader=None, useFileName="yes", badc=None, coards=None, cfS 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 + 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$') + fileSuffix = re.compile("^\S+\.nc$") print("") if self.uploader: @@ -336,7 +372,9 @@ def checker(self, filename): # 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_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)) @@ -359,7 +397,9 @@ def checker(self, filename): print("NetCDF Attribute Error:") raise except: - print("\nCould not open file, please check that NetCDF is formatted correctly.\n".upper()) + print( + "\nCould not open file, please check that NetCDF is formatted correctly.\n".upper() + ) print("ERRORS detected:", 1) raise @@ -368,7 +408,10 @@ def checker(self, filename): 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) + 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 @@ -395,10 +438,22 @@ def checker(self, filename): 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 + ")") + 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( + "Using Area Type Table Version " + + self.area_type_lh.version_number + + " (" + + self.area_type_lh.last_modified + + ")" + ) print("") # Read in netCDF file @@ -409,7 +464,9 @@ def checker(self, filename): print("NetCDF Attribute Error:") raise except: - print("\nCould not open file, please check that NetCDF is formatted correctly.\n".upper()) + print( + "\nCould not open file, please check that NetCDF is formatted correctly.\n".upper() + ) print("ERRORS detected:", 1) raise @@ -429,7 +486,13 @@ def _checker(self): if not self.chkGlobalAttributes(): rc = 0 - (coordVars, auxCoordVars, boundsVars, climatologyVars, gridMappingVars) = self.getCoordinateDataVars() + ( + coordVars, + auxCoordVars, + boundsVars, + climatologyVars, + gridMappingVars, + ) = self.getCoordinateDataVars() self.coordVars = coordVars self.auxCoordVars = auxCoordVars self.boundsVars = boundsVars @@ -440,7 +503,7 @@ def _checker(self): # print "Coordinate Vars: ",coordVars allCoordVars = coordVars[:] - allCoordVars[len(allCoordVars):] = auxCoordVars[:] + allCoordVars[len(allCoordVars) :] = auxCoordVars[:] self.setUpFormulas() @@ -537,7 +600,9 @@ def _checker(self): # 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.") + print( + "WARNING (5): Possible incorrect declaration of a coordinate variable." + ) self.warn = self.warn + 1 else: if self.f[var].isTime(): @@ -551,25 +616,45 @@ def _checker(self): 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)") + 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 "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") + 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: + 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") + 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: + 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") + print( + "ERROR (9.5): CF Files containing", + featureType, + "featureType may contain 2 occurrences of a cf_role attribute", + ) self.err = self.err + 1 print("") @@ -587,6 +672,7 @@ def _checker(self): return 0 # ----------------------------- + def setUpAttributeList(self): # ----------------------------- """Set up Dictionary of valid attributes, their corresponding @@ -594,52 +680,53 @@ def setUpAttributeList(self): 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')] + 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'] + 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'] + 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.""" @@ -654,20 +741,22 @@ def uniqueList(self, lst): return 1 # ------------------------- + def isNumeric(self, var): # ------------------------- """Determine if variable is of Numeric data type.""" - types = ['i', 'f', 'd'] + 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' + attName = "standard_name" attDict = var.attributes if attName not in attDict.keys(): return None @@ -677,10 +766,11 @@ def getStdNameOld(self, var): 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' + attName = "standard_name" attDict = var.attributes if attName not in attDict.keys(): @@ -699,12 +789,13 @@ def getStdName(self, var): 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']: + if units in ["level", "layer", "sigma_level"]: # Dimensionless vertical coordinate return "Z" @@ -717,44 +808,60 @@ def getInterpretation(self, units, positive=None): # self.err = self.err+1 return None -# print "here" + # 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")): + 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")): + 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): + 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")): + 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): + 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): + 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 + 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 = [] @@ -768,26 +875,30 @@ def getCoordinateDataVars(self): # 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 + # 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: + 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) + 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() + coordinates = self.f[var].attributes["coordinates"].split() for dataVar in coordinates: if dataVar in variables: @@ -796,27 +907,50 @@ def getCoordinateDataVars(self): auxCoordVars.append(dataVar) # Is the auxiliary coordinate var actually a label? - if self.getTypeCode(self.f[dataVar]) == 'c': + 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") + 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) + 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: + 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) + 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) + 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 @@ -832,25 +966,39 @@ def getCoordinateDataVars(self): 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: + 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) + 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) + 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) + 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'] + 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") @@ -860,7 +1008,9 @@ def getCoordinateDataVars(self): boundaryVars.append(bounds) if not self.isNumeric(bounds): - print("ERROR (7.1): boundary variable with non-numeric data type") + 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: @@ -870,22 +1020,50 @@ def getCoordinateDataVars(self): for dim in varDimensions: if dim not in self.f[bounds].getAxisIds(): - print("ERROR (7.1): Incorrect dimensions for boundary variable:", bounds) + 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) + 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) + 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) + 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) + 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 @@ -904,23 +1082,48 @@ def getCoordinateDataVars(self): 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.") + 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") + 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") + 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 @@ -928,8 +1131,8 @@ def getCoordinateDataVars(self): # ---------------------------- # Climatology Variable Checks # ---------------------------- - if 'climatology' in self.f[var].attributes: - climatology = self.f[var].attributes['climatology'] + 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") @@ -938,63 +1141,113 @@ def getCoordinateDataVars(self): if climatology in variables: climatologyVars.append(climatology) if not self.isNumeric(climatology): - print("ERROR (7.4): climatology variable with non-numeric data type") + 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) + 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) + 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) + 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") + 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'] + 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") + 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) + 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: + 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 + 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'] + 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'] + 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) @@ -1012,38 +1265,63 @@ def chkGridMappingVar(self, varName): 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))'] + 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""" @@ -1052,6 +1330,7 @@ def parseBlankSeparatedList(self, lst): return 0 # ------------------------------------------- + def extendedBlankSeparatedList(self, lst): # ------------------------------------------- """Check list is a blank separated list of words containing alphanumeric characters @@ -1061,6 +1340,7 @@ def extendedBlankSeparatedList(self, lst): return 0 # ------------------------------------------- + def commaOrBlankSeparatedList(self, lst): # ------------------------------------------- """Check list is a blank or comma separated list of words containing alphanumeric @@ -1070,16 +1350,19 @@ def commaOrBlankSeparatedList(self, lst): return 0 # ------------------------------ + def chkGlobalAttributes(self): # ------------------------------ """Check validity of global attributes.""" rc = 1 - if 'Conventions' in self.f.attributes: - conventions = self.f.attributes['Conventions'] + 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") + 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: @@ -1097,12 +1380,19 @@ def chkGlobalAttributes(self): break if found != 1: - print("ERROR (2.6.1): This netCDF file does not appear to contain CF Convention data.") + 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) + 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: @@ -1111,29 +1401,47 @@ def chkGlobalAttributes(self): 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") + 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']: + 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'") + 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'] + 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 @@ -1149,44 +1457,53 @@ def getFileCFVersion(self): found = 1 rc = CFVersion(convention.strip()) break - elif convention.strip() == 'COARDS': + elif convention.strip() == "COARDS": coards = 1 if not found and coards: - print("WARNING: The conventions attribute specifies COARDS, assuming CF-1.0") + 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 + """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_]*$') + 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.""" + 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. + 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 @@ -1200,19 +1517,23 @@ def chkDimensions(self, varName, allcoordVars): for dim in dimensions: i = i + 1 try: - if hasattr(self.f[dim], 'axis'): + 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") + 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 != "": + 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) + 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) @@ -1226,7 +1547,11 @@ def chkDimensions(self, varName, allcoordVars): if firstST == -1: firstST = pos except AttributeError: - print("ERROR: Problem accessing variable:", dim, "(May not exist in file).") + print( + "ERROR: Problem accessing variable:", + dim, + "(May not exist in file).", + ) self.err = self.err + 1 exit(self.err) except ValueError: @@ -1240,21 +1565,31 @@ def chkDimensions(self, varName, allcoordVars): lastPos = pos trailingVars = [] else: - print("WARNING (2.4): space/time dimensions appear in incorrect order") + 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[:] + 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") + 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") + print( + "WARNING (2.4): dimensions", + nonSpaceDimensions, + "should appear to left of space/time dimensions", + ) self.warn = self.warn + 1 dimensions.sort() @@ -1262,17 +1597,17 @@ def chkDimensions(self, varName, allcoordVars): 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 - - # ------------------------------------------------------- + # 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): # ------------------------------------------------------- """ @@ -1295,6 +1630,7 @@ def getTypeCode(self, obj): return obj.typecode() # ------------------------------------------------------- + def chkAttribute(self, attribute, varName, allCoordVars): # ------------------------------------------------------- """Check the syntax of the attribute name, that the attribute @@ -1319,31 +1655,33 @@ def chkAttribute(self, attribute, varName, allCoordVars): attrType = type(value) if isinstance(value, str): - attrType = 'S' + attrType = "S" elif isinstance(value, (int, float)): - attrType = 'N' + attrType = "N" elif isinstance(value, numpy.ndarray): - attrType = 'N' + attrType = "N" elif isinstance(value, type(None)): # attrType=self.AttrList[attribute][0] - attrType = 'NoneType' + 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': + 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': + if attrType == "S": # Note: A string is an array of chars - if self.getTypeCode(var) != 'c': + if self.getTypeCode(var) != "c": typeError = 1 else: - if self.getTypeCode(var) != self.getTypeCode(var.attributes[attribute]): + if self.getTypeCode(var) != self.getTypeCode( + var.attributes[attribute] + ): typeError = 1 elif self.AttrList[attribute][0] != attrType: @@ -1371,23 +1709,45 @@ def chkAttribute(self, attribute, varName, allCoordVars): # 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") + 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") + 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'] + 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 "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") + print( + "ERROR (4.4.1): Attribute", + attribute, + "may only be attached to time coordinate variable", + ) self.err = self.err + 1 rc = 0 @@ -1396,13 +1756,18 @@ def chkAttribute(self, attribute, varName, allCoordVars): udunits.ut_free(secsSinceEpoch) else: - print("ERROR (4.4.1): Attribute", attribute, "may only be attached to time coordinate variable") + 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 @@ -1417,14 +1782,16 @@ def chkCellMethods(self, varName): varDimensions = {} var = self.f[varName] - if 'cell_methods' in var.attributes: - cellMethods = var.attributes['cell_methods'] - getComments = re.compile(r'\([^)]+\)') + 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*)+$') + 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: @@ -1434,17 +1801,26 @@ def chkCellMethods(self, varName): break # Validate dim and check that it only appears once unless it is 'time' - allDims = re.findall(r'\S+\s*:', s) + allDims = re.findall(r"\S+\s*:", s) for part in allDims: - dims = re.split(':', part) + 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) + 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) + print( + "ERROR (7.3): Multiple cell_methods entries for dimension:", + d, + ) self.err = self.err + 1 else: varDimensions[d] = 1 @@ -1453,9 +1829,11 @@ def chkCellMethods(self, varName): # 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: .+)?\)') + 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): + 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 @@ -1470,20 +1848,21 @@ def chkCellMethods(self, varName): 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'] + 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']: + 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 @@ -1491,31 +1870,41 @@ def chkCFRole(self, varName): return rc # --------------------------------- + def chkRaggedArray(self, varName): # --------------------------------- # Validate count/index variable # rc=1 var = self.f[varName] - if 'sample_dimension' in var.attributes: + 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") + 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: + 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") + 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 @@ -1533,24 +1922,29 @@ def isValidUdunitsUnit(self, unit): return rc # --------------------------------------------------- + def isValidCellMethodTypeValue(self, typ, value): # --------------------------------------------------- - """ Is or in the cell_methods attribute a valid 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': + 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.") + 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': + 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 @@ -1560,11 +1954,12 @@ def isValidCellMethodTypeValue(self, typ, value): 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) + dim1: [dim2: [dim3: ...]] method [where type1 [over type2]] [ (comment) ] + where comment is of the form: ([interval: value unit [interval: ...] comment:] remainder) """ rc = 1 @@ -1572,18 +1967,20 @@ def chkCellMethods_redefined(self, varName): varDimensions = {} var = self.f[varName] - if 'cell_methods' in var.attributes: - cellMethods = var.attributes['cell_methods'] + if "cell_methods" in var.attributes: + cellMethods = var.attributes["cell_methods"] -# cellMethods="lat: area: maximum (interval: 1 hours interval: 3 hours comment: fred)" + # 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'+$') + 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) @@ -1593,58 +1990,87 @@ def chkCellMethods_redefined(self, varName): 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\([^)]+\))?') + 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')) + 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") + 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") + 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 + allDims = re.findall(r"\S+\s*:", s.group("dimensions")) + dc = 0 # Number of dims for part in allDims: - dims = re.split(':', part) + 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 ( + 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) + 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) + 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) + print( + "ERROR (7.3): Multiple cell_methods entries for dimension:", + d, + ) self.err = self.err + 1 rc = 0 else: @@ -1653,35 +2079,55 @@ def chkCellMethods_redefined(self, varName): 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") + 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') + comment = s.group("comment") if comment: - getIntervals = re.compile(r'(?Pinterval:\s+\d+\s+(?P\S+)\s*)') + 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 + i = 0 # Number of intervals present for m in allIntervals: i = i + 1 - unit = m.group('unit') + unit = m.group("unit") if not self.isValidUdunitsUnit(unit): - print("ERROR (7.3): Invalid unit", unit, "in cell_methods comment") + 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") + 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: @@ -1691,9 +2137,11 @@ def chkCellMeasures(self, varName): 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): + 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 @@ -1707,15 +2155,28 @@ def chkCellMeasures(self, varName): 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.") + 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()) + 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: @@ -1723,23 +2184,34 @@ def chkCellMeasures(self, varName): # 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()) + 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) + measure = re.sub(":", "", measure) if not re.match("^(area|volume)$", measure): - print("ERROR (7.2): Invalid measure in attribute cell_measures") + 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") + 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") + print( + "ERROR (7.2): Must have cubic meters for volume measure" + ) self.err = self.err + 1 rc = 0 @@ -1749,6 +2221,7 @@ def chkCellMeasures(self, varName): return rc # ---------------------------------- + def chkFormulaTerms(self, varName, allCoordVars): # ---------------------------------- """Checks on formula_terms attribute (CF Section 4.3.2): @@ -1760,15 +2233,19 @@ def chkFormulaTerms(self, varName, allCoordVars): rc = 1 var = self.f[varName] - if 'formula_terms' in var.attributes: + if "formula_terms" in var.attributes: if varName not in allCoordVars: - print("ERROR (4.3.2): formula_terms attribute only allowed on coordinate variables") + 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") + 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 @@ -1783,7 +2260,7 @@ def chkFormulaTerms(self, varName, allCoordVars): index = self.alias[stdName] - formulaTerms = var.attributes['formula_terms'] + 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 @@ -1800,14 +2277,14 @@ def chkFormulaTerms(self, varName, allCoordVars): rc = 0 else: # Term - Should be present in formula - x = re.sub(':', '', x) - found = 'false' + x = re.sub(":", "", x) + found = "false" for formula in self.formulas[index]: if re.search(x, formula): - found = 'true' + found = "true" break - if found == 'false': + if found == "false": print("ERROR (4.3.2): term", x, "not present in formula") self.err = self.err + 1 rc = 0 @@ -1815,6 +2292,7 @@ def chkFormulaTerms(self, varName, allCoordVars): return rc # ---------------------------------------- + def chkUnits(self, varName, allCoordVars): # ---------------------------------------- """Check units attribute""" @@ -1828,9 +2306,9 @@ def chkUnits(self, varName, allCoordVars): 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'] != '': + if "units" in var.attributes and var.attributes["units"] != "": # Type of units is a string - units = var.attributes['units'] + 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 @@ -1838,16 +2316,22 @@ def chkUnits(self, varName, allCoordVars): return 0 # units - level, layer and sigma_level are deprecated - if units in ['level', 'layer', 'sigma_level']: + 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") + 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.") + 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 @@ -1860,14 +2344,16 @@ def chkUnits(self, varName, allCoordVars): # 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: + 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': + 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.") + 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(): @@ -1875,31 +2361,41 @@ def chkUnits(self, varName, allCoordVars): 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') + stdNameUnits = stdNameUnits.encode("ascii") - canonicalUnit = udunits.ut_parse(self.unitSystem, stdNameUnits, "UT_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") + 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: + 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']) + getComments = re.compile(r"\([^)]+\)") + noComments = getComments.sub( + "%5A", var.attributes["cell_methods"] + ) - if re.search(r'(\s+|:)variance', noComments): + 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") + 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.") + print( + "ERROR (3.1): Units are not consistent with those given in the standard_name table." + ) self.err = self.err + 1 rc = 0 @@ -1916,29 +2412,44 @@ def chkUnits(self, varName, allCoordVars): 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': + 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'): + 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: + 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': + 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.") + 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""" @@ -1949,8 +2460,8 @@ def chkBADCUnits(self, var): # 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']) + if hasattr(var, "units") and var.attributes["units"] in line.split(): + print("Valid units in BADC list:", var.attributes["units"]) rc = 1 break else: @@ -1959,22 +2470,25 @@ def chkBADCUnits(self, var): 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: + 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") + 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 @@ -1984,79 +2498,99 @@ def chk_FillValue(self, varName): rc = 1 var = self.f[varName] -# varType = self.getTypeCode(var) + # varType = self.getTypeCode(var) - if '_FillValue' in var.__dict__: - fillValue = var.__dict__['_FillValue'] + 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 + # 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: + if "valid_range" in var.attributes: # Check _FillValue is outside valid_range - validRange = var.attributes['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") + 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") + 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'] + if "missing_value" in var.attributes: + missingValue = var.attributes["missing_value"] -# print type(missingValue) -# print type(Numeric.array([])) + # print type(missingValue) + # print type(Numeric.array([])) try: if missingValue: - if '_FillValue' in var.__dict__: + 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") + 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 + # 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") + 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") + print( + "ERROR (7.4): Climatology Variable", + var.id, + "must not have missing_value attribute", + ) self.err = self.err + 1 rc = 0 @@ -2073,27 +2607,34 @@ def chk_FillValue(self, varName): 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): + 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.") + 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'): + if hasattr(var, "units"): + if hasattr(var, "positive"): interp = self.getInterpretation(var.units, var.positive) else: interp = self.getInterpretation(var.units) @@ -2101,24 +2642,27 @@ def chkAxisAttribute(self, varName): # Variable does not have a units attribute so a consistency check cannot be made interp = None -# print "interp:",interp -# print "axis:",var.axis + # 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") + 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): + 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 @@ -2126,61 +2670,84 @@ def chkPositiveAttribute(self, varName): 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): + 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") + 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.") + 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") + 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") + 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: + 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])): + 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") + 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") + 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") @@ -2193,24 +2760,24 @@ def chkTimeVariableAttributes(self, varName): 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.""" + 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: + 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: + if "standard_name" in var.attributes: # Check if valid by the standard_name table and allowed modifiers - std_name = var.attributes['standard_name'] + 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) @@ -2221,7 +2788,11 @@ def chkDescription(self, varName): 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 + "'") + print( + "ERROR (3.3): Invalid syntax for 'standard_name' attribute: '" + + std_name + + "'" + ) self.err = self.err + 1 rc = 0 @@ -2237,22 +2808,34 @@ def chkDescription(self, varName): 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) + 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.") + 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): @@ -2263,15 +2846,18 @@ def chkCompressAttr(self, varName): dimensions = compress.split() dimProduct = 1 for x in dimensions: - found = 'false' + 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' + found = "true" - if found != 'true': - print("ERROR (8.2): compress attribute naming non-existent dimension: ", x) + if found != "true": + print( + "ERROR (8.2): compress attribute naming non-existent dimension: ", + x, + ) self.err = self.err + 1 rc = 0 @@ -2283,26 +2869,36 @@ def chkCompressAttr(self, varName): break if outOfRange: - print("ERROR (8.2): values of", var.id, "must be in the range 0 to", dimProduct - 1) + 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") + 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 + 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 @@ -2311,60 +2907,69 @@ def chkPackedData(self, varName): # 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") + 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': + 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") + 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: + 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'] + meanings = var.attributes["flag_meanings"] -# if not self.parseBlankSeparatedList(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: + if "flag_values" in var.attributes: values_or_masks = 1 - values = var.attributes['flag_values'] + 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) + # 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() + # 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) + # 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") + 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 @@ -2373,20 +2978,24 @@ def chkFlags(self, varName): values = values.split() if not self.uniqueList(values): - print("ERROR (3.5): flag_values attribute must contain a list of unique 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: + if "flag_masks" in var.attributes: values_or_masks = 1 - masks = var.attributes['flag_masks'] + 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") + 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 @@ -2398,8 +3007,8 @@ def chkFlags(self, varName): 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: + 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 @@ -2408,17 +3017,28 @@ def chkFlags(self, varName): 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.") + 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") + 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: + 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 @@ -2426,6 +3046,7 @@ def chkFlags(self, varName): return rc # ----------------------- + def getType(self, arg): # ----------------------- if isinstance(arg, numpy.ndarray): @@ -2441,9 +3062,10 @@ def getType(self, arg): return 0 # ---------------------------------------- + def equalNumOfValues(self, arg1, arg2): # ---------------------------------------- - """ Check that arg1 and arg2 contain the same number of blank-separated elements.""" + """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) @@ -2468,6 +3090,7 @@ def equalNumOfValues(self, arg1, arg2): return 1 # ------------------------------------------ + def chkMultiDimCoord(self, varName, axes): # ------------------------------------------ """If a coordinate variable is multi-dimensional, then it is recommended @@ -2480,11 +3103,16 @@ def chkMultiDimCoord(self, varName, axes): 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.") + 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 @@ -2503,27 +3131,33 @@ def chkValuesMonotonic(self, varName): i = i + 1 if val < lastVal: # Decreasing sequence - typ = 'decr' + typ = "decr" elif val > lastVal: # Increasing sequence - typ = 'incr' + typ = "incr" else: # Same value - ERROR - print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") + print( + "ERROR (5): coordinate variable '" + var.id + "' not monotonic" + ) self.err = self.err + 1 return 1 lastVal = val else: i = i + 1 - if val < lastVal and typ != 'decr': + if val < lastVal and typ != "decr": # ERROR - should be increasing value - print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") + print( + "ERROR (5): coordinate variable '" + var.id + "' not monotonic" + ) self.err = self.err + 1 return 1 - elif val > lastVal and typ != 'incr': + elif val > lastVal and typ != "incr": # ERROR - should be decreasing value - print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") + print( + "ERROR (5): coordinate variable '" + var.id + "' not monotonic" + ) self.err = self.err + 1 return 1 @@ -2531,15 +3165,15 @@ def chkValuesMonotonic(self, varName): def getargs(arglist): - '''getargs(arglist): parse command line options and environment variables''' + """getargs(arglist): parse command line options and environment variables""" - from getopt import getopt, GetoptError + from getopt import GetoptError, getopt from os import environ from sys import stderr - udunitskey = 'UDUNITS' - standardnamekey = 'CF_STANDARD_NAMES' - areatypeskey = 'CF_AREA_TYPES' + udunitskey = "UDUNITS" + standardnamekey = "CF_STANDARD_NAMES" + areatypeskey = "CF_AREA_TYPES" # set defaults udunits = None standardname = STANDARDNAME @@ -2559,38 +3193,52 @@ def getargs(arglist): 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=']) + (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__) + stderr.write("%s\n" % __doc__) sys.exit(1) for a, v in opts: - if a in ('-a', '--area_types'): + if a in ("-a", "--area_types"): areatypes = v.strip() continue - if a in ('-b', '--badc'): + if a in ("-b", "--badc"): badc = "yes" continue - if a in ('-c', '--coards'): + if a in ("-c", "--coards"): coards = "yes" continue - if a in ('-h', '--help'): + if a in ("-h", "--help"): print(__doc__) sys.exit(0) - if a in ('-l', '--uploader'): + if a in ("-l", "--uploader"): uploader = "yes" continue - if a in ('-n', '--noname'): + if a in ("-n", "--noname"): useFileName = "no" continue - if a in ('-u', '--udunits'): + if a in ("-u", "--udunits"): udunits = v.strip() continue - if a in ('-s', '--cf_standard_names'): + if a in ("-s", "--cf_standard_names"): standardname = v.strip() continue - if a in ('-v', '--version'): - if v == 'auto': + if a in ("-v", "--version"): + if v == "auto": version = CFVersion() else: try: @@ -2605,21 +3253,50 @@ def getargs(arglist): continue if not args: - stderr.write('ERROR in command line\n\nusage:\n%s\n' % __doc__) + 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) + 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) +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) diff --git a/autotest/gdrivers/netcdf_multidim.py b/autotest/gdrivers/netcdf_multidim.py index 8f5397c18d7d..c7c03b2ce90e 100755 --- a/autotest/gdrivers/netcdf_multidim.py +++ b/autotest/gdrivers/netcdf_multidim.py @@ -28,72 +28,75 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr - import array -import gdaltest import os -import pytest import shutil import stat import struct import sys import time +import gdaltest +import pytest + +from osgeo import gdal, osr + + def has_nc4(): - netcdf_drv = gdal.GetDriverByName('NETCDF') + netcdf_drv = gdal.GetDriverByName("NETCDF") if netcdf_drv is None: return False metadata = netcdf_drv.GetMetadata() - return 'NETCDF_HAS_NC4' in metadata and metadata['NETCDF_HAS_NC4'] == 'YES' + return "NETCDF_HAS_NC4" in metadata and metadata["NETCDF_HAS_NC4"] == "YES" -pytestmark = [ pytest.mark.require_driver('netCDF'), - pytest.mark.skipif(not has_nc4(), reason='netCDF 4 support missing') ] +pytestmark = [ + pytest.mark.require_driver("netCDF"), + pytest.mark.skipif(not has_nc4(), reason="netCDF 4 support missing"), +] def test_netcdf_multidim_invalid_file(): - ds = gdal.OpenEx('data/netcdf/byte_truncated.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/byte_truncated.nc", gdal.OF_MULTIDIM_RASTER) assert not ds def test_netcdf_multidim_single_group(): - ds = gdal.OpenEx('data/netcdf/byte_no_cf.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/byte_no_cf.nc", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' - assert rg.GetFullName() == '/' + assert rg.GetName() == "/" + assert rg.GetFullName() == "/" assert rg.GetGroupNames() is None dims = rg.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'x' - assert dims[0].GetFullName() == '/x' - assert dims[1].GetName() == 'y' - assert rg.OpenGroup('foo') is None + assert dims[0].GetName() == "x" + assert dims[0].GetFullName() == "/x" + assert dims[1].GetName() == "y" + assert rg.OpenGroup("foo") is None assert not rg.GetAttribute("not existing") - assert rg.GetStructuralInfo() == {'NC_FORMAT': 'CLASSIC'} - assert rg.GetMDArrayNames() == [ 'Band1' ] - var = rg.OpenMDArray('Band1') + assert rg.GetStructuralInfo() == {"NC_FORMAT": "CLASSIC"} + assert rg.GetMDArrayNames() == ["Band1"] + var = rg.OpenMDArray("Band1") assert var - assert var.GetName() == 'Band1' - assert not rg.OpenMDArray('foo') + assert var.GetName() == "Band1" + assert not rg.OpenMDArray("foo") assert not var.GetAttribute("not existing") assert var.GetDimensionCount() == 2 dims = var.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'y' + assert dims[0].GetName() == "y" assert dims[0].GetSize() == 20 assert not dims[0].GetIndexingVariable() - assert dims[1].GetName() == 'x' + assert dims[1].GetName() == "x" assert dims[1].GetSize() == 20 assert not dims[1].GetIndexingVariable() assert var.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert var.GetDataType().GetNumericDataType() == gdal.GDT_Byte - assert var.GetAttribute('long_name') + assert var.GetAttribute("long_name") assert len(var.GetNoDataValueAsRaw()) == 1 assert var.GetNoDataValueAsDouble() == 0.0 assert var.GetScale() is None @@ -101,46 +104,51 @@ def test_netcdf_multidim_single_group(): assert var.GetBlockSize() == [0, 0] assert var.GetProcessingChunkSize(0) == [1, 1] - ref_ds = gdal.Open('data/netcdf/byte_no_cf.nc') - ref_data = struct.unpack('B' * 400, ref_ds.ReadRaster()) - got_data = struct.unpack('B' * 400, var.Read()) + ref_ds = gdal.Open("data/netcdf/byte_no_cf.nc") + ref_data = struct.unpack("B" * 400, ref_ds.ReadRaster()) + got_data = struct.unpack("B" * 400, var.Read()) assert got_data == ref_data - with gdaltest.error_handler(): # Write to read only - assert not rg.CreateDimension('X', None, None, 2) - assert not rg.CreateAttribute('att_text', [], gdal.ExtendedDataType.CreateString()) - assert not var.CreateAttribute('att_text', [], gdal.ExtendedDataType.CreateString()) - assert not rg.CreateGroup('subgroup') - assert not rg.CreateMDArray('my_var_no_dim', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + with gdaltest.error_handler(): # Write to read only + assert not rg.CreateDimension("X", None, None, 2) + assert not rg.CreateAttribute( + "att_text", [], gdal.ExtendedDataType.CreateString() + ) + assert not var.CreateAttribute( + "att_text", [], gdal.ExtendedDataType.CreateString() + ) + assert not rg.CreateGroup("subgroup") + assert not rg.CreateMDArray( + "my_var_no_dim", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert var.Write(var.Read()) != gdal.CE_None - att = next((x for x in var.GetAttributes() if x.GetName() == 'long_name'), None) - assert att.Write('foo') != gdal.CE_None + att = next((x for x in var.GetAttributes() if x.GetName() == "long_name"), None) + assert att.Write("foo") != gdal.CE_None def test_netcdf_multidim_multi_group(): - ds = gdal.OpenEx('data/netcdf/complex.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/complex.nc", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' - assert rg.GetGroupNames() == ['group'] - assert rg.GetMDArrayNames() == [ 'Y', 'X', 'Z', 'f32', 'f64' ] - assert rg.GetAttribute('Conventions') - assert rg.GetStructuralInfo() == {'NC_FORMAT': 'NETCDF4'} - subgroup = rg.OpenGroup('group') + assert rg.GetName() == "/" + assert rg.GetGroupNames() == ["group"] + assert rg.GetMDArrayNames() == ["Y", "X", "Z", "f32", "f64"] + assert rg.GetAttribute("Conventions") + assert rg.GetStructuralInfo() == {"NC_FORMAT": "NETCDF4"} + subgroup = rg.OpenGroup("group") assert subgroup - assert subgroup.GetName() == 'group' - assert subgroup.GetFullName() == '/group' - assert rg.OpenGroup('foo') is None + assert subgroup.GetName() == "group" + assert subgroup.GetFullName() == "/group" + assert rg.OpenGroup("foo") is None assert subgroup.GetGroupNames() is None - assert subgroup.GetMDArrayNames() == [ 'fmul' ] - assert subgroup.OpenGroup('foo') is None + assert subgroup.GetMDArrayNames() == ["fmul"] + assert subgroup.OpenGroup("foo") is None - var = rg.OpenMDArray('f32') + var = rg.OpenMDArray("f32") assert var - assert var.GetName() == 'f32' + assert var.GetName() == "f32" dim0 = var.GetDimensions()[0] indexing_var = dim0.GetIndexingVariable() assert indexing_var @@ -149,37 +157,37 @@ def test_netcdf_multidim_multi_group(): assert var.GetDataType().GetNumericDataType() == gdal.GDT_CFloat32 assert var.GetNoDataValueAsRaw() is None - var = rg.OpenMDArray('f64') + var = rg.OpenMDArray("f64") assert var assert var.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert var.GetDataType().GetNumericDataType() == gdal.GDT_CFloat64 - assert not rg.OpenMDArray('foo') - var = subgroup.OpenMDArray('fmul') + assert not rg.OpenMDArray("foo") + var = subgroup.OpenMDArray("fmul") assert var - assert var.GetName() == 'fmul' - assert var.GetFullName() == '/group/fmul' - assert not subgroup.OpenMDArray('foo') + assert var.GetName() == "fmul" + assert var.GetFullName() == "/group/fmul" + assert not subgroup.OpenMDArray("foo") assert var.GetDimensionCount() == 3 dims = var.GetDimensions() assert len(dims) == 3 - assert dims[0].GetName() == 'Z' + assert dims[0].GetName() == "Z" assert dims[0].GetSize() == 3 indexing_var = dims[0].GetIndexingVariable() assert indexing_var - assert indexing_var.GetName() == 'Z' - assert dims[1].GetName() == 'Y' + assert indexing_var.GetName() == "Z" + assert dims[1].GetName() == "Y" assert dims[1].GetSize() == 5 - assert dims[2].GetName() == 'X' + assert dims[2].GetName() == "X" assert dims[2].GetSize() == 5 def test_netcdf_multidim_from_ncdump(): - if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != 'YES': + if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != "YES": pytest.skip() - ds = gdal.OpenEx('data/netcdf/byte.nc.txt', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/byte.nc.txt", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -187,250 +195,344 @@ def test_netcdf_multidim_from_ncdump(): def test_netcdf_multidim_var_alldatatypes(): - ds = gdal.OpenEx('data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - expected_vars = [ ('char_var', gdal.GDT_Byte, (ord('x'),ord('y'))), - ('ubyte_var', gdal.GDT_Byte, (255, 254)), - ('byte_var', gdal.GDT_Int16, (-128,-127)), - ('byte_unsigned_false_var', gdal.GDT_Int16, (-128,-127)), - ('byte_unsigned_true_var', gdal.GDT_Byte, (128, 129)), - ('ushort_var', gdal.GDT_UInt16, (65534, 65533)), - ('short_var', gdal.GDT_Int16, (-32768, -32767)), - ('uint_var', gdal.GDT_UInt32, (4294967294, 4294967293)), - ('int_var', gdal.GDT_Int32, (-2147483648, -2147483647)), - ('uint64_var', gdal.GDT_UInt64, (18446744073709551613, 18446744073709551612)), - ('int64_var', gdal.GDT_Int64, (-9223372036854775808, -9223372036854775807)), - ('float_var', gdal.GDT_Float32, (1.25, 2.25)), - ('double_var', gdal.GDT_Float64, (1.25125, 2.25125)), - ('complex_int16_var', gdal.GDT_CInt16, (-32768, -32767, -32766, -32765)), - ('complex_int32_var', gdal.GDT_CInt32, (-2147483648, -2147483647, -2147483646, -2147483645)), - ('complex64_var', gdal.GDT_CFloat32, (1.25, 2.5, 2.25, 3.5)), - ('complex128_var', gdal.GDT_CFloat64, (1.25125, 2.25125, 3.25125, 4.25125)), - ] + expected_vars = [ + ("char_var", gdal.GDT_Byte, (ord("x"), ord("y"))), + ("ubyte_var", gdal.GDT_Byte, (255, 254)), + ("byte_var", gdal.GDT_Int16, (-128, -127)), + ("byte_unsigned_false_var", gdal.GDT_Int16, (-128, -127)), + ("byte_unsigned_true_var", gdal.GDT_Byte, (128, 129)), + ("ushort_var", gdal.GDT_UInt16, (65534, 65533)), + ("short_var", gdal.GDT_Int16, (-32768, -32767)), + ("uint_var", gdal.GDT_UInt32, (4294967294, 4294967293)), + ("int_var", gdal.GDT_Int32, (-2147483648, -2147483647)), + ("uint64_var", gdal.GDT_UInt64, (18446744073709551613, 18446744073709551612)), + ("int64_var", gdal.GDT_Int64, (-9223372036854775808, -9223372036854775807)), + ("float_var", gdal.GDT_Float32, (1.25, 2.25)), + ("double_var", gdal.GDT_Float64, (1.25125, 2.25125)), + ("complex_int16_var", gdal.GDT_CInt16, (-32768, -32767, -32766, -32765)), + ( + "complex_int32_var", + gdal.GDT_CInt32, + (-2147483648, -2147483647, -2147483646, -2147483645), + ), + ("complex64_var", gdal.GDT_CFloat32, (1.25, 2.5, 2.25, 3.5)), + ("complex128_var", gdal.GDT_CFloat64, (1.25125, 2.25125, 3.25125, 4.25125)), + ] for var_name, dt, val in expected_vars: var = rg.OpenMDArray(var_name) assert var assert var.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert var.GetDataType().GetNumericDataType() == dt, var_name if dt == gdal.GDT_Byte: - assert struct.unpack('B' * len(val), var.Read()) == val + assert struct.unpack("B" * len(val), var.Read()) == val if dt == gdal.GDT_UInt16: - assert struct.unpack('H' * len(val), var.Read()) == val + assert struct.unpack("H" * len(val), var.Read()) == val if dt == gdal.GDT_Int16: - assert struct.unpack('h' * len(val), var.Read()) == val, var_name + assert struct.unpack("h" * len(val), var.Read()) == val, var_name if dt == gdal.GDT_UInt32: - assert struct.unpack('I' * len(val), var.Read()) == val + assert struct.unpack("I" * len(val), var.Read()) == val if dt == gdal.GDT_Int32: - assert struct.unpack('i' * len(val), var.Read()) == val + assert struct.unpack("i" * len(val), var.Read()) == val if dt == gdal.GDT_UInt64: - assert struct.unpack('Q' * len(val), var.Read()) == val + assert struct.unpack("Q" * len(val), var.Read()) == val if dt == gdal.GDT_Int64: - assert struct.unpack('q' * len(val), var.Read()) == val + assert struct.unpack("q" * len(val), var.Read()) == val if dt == gdal.GDT_Float32: - assert struct.unpack('f' * len(val), var.Read()) == val + assert struct.unpack("f" * len(val), var.Read()) == val if dt == gdal.GDT_Float64: - assert struct.unpack('d' * len(val), var.Read()) == val + assert struct.unpack("d" * len(val), var.Read()) == val if dt == gdal.GDT_CInt16: - assert struct.unpack('h' * len(val), var.Read()) == val + assert struct.unpack("h" * len(val), var.Read()) == val if dt == gdal.GDT_CInt32: - assert struct.unpack('i' * len(val), var.Read()) == val + assert struct.unpack("i" * len(val), var.Read()) == val if dt == gdal.GDT_CFloat32: - assert struct.unpack('f' * len(val), var.Read()) == val + assert struct.unpack("f" * len(val), var.Read()) == val if dt == gdal.GDT_CFloat64: - assert struct.unpack('d' * len(val), var.Read()) == val + assert struct.unpack("d" * len(val), var.Read()) == val # Read byte_var (where nc native type != gdal data type) to other data types - var = rg.OpenMDArray('byte_var') - assert struct.unpack('B' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Byte))) == (0, 0) - assert struct.unpack('i' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int32))) == (-128, -127) + var = rg.OpenMDArray("byte_var") + assert struct.unpack( + "B" * 2, var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + ) == (0, 0) + assert struct.unpack( + "i" * 2, var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + ) == (-128, -127) # Read int_var to other data types - var = rg.OpenMDArray('int_var') - assert struct.unpack('h' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16))) == (-32768, -32768) - assert struct.unpack('f' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32))) == (-2147483648.0, -2147483648.0) - assert struct.unpack('d' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float64))) == (-2147483648.0, -2147483647.0) + var = rg.OpenMDArray("int_var") + assert struct.unpack( + "h" * 2, var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + ) == (-32768, -32768) + assert struct.unpack( + "f" * 2, + var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32)), + ) == (-2147483648.0, -2147483648.0) + assert struct.unpack( + "d" * 2, + var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)), + ) == (-2147483648.0, -2147483647.0) # Read int64_var (where nc native type != gdal data type) to other data types - var = rg.OpenMDArray('int64_var') - assert struct.unpack('h' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Int16))) == (-32768, -32768) - assert struct.unpack('f' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32))) == (-9.223372036854776e+18, -9.223372036854776e+18) - assert struct.unpack('d' * 2, var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float64))) == (-9.223372036854776e+18, -9.223372036854776e+18) - - - var = rg.OpenMDArray('custom_type_2_elts_var') + var = rg.OpenMDArray("int64_var") + assert struct.unpack( + "h" * 2, var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + ) == (-32768, -32768) + assert struct.unpack( + "f" * 2, + var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32)), + ) == (-9.223372036854776e18, -9.223372036854776e18) + assert struct.unpack( + "d" * 2, + var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)), + ) == (-9.223372036854776e18, -9.223372036854776e18) + + var = rg.OpenMDArray("custom_type_2_elts_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 8 - assert dt.GetName() == 'custom_type_2_elts' + assert dt.GetName() == "custom_type_2_elts" comps = dt.GetComponents() assert len(comps) == 2 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 data = var.Read() assert len(data) == 2 * 8 - assert struct.unpack('ihihh', data) == (1, 2, 3, 4, 0) + assert struct.unpack("ihihh", data) == (1, 2, 3, 4, 0) - var = rg.OpenMDArray('custom_type_3_elts_var') + var = rg.OpenMDArray("custom_type_3_elts_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 12 comps = dt.GetComponents() assert len(comps) == 3 - assert comps[0].GetName() == 'x' + assert comps[0].GetName() == "x" assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 - assert comps[1].GetName() == 'y' + assert comps[1].GetName() == "y" assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 - assert comps[2].GetName() == 'z' + assert comps[2].GetName() == "z" assert comps[2].GetOffset() == 8 assert comps[2].GetType().GetNumericDataType() == gdal.GDT_Float32 data = var.Read() assert len(data) == 2 * 12 - assert struct.unpack('ihf' * 2, data) == (1, 2, 3.5, 4, 5, 6.5) + assert struct.unpack("ihf" * 2, data) == (1, 2, 3.5, 4, 5, 6.5) - var = rg.OpenMDArray('string_var') + var = rg.OpenMDArray("string_var") dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_STRING - assert var.Read() == ['abcd', 'ef'] + assert var.Read() == ["abcd", "ef"] - group = rg.OpenGroup('group') - var = group.OpenMDArray('char_var') - assert var.GetFullName() == '/group/char_var' + group = rg.OpenGroup("group") + var = group.OpenMDArray("char_var") + assert var.GetFullName() == "/group/char_var" dims = var.GetDimensions() assert len(dims) == 3 - assert dims[0].GetFullName() == '/Y' + assert dims[0].GetFullName() == "/Y" assert dims[0].GetSize() == 1 - assert dims[1].GetFullName() == '/group/Y' + assert dims[1].GetFullName() == "/group/Y" assert dims[1].GetSize() == 2 - assert dims[2].GetFullName() == '/group/X' + assert dims[2].GetFullName() == "/group/X" assert dims[2].GetSize() == 3 dims = rg.GetDimensions() - assert [dims[i].GetFullName() for i in range(len(dims))] == ['/Y', '/X', '/Y2', '/X2', '/Z2', '/T2'] + assert [dims[i].GetFullName() for i in range(len(dims))] == [ + "/Y", + "/X", + "/Y2", + "/X2", + "/Z2", + "/T2", + ] dims = group.GetDimensions() - assert [dims[i].GetFullName() for i in range(len(dims))] == ['/group/Y', '/group/X'] + assert [dims[i].GetFullName() for i in range(len(dims))] == ["/group/Y", "/group/X"] def test_netcdf_multidim_2d_dim_char_variable(): - ds = gdal.OpenEx('data/netcdf/2d_dim_char_variable.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/2d_dim_char_variable.nc", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - var = rg.OpenMDArray('TIME') + var = rg.OpenMDArray("TIME") assert var.GetDataType().GetClass() == gdal.GEDTC_STRING assert var.GetDataType().GetMaxStringLength() == 16 assert var.GetDimensionCount() == 1 dims = var.GetDimensions() assert len(dims) == 1 - assert dims[0].GetName() == 'TIME' - assert var.Read() == ['2019-06-29', '2019-06-30'] + assert dims[0].GetName() == "TIME" + assert var.Read() == ["2019-06-29", "2019-06-30"] indexing_var = rg.GetDimensions()[0].GetIndexingVariable() assert indexing_var - assert indexing_var.GetName() == 'TIME' + assert indexing_var.GetName() == "TIME" def test_netcdf_multidim_read_array(): - ds = gdal.OpenEx('data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() # 0D - var = rg.OpenMDArray('ubyte_no_dim_var') + var = rg.OpenMDArray("ubyte_no_dim_var") assert var - assert struct.unpack('B', var.Read()) == (2,) - assert struct.unpack('H', var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16))) == (2,) + assert struct.unpack("B", var.Read()) == (2,) + assert struct.unpack( + "H", var.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) + ) == (2,) # 1D - var = rg.OpenMDArray('ubyte_x2_var') - data = var.Read(array_start_idx = [1], count = [2], array_step = [2]) + var = rg.OpenMDArray("ubyte_x2_var") + data = var.Read(array_start_idx=[1], count=[2], array_step=[2]) got_data_ref = (2, 4) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1], count = [2], array_step = [2], - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1], + count=[2], + array_step=[2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [2], count = [2], array_step = [-2]) + data = var.Read(array_start_idx=[2], count=[2], array_step=[-2]) got_data_ref = (3, 1) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref # 2D - var = rg.OpenMDArray('ubyte_y2_x2_var') - data = var.Read(count = [2, 3], array_step = [2, 1]) + var = rg.OpenMDArray("ubyte_y2_x2_var") + data = var.Read(count=[2, 3], array_step=[2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(count = [2, 3], array_step = [2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + count=[2, 3], + array_step=[2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [1, 2], count = [2, 2]) + data = var.Read(array_start_idx=[1, 2], count=[2, 2]) got_data_ref = (7, 8, 11, 12) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1, 2], count = [2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1, 2], + count=[2, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref # 3D - var = rg.OpenMDArray('ubyte_z2_y2_x2_var') - data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1]) + var = rg.OpenMDArray("ubyte_z2_y2_x2_var") + data = var.Read(count=[3, 2, 3], array_step=[1, 2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + count=[3, 2, 3], + array_step=[1, 2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref - data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2]) + data = var.Read(array_start_idx=[1, 1, 1], count=[3, 2, 2]) got_data_ref = (7, 8, 11, 12, 8, 9, 12, 1, 9, 10, 1, 2) - assert struct.unpack('B' * len(data), data) == got_data_ref + assert struct.unpack("B" * len(data), data) == got_data_ref - data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + data = var.Read( + array_start_idx=[1, 1, 1], + count=[3, 2, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref # Test reading from slice (most optimized path) - data = var.Read(array_start_idx = [3, 0, 0], count = [1, 2, 3]) - data_from_slice = var[3].Read(count = [2, 3]) + data = var.Read(array_start_idx=[3, 0, 0], count=[1, 2, 3]) + data_from_slice = var[3].Read(count=[2, 3]) assert data_from_slice == data # Test reading from slice (slower path) - data = var.Read(array_start_idx = [3, 0, 0], count = [1, 2, 3], array_step = [1, 2, 1]) - data_from_slice = var[3].Read(count = [2, 3], array_step = [2, 1]) + data = var.Read(array_start_idx=[3, 0, 0], count=[1, 2, 3], array_step=[1, 2, 1]) + data_from_slice = var[3].Read(count=[2, 3], array_step=[2, 1]) assert data_from_slice == data # 4D - var = rg.OpenMDArray('ubyte_t2_z2_y2_x2_var') - data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1]) - got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 4, 5, 6, 12, 1, 2) - assert struct.unpack('B' * len(data), data) == got_data_ref - - data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) - assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref + var = rg.OpenMDArray("ubyte_t2_z2_y2_x2_var") + data = var.Read(count=[2, 3, 2, 3], array_step=[1, 1, 2, 1]) + got_data_ref = ( + 1, + 2, + 3, + 9, + 10, + 11, + 2, + 3, + 4, + 10, + 11, + 12, + 3, + 4, + 5, + 11, + 12, + 1, + 2, + 3, + 4, + 10, + 11, + 12, + 3, + 4, + 5, + 11, + 12, + 1, + 4, + 5, + 6, + 12, + 1, + 2, + ) + assert struct.unpack("B" * len(data), data) == got_data_ref + + data = var.Read( + count=[2, 3, 2, 3], + array_step=[1, 1, 2, 1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_UInt16), + ) + assert struct.unpack("H" * (len(data) // 2), data) == got_data_ref def test_netcdf_multidim_attr_alldatatypes(): - ds = gdal.OpenEx('data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/alldatatypes.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() attrs = rg.GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'global_attr' + assert attrs[0].GetName() == "global_attr" - attrs = rg.OpenGroup('group').GetAttributes() + attrs = rg.OpenGroup("group").GetAttributes() assert len(attrs) == 1 - assert attrs[0].GetName() == 'group_global_attr' + assert attrs[0].GetName() == "group_global_attr" - var = rg.OpenMDArray('ubyte_var') + var = rg.OpenMDArray("ubyte_var") assert var attrs = var.GetAttributes() assert len(attrs) == 30 @@ -438,171 +540,193 @@ def test_netcdf_multidim_attr_alldatatypes(): for attr in attrs: map_attrs[attr.GetName()] = attr - attr = map_attrs['attr_byte'] + attr = map_attrs["attr_byte"] assert attr.GetDimensionCount() == 0 assert len(attr.GetDimensionsSize()) == 0 assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Int16 assert attr.Read() == -128 - assert map_attrs['attr_ubyte'].Read() == 255 + assert map_attrs["attr_ubyte"].Read() == 255 - assert map_attrs['attr_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_char'].GetDimensionCount() == 0 - assert map_attrs['attr_char'].Read() == 'x' - assert map_attrs['attr_char'].ReadAsStringArray() == ['x'] + assert map_attrs["attr_char"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_char"].GetDimensionCount() == 0 + assert map_attrs["attr_char"].Read() == "x" + assert map_attrs["attr_char"].ReadAsStringArray() == ["x"] with gdaltest.error_handler(): - assert not map_attrs['attr_char'].ReadAsRaw() + assert not map_attrs["attr_char"].ReadAsRaw() - assert map_attrs['attr_string_as_repeated_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_string_as_repeated_char'].GetDimensionCount() == 0 - assert map_attrs['attr_string_as_repeated_char'].Read() == 'xy' - assert map_attrs['attr_string_as_repeated_char'].ReadAsStringArray() == ['xy'] + assert ( + map_attrs["attr_string_as_repeated_char"].GetDataType().GetClass() + == gdal.GEDTC_STRING + ) + assert map_attrs["attr_string_as_repeated_char"].GetDimensionCount() == 0 + assert map_attrs["attr_string_as_repeated_char"].Read() == "xy" + assert map_attrs["attr_string_as_repeated_char"].ReadAsStringArray() == ["xy"] - assert map_attrs['attr_empty_char'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_empty_char'].GetDimensionCount() == 0 - assert map_attrs['attr_empty_char'].Read() == '' + assert map_attrs["attr_empty_char"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_empty_char"].GetDimensionCount() == 0 + assert map_attrs["attr_empty_char"].Read() == "" - assert map_attrs['attr_two_strings'].GetDataType().GetClass() == gdal.GEDTC_STRING - assert map_attrs['attr_two_strings'].GetDimensionCount() == 1 - assert map_attrs['attr_two_strings'].GetDimensionsSize()[0] == 2 - assert map_attrs['attr_two_strings'].Read() == ['ab', 'cd'] - assert map_attrs['attr_two_strings'].ReadAsString() == 'ab' + assert map_attrs["attr_two_strings"].GetDataType().GetClass() == gdal.GEDTC_STRING + assert map_attrs["attr_two_strings"].GetDimensionCount() == 1 + assert map_attrs["attr_two_strings"].GetDimensionsSize()[0] == 2 + assert map_attrs["attr_two_strings"].Read() == ["ab", "cd"] + assert map_attrs["attr_two_strings"].ReadAsString() == "ab" - assert map_attrs['attr_int'].Read() == -2147483647 + assert map_attrs["attr_int"].Read() == -2147483647 - assert map_attrs['attr_float'].Read() == 1.25 + assert map_attrs["attr_float"].Read() == 1.25 - assert map_attrs['attr_double'].Read() == 1.25125 - assert map_attrs['attr_double'].ReadAsDoubleArray() == (1.25125,) + assert map_attrs["attr_double"].Read() == 1.25125 + assert map_attrs["attr_double"].ReadAsDoubleArray() == (1.25125,) - assert map_attrs['attr_int64'].Read() == -9.223372036854776e+18 + assert map_attrs["attr_int64"].Read() == -9.223372036854776e18 - assert map_attrs['attr_uint64'].Read() == 1.8446744073709552e+19 + assert map_attrs["attr_uint64"].Read() == 1.8446744073709552e19 - assert map_attrs['attr_complex_int16'].GetDataType().GetNumericDataType() == gdal.GDT_CInt16 - assert map_attrs['attr_complex_int16'].Read() == 1.0 - assert map_attrs['attr_complex_int16'].ReadAsString() == '1+2j' + assert ( + map_attrs["attr_complex_int16"].GetDataType().GetNumericDataType() + == gdal.GDT_CInt16 + ) + assert map_attrs["attr_complex_int16"].Read() == 1.0 + assert map_attrs["attr_complex_int16"].ReadAsString() == "1+2j" - assert map_attrs['attr_two_bytes'].Read() == (-128, -127) + assert map_attrs["attr_two_bytes"].Read() == (-128, -127) - assert map_attrs['attr_two_ints'].Read() == (-2147483648, -2147483647) + assert map_attrs["attr_two_ints"].Read() == (-2147483648, -2147483647) - assert map_attrs['attr_two_doubles'].GetDataType().GetNumericDataType() == gdal.GDT_Float64 - assert map_attrs['attr_two_doubles'].GetDimensionCount() == 1 - assert map_attrs['attr_two_doubles'].GetDimensionsSize()[0] == 2 - assert map_attrs['attr_two_doubles'].Read() == (1.25125, 2.125125) - assert map_attrs['attr_two_doubles'].ReadAsDouble() == 1.25125 + assert ( + map_attrs["attr_two_doubles"].GetDataType().GetNumericDataType() + == gdal.GDT_Float64 + ) + assert map_attrs["attr_two_doubles"].GetDimensionCount() == 1 + assert map_attrs["attr_two_doubles"].GetDimensionsSize()[0] == 2 + assert map_attrs["attr_two_doubles"].Read() == (1.25125, 2.125125) + assert map_attrs["attr_two_doubles"].ReadAsDouble() == 1.25125 - assert map_attrs['attr_enum_ubyte'].GetDataType().GetNumericDataType() == gdal.GDT_Byte - assert map_attrs['attr_enum_ubyte'].Read() == 1 + assert ( + map_attrs["attr_enum_ubyte"].GetDataType().GetNumericDataType() == gdal.GDT_Byte + ) + assert map_attrs["attr_enum_ubyte"].Read() == 1 - assert map_attrs['attr_enum_int'].GetDataType().GetNumericDataType() == gdal.GDT_Int32 - assert map_attrs['attr_enum_int'].Read() == 1000000001 + assert ( + map_attrs["attr_enum_int"].GetDataType().GetNumericDataType() == gdal.GDT_Int32 + ) + assert map_attrs["attr_enum_int"].Read() == 1000000001 - assert len(map_attrs['attr_custom_type_2_elts'].ReadAsRaw()) == 8 + assert len(map_attrs["attr_custom_type_2_elts"].ReadAsRaw()) == 8 # Compound type contains a string with gdaltest.error_handler(): - assert not map_attrs['attr_custom_with_string'].ReadAsRaw() + assert not map_attrs["attr_custom_with_string"].ReadAsRaw() + def test_netcdf_multidim_read_projection(): - ds = gdal.OpenEx('data/netcdf/cf_lcc1sp.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/cf_lcc1sp.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - var = rg.OpenMDArray('Total_cloud_cover') + var = rg.OpenMDArray("Total_cloud_cover") srs = var.GetSpatialRef() assert srs assert srs.GetDataAxisToSRSAxisMapping() == [3, 2] - lat_origin = srs.GetProjParm('latitude_of_origin') + lat_origin = srs.GetProjParm("latitude_of_origin") - assert lat_origin == 25, ('Latitude of origin does not match expected:\n%f' - % lat_origin) + assert lat_origin == 25, ( + "Latitude of origin does not match expected:\n%f" % lat_origin + ) - dim_x = next((x for x in var.GetDimensions() if x.GetName() == 'x'), None) + dim_x = next((x for x in var.GetDimensions() if x.GetName() == "x"), None) assert dim_x assert dim_x.GetType() == gdal.DIM_TYPE_HORIZONTAL_X - dim_y = next((x for x in var.GetDimensions() if x.GetName() == 'y'), None) + dim_y = next((x for x in var.GetDimensions() if x.GetName() == "y"), None) assert dim_y assert dim_y.GetType() == gdal.DIM_TYPE_HORIZONTAL_Y + ############################################################################### # Test reading a netCDF file whose grid_mapping attribute uses an # expanded form + def test_netcdf_multidim_expanded_form_of_grid_mapping(): - ds = gdal.OpenEx('data/netcdf/expanded_form_of_grid_mapping.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "data/netcdf/expanded_form_of_grid_mapping.nc", gdal.OF_MULTIDIM_RASTER + ) rg = ds.GetRootGroup() - var = rg.OpenMDArray('temp') + var = rg.OpenMDArray("temp") sr = var.GetSpatialRef() assert sr - assert 'Transverse_Mercator' in sr.ExportToWkt() + assert "Transverse_Mercator" in sr.ExportToWkt() def test_netcdf_multidim_read_netcdf_4d(): - ds = gdal.OpenEx('data/netcdf/netcdf-4d.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/netcdf-4d.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - var = rg.OpenMDArray('t') + var = rg.OpenMDArray("t") assert not var.GetSpatialRef() - dim_x = next((x for x in var.GetDimensions() if x.GetName() == 'longitude'), None) + dim_x = next((x for x in var.GetDimensions() if x.GetName() == "longitude"), None) assert dim_x assert dim_x.GetType() == gdal.DIM_TYPE_HORIZONTAL_X - dim_y = next((x for x in var.GetDimensions() if x.GetName() == 'latitude'), None) + dim_y = next((x for x in var.GetDimensions() if x.GetName() == "latitude"), None) assert dim_y assert dim_y.GetType() == gdal.DIM_TYPE_HORIZONTAL_Y - dim_time = next((x for x in var.GetDimensions() if x.GetName() == 'time'), None) + dim_time = next((x for x in var.GetDimensions() if x.GetName() == "time"), None) assert dim_time assert dim_time.GetType() == gdal.DIM_TYPE_TEMPORAL def test_netcdf_multidim_create_nc3(): - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") with gdaltest.error_handler(): - assert not drv.CreateMultiDimensional('/i_do/not_exist.nc') + assert not drv.CreateMultiDimensional("/i_do/not_exist.nc") def f(): - ds = drv.CreateMultiDimensional('tmp/multidim_nc3.nc', [], ['FORMAT=NC']) + ds = drv.CreateMultiDimensional("tmp/multidim_nc3.nc", [], ["FORMAT=NC"]) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetStructuralInfo() == {'NC_FORMAT': 'CLASSIC'} + assert rg.GetStructuralInfo() == {"NC_FORMAT": "CLASSIC"} assert not rg.GetDimensions() # not support on NC3 with gdaltest.error_handler(): assert not rg.CreateGroup("subgroup") - dim_x = rg.CreateDimension('X', None, None, 2) + dim_x = rg.CreateDimension("X", None, None, 2) assert dim_x - assert dim_x.GetName() == 'X' + assert dim_x.GetName() == "X" assert dim_x.GetSize() == 2 - dim_y_unlimited = rg.CreateDimension('Y', None, None, 123, ['UNLIMITED=YES']) + dim_y_unlimited = rg.CreateDimension("Y", None, None, 123, ["UNLIMITED=YES"]) assert dim_y_unlimited assert dim_y_unlimited.GetSize() == 123 with gdaltest.error_handler(): - assert not rg.CreateDimension('unlimited2', None, None, 123, ['UNLIMITED=YES']) + assert not rg.CreateDimension( + "unlimited2", None, None, 123, ["UNLIMITED=YES"] + ) with gdaltest.error_handler(): - assert not rg.CreateDimension('too_big', None, None, (1 << 31) - 1) + assert not rg.CreateDimension("too_big", None, None, (1 << 31) - 1) - var = rg.CreateMDArray('my_var_no_dim', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + var = rg.CreateMDArray( + "my_var_no_dim", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert var assert var.SetNoDataValueDouble(1) == gdal.CE_None - assert struct.unpack('d', var.Read()) == (1, ) + assert struct.unpack("d", var.Read()) == (1,) assert var.GetNoDataValueAsDouble() == 1 assert var.DeleteNoDataValue() == gdal.CE_None assert var.GetNoDataValueAsRaw() is None - assert var.Write(struct.pack('d', 1.25125)) == gdal.CE_None - assert struct.unpack('d', var.Read()) == (1.25125,) + assert var.Write(struct.pack("d", 1.25125)) == gdal.CE_None + assert struct.unpack("d", var.Read()) == (1.25125,) assert var.SetScale(2.5) == gdal.CE_None assert var.GetScale() == 2.5 assert var.GetScaleStorageType() == gdal.GDT_Float64 @@ -611,79 +735,101 @@ def f(): assert var.GetOffsetStorageType() == gdal.GDT_Float64 var.SetUnit("foo") - var = rg.OpenMDArray('my_var_no_dim') + var = rg.OpenMDArray("my_var_no_dim") assert var.GetUnit() == "foo" - var = rg.CreateMDArray('my_var_x', [dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + var = rg.CreateMDArray( + "my_var_x", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert var - var = rg.OpenMDArray('my_var_x') + var = rg.OpenMDArray("my_var_x") assert var assert var.GetDimensionCount() == 1 assert var.GetDimensions()[0].GetSize() == 2 - assert struct.unpack('d' * 2, var.Read()) == (9.969209968386869e+36, 9.969209968386869e+36) - - var = rg.CreateMDArray('my_var_with_unlimited', [dim_y_unlimited, dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + assert struct.unpack("d" * 2, var.Read()) == ( + 9.969209968386869e36, + 9.969209968386869e36, + ) + + var = rg.CreateMDArray( + "my_var_with_unlimited", + [dim_y_unlimited, dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) assert var - var = rg.OpenMDArray('my_var_with_unlimited') + var = rg.OpenMDArray("my_var_with_unlimited") assert var assert var.GetDimensionCount() == 2 assert var.GetDimensions()[0].GetSize() == 0 assert var.GetDimensions()[1].GetSize() == 2 - att = rg.CreateAttribute('att_text', [], gdal.ExtendedDataType.CreateString()) + att = rg.CreateAttribute("att_text", [], gdal.ExtendedDataType.CreateString()) assert att with gdaltest.error_handler(): assert not att.Read() - assert att.Write('f') == gdal.CE_None - assert att.Write('foo') == gdal.CE_None - assert att.Read() == 'foo' - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) - assert att.Read() == 'foo' + assert att.Write("f") == gdal.CE_None + assert att.Write("foo") == gdal.CE_None + assert att.Read() == "foo" + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert att.Read() == "foo" # netCDF 3 cannot support NC_STRING. Needs fixed size strings with gdaltest.error_handler(): - var = rg.CreateMDArray('my_var_string_array', [dim_x], gdal.ExtendedDataType.CreateString()) + var = rg.CreateMDArray( + "my_var_string_array", [dim_x], gdal.ExtendedDataType.CreateString() + ) assert not var string_type = gdal.ExtendedDataType.CreateString(10) - var = rg.CreateMDArray('my_var_string_array_fixed_width', [dim_x], string_type) + var = rg.CreateMDArray("my_var_string_array_fixed_width", [dim_x], string_type) assert var assert var.GetDimensionCount() == 1 - assert var.Write(['', '0123456789truncated']) == gdal.CE_None - var = rg.OpenMDArray('my_var_string_array_fixed_width') + assert var.Write(["", "0123456789truncated"]) == gdal.CE_None + var = rg.OpenMDArray("my_var_string_array_fixed_width") assert var - assert var.Read() == ['', '0123456789'] - assert var.Write(['foo'], array_start_idx = [1]) == gdal.CE_None - assert var.Read() == ['', 'foo'] + assert var.Read() == ["", "0123456789"] + assert var.Write(["foo"], array_start_idx=[1]) == gdal.CE_None + assert var.Read() == ["", "foo"] f() def f2(): - ds = gdal.OpenEx('tmp/multidim_nc3.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc3.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() assert rg - att = next((x for x in rg.GetAttributes() if x.GetName() == 'att_text'), None) + att = next((x for x in rg.GetAttributes() if x.GetName() == "att_text"), None) # Test correct switching to define mode due to attribute value being longer - assert att.Write('rewritten_attribute') == gdal.CE_None - assert att.Read() == 'rewritten_attribute' + assert att.Write("rewritten_attribute") == gdal.CE_None + assert att.Read() == "rewritten_attribute" f2() def create_georeferenced(): - ds = gdal.OpenEx('tmp/multidim_nc3.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc3.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() - dim_y = rg.CreateDimension('my_y', gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) - dim_x = rg.CreateDimension('my_x', gdal.DIM_TYPE_HORIZONTAL_X, None, 3) - var_y = rg.CreateMDArray('my_y', [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var_x = rg.CreateMDArray('my_x', [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var = rg.CreateMDArray('my_georeferenced_var', [dim_y, dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dim_y = rg.CreateDimension("my_y", gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) + dim_x = rg.CreateDimension("my_x", gdal.DIM_TYPE_HORIZONTAL_X, None, 3) + var_y = rg.CreateMDArray( + "my_y", [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var_x = rg.CreateMDArray( + "my_x", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var = rg.CreateMDArray( + "my_georeferenced_var", + [dim_y, dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) assert var assert var.GetDimensions()[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y srs = osr.SpatialReference() @@ -691,27 +837,28 @@ def create_georeferenced(): assert var.SetSpatialRef(srs) == gdal.CE_None got_srs = var.GetSpatialRef() assert got_srs - assert '32631' in got_srs.ExportToWkt() - assert var_x.GetAttribute('standard_name').Read() == 'projection_x_coordinate' - assert var_y.GetAttribute('standard_name').Read() == 'projection_y_coordinate' + assert "32631" in got_srs.ExportToWkt() + assert var_x.GetAttribute("standard_name").Read() == "projection_x_coordinate" + assert var_y.GetAttribute("standard_name").Read() == "projection_y_coordinate" create_georeferenced() - gdal.Unlink('tmp/multidim_nc3.nc') + gdal.Unlink("tmp/multidim_nc3.nc") def test_netcdf_multidim_create_nc4(): - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") + def f(): - ds = drv.CreateMultiDimensional('tmp/multidim_nc4.nc') + ds = drv.CreateMultiDimensional("tmp/multidim_nc4.nc") assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetStructuralInfo() == {'NC_FORMAT': 'NETCDF4'} + assert rg.GetStructuralInfo() == {"NC_FORMAT": "NETCDF4"} subgroup = rg.CreateGroup("subgroup") assert subgroup - assert subgroup.GetName() == 'subgroup' + assert subgroup.GetName() == "subgroup" with gdaltest.error_handler(): assert not rg.CreateGroup("") @@ -722,22 +869,25 @@ def f(): subgroup = rg.OpenGroup("subgroup") assert subgroup - dim1 = subgroup.CreateDimension('unlimited1', None, None, 1, ['UNLIMITED=YES']) + dim1 = subgroup.CreateDimension("unlimited1", None, None, 1, ["UNLIMITED=YES"]) assert dim1 - dim2 = subgroup.CreateDimension('unlimited2', None, None, 2, ['UNLIMITED=YES']) + dim2 = subgroup.CreateDimension("unlimited2", None, None, 2, ["UNLIMITED=YES"]) assert dim2 - var = rg.CreateMDArray('my_var_no_dim', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['BLOCKSIZE=']) + var = rg.CreateMDArray( + "my_var_no_dim", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["BLOCKSIZE="], + ) assert var assert var.SetNoDataValueDouble(1) == gdal.CE_None - assert struct.unpack('d', var.Read()) == (1, ) + assert struct.unpack("d", var.Read()) == (1,) assert var.GetNoDataValueAsDouble() == 1 assert var.DeleteNoDataValue() == gdal.CE_None assert var.GetNoDataValueAsRaw() is None - assert var.Write(struct.pack('d', 1.25125)) == gdal.CE_None - assert struct.unpack('d', var.Read()) == (1.25125,) + assert var.Write(struct.pack("d", 1.25125)) == gdal.CE_None + assert struct.unpack("d", var.Read()) == (1.25125,) assert var.SetScale(2.5, gdal.GDT_Float32) == gdal.CE_None assert var.GetScale() == 2.5 assert var.GetScaleStorageType() == gdal.GDT_Float32 @@ -749,54 +899,68 @@ def f(): assert var.SetOffset(-1.5) == gdal.CE_None assert var.GetOffset() == -1.5 - dim_x = rg.CreateDimension('X', None, None, 2) + dim_x = rg.CreateDimension("X", None, None, 2) assert dim_x - assert dim_x.GetName() == 'X' - assert dim_x.GetType() == '' + assert dim_x.GetName() == "X" + assert dim_x.GetType() == "" assert dim_x.GetSize() == 2 - var = rg.CreateMDArray('my_var_x', [dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['BLOCKSIZE=1', 'COMPRESS=DEFLATE', 'ZLEVEL=6', - 'CHECKSUM=YES']) - assert var.Write(struct.pack('f' * 2, 1.25, 2.25), - buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)) == gdal.CE_None - assert struct.unpack('d' * 2, var.Read()) == (1.25, 2.25) - assert var.Write(struct.pack('d' * 2, 1.25125, 2.25125)) == gdal.CE_None + var = rg.CreateMDArray( + "my_var_x", + [dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["BLOCKSIZE=1", "COMPRESS=DEFLATE", "ZLEVEL=6", "CHECKSUM=YES"], + ) + assert ( + var.Write( + struct.pack("f" * 2, 1.25, 2.25), + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float32), + ) + == gdal.CE_None + ) + assert struct.unpack("d" * 2, var.Read()) == (1.25, 2.25) + assert var.Write(struct.pack("d" * 2, 1.25125, 2.25125)) == gdal.CE_None assert var assert var.GetBlockSize() == [1] - assert var.GetStructuralInfo() == { 'COMPRESS': 'DEFLATE' } + assert var.GetStructuralInfo() == {"COMPRESS": "DEFLATE"} # Try with random filter id. Just to test that FILTER is taken # into account with gdaltest.error_handler(): - var = rg.CreateMDArray('my_var_x', [dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['FILTER=123456789,2']) + var = rg.CreateMDArray( + "my_var_x", + [dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["FILTER=123456789,2"], + ) assert var is None - var = rg.OpenMDArray('my_var_x') + var = rg.OpenMDArray("my_var_x") assert var assert var.GetDimensionCount() == 1 assert var.GetDimensions()[0].GetSize() == 2 - assert struct.unpack('d' * 2, var.Read()) == (1.25125, 2.25125) + assert struct.unpack("d" * 2, var.Read()) == (1.25125, 2.25125) def dims_from_non_netcdf(rg): - dim_z = rg.CreateDimension('Z', None, None, 4) + dim_z = rg.CreateDimension("Z", None, None, 4) - mem_ds = gdal.GetDriverByName('MEM').CreateMultiDimensional('myds') + mem_ds = gdal.GetDriverByName("MEM").CreateMultiDimensional("myds") mem_rg = mem_ds.GetRootGroup() # the netCDF file has already a X variable of size 2 - dim_x_from_mem = mem_rg.CreateDimension('X', None, None, 2) + dim_x_from_mem = mem_rg.CreateDimension("X", None, None, 2) # the netCDF file has no Y variable - dim_y_from_mem = mem_rg.CreateDimension('Y', None, None, 3) + dim_y_from_mem = mem_rg.CreateDimension("Y", None, None, 3) # the netCDF file has already a Z variable, but of a different size - dim_z_from_mem = mem_rg.CreateDimension('Z', None, None, dim_z.GetSize() + 1) + dim_z_from_mem = mem_rg.CreateDimension( + "Z", None, None, dim_z.GetSize() + 1 + ) with gdaltest.error_handler(): - var = rg.CreateMDArray('my_var_x_y', - [dim_x_from_mem, dim_y_from_mem, dim_z_from_mem], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + var = rg.CreateMDArray( + "my_var_x_y", + [dim_x_from_mem, dim_y_from_mem, dim_z_from_mem], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) assert var assert var.GetDimensionCount() == 3 assert var.GetDimensions()[0].GetSize() == 2 @@ -805,17 +969,24 @@ def dims_from_non_netcdf(rg): dims_from_non_netcdf(rg) - for dt in (gdal.GDT_Byte, - gdal.GDT_Int16, gdal.GDT_UInt16, - gdal.GDT_Int32, gdal.GDT_UInt32, - gdal.GDT_Int64, gdal.GDT_UInt64, - gdal.GDT_Float32, - gdal.GDT_Float64, gdal.GDT_CInt16, gdal.GDT_CInt32, - gdal.GDT_CFloat32, gdal.GDT_CFloat64): - - varname = 'my_var_' + gdal.GetDataTypeName(dt) - var = rg.CreateMDArray(varname, [dim_x], - gdal.ExtendedDataType.Create(dt)) + for dt in ( + gdal.GDT_Byte, + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Int64, + gdal.GDT_UInt64, + gdal.GDT_Float32, + gdal.GDT_Float64, + gdal.GDT_CInt16, + gdal.GDT_CInt32, + gdal.GDT_CFloat32, + gdal.GDT_CFloat64, + ): + + varname = "my_var_" + gdal.GetDataTypeName(dt) + var = rg.CreateMDArray(varname, [dim_x], gdal.ExtendedDataType.Create(dt)) assert var var = rg.OpenMDArray(varname) assert var @@ -823,225 +994,321 @@ def dims_from_non_netcdf(rg): # Check good behaviour when complex data type already registered dt = gdal.GDT_CFloat32 - varname = 'my_var_' + gdal.GetDataTypeName(dt) + "_bis" - var = rg.CreateMDArray(varname, [dim_x], - gdal.ExtendedDataType.Create(dt)) + varname = "my_var_" + gdal.GetDataTypeName(dt) + "_bis" + var = rg.CreateMDArray(varname, [dim_x], gdal.ExtendedDataType.Create(dt)) assert var assert var.GetNoDataValueAsRaw() is None - assert var.SetNoDataValueRaw(struct.pack('ff', 3.5, 4.5)) == gdal.CE_None - assert struct.unpack('ff', var.GetNoDataValueAsRaw()) == (3.5, 4.5) - assert var.Write(struct.pack('ff' * 2, -1.25, 1.25, 2.5, -2.5)) == gdal.CE_None - assert struct.unpack('ff' * 2, var.Read()) == (-1.25, 1.25, 2.5, -2.5) + assert var.SetNoDataValueRaw(struct.pack("ff", 3.5, 4.5)) == gdal.CE_None + assert struct.unpack("ff", var.GetNoDataValueAsRaw()) == (3.5, 4.5) + assert var.Write(struct.pack("ff" * 2, -1.25, 1.25, 2.5, -2.5)) == gdal.CE_None + assert struct.unpack("ff" * 2, var.Read()) == (-1.25, 1.25, 2.5, -2.5) var = rg.OpenMDArray(varname) assert var assert var.GetDataType().GetNumericDataType() == dt - var = rg.CreateMDArray('var_as_nc_byte', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), ['NC_TYPE=NC_BYTE']) + var = rg.CreateMDArray( + "var_as_nc_byte", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_BYTE"], + ) assert var.GetDataType().GetNumericDataType() == gdal.GDT_Int16 assert var.GetNoDataValueAsRaw() is None assert var.SetNoDataValueDouble(-127) == gdal.CE_None - assert struct.unpack('h', var.GetNoDataValueAsRaw()) == (-127, ) + assert struct.unpack("h", var.GetNoDataValueAsRaw()) == (-127,) assert var.GetNoDataValueAsDouble() == -127 - assert var.Write(struct.pack('h', -128)) == gdal.CE_None - assert struct.unpack('h', var.Read()) == (-128, ) - - var = rg.CreateMDArray('var_as_nc_int64', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), ['NC_TYPE=NC_INT64']) + assert var.Write(struct.pack("h", -128)) == gdal.CE_None + assert struct.unpack("h", var.Read()) == (-128,) + + var = rg.CreateMDArray( + "var_as_nc_int64", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_INT64"], + ) assert var.GetDataType().GetNumericDataType() == gdal.GDT_Int64 - assert var.Write(struct.pack('q', -1234567890123)) == gdal.CE_None - assert struct.unpack('q', var.Read()) == (-1234567890123, ) - - var = rg.CreateMDArray('var_as_nc_uint64', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), ['NC_TYPE=NC_UINT64']) + assert var.Write(struct.pack("q", -1234567890123)) == gdal.CE_None + assert struct.unpack("q", var.Read()) == (-1234567890123,) + + var = rg.CreateMDArray( + "var_as_nc_uint64", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_UINT64"], + ) assert var.GetDataType().GetNumericDataType() == gdal.GDT_UInt64 - assert var.Write(struct.pack('Q', 1234567890123)) == gdal.CE_None - assert struct.unpack('Q', var.Read()) == (1234567890123, ) + assert var.Write(struct.pack("Q", 1234567890123)) == gdal.CE_None + assert struct.unpack("Q", var.Read()) == (1234567890123,) # Test creation of compound data type - comp0 = gdal.EDTComponent.Create('x', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - comp1 = gdal.EDTComponent.Create('y', 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) - compound_dt = gdal.ExtendedDataType.CreateCompound("mycompoundtype", 8, [comp0, comp1]) - - var = rg.CreateMDArray('var_with_compound_type', [dim_x], compound_dt) + comp0 = gdal.EDTComponent.Create( + "x", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16) + ) + comp1 = gdal.EDTComponent.Create( + "y", 4, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) + compound_dt = gdal.ExtendedDataType.CreateCompound( + "mycompoundtype", 8, [comp0, comp1] + ) + + var = rg.CreateMDArray("var_with_compound_type", [dim_x], compound_dt) assert var - assert var.Write(struct.pack('hi', -128, -12345678), count = [1]) == gdal.CE_None - assert struct.unpack('hi' * 2, var.Read()) == (-128, -12345678, 0, 0) - - extract_compound_dt = gdal.ExtendedDataType.CreateCompound("mytype", 4, - [gdal.EDTComponent.Create('y', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32))]) - got_data = var.Read(buffer_datatype = extract_compound_dt) + assert var.Write(struct.pack("hi", -128, -12345678), count=[1]) == gdal.CE_None + assert struct.unpack("hi" * 2, var.Read()) == (-128, -12345678, 0, 0) + + extract_compound_dt = gdal.ExtendedDataType.CreateCompound( + "mytype", + 4, + [ + gdal.EDTComponent.Create( + "y", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) + ], + ) + got_data = var.Read(buffer_datatype=extract_compound_dt) assert len(got_data) == 8 - assert struct.unpack('i' * 2, got_data) == (-12345678, 0) + assert struct.unpack("i" * 2, got_data) == (-12345678, 0) - var = rg.CreateMDArray('another_var_with_compound_type', [dim_x], compound_dt) + var = rg.CreateMDArray("another_var_with_compound_type", [dim_x], compound_dt) assert var - var = rg.OpenMDArray('another_var_with_compound_type') + var = rg.OpenMDArray("another_var_with_compound_type") assert var.GetDataType().Equals(compound_dt) # Attribute on variable - att = var.CreateAttribute('var_att_text', [], gdal.ExtendedDataType.CreateString()) + att = var.CreateAttribute( + "var_att_text", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('foo_of_var') == gdal.CE_None - att = next((x for x in var.GetAttributes() if x.GetName() == att.GetName()), None) - assert att.Read() == 'foo_of_var' + assert att.Write("foo_of_var") == gdal.CE_None + att = next( + (x for x in var.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert att.Read() == "foo_of_var" with gdaltest.error_handler(): - assert not rg.CreateAttribute('attr_too_many_dimensions', [2, 3], gdal.ExtendedDataType.CreateString()) + assert not rg.CreateAttribute( + "attr_too_many_dimensions", [2, 3], gdal.ExtendedDataType.CreateString() + ) - att = rg.CreateAttribute('att_text', [], gdal.ExtendedDataType.CreateString()) + att = rg.CreateAttribute("att_text", [], gdal.ExtendedDataType.CreateString()) assert att - assert att.Write('first_write') == gdal.CE_None - assert att.Read() == 'first_write' + assert att.Write("first_write") == gdal.CE_None + assert att.Read() == "first_write" assert att.Write(123) == gdal.CE_None - assert att.Read() == '123' - assert att.Write('foo') == gdal.CE_None - assert att.Read() == 'foo' - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) - assert att.Read() == 'foo' - - att = rg.CreateAttribute('att_string', [], gdal.ExtendedDataType.CreateString(), - ['NC_TYPE=NC_STRING']) + assert att.Read() == "123" + assert att.Write("foo") == gdal.CE_None + assert att.Read() == "foo" + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert att.Read() == "foo" + + att = rg.CreateAttribute( + "att_string", + [], + gdal.ExtendedDataType.CreateString(), + ["NC_TYPE=NC_STRING"], + ) assert att assert att.Write(123) == gdal.CE_None - assert att.Read() == '123' - assert att.Write('bar') == gdal.CE_None - assert att.Read() == 'bar' - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) - assert att.Read() == 'bar' + assert att.Read() == "123" + assert att.Write("bar") == gdal.CE_None + assert att.Read() == "bar" + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert att.Read() == "bar" # There is an issue on 32-bit platforms, likely in libnetcdf or libhdf5 itself, # with writing more than one string if sys.maxsize > 0x7FFFFFFF: - att = rg.CreateAttribute('att_two_strings', [2], gdal.ExtendedDataType.CreateString()) + att = rg.CreateAttribute( + "att_two_strings", [2], gdal.ExtendedDataType.CreateString() + ) assert att with gdaltest.error_handler(): - assert att.Write(['not_enough_elements']) != gdal.CE_None + assert att.Write(["not_enough_elements"]) != gdal.CE_None assert att.Write([1, 2]) == gdal.CE_None - assert att.Read() == ['1', '2'] - assert att.Write(['foo', 'barbaz']) == gdal.CE_None - assert att.Read() == ['foo', 'barbaz'] - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) - assert att.Read() == ['foo', 'barbaz'] - - att = rg.CreateAttribute('att_double', [], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + assert att.Read() == ["1", "2"] + assert att.Write(["foo", "barbaz"]) == gdal.CE_None + assert att.Read() == ["foo", "barbaz"] + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert att.Read() == ["foo", "barbaz"] + + att = rg.CreateAttribute( + "att_double", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert att assert att.Write(1.25125) == gdal.CE_None assert att.Read() == 1.25125 - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == 1.25125 - att = rg.CreateAttribute('att_two_double', [2], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + att = rg.CreateAttribute( + "att_two_double", [2], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert att assert att.Write([1.25125, 2.25125]) == gdal.CE_None assert att.Read() == (1.25125, 2.25125) - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == (1.25125, 2.25125) - att = rg.CreateAttribute('att_byte', [], - gdal.ExtendedDataType.Create(gdal.GDT_Int16), - ['NC_TYPE=NC_BYTE']) + att = rg.CreateAttribute( + "att_byte", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Int16), + ["NC_TYPE=NC_BYTE"], + ) assert att assert att.Write(-128) == gdal.CE_None assert att.Read() == -128 - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == -128 - att = rg.CreateAttribute('att_two_byte', [2], - gdal.ExtendedDataType.Create(gdal.GDT_Int16), - ['NC_TYPE=NC_BYTE']) + att = rg.CreateAttribute( + "att_two_byte", + [2], + gdal.ExtendedDataType.Create(gdal.GDT_Int16), + ["NC_TYPE=NC_BYTE"], + ) assert att assert att.Write([-128, -127]) == gdal.CE_None assert att.Read() == (-128, -127) - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == (-128, -127) - att = rg.CreateAttribute('att_int64', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['NC_TYPE=NC_INT64']) + att = rg.CreateAttribute( + "att_int64", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_INT64"], + ) assert att assert att.Write(-1234567890123) == gdal.CE_None assert att.Read() == -1234567890123 - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == -1234567890123 - att = rg.CreateAttribute('att_two_int64', [2], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['NC_TYPE=NC_INT64']) + att = rg.CreateAttribute( + "att_two_int64", + [2], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_INT64"], + ) assert att assert att.Write([-1234567890123, -1234567890124]) == gdal.CE_None assert att.Read() == (-1234567890123, -1234567890124) - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == (-1234567890123, -1234567890124) - att = rg.CreateAttribute('att_uint64', [], - gdal.ExtendedDataType.Create(gdal.GDT_Float64), - ['NC_TYPE=NC_UINT64']) + att = rg.CreateAttribute( + "att_uint64", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ["NC_TYPE=NC_UINT64"], + ) assert att assert att.Write(1234567890123) == gdal.CE_None assert att.Read() == 1234567890123 - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) assert att.Read() == 1234567890123 - att = rg.CreateAttribute('att_compound', [], compound_dt) + att = rg.CreateAttribute("att_compound", [], compound_dt) assert att - assert att.Write(struct.pack('hi', -128, -12345678)) == gdal.CE_None + assert att.Write(struct.pack("hi", -128, -12345678)) == gdal.CE_None assert len(att.Read()) == 8 - assert struct.unpack('hi', att.Read()) == (-128, -12345678) - att = next((x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None) - assert struct.unpack('hi', att.Read()) == (-128, -12345678) + assert struct.unpack("hi", att.Read()) == (-128, -12345678) + att = next( + (x for x in rg.GetAttributes() if x.GetName() == att.GetName()), None + ) + assert struct.unpack("hi", att.Read()) == (-128, -12345678) # netCDF 4 can support NC_STRING - var = rg.CreateMDArray('my_var_string_array', [dim_x], gdal.ExtendedDataType.CreateString()) + var = rg.CreateMDArray( + "my_var_string_array", [dim_x], gdal.ExtendedDataType.CreateString() + ) assert var - assert var.Write(['', '0123456789']) == gdal.CE_None - var = rg.OpenMDArray('my_var_string_array') + assert var.Write(["", "0123456789"]) == gdal.CE_None + var = rg.OpenMDArray("my_var_string_array") assert var - assert var.Read() == ['', '0123456789'] + assert var.Read() == ["", "0123456789"] string_type = gdal.ExtendedDataType.CreateString(10) - var = rg.CreateMDArray('my_var_string_array_fixed_width', [dim_x], string_type) + var = rg.CreateMDArray("my_var_string_array_fixed_width", [dim_x], string_type) assert var assert var.GetDimensionCount() == 1 - assert var.Write(['', '0123456789truncated']) == gdal.CE_None - var = rg.OpenMDArray('my_var_string_array_fixed_width') + assert var.Write(["", "0123456789truncated"]) == gdal.CE_None + var = rg.OpenMDArray("my_var_string_array_fixed_width") assert var - assert var.Read() == ['', '0123456789'] + assert var.Read() == ["", "0123456789"] f() def f2(): - ds = gdal.OpenEx('tmp/multidim_nc4.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc4.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() assert rg - assert rg.CreateGroup('subgroup2') + assert rg.CreateGroup("subgroup2") f2() def f3(): - ds = gdal.OpenEx('tmp/multidim_nc4.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc4.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() assert rg - att = next((x for x in rg.GetAttributes() if x.GetName() == 'att_text'), None) - assert att.Write('rewritten_attribute') == gdal.CE_None - assert att.Read() == 'rewritten_attribute' + att = next((x for x in rg.GetAttributes() if x.GetName() == "att_text"), None) + assert att.Write("rewritten_attribute") == gdal.CE_None + assert att.Read() == "rewritten_attribute" f3() def create_georeferenced_projected(grp_name, set_dim_type): - ds = gdal.OpenEx('tmp/multidim_nc4.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc4.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() subg = rg.CreateGroup(grp_name) - dim_y = subg.CreateDimension('my_y', gdal.DIM_TYPE_HORIZONTAL_Y if set_dim_type else None, None, 2) - dim_x = subg.CreateDimension('my_x', gdal.DIM_TYPE_HORIZONTAL_X if set_dim_type else None, None, 3) - var_y = subg.CreateMDArray('my_y', [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var_x = subg.CreateMDArray('my_x', [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var = subg.CreateMDArray('my_georeferenced_var', [dim_y, dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dim_y = subg.CreateDimension( + "my_y", gdal.DIM_TYPE_HORIZONTAL_Y if set_dim_type else None, None, 2 + ) + dim_x = subg.CreateDimension( + "my_x", gdal.DIM_TYPE_HORIZONTAL_X if set_dim_type else None, None, 3 + ) + var_y = subg.CreateMDArray( + "my_y", [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var_x = subg.CreateMDArray( + "my_x", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var = subg.CreateMDArray( + "my_georeferenced_var", + [dim_y, dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) assert var if set_dim_type: assert var.GetDimensions()[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y @@ -1052,34 +1319,49 @@ def create_georeferenced_projected(grp_name, set_dim_type): assert var.SetSpatialRef(srs) == gdal.CE_None got_srs = var.GetSpatialRef() assert got_srs - assert '32631' in got_srs.ExportToWkt() - assert var_x.GetAttribute('standard_name').Read() == 'projection_x_coordinate' - assert var_x.GetAttribute('long_name').Read() == 'x coordinate of projection' - assert var_x.GetAttribute('units').Read() == 'm' - assert var_y.GetAttribute('standard_name').Read() == 'projection_y_coordinate' - assert var_y.GetAttribute('long_name').Read() == 'y coordinate of projection' - assert var_y.GetAttribute('units').Read() == 'm' + assert "32631" in got_srs.ExportToWkt() + assert var_x.GetAttribute("standard_name").Read() == "projection_x_coordinate" + assert var_x.GetAttribute("long_name").Read() == "x coordinate of projection" + assert var_x.GetAttribute("units").Read() == "m" + assert var_y.GetAttribute("standard_name").Read() == "projection_y_coordinate" + assert var_y.GetAttribute("long_name").Read() == "y coordinate of projection" + assert var_y.GetAttribute("units").Read() == "m" var = subg.OpenMDArray(var.GetName()) assert var assert var.GetDimensions()[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y assert var.GetDimensions()[1].GetType() == gdal.DIM_TYPE_HORIZONTAL_X - create_georeferenced_projected('georeferenced_projected_with_dim_type', True) + create_georeferenced_projected("georeferenced_projected_with_dim_type", True) with gdaltest.error_handler(): - create_georeferenced_projected('georeferenced_projected_without_dim_type', False) + create_georeferenced_projected( + "georeferenced_projected_without_dim_type", False + ) def create_georeferenced_geographic(grp_name, set_dim_type): - ds = gdal.OpenEx('tmp/multidim_nc4.nc', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "tmp/multidim_nc4.nc", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() subg = rg.CreateGroup(grp_name) - dim_y = subg.CreateDimension('my_y', gdal.DIM_TYPE_HORIZONTAL_Y if set_dim_type else None, None, 2) - dim_x = subg.CreateDimension('my_x', gdal.DIM_TYPE_HORIZONTAL_X if set_dim_type else None, None, 3) - var_y = subg.CreateMDArray('my_y', [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var_x = subg.CreateMDArray('my_x', [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - var = subg.CreateMDArray('my_georeferenced_var', [dim_y, dim_x], - gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dim_y = subg.CreateDimension( + "my_y", gdal.DIM_TYPE_HORIZONTAL_Y if set_dim_type else None, None, 2 + ) + dim_x = subg.CreateDimension( + "my_x", gdal.DIM_TYPE_HORIZONTAL_X if set_dim_type else None, None, 3 + ) + var_y = subg.CreateMDArray( + "my_y", [dim_y], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var_x = subg.CreateMDArray( + "my_x", [dim_x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + var = subg.CreateMDArray( + "my_georeferenced_var", + [dim_y, dim_x], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) assert var if set_dim_type: assert var.GetDimensions()[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y @@ -1089,71 +1371,95 @@ def create_georeferenced_geographic(grp_name, set_dim_type): assert var.SetSpatialRef(srs) == gdal.CE_None got_srs = var.GetSpatialRef() assert got_srs - assert '4326' in got_srs.ExportToWkt() - assert var_x.GetAttribute('standard_name').Read() == 'longitude' - assert var_x.GetAttribute('long_name').Read() == 'longitude' - assert var_x.GetAttribute('units').Read() == 'degrees_east' - assert var_y.GetAttribute('standard_name').Read() == 'latitude' - assert var_y.GetAttribute('long_name').Read() == 'latitude' - assert var_y.GetAttribute('units').Read() == 'degrees_north' + assert "4326" in got_srs.ExportToWkt() + assert var_x.GetAttribute("standard_name").Read() == "longitude" + assert var_x.GetAttribute("long_name").Read() == "longitude" + assert var_x.GetAttribute("units").Read() == "degrees_east" + assert var_y.GetAttribute("standard_name").Read() == "latitude" + assert var_y.GetAttribute("long_name").Read() == "latitude" + assert var_y.GetAttribute("units").Read() == "degrees_north" var = subg.OpenMDArray(var.GetName()) assert var assert var.GetDimensions()[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y assert var.GetDimensions()[1].GetType() == gdal.DIM_TYPE_HORIZONTAL_X - create_georeferenced_geographic('georeferenced_geographic_with_dim_type', True) + create_georeferenced_geographic("georeferenced_geographic_with_dim_type", True) with gdaltest.error_handler(): - create_georeferenced_geographic('georeferenced_geographic_without_dim_type', False) + create_georeferenced_geographic( + "georeferenced_geographic_without_dim_type", False + ) - gdal.Unlink('tmp/multidim_nc4.nc') + gdal.Unlink("tmp/multidim_nc4.nc") def test_netcdf_multidim_create_several_arrays_with_srs(): - tmpfilename = 'tmp/several_arrays_with_srs.nc' + tmpfilename = "tmp/several_arrays_with_srs.nc" def create(): - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - lat = rg.CreateDimension('latitude', gdal.DIM_TYPE_HORIZONTAL_X, None, 2) - rg.CreateMDArray('latitude', [lat], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - lon = rg.CreateDimension('longitude', gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) - rg.CreateMDArray('longitude', [lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - - x = rg.CreateDimension('x', gdal.DIM_TYPE_HORIZONTAL_X, None, 2) - rg.CreateMDArray('x', [x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - y = rg.CreateDimension('y', gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) - rg.CreateMDArray('y', [y], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - - ar = rg.CreateMDArray('ar_longlat_4326_1', [lat, lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + lat = rg.CreateDimension("latitude", gdal.DIM_TYPE_HORIZONTAL_X, None, 2) + rg.CreateMDArray( + "latitude", [lat], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + lon = rg.CreateDimension("longitude", gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) + rg.CreateMDArray( + "longitude", [lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + + x = rg.CreateDimension("x", gdal.DIM_TYPE_HORIZONTAL_X, None, 2) + rg.CreateMDArray("x", [x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + y = rg.CreateDimension("y", gdal.DIM_TYPE_HORIZONTAL_Y, None, 2) + rg.CreateMDArray("y", [y], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + + ar = rg.CreateMDArray( + "ar_longlat_4326_1", + [lat, lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) ar.SetSpatialRef(srs) - ar = rg.CreateMDArray('ar_longlat_4326_2', [lat, lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar_longlat_4326_2", + [lat, lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) ar.SetSpatialRef(srs) - ar = rg.CreateMDArray('ar_longlat_4258', [lat, lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar_longlat_4258", + [lat, lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4258) ar.SetSpatialRef(srs) - ar = rg.CreateMDArray('ar_longlat_32631_1', [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar_longlat_32631_1", [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) ar.SetSpatialRef(srs) - ar = rg.CreateMDArray('ar_longlat_32631_2', [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar_longlat_32631_2", [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) ar.SetSpatialRef(srs) - ar = rg.CreateMDArray('ar_longlat_32632', [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar_longlat_32632", [y, x], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) srs = osr.SpatialReference() srs.ImportFromEPSG(32632) ar.SetSpatialRef(srs) @@ -1164,23 +1470,23 @@ def read(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('ar_longlat_4326_1') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '4326' + ar = rg.OpenMDArray("ar_longlat_4326_1") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "4326" - ar = rg.OpenMDArray('ar_longlat_4326_2') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '4326' + ar = rg.OpenMDArray("ar_longlat_4326_2") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "4326" - ar = rg.OpenMDArray('ar_longlat_4258') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '4258' + ar = rg.OpenMDArray("ar_longlat_4258") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "4258" - ar = rg.OpenMDArray('ar_longlat_32631_1') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '32631' + ar = rg.OpenMDArray("ar_longlat_32631_1") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "32631" - ar = rg.OpenMDArray('ar_longlat_32631_2') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '32631' + ar = rg.OpenMDArray("ar_longlat_32631_2") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "32631" - ar = rg.OpenMDArray('ar_longlat_32632') - assert ar.GetSpatialRef().GetAuthorityCode(None) == '32632' + ar = rg.OpenMDArray("ar_longlat_32632") + assert ar.GetSpatialRef().GetAuthorityCode(None) == "32632" read() @@ -1189,32 +1495,34 @@ def read(): def test_netcdf_multidim_create_dim_zero(): - tmpfilename = 'tmp/test_netcdf_multidim_create_dim_zero_in.nc' + tmpfilename = "tmp/test_netcdf_multidim_create_dim_zero_in.nc" def create(): - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dim_zero = rg.CreateDimension('dim_zero', None, None, 0) + dim_zero = rg.CreateDimension("dim_zero", None, None, 0) assert dim_zero - ar = rg.CreateMDArray('ar', [dim_zero], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + ar = rg.CreateMDArray( + "ar", [dim_zero], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert ar create() - tmpfilename2 = 'tmp/test_netcdf_multidim_create_dim_zero_out.nc' + tmpfilename2 = "tmp/test_netcdf_multidim_create_dim_zero_out.nc" def copy(): - out_ds = gdal.MultiDimTranslate(tmpfilename2, tmpfilename, format = 'netCDF') + out_ds = gdal.MultiDimTranslate(tmpfilename2, tmpfilename, format="netCDF") assert out_ds rg = out_ds.GetRootGroup() assert rg - ar = rg.OpenMDArray('ar') + ar = rg.OpenMDArray("ar") assert ar copy() - assert gdal.MultiDimInfo(tmpfilename2, detailed = True) + assert gdal.MultiDimInfo(tmpfilename2, detailed=True) gdal.Unlink(tmpfilename) gdal.Unlink(tmpfilename2) @@ -1222,7 +1530,8 @@ def copy(): def test_netcdf_multidim_dims_with_same_name_different_size(): - src_ds = gdal.OpenEx(""" + src_ds = gdal.OpenEx( + """ Float64 @@ -1233,89 +1542,110 @@ def test_netcdf_multidim_dims_with_same_name_different_size(): -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) - tmpfilename = 'tmp/test_netcdf_multidim_dims_with_same_name_different_size.nc' - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds) + tmpfilename = "tmp/test_netcdf_multidim_dims_with_same_name_different_size.nc" + gdal.GetDriverByName("netCDF").CreateCopy(tmpfilename, src_ds) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar_x = rg.OpenMDArray('X') + ar_x = rg.OpenMDArray("X") assert ar_x.GetDimensions()[0].GetSize() == 2 - ar_y = rg.OpenMDArray('Y') + ar_y = rg.OpenMDArray("Y") assert ar_y.GetDimensions()[0].GetSize() == 3 check() gdal.Unlink(tmpfilename) + def test_netcdf_multidim_getmdarraynames_options(): - ds = gdal.OpenEx('data/netcdf/with_bounds.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/with_bounds.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - assert rg.GetMDArrayNames() == [ 'lat', 'lat_bnds' ] - assert rg.GetMDArrayNames(['SHOW_BOUNDS=NO']) == [ 'lat' ] - assert rg.GetMDArrayNames(['SHOW_INDEXING=NO']) == [ 'lat_bnds' ] + assert rg.GetMDArrayNames() == ["lat", "lat_bnds"] + assert rg.GetMDArrayNames(["SHOW_BOUNDS=NO"]) == ["lat"] + assert rg.GetMDArrayNames(["SHOW_INDEXING=NO"]) == ["lat_bnds"] - ds = gdal.OpenEx('data/netcdf/bug5118.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/bug5118.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - assert rg.GetMDArrayNames() == [ 'height_above_ground1', - 'time', - 'v-component_of_wind_height_above_ground', - 'x', - 'y' ] - assert rg.GetMDArrayNames(['SHOW_COORDINATES=NO']) == \ - [ 'v-component_of_wind_height_above_ground' ] - - - ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', - gdal.OF_MULTIDIM_RASTER) + assert rg.GetMDArrayNames() == [ + "height_above_ground1", + "time", + "v-component_of_wind_height_above_ground", + "x", + "y", + ] + assert rg.GetMDArrayNames(["SHOW_COORDINATES=NO"]) == [ + "v-component_of_wind_height_above_ground" + ] + + ds = gdal.OpenEx( + "data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc", + gdal.OF_MULTIDIM_RASTER, + ) rg = ds.GetRootGroup() - assert 'time_01' in rg.GetMDArrayNames() - assert 'time_01' not in rg.GetMDArrayNames(['SHOW_TIME=NO']) + assert "time_01" in rg.GetMDArrayNames() + assert "time_01" not in rg.GetMDArrayNames(["SHOW_TIME=NO"]) - ds = gdal.OpenEx('data/netcdf/byte_no_cf.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/byte_no_cf.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - assert 'mygridmapping' not in rg.GetMDArrayNames() - assert 'mygridmapping' in rg.GetMDArrayNames(['SHOW_ZERO_DIM=YES']) + assert "mygridmapping" not in rg.GetMDArrayNames() + assert "mygridmapping" in rg.GetMDArrayNames(["SHOW_ZERO_DIM=YES"]) def test_netcdf_multidim_indexing_var_through_coordinates_opposite_order(): - tmpfilename = 'tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dim_rel_to_lat = rg.CreateDimension('related_to_lat', None, None, 1) - dim_rel_to_lon = rg.CreateDimension('related_to_lon', None, None, 2) - var = rg.CreateMDArray('var', [dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('coordinates', [], gdal.ExtendedDataType.CreateString()) + dim_rel_to_lat = rg.CreateDimension("related_to_lat", None, None, 1) + dim_rel_to_lon = rg.CreateDimension("related_to_lon", None, None, 2) + var = rg.CreateMDArray( + "var", + [dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "coordinates", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('lon lat') == gdal.CE_None - - var = rg.CreateMDArray('lat', [dim_rel_to_lat], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("lon lat") == gdal.CE_None + + var = rg.CreateMDArray( + "lat", [dim_rel_to_lat], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('latitude') == gdal.CE_None - - var = rg.CreateMDArray('lon', [dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("latitude") == gdal.CE_None + + var = rg.CreateMDArray( + "lon", [dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('longitude') == gdal.CE_None + assert att.Write("longitude") == gdal.CE_None def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() dim_lat = dims[0] - assert dim_lat.GetName() == 'related_to_lat' - assert dim_lat.GetIndexingVariable().GetName() == 'lat' + assert dim_lat.GetName() == "related_to_lat" + assert dim_lat.GetIndexingVariable().GetName() == "lat" dim_lon = dims[1] - assert dim_lon.GetName() == 'related_to_lon' - assert dim_lon.GetIndexingVariable().GetName() == 'lon' + assert dim_lon.GetName() == "related_to_lon" + assert dim_lon.GetIndexingVariable().GetName() == "lon" create() check() @@ -1324,42 +1654,60 @@ def check(): def test_netcdf_multidim_indexing_var_through_coordinates_2D_dims_same_order(): - tmpfilename = 'tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dimZ = rg.CreateDimension('Z', None, None, 1) - dim_rel_to_lat = rg.CreateDimension('related_to_lat', None, None, 1) - dim_rel_to_lon = rg.CreateDimension('related_to_lon', None, None, 2) - var = rg.CreateMDArray('var', [dimZ, dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('coordinates', [], gdal.ExtendedDataType.CreateString()) + dimZ = rg.CreateDimension("Z", None, None, 1) + dim_rel_to_lat = rg.CreateDimension("related_to_lat", None, None, 1) + dim_rel_to_lon = rg.CreateDimension("related_to_lon", None, None, 2) + var = rg.CreateMDArray( + "var", + [dimZ, dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "coordinates", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('Z lat lon') == gdal.CE_None - - var = rg.CreateMDArray('lat', [dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("Z lat lon") == gdal.CE_None + + var = rg.CreateMDArray( + "lat", + [dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('latitude') == gdal.CE_None - - var = rg.CreateMDArray('lon', [dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("latitude") == gdal.CE_None + + var = rg.CreateMDArray( + "lon", + [dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('longitude') == gdal.CE_None + assert att.Write("longitude") == gdal.CE_None - rg.CreateMDArray('Z', [dimZ], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + rg.CreateMDArray("Z", [dimZ], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() dim_lat = dims[1] - assert dim_lat.GetName() == 'related_to_lat' - assert dim_lat.GetIndexingVariable().GetName() == 'lat' + assert dim_lat.GetName() == "related_to_lat" + assert dim_lat.GetIndexingVariable().GetName() == "lat" dim_lon = dims[2] - assert dim_lon.GetName() == 'related_to_lon' - assert dim_lon.GetIndexingVariable().GetName() == 'lon' + assert dim_lon.GetName() == "related_to_lon" + assert dim_lon.GetIndexingVariable().GetName() == "lon" create() check() @@ -1368,42 +1716,60 @@ def check(): def test_netcdf_multidim_indexing_var_through_coordinates_2D_dims_opposite_order(): - tmpfilename = 'tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_indexing_var_through_coordinates.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dimZ = rg.CreateDimension('Z', None, None, 1) - dim_rel_to_lat = rg.CreateDimension('related_to_lat', None, None, 1) - dim_rel_to_lon = rg.CreateDimension('related_to_lon', None, None, 2) - var = rg.CreateMDArray('var', [dimZ, dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('coordinates', [], gdal.ExtendedDataType.CreateString()) + dimZ = rg.CreateDimension("Z", None, None, 1) + dim_rel_to_lat = rg.CreateDimension("related_to_lat", None, None, 1) + dim_rel_to_lon = rg.CreateDimension("related_to_lon", None, None, 2) + var = rg.CreateMDArray( + "var", + [dimZ, dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "coordinates", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('lon lat Z') == gdal.CE_None - - var = rg.CreateMDArray('lat', [dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("lon lat Z") == gdal.CE_None + + var = rg.CreateMDArray( + "lat", + [dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('latitude') == gdal.CE_None - - var = rg.CreateMDArray('lon', [dim_rel_to_lat, dim_rel_to_lon], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - att = var.CreateAttribute('standard_name', [], gdal.ExtendedDataType.CreateString()) + assert att.Write("latitude") == gdal.CE_None + + var = rg.CreateMDArray( + "lon", + [dim_rel_to_lat, dim_rel_to_lon], + gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + att = var.CreateAttribute( + "standard_name", [], gdal.ExtendedDataType.CreateString() + ) assert att - assert att.Write('longitude') == gdal.CE_None + assert att.Write("longitude") == gdal.CE_None - rg.CreateMDArray('Z', [dimZ], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + rg.CreateMDArray("Z", [dimZ], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() dim_lat = dims[1] - assert dim_lat.GetName() == 'related_to_lat' - assert dim_lat.GetIndexingVariable().GetName() == 'lat' + assert dim_lat.GetName() == "related_to_lat" + assert dim_lat.GetIndexingVariable().GetName() == "lat" dim_lon = dims[2] - assert dim_lon.GetName() == 'related_to_lon' - assert dim_lon.GetIndexingVariable().GetName() == 'lon' + assert dim_lon.GetName() == "related_to_lon" + assert dim_lon.GetIndexingVariable().GetName() == "lon" create() check() @@ -1412,24 +1778,26 @@ def check(): def test_netcdf_multidim_indexing_var_single_dim(): - tmpfilename = 'tmp/test_netcdf_multidim_indexing_var_single_dim.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_indexing_var_single_dim.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dimK = rg.CreateDimension('k', None, None, 1) - rg.CreateMDArray('time', [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - dimL = rg.CreateDimension('l', None, None, 1) - rg.CreateMDArray('unrelated', [dimL], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dimK = rg.CreateDimension("k", None, None, 1) + rg.CreateMDArray("time", [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dimL = rg.CreateDimension("l", None, None, 1) + rg.CreateMDArray( + "unrelated", [dimL], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() dim = dims[0] - assert dim.GetName() == 'k' - assert dim.GetIndexingVariable().GetName() == 'time' + assert dim.GetName() == "k" + assert dim.GetIndexingVariable().GetName() == "time" create() check() @@ -1438,15 +1806,17 @@ def check(): def test_netcdf_multidim_indexing_var_single_dim_two_candidates(): - tmpfilename = 'tmp/test_netcdf_multidim_indexing_var_single_dim_two_candidates.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_indexing_var_single_dim_two_candidates.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dimK = rg.CreateDimension('k', None, None, 1) - rg.CreateMDArray('time', [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - rg.CreateMDArray('another_time', [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + dimK = rg.CreateDimension("k", None, None, 1) + rg.CreateMDArray("time", [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + rg.CreateMDArray( + "another_time", [dimK], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) @@ -1462,24 +1832,28 @@ def check(): def test_netcdf_multidim_stats(): - tmpfilename = 'tmp/test_netcdf_multidim_stats.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_stats.nc" + drv = gdal.GetDriverByName("netCDF") def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) - dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) + dim0 = rg.CreateDimension( + "dim0", "unspecified type", "unspecified direction", 2 + ) + dim1 = rg.CreateDimension( + "dim1", "unspecified type", "unspecified direction", 3 + ) float64dt = gdal.ExtendedDataType.Create(gdal.GDT_Float64) ar = rg.CreateMDArray("myarray", [dim0, dim1], float64dt) ar.SetNoDataValueDouble(6) - data = struct.pack('d' * 6, 1, 2, 3, 4, 5, 6) + data = struct.pack("d" * 6, 1, 2, 3, 4, 5, 6) ar.Write(data) def compute_stats(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('myarray') + ar = rg.OpenMDArray("myarray") stats = ar.GetStatistics(False, force=False) assert stats is None @@ -1503,11 +1877,11 @@ def compute_stats(): # Check that we can read stats from the .aux.xml def reopen(): - assert os.path.exists(tmpfilename + '.aux.xml') + assert os.path.exists(tmpfilename + ".aux.xml") ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('myarray') + ar = rg.OpenMDArray("myarray") stats = ar.GetStatistics(False, force=False) assert stats is not None @@ -1524,19 +1898,19 @@ def reopen(): assert stats.max == 1.0 def clear_stats(): - assert os.path.exists(tmpfilename + '.aux.xml') + assert os.path.exists(tmpfilename + ".aux.xml") ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) ds.ClearStatistics() rg = ds.GetRootGroup() - ar = rg.OpenMDArray('myarray') + ar = rg.OpenMDArray("myarray") stats = ar.GetStatistics(False, force=False) assert stats is None ds = None ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('myarray') + ar = rg.OpenMDArray("myarray") stats = ar.GetStatistics(False, force=False) assert stats is None @@ -1551,71 +1925,81 @@ def clear_stats(): def test_netcdf_multidim_advise_read(): - ds = gdal.OpenEx('data/netcdf/byte_no_cf.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/byte_no_cf.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - var = rg.OpenMDArray('Band1') - ref_data_whole = struct.unpack('B' * 20 * 20, var.Read()) - ref_data = struct.unpack('B' * 4 * 5, var.Read(array_start_idx = [2, 3], count = [4, 5])) + var = rg.OpenMDArray("Band1") + ref_data_whole = struct.unpack("B" * 20 * 20, var.Read()) + ref_data = struct.unpack( + "B" * 4 * 5, var.Read(array_start_idx=[2, 3], count=[4, 5]) + ) sliced = var[1] - ref_data_line = struct.unpack('B' * 20, sliced.Read()) + ref_data_line = struct.unpack("B" * 20, sliced.Read()) transposed = var.Transpose([1, 0]) - ref_data_transposed = struct.unpack('B' * 20 * 20, transposed.Read()) + ref_data_transposed = struct.unpack("B" * 20 * 20, transposed.Read()) # AdviseRead on all assert var.AdviseRead() == gdal.CE_None # Can use AdviseRead - got_data = struct.unpack('B' * 4 * 5, var.Read(array_start_idx = [2, 3], count = [4, 5])) + got_data = struct.unpack( + "B" * 4 * 5, var.Read(array_start_idx=[2, 3], count=[4, 5]) + ) assert got_data == ref_data # AdviseRead on portion - assert var.AdviseRead(array_start_idx = [2, 3], count = [4, 5]) == gdal.CE_None - got_data = struct.unpack('B' * 4 * 5, var.Read(array_start_idx = [2, 3], count = [4, 5])) + assert var.AdviseRead(array_start_idx=[2, 3], count=[4, 5]) == gdal.CE_None + got_data = struct.unpack( + "B" * 4 * 5, var.Read(array_start_idx=[2, 3], count=[4, 5]) + ) assert got_data == ref_data # Cannot use AdviseRead as we read outside of it - got_data = struct.unpack('B' * 20 * 20, var.Read()) + got_data = struct.unpack("B" * 20 * 20, var.Read()) assert got_data == ref_data_whole # On a slice assert sliced.AdviseRead() == gdal.CE_None - got_data = struct.unpack('B' * 20, sliced.Read()) + got_data = struct.unpack("B" * 20, sliced.Read()) assert got_data == ref_data_line # On transposed array assert transposed.AdviseRead() == gdal.CE_None - got_data = struct.unpack('B' * 20 * 20, transposed.Read()) + got_data = struct.unpack("B" * 20 * 20, transposed.Read()) assert got_data == ref_data_transposed with gdaltest.error_handler(): - assert var.AdviseRead(array_start_idx = [2, 3], count = [20, 5]) == gdal.CE_Failure - + assert var.AdviseRead(array_start_idx=[2, 3], count=[20, 5]) == gdal.CE_Failure def test_netcdf_multidim_get_mask(): - tmpfilename = 'tmp/test_netcdf_multidim_get_mask.nc' - drv = gdal.GetDriverByName('netCDF') + tmpfilename = "tmp/test_netcdf_multidim_get_mask.nc" + drv = gdal.GetDriverByName("netCDF") + def create(): ds = drv.CreateMultiDimensional(tmpfilename) rg = ds.GetRootGroup() - dim0 = rg.CreateDimension("dim0", "unspecified type", "unspecified direction", 2) - dim1 = rg.CreateDimension("dim1", "unspecified type", "unspecified direction", 3) + dim0 = rg.CreateDimension( + "dim0", "unspecified type", "unspecified direction", 2 + ) + dim1 = rg.CreateDimension( + "dim1", "unspecified type", "unspecified direction", 3 + ) bytedt = gdal.ExtendedDataType.Create(gdal.GDT_Byte) ar = rg.CreateMDArray("myarray", [dim0, dim1], bytedt) ar.SetNoDataValueDouble(6) - data = struct.pack('B' * 6, 1, 2, 3, 4, 5, 6) + data = struct.pack("B" * 6, 1, 2, 3, 4, 5, 6) ar.Write(data) - attr = ar.CreateAttribute('missing_value', [1], bytedt) + attr = ar.CreateAttribute("missing_value", [1], bytedt) assert attr.Write(1) == gdal.CE_None def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('myarray') - maskdata = struct.unpack('B' * 6, ar.GetMask().Read()) + ar = rg.OpenMDArray("myarray") + maskdata = struct.unpack("B" * 6, ar.GetMask().Read()) assert maskdata == (0, 1, 1, 1, 1, 0) try: @@ -1627,20 +2011,25 @@ def check(): def test_netcdf_multidim_createcopy_array_options(): - src_ds = gdal.OpenEx('data/netcdf/byte_no_cf.nc', gdal.OF_MULTIDIM_RASTER) - tmpfilename = 'tmp/test_netcdf_multidim_createcopy_array_options.nc' + src_ds = gdal.OpenEx("data/netcdf/byte_no_cf.nc", gdal.OF_MULTIDIM_RASTER) + tmpfilename = "tmp/test_netcdf_multidim_createcopy_array_options.nc" with gdaltest.error_handler(): - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds, - options=['ARRAY:IF(DIM=2):BLOCKSIZE=1,2', - 'ARRAY:IF(NAME=Band1):COMPRESS=DEFLATE', - 'ARRAY:ZLEVEL=6']) + gdal.GetDriverByName("netCDF").CreateCopy( + tmpfilename, + src_ds, + options=[ + "ARRAY:IF(DIM=2):BLOCKSIZE=1,2", + "ARRAY:IF(NAME=Band1):COMPRESS=DEFLATE", + "ARRAY:ZLEVEL=6", + ], + ) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - var = rg.OpenMDArray('Band1') + var = rg.OpenMDArray("Band1") assert var.GetBlockSize() == [1, 2] - assert var.GetStructuralInfo() == { 'COMPRESS': 'DEFLATE' } + assert var.GetStructuralInfo() == {"COMPRESS": "DEFLATE"} check() @@ -1649,17 +2038,20 @@ def check(): def test_netcdf_multidim_createcopy_array_options_if_name_fullname(): - src_ds = gdal.OpenEx('data/netcdf/byte_no_cf.nc', gdal.OF_MULTIDIM_RASTER) - tmpfilename = 'tmp/test_netcdf_multidim_createcopy_array_options_if_name_fullname.nc' + src_ds = gdal.OpenEx("data/netcdf/byte_no_cf.nc", gdal.OF_MULTIDIM_RASTER) + tmpfilename = ( + "tmp/test_netcdf_multidim_createcopy_array_options_if_name_fullname.nc" + ) with gdaltest.error_handler(): - gdal.GetDriverByName('netCDF').CreateCopy(tmpfilename, src_ds, - options=['ARRAY:IF(NAME=/Band1):COMPRESS=DEFLATE']) + gdal.GetDriverByName("netCDF").CreateCopy( + tmpfilename, src_ds, options=["ARRAY:IF(NAME=/Band1):COMPRESS=DEFLATE"] + ) def check(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - var = rg.OpenMDArray('Band1') - assert var.GetStructuralInfo() == { 'COMPRESS': 'DEFLATE' } + var = rg.OpenMDArray("Band1") + assert var.GetStructuralInfo() == {"COMPRESS": "DEFLATE"} check() @@ -1668,76 +2060,82 @@ def check(): def test_netcdf_multidim_group_by_same_dimension(): - ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc", + gdal.OF_MULTIDIM_RASTER, + ) rg = ds.GetRootGroup() - assert rg.GetMDArrayNames(['GROUP_BY=SAME_DIMENSION']) is None - groups = rg.GetGroupNames(['GROUP_BY=SAME_DIMENSION']) - assert set(groups) == set(['time_01', 'time_20_c', 'time_20_ku']) - g = rg.OpenGroup('time_01', ['GROUP_BY=SAME_DIMENSION']) + assert rg.GetMDArrayNames(["GROUP_BY=SAME_DIMENSION"]) is None + groups = rg.GetGroupNames(["GROUP_BY=SAME_DIMENSION"]) + assert set(groups) == set(["time_01", "time_20_c", "time_20_ku"]) + g = rg.OpenGroup("time_01", ["GROUP_BY=SAME_DIMENSION"]) assert g is not None arrays = g.GetMDArrayNames() for arrayName in arrays: ar = g.OpenMDArray(arrayName) dims = ar.GetDimensions() assert len(dims) == 1 - assert dims[0].GetName() == 'time_01' + assert dims[0].GetName() == "time_01" def test_netcdf_multidim_getcoordinatevariables(): - ds = gdal.OpenEx('data/netcdf/expanded_form_of_grid_mapping.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "data/netcdf/expanded_form_of_grid_mapping.nc", gdal.OF_MULTIDIM_RASTER + ) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('temp') + ar = rg.OpenMDArray("temp") coordinate_vars = ar.GetCoordinateVariables() assert len(coordinate_vars) == 2 - assert coordinate_vars[0].GetName() == 'lat' - assert coordinate_vars[1].GetName() == 'lon' + assert coordinate_vars[0].GetName() == "lat" + assert coordinate_vars[1].GetName() == "lon" assert len(coordinate_vars[0].GetCoordinateVariables()) == 0 def test_netcdf_multidim_getresampled_with_geoloc(): - ds = gdal.OpenEx('data/netcdf/sentinel5p_fake.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/netcdf/sentinel5p_fake.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - ar = rg.OpenMDArray('my_var') + ar = rg.OpenMDArray("my_var") coordinate_vars = ar.GetCoordinateVariables() assert len(coordinate_vars) == 2 - assert coordinate_vars[0].GetName() == 'longitude' - assert coordinate_vars[1].GetName() == 'latitude' + assert coordinate_vars[0].GetName() == "longitude" + assert coordinate_vars[1].GetName() == "latitude" - resampled_ar = ar.GetResampled([None] * ar.GetDimensionCount(), - gdal.GRIORA_NearestNeighbour, None) + resampled_ar = ar.GetResampled( + [None] * ar.GetDimensionCount(), gdal.GRIORA_NearestNeighbour, None + ) assert resampled_ar is not None # By default, the classic netCDF driver would use bottom-up reordering, # which slightly modifies the output of the geolocation interpolation, # and would not make it possible to compare exactly with the GetResampled() # result - with gdaltest.config_option('GDAL_NETCDF_BOTTOMUP', 'NO'): - warped_ds = gdal.Warp('', 'data/netcdf/sentinel5p_fake.nc', format='MEM') + with gdaltest.config_option("GDAL_NETCDF_BOTTOMUP", "NO"): + warped_ds = gdal.Warp("", "data/netcdf/sentinel5p_fake.nc", format="MEM") assert warped_ds.ReadRaster() == resampled_ar.Read() def test_netcdf_multidim_cache(): - tmpfilename = 'tmp/test.nc' - shutil.copy('data/netcdf/alldatatypes.nc', tmpfilename) + tmpfilename = "tmp/test.nc" + shutil.copy("data/netcdf/alldatatypes.nc", tmpfilename) gdal.Unlink(tmpfilename + ".gmac") def get_transposed_and_cache(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('ubyte_y2_x2_var') + ar = ds.GetRootGroup().OpenMDArray("ubyte_y2_x2_var") assert ar transpose = ar.Transpose([1, 0]) - assert transpose.Cache( ['BLOCKSIZE=2,1'] ) + assert transpose.Cache(["BLOCKSIZE=2,1"]) with gdaltest.error_handler(): # Cannot cache twice the same array assert transpose.Cache() is False - ar2 = ds.GetRootGroup().OpenMDArray('ubyte_z2_y2_x2_var') + ar2 = ds.GetRootGroup().OpenMDArray("ubyte_z2_y2_x2_var") assert ar2 assert ar2.Cache() @@ -1749,18 +2147,18 @@ def check_cache_exists(): cache_ds = gdal.OpenEx(tmpfilename + ".gmac", gdal.OF_MULTIDIM_RASTER) assert cache_ds rg = cache_ds.GetRootGroup() - cached_ar = rg.OpenMDArray('Transposed_view_of__ubyte_y2_x2_var_along__1_0_') + cached_ar = rg.OpenMDArray("Transposed_view_of__ubyte_y2_x2_var_along__1_0_") assert cached_ar assert cached_ar.GetBlockSize() == [2, 1] assert cached_ar.Read() == transposed_data - assert rg.OpenMDArray('_ubyte_z2_y2_x2_var') is not None + assert rg.OpenMDArray("_ubyte_z2_y2_x2_var") is not None check_cache_exists() def check_cache_working(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('ubyte_y2_x2_var') + ar = ds.GetRootGroup().OpenMDArray("ubyte_y2_x2_var") transpose = ar.Transpose([1, 0]) assert transpose.Read() == transposed_data # Again @@ -1770,21 +2168,22 @@ def check_cache_working(): # Now alter the cache directly def alter_cache(): - cache_ds = gdal.OpenEx(tmpfilename + ".gmac", - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + cache_ds = gdal.OpenEx( + tmpfilename + ".gmac", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert cache_ds rg = cache_ds.GetRootGroup() cached_ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - cached_ar.Write(b'\x00' * len(transposed_data)) + cached_ar.Write(b"\x00" * len(transposed_data)) alter_cache() # And check we get the altered values def check_cache_really_working(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('ubyte_y2_x2_var') + ar = ds.GetRootGroup().OpenMDArray("ubyte_y2_x2_var") transpose = ar.Transpose([1, 0]) - assert transpose.Read() == b'\x00' * len(transposed_data) + assert transpose.Read() == b"\x00" * len(transposed_data) check_cache_really_working() @@ -1793,31 +2192,30 @@ def check_cache_really_working(): def test_netcdf_multidim_cache_pamproxydb(): - def remove_dir(): try: - os.chmod('tmp/tmpdirreadonly', stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - shutil.rmtree('tmp/tmpdirreadonly') + os.chmod("tmp/tmpdirreadonly", stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) + shutil.rmtree("tmp/tmpdirreadonly") except OSError: pass try: - shutil.rmtree('tmp/tmppamproxydir') + shutil.rmtree("tmp/tmppamproxydir") except OSError: pass # Create a read-only directory remove_dir() - os.mkdir('tmp/tmpdirreadonly') - os.mkdir('tmp/tmppamproxydir') - shutil.copy('data/netcdf/byte_no_cf.nc', 'tmp/tmpdirreadonly/test.nc') + os.mkdir("tmp/tmpdirreadonly") + os.mkdir("tmp/tmppamproxydir") + shutil.copy("data/netcdf/byte_no_cf.nc", "tmp/tmpdirreadonly/test.nc") # FIXME: how do we create a read-only dir on windows ? # The following has no effect - os.chmod('tmp/tmpdirreadonly', stat.S_IRUSR | stat.S_IXUSR) + os.chmod("tmp/tmpdirreadonly", stat.S_IRUSR | stat.S_IXUSR) # Test that the directory is really read-only try: - f = open('tmp/tmpdirreadonly/test', 'w') + f = open("tmp/tmpdirreadonly/test", "w") if f is not None: f.close() remove_dir() @@ -1829,8 +2227,14 @@ def remove_dir(): # 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('.', 'netcdf_multidim_pamproxydb', '-test_netcdf_multidim_cache_pamproxydb') - assert ret.find('success') != -1, ('netcdf_multidim_pamproxydb.py -test_netcdf_multidim_cache_pamproxydb failed %s' % ret) + + ret = test_py_scripts.run_py_script_as_external_script( + ".", "netcdf_multidim_pamproxydb", "-test_netcdf_multidim_cache_pamproxydb" + ) + assert ret.find("success") != -1, ( + "netcdf_multidim_pamproxydb.py -test_netcdf_multidim_cache_pamproxydb failed %s" + % ret + ) finally: remove_dir() @@ -1841,15 +2245,14 @@ def remove_dir(): def test_netcdf_multidim_open_vsimem(): - if gdal.GetDriverByName('netCDF').GetMetadataItem('NETCDF_HAS_NETCDF_MEM') is None: - pytest.skip('NETCDF_HAS_NETCDF_MEM missing') + if gdal.GetDriverByName("netCDF").GetMetadataItem("NETCDF_HAS_NETCDF_MEM") is None: + pytest.skip("NETCDF_HAS_NETCDF_MEM missing") - gdal.FileFromMemBuffer('/vsimem/test.nc', - open('data/netcdf/trmm.nc', 'rb').read()) - ds = gdal.OpenEx('/vsimem/test.nc', gdal.OF_MULTIDIM_RASTER) + gdal.FileFromMemBuffer("/vsimem/test.nc", open("data/netcdf/trmm.nc", "rb").read()) + ds = gdal.OpenEx("/vsimem/test.nc", gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - gdal.Unlink('/vsimem/test.nc') + gdal.Unlink("/vsimem/test.nc") assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar @@ -1862,24 +2265,27 @@ def test_netcdf_multidim_open_vsimem(): def test_netcdf_multidim_open_userfaultfd(): - gdal.Unlink('tmp/test_netcdf_open_userfaultfd.zip') + gdal.Unlink("tmp/test_netcdf_open_userfaultfd.zip") - f = gdal.VSIFOpenL('/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc', 'wb') + f = gdal.VSIFOpenL("/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc", "wb") assert f - data = open('data/netcdf/byte_no_cf.nc', 'rb').read() + data = open("data/netcdf/byte_no_cf.nc", "rb").read() gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) # Can only work on Linux, with some kernel versions... not in Docker by default # so mostly test that we don't crash with gdaltest.error_handler(): - ds = gdal.OpenEx("/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc", gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "/vsizip/tmp/test_netcdf_open_userfaultfd.zip/test.nc", + gdal.OF_MULTIDIM_RASTER, + ) success_expected = False - if 'CI' not in os.environ: - if sys.platform.startswith('linux'): + if "CI" not in os.environ: + if sys.platform.startswith("linux"): uname = os.uname() - version = uname.release.split('.') + version = uname.release.split(".") major = int(version[0]) minor = int(version[1]) if (major, minor) >= (5, 11): @@ -1887,9 +2293,9 @@ def test_netcdf_multidim_open_userfaultfd(): success_expected = True if ds and not success_expected: - print('/vsi access through userfaultfd succeeded') + print("/vsi access through userfaultfd succeeded") - gdal.Unlink('tmp/test_netcdf_open_userfaultfd.zip') + gdal.Unlink("tmp/test_netcdf_open_userfaultfd.zip") ############################################################################### @@ -1898,8 +2304,8 @@ def test_netcdf_multidim_open_userfaultfd(): def test_netcdf_multidim_open_char_2d(): - ds = gdal.OpenEx('data/netcdf/char_2d.nc', gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('f') + ds = gdal.OpenEx("data/netcdf/char_2d.nc", gdal.OF_MULTIDIM_RASTER) + ar = ds.GetRootGroup().OpenMDArray("f") assert ar ar.GetNoDataValueAsRaw() ar.GetBlockSize() @@ -1911,8 +2317,8 @@ def test_netcdf_multidim_open_char_2d(): def test_netcdf_multidim_open_char_2d_zero_dim(): - ds = gdal.OpenEx('data/netcdf/char_2d_zero_dim.nc', gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('f') + ds = gdal.OpenEx("data/netcdf/char_2d_zero_dim.nc", gdal.OF_MULTIDIM_RASTER) + ar = ds.GetRootGroup().OpenMDArray("f") assert ar ar.GetNoDataValueAsRaw() ar.GetBlockSize() @@ -1923,41 +2329,52 @@ def test_netcdf_multidim_open_char_2d_zero_dim(): # (or 'dummy dimensions' for the non-last 2dims and the last 2 dims transposed) -@pytest.mark.parametrize("datatype,request_datatype", - [(gdal.GDT_Byte, gdal.GDT_Byte), - (gdal.GDT_Byte, gdal.GDT_UInt16), # different data type - (gdal.GDT_UInt16, gdal.GDT_UInt16), - (gdal.GDT_UInt16, gdal.GDT_UInt32), # different data type - (gdal.GDT_UInt32, gdal.GDT_UInt32), - (gdal.GDT_Float64, gdal.GDT_Float64), - (gdal.GDT_CFloat64, gdal.GDT_CFloat64), # no optimized CopyWord() implementation - ]) +@pytest.mark.parametrize( + "datatype,request_datatype", + [ + (gdal.GDT_Byte, gdal.GDT_Byte), + (gdal.GDT_Byte, gdal.GDT_UInt16), # different data type + (gdal.GDT_UInt16, gdal.GDT_UInt16), + (gdal.GDT_UInt16, gdal.GDT_UInt32), # different data type + (gdal.GDT_UInt32, gdal.GDT_UInt32), + (gdal.GDT_Float64, gdal.GDT_Float64), + ( + gdal.GDT_CFloat64, + gdal.GDT_CFloat64, + ), # no optimized CopyWord() implementation + ], +) @pytest.mark.parametrize("has_one_sample_z_dim", [False, True]) -def test_netcdf_multidim_read_transposed_optimized_last_2dims(datatype, request_datatype, has_one_sample_z_dim): +def test_netcdf_multidim_read_transposed_optimized_last_2dims( + datatype, request_datatype, has_one_sample_z_dim +): map_gdal_datatype_to_array_letter = { - gdal.GDT_Byte: 'B', - gdal.GDT_UInt16: 'H', - gdal.GDT_UInt32: 'I', - gdal.GDT_Float64: 'd', - gdal.GDT_CFloat64: 'd', + gdal.GDT_Byte: "B", + gdal.GDT_UInt16: "H", + gdal.GDT_UInt32: "I", + gdal.GDT_Float64: "d", + gdal.GDT_CFloat64: "d", } array_letter = map_gdal_datatype_to_array_letter[datatype] request_array_letter = map_gdal_datatype_to_array_letter[request_datatype] values_per_item = 2 if gdal.DataTypeIsComplex(datatype) else 1 - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") + def f(): - ds = drv.CreateMultiDimensional('tmp/test_netcdf_multidim_read_transposed_optimized_last_2dims.nc') + ds = drv.CreateMultiDimensional( + "tmp/test_netcdf_multidim_read_transposed_optimized_last_2dims.nc" + ) assert ds rg = ds.GetRootGroup() assert rg - dim_z = rg.CreateDimension('z', None, None, 1) if has_one_sample_z_dim else None + dim_z = rg.CreateDimension("z", None, None, 1) if has_one_sample_z_dim else None # use dimensions > 32 to test transpose-by-subblock approach of the Transpose2D() # method of gdalmultidim.cpp - dim_y = rg.CreateDimension('Y', None, None, 41) - dim_x = rg.CreateDimension('X', None, None, 37) + dim_y = rg.CreateDimension("Y", None, None, 41) + dim_x = rg.CreateDimension("X", None, None, 37) dims = [] if dim_z: dims.append(dim_z) @@ -1965,17 +2382,27 @@ def f(): dims.append(dim_x) y_size = dim_y.GetSize() x_size = dim_x.GetSize() - var = rg.CreateMDArray('var', dims, - gdal.ExtendedDataType.Create(datatype), - ['COMPRESS=DEFLATE']) + var = rg.CreateMDArray( + "var", dims, gdal.ExtendedDataType.Create(datatype), ["COMPRESS=DEFLATE"] + ) if values_per_item == 2: - data = array.array(array_letter, [(v // 2) & 255 for v in range(2 * y_size * x_size)]).tobytes() + data = array.array( + array_letter, [(v // 2) & 255 for v in range(2 * y_size * x_size)] + ).tobytes() else: - data = array.array(array_letter, [v & 255 for v in range(y_size * x_size)]).tobytes() + data = array.array( + array_letter, [v & 255 for v in range(y_size * x_size)] + ).tobytes() assert var.Write(data) == gdal.CE_None transposed_ar = var.Transpose([0, 2, 1] if dim_z else [1, 0]) - got_data_raw = transposed_ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(request_datatype)) - got_data = list(struct.unpack(request_array_letter * (values_per_item * y_size * x_size), got_data_raw)) + got_data_raw = transposed_ar.Read( + buffer_datatype=gdal.ExtendedDataType.Create(request_datatype) + ) + got_data = list( + struct.unpack( + request_array_letter * (values_per_item * y_size * x_size), got_data_raw + ) + ) expected_data = [] for i in range(x_size): for j in range(y_size): @@ -1987,109 +2414,145 @@ def f(): try: f() finally: - gdal.Unlink('tmp/test_netcdf_multidim_read_transposed_optimized_last_2dims.nc') + gdal.Unlink("tmp/test_netcdf_multidim_read_transposed_optimized_last_2dims.nc") ############################################################################### # Test reading a transposed 4-dim array with the last 2 dims transposed -@pytest.mark.parametrize("datatype,request_datatype", - [(gdal.GDT_Byte, gdal.GDT_Byte), - (gdal.GDT_UInt16, gdal.GDT_UInt16), - (gdal.GDT_UInt32, gdal.GDT_UInt32), - (gdal.GDT_Float64, gdal.GDT_Float64),]) -def test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims(datatype, request_datatype): +@pytest.mark.parametrize( + "datatype,request_datatype", + [ + (gdal.GDT_Byte, gdal.GDT_Byte), + (gdal.GDT_UInt16, gdal.GDT_UInt16), + (gdal.GDT_UInt32, gdal.GDT_UInt32), + (gdal.GDT_Float64, gdal.GDT_Float64), + ], +) +def test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims( + datatype, request_datatype +): map_gdal_datatype_to_array_letter = { - gdal.GDT_Byte: 'B', - gdal.GDT_UInt16: 'H', - gdal.GDT_UInt32: 'I', - gdal.GDT_Float64: 'd', + gdal.GDT_Byte: "B", + gdal.GDT_UInt16: "H", + gdal.GDT_UInt32: "I", + gdal.GDT_Float64: "d", } array_letter = map_gdal_datatype_to_array_letter[datatype] request_array_letter = map_gdal_datatype_to_array_letter[request_datatype] - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") + def f(): - ds = drv.CreateMultiDimensional('tmp/test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims.nc') + ds = drv.CreateMultiDimensional( + "tmp/test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims.nc" + ) assert ds rg = ds.GetRootGroup() assert rg - dim_t = rg.CreateDimension('T', None, None, 3) - dim_z = rg.CreateDimension('Z', None, None, 2) - dim_y = rg.CreateDimension('Y', None, None, 41) - dim_x = rg.CreateDimension('X', None, None, 37) + dim_t = rg.CreateDimension("T", None, None, 3) + dim_z = rg.CreateDimension("Z", None, None, 2) + dim_y = rg.CreateDimension("Y", None, None, 41) + dim_x = rg.CreateDimension("X", None, None, 37) dims = [dim_t, dim_z, dim_y, dim_x] t_size = dim_t.GetSize() z_size = dim_z.GetSize() y_size = dim_y.GetSize() x_size = dim_x.GetSize() - var = rg.CreateMDArray('var', dims, - gdal.ExtendedDataType.Create(datatype), - ['COMPRESS=DEFLATE']) - data = array.array(array_letter, [v & 255 for v in range(t_size * z_size * y_size * x_size)]).tobytes() + var = rg.CreateMDArray( + "var", dims, gdal.ExtendedDataType.Create(datatype), ["COMPRESS=DEFLATE"] + ) + data = array.array( + array_letter, [v & 255 for v in range(t_size * z_size * y_size * x_size)] + ).tobytes() assert var.Write(data) == gdal.CE_None transposed_ar = var.Transpose([0, 1, 3, 2]) - got_data_raw = transposed_ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(request_datatype)) - got_data = list(struct.unpack(request_array_letter * (t_size * z_size * y_size * x_size), got_data_raw)) + got_data_raw = transposed_ar.Read( + buffer_datatype=gdal.ExtendedDataType.Create(request_datatype) + ) + got_data = list( + struct.unpack( + request_array_letter * (t_size * z_size * y_size * x_size), got_data_raw + ) + ) expected_data = [] for l in range(t_size): for k in range(z_size): for i in range(x_size): for j in range(y_size): - expected_data.append((((l * z_size + k) * y_size + j) * x_size + i) & 255) + expected_data.append( + (((l * z_size + k) * y_size + j) * x_size + i) & 255 + ) assert got_data == expected_data try: f() finally: - gdal.Unlink('tmp/test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims.nc') + gdal.Unlink( + "tmp/test_netcdf_multidim_read_transposed_4d_optimized_case_for_last_2dims.nc" + ) ############################################################################### # Test reading a transposed 3-dim array with all dims shuffled in the transposition -@pytest.mark.parametrize("datatype,request_datatype", - [(gdal.GDT_Byte, gdal.GDT_Byte), - (gdal.GDT_UInt16, gdal.GDT_UInt16), - (gdal.GDT_UInt32, gdal.GDT_UInt32), - (gdal.GDT_Float64, gdal.GDT_Float64),]) +@pytest.mark.parametrize( + "datatype,request_datatype", + [ + (gdal.GDT_Byte, gdal.GDT_Byte), + (gdal.GDT_UInt16, gdal.GDT_UInt16), + (gdal.GDT_UInt32, gdal.GDT_UInt32), + (gdal.GDT_Float64, gdal.GDT_Float64), + ], +) def test_netcdf_multidim_read_transposed_3d_general_case(datatype, request_datatype): map_gdal_datatype_to_array_letter = { - gdal.GDT_Byte: 'B', - gdal.GDT_UInt16: 'H', - gdal.GDT_UInt32: 'I', - gdal.GDT_Float64: 'd', + gdal.GDT_Byte: "B", + gdal.GDT_UInt16: "H", + gdal.GDT_UInt32: "I", + gdal.GDT_Float64: "d", } array_letter = map_gdal_datatype_to_array_letter[datatype] request_array_letter = map_gdal_datatype_to_array_letter[request_datatype] - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") + def f(): - ds = drv.CreateMultiDimensional('tmp/test_netcdf_multidim_read_transposed_3d_general_case.nc') + ds = drv.CreateMultiDimensional( + "tmp/test_netcdf_multidim_read_transposed_3d_general_case.nc" + ) assert ds rg = ds.GetRootGroup() assert rg - dim_z = rg.CreateDimension('Z', None, None, 2) - dim_y = rg.CreateDimension('Y', None, None, 41) - dim_x = rg.CreateDimension('X', None, None, 37) + dim_z = rg.CreateDimension("Z", None, None, 2) + dim_y = rg.CreateDimension("Y", None, None, 41) + dim_x = rg.CreateDimension("X", None, None, 37) dims = [dim_z, dim_y, dim_x] z_size = dim_z.GetSize() y_size = dim_y.GetSize() x_size = dim_x.GetSize() - var = rg.CreateMDArray('var', dims, - gdal.ExtendedDataType.Create(datatype), - ['COMPRESS=DEFLATE']) - data = array.array(array_letter, [v & 255 for v in range(z_size * y_size * x_size)]).tobytes() + var = rg.CreateMDArray( + "var", dims, gdal.ExtendedDataType.Create(datatype), ["COMPRESS=DEFLATE"] + ) + data = array.array( + array_letter, [v & 255 for v in range(z_size * y_size * x_size)] + ).tobytes() assert var.Write(data) == gdal.CE_None - transposed_ar = var.Transpose([2, 1, 0]) # full transposition - got_data_raw = transposed_ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(request_datatype)) - got_data = list(struct.unpack(request_array_letter * (z_size * y_size * x_size), got_data_raw)) + transposed_ar = var.Transpose([2, 1, 0]) # full transposition + got_data_raw = transposed_ar.Read( + buffer_datatype=gdal.ExtendedDataType.Create(request_datatype) + ) + got_data = list( + struct.unpack( + request_array_letter * (z_size * y_size * x_size), got_data_raw + ) + ) expected_data = [] for i in range(x_size): for j in range(y_size): @@ -2100,7 +2563,7 @@ def f(): try: f() finally: - gdal.Unlink('tmp/test_netcdf_multidim_read_transposed_3d_general_case.nc') + gdal.Unlink("tmp/test_netcdf_multidim_read_transposed_3d_general_case.nc") ############################################################################### @@ -2110,29 +2573,38 @@ def f(): def test_netcdf_multidim_read_transposed_bigger_file(): - drv = gdal.GetDriverByName('netCDF') + drv = gdal.GetDriverByName("netCDF") + def create(): - ds = drv.CreateMultiDimensional('tmp/test_netcdf_multidim_read_transposed_bigger_file.nc') + ds = drv.CreateMultiDimensional( + "tmp/test_netcdf_multidim_read_transposed_bigger_file.nc" + ) assert ds rg = ds.GetRootGroup() assert rg - dim_y = rg.CreateDimension('Y', None, None, 1024) - dim_x = rg.CreateDimension('X', None, None, 1024) + dim_y = rg.CreateDimension("Y", None, None, 1024) + dim_x = rg.CreateDimension("X", None, None, 1024) dims = [dim_y, dim_x] y_size = dim_y.GetSize() x_size = dim_x.GetSize() - var = rg.CreateMDArray('var', dims, - gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['COMPRESS=DEFLATE', 'BLOCKSIZE=1024,1024']) - data = b'\0' * (y_size * x_size) + var = rg.CreateMDArray( + "var", + dims, + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ["COMPRESS=DEFLATE", "BLOCKSIZE=1024,1024"], + ) + data = b"\0" * (y_size * x_size) assert var.Write(data) == gdal.CE_None create() - ds = gdal.OpenEx('tmp/test_netcdf_multidim_read_transposed_bigger_file.nc', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx( + "tmp/test_netcdf_multidim_read_transposed_bigger_file.nc", + gdal.OF_MULTIDIM_RASTER, + ) rg = ds.GetRootGroup() - var = rg.OpenMDArray('var') + var = rg.OpenMDArray("var") transposed_ar = var.Transpose([1, 0]) # Takes 4 seconds or so if not optimized, vs a few milliseconds otherwise start = time.time() @@ -2140,4 +2612,4 @@ def create(): delay = time.time() - start assert delay < 1 - gdal.Unlink('tmp/test_netcdf_multidim_read_transposed_bigger_file.nc') + gdal.Unlink("tmp/test_netcdf_multidim_read_transposed_bigger_file.nc") diff --git a/autotest/gdrivers/netcdf_multidim_pamproxydb.py b/autotest/gdrivers/netcdf_multidim_pamproxydb.py index 9e2a88ddb28d..03ee18a0799e 100755 --- a/autotest/gdrivers/netcdf_multidim_pamproxydb.py +++ b/autotest/gdrivers/netcdf_multidim_pamproxydb.py @@ -29,22 +29,23 @@ ############################################################################### import sys -sys.path.append('../pymod') + +sys.path.append("../pymod") import gdaltest from osgeo import gdal # Must to be launched from netcdf_multidim.py::test_netcdf_multidim_cache_pamproxydb -if len(sys.argv) == 2 and sys.argv[1] == '-test_netcdf_multidim_cache_pamproxydb': +if len(sys.argv) == 2 and sys.argv[1] == "-test_netcdf_multidim_cache_pamproxydb": - gdal.SetConfigOption('GDAL_PAM_PROXY_DIR', 'tmp/tmppamproxydir') + gdal.SetConfigOption("GDAL_PAM_PROXY_DIR", "tmp/tmppamproxydir") - tmpfilename = 'tmp/tmpdirreadonly/test.nc' + tmpfilename = "tmp/tmpdirreadonly/test.nc" def get_transposed_and_cache(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('Band1') + ar = ds.GetRootGroup().OpenMDArray("Band1") assert ar transpose = ar.Transpose([1, 0]) assert transpose.Cache() @@ -52,7 +53,7 @@ def get_transposed_and_cache(): # Cannot cache twice the same array assert transpose.Cache() is False - ar2 = ds.GetRootGroup().OpenMDArray('Band1') + ar2 = ds.GetRootGroup().OpenMDArray("Band1") assert ar2 assert ar2.Cache() @@ -61,20 +62,23 @@ def get_transposed_and_cache(): transposed_data = get_transposed_and_cache() def check_cache_exists(): - cache_ds = gdal.OpenEx('tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac', gdal.OF_MULTIDIM_RASTER) + cache_ds = gdal.OpenEx( + "tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac", + gdal.OF_MULTIDIM_RASTER, + ) assert cache_ds rg = cache_ds.GetRootGroup() - cached_ar = rg.OpenMDArray('Transposed_view_of__Band1_along__1_0_') + cached_ar = rg.OpenMDArray("Transposed_view_of__Band1_along__1_0_") assert cached_ar assert cached_ar.Read() == transposed_data - assert rg.OpenMDArray('_Band1') is not None + assert rg.OpenMDArray("_Band1") is not None check_cache_exists() def check_cache_working(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('Band1') + ar = ds.GetRootGroup().OpenMDArray("Band1") transpose = ar.Transpose([1, 0]) assert transpose.Read() == transposed_data # Again @@ -84,26 +88,28 @@ def check_cache_working(): # Now alter the cache directly def alter_cache(): - cache_ds = gdal.OpenEx('tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac', - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + cache_ds = gdal.OpenEx( + "tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac", + gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE, + ) assert cache_ds rg = cache_ds.GetRootGroup() cached_ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - cached_ar.Write(b'\x00' * len(transposed_data)) + cached_ar.Write(b"\x00" * len(transposed_data)) alter_cache() # And check we get the altered values def check_cache_really_working(): ds = gdal.OpenEx(tmpfilename, gdal.OF_MULTIDIM_RASTER) - ar = ds.GetRootGroup().OpenMDArray('Band1') + ar = ds.GetRootGroup().OpenMDArray("Band1") transpose = ar.Transpose([1, 0]) - assert transpose.Read() == b'\x00' * len(transposed_data) + assert transpose.Read() == b"\x00" * len(transposed_data) check_cache_really_working() gdal.Unlink(tmpfilename) - gdal.Unlink('tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac') + gdal.Unlink("tmp/tmppamproxydir/000000_tmp_tmpdirreadonly_test.nc.gmac") - print('success') + print("success") sys.exit(0) diff --git a/autotest/gdrivers/ngsgeoid.py b/autotest/gdrivers/ngsgeoid.py index 2827df986153..7110b176b0ea 100755 --- a/autotest/gdrivers/ngsgeoid.py +++ b/autotest/gdrivers/ngsgeoid.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,8 +37,19 @@ def test_ngsgeoid_1(): - tst = gdaltest.GDALTest('NGSGEOID', 'ngsgeoid/g2009u01_le_truncated.bin', 1, 65534) - return tst.testOpen(check_gt=(229.99166666666667, 0.016666666666670001, 0.0, 40.00833333333334, 0.0, -0.016666666666670001), check_prj='WGS84') + tst = gdaltest.GDALTest("NGSGEOID", "ngsgeoid/g2009u01_le_truncated.bin", 1, 65534) + return tst.testOpen( + check_gt=( + 229.99166666666667, + 0.016666666666670001, + 0.0, + 40.00833333333334, + 0.0, + -0.016666666666670001, + ), + check_prj="WGS84", + ) + ############################################################################### # Test opening a big endian file @@ -47,8 +57,15 @@ def test_ngsgeoid_1(): def test_ngsgeoid_2(): - tst = gdaltest.GDALTest('NGSGEOID', 'ngsgeoid/g2009u01_be_truncated.bin', 1, 65534) - return tst.testOpen(check_gt=(229.99166666666667, 0.016666666666670001, 0.0, 40.00833333333334, 0.0, -0.016666666666670001), check_prj='WGS84') - - - + tst = gdaltest.GDALTest("NGSGEOID", "ngsgeoid/g2009u01_be_truncated.bin", 1, 65534) + return tst.testOpen( + check_gt=( + 229.99166666666667, + 0.016666666666670001, + 0.0, + 40.00833333333334, + 0.0, + -0.016666666666670001, + ), + check_prj="WGS84", + ) diff --git a/autotest/gdrivers/ngw.py b/autotest/gdrivers/ngw.py index d9fe37f489a4..10b9141b8712 100755 --- a/autotest/gdrivers/ngw.py +++ b/autotest/gdrivers/ngw.py @@ -30,27 +30,34 @@ ############################################################################### import os -import sys import shutil +import sys + from osgeo import gdal -sys.path.append('../pymod') +sys.path.append("../pymod") -import gdaltest -import time import json -import pytest import random +import time from datetime import datetime -pytestmark = [pytest.mark.require_driver('NGW'), - pytest.mark.skipif('CI' in os.environ, reason="NGW tests are flaky. See https://github.com/OSGeo/gdal/issues/4453")] +import gdaltest +import pytest + +pytestmark = [ + pytest.mark.require_driver("NGW"), + pytest.mark.skipif( + "CI" in os.environ, + reason="NGW tests are flaky. See https://github.com/OSGeo/gdal/issues/4453", + ), +] ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.ngw_test_server = 'https://sandbox.nextgis.com' + gdaltest.ngw_test_server = "https://sandbox.nextgis.com" if check_availability(gdaltest.ngw_test_server) == False: pytest.skip() @@ -58,18 +65,21 @@ def startup_and_cleanup(): yield if gdaltest.group_id is not None: - delete_url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.group_id + delete_url = ( + "NGW:" + gdaltest.ngw_test_server + "/resource/" + gdaltest.group_id + ) gdaltest.ngw_ds = None - assert gdal.GetDriverByName('NGW').Delete(delete_url) == gdal.CE_None, \ - 'Failed to delete datasource ' + delete_url + '.' + assert gdal.GetDriverByName("NGW").Delete(delete_url) == gdal.CE_None, ( + "Failed to delete datasource " + delete_url + "." + ) gdaltest.ngw_ds = None gdaltest.clean_tmp() try: - shutil.rmtree('gdalwmscache') + shutil.rmtree("gdalwmscache") except OSError: pass @@ -81,99 +91,125 @@ def check_availability(url): if now.hour >= 0 and now.hour < 4: return False - version_url = url + '/api/component/pyramid/pkg_version' + 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_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'] + limit = quota_json["limit"] + count = quota_json["count"] if limit is None or count is None: return True return limit - count > 15 except: return False + def get_new_name(): - return 'gdaltest_group_' + str(int(time.time())) + '_' + str(random.randint(10, 99)) + return "gdaltest_group_" + str(int(time.time())) + "_" + str(random.randint(10, 99)) + ############################################################################### # Check create datasource. + def test_ngw_2(): - create_url = 'NGW:' + gdaltest.ngw_test_server + '/resource/0/' + get_new_name() + create_url = "NGW:" + gdaltest.ngw_test_server + "/resource/0/" + get_new_name() gdal.PushErrorHandler() - description = 'GDAL Raster test group' - gdaltest.ngw_ds = gdal.GetDriverByName('NGW').Create(create_url, 0, 0, 0, gdal.GDT_Unknown, \ - options=['DESCRIPTION=' + description,]) + description = "GDAL Raster test group" + gdaltest.ngw_ds = gdal.GetDriverByName("NGW").Create( + create_url, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=[ + "DESCRIPTION=" + description, + ], + ) gdal.PopErrorHandler() - assert gdaltest.ngw_ds is not None, 'Create datasource failed.' - assert gdaltest.ngw_ds.GetMetadataItem('description', '') == description, \ - 'Did not get expected datasource description.' + assert gdaltest.ngw_ds is not None, "Create datasource failed." + assert ( + gdaltest.ngw_ds.GetMetadataItem("description", "") == description + ), "Did not get expected datasource description." + + assert ( + int(gdaltest.ngw_ds.GetMetadataItem("id", "")) > 0 + ), "Did not get expected datasource identifier." - assert int(gdaltest.ngw_ds.GetMetadataItem('id', '')) > 0, \ - 'Did not get expected datasource identifier.' ############################################################################### # Check rename datasource. + def test_ngw_3(): - 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 + 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 ( + gdal.GetDriverByName("NGW").Rename(new_name, rename_url) == gdal.CE_None + ), "Rename datasource failed." - assert gdal.GetDriverByName('NGW').Rename(new_name, rename_url) == gdal.CE_None, \ - 'Rename datasource failed.' ############################################################################### # Create the NGW raster layer + def test_ngw_4(): # FIXME: depends on previous test if gdaltest.ngw_ds is None: pytest.skip() - src_ds = gdal.Open('data/rgbsmall.tif') - resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') - url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + resource_id + '/rgbsmall' - ds = gdal.GetDriverByName('NGW').CreateCopy(url, src_ds, options=['DESCRIPTION=Test raster create']) + src_ds = gdal.Open("data/rgbsmall.tif") + resource_id = gdaltest.ngw_ds.GetMetadataItem("id", "") + url = "NGW:" + gdaltest.ngw_test_server + "/resource/" + resource_id + "/rgbsmall" + ds = gdal.GetDriverByName("NGW").CreateCopy( + url, src_ds, options=["DESCRIPTION=Test raster create"] + ) src_ds = None - assert ds is not None, 'Raster create failed' + assert ds is not None, "Raster create failed" - ds_resource_id = ds.GetMetadataItem('id', '') + ds_resource_id = ds.GetMetadataItem("id", "") gdaltest.raster_id = ds_resource_id gdaltest.group_id = resource_id ds = None # Upload 16bit raster - src_ds = gdal.Open('data/int16.tif') - url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + resource_id + '/int16' - ds = gdal.GetDriverByName('NGW').CreateCopy(url, src_ds, options=[ - 'DESCRIPTION=Test 16bit raster create', - 'RASTER_QML_PATH=data/ngw/96.qml' - ]) + src_ds = gdal.Open("data/int16.tif") + url = "NGW:" + gdaltest.ngw_test_server + "/resource/" + resource_id + "/int16" + ds = gdal.GetDriverByName("NGW").CreateCopy( + url, + src_ds, + options=[ + "DESCRIPTION=Test 16bit raster create", + "RASTER_QML_PATH=data/ngw/96.qml", + ], + ) src_ds = None - assert ds is not None, 'Raster create failed' + assert ds is not None, "Raster create failed" ds = None + ############################################################################### # Open the NGW dataset + def test_ngw_5(): # FIXME: depends on previous test @@ -183,43 +219,52 @@ def test_ngw_5(): if gdaltest.raster_id is None: pytest.skip() - url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.raster_id + url = "NGW:" + gdaltest.ngw_test_server + "/resource/" + gdaltest.raster_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_RASTER) - assert gdaltest.ngw_ds is not None, 'Open {} failed.'.format(url) + assert gdaltest.ngw_ds is not None, "Open {} failed.".format(url) + ############################################################################### # Check various things about the configuration. + def test_ngw_6(): # FIXME: depends on previous test if gdaltest.ngw_ds is None: pytest.skip() - assert gdaltest.ngw_ds.RasterXSize == 1073741824 and \ - gdaltest.ngw_ds.RasterYSize == 1073741824 and \ - gdaltest.ngw_ds.RasterCount == 4, 'Wrong size or band count.' + assert ( + gdaltest.ngw_ds.RasterXSize == 1073741824 + and gdaltest.ngw_ds.RasterYSize == 1073741824 + and gdaltest.ngw_ds.RasterCount == 4 + ), "Wrong size or band count." wkt = gdaltest.ngw_ds.GetProjectionRef() - assert wkt[:33] == 'PROJCS["WGS 84 / Pseudo-Mercator"', 'Got wrong SRS: ' + wkt + assert wkt[:33] == 'PROJCS["WGS 84 / Pseudo-Mercator"', "Got wrong SRS: " + wkt gt = gdaltest.ngw_ds.GetGeoTransform() # -20037508.34, 0.037322767712175846, 0.0, 20037508.34, 0.0, -0.037322767712175846 - assert gt[0] == pytest.approx(-20037508.34, abs=0.00001) \ - or gt[3] == pytest.approx(20037508.34, abs=0.00001) \ - or gt[1] == pytest.approx(0.037322767712175846, abs=0.00001) \ - or gt[2] == pytest.approx(0.0, abs=0.00001) \ - or gt[5] == pytest.approx(-0.037322767712175846, abs=0.00001) \ - or gt[4] == pytest.approx(0.0, abs=0.00001), 'Wrong geotransform. {}'.format(gt) + assert ( + gt[0] == pytest.approx(-20037508.34, abs=0.00001) + or gt[3] == pytest.approx(20037508.34, abs=0.00001) + or gt[1] == pytest.approx(0.037322767712175846, abs=0.00001) + or gt[2] == pytest.approx(0.0, abs=0.00001) + or gt[5] == pytest.approx(-0.037322767712175846, abs=0.00001) + or gt[4] == pytest.approx(0.0, abs=0.00001) + ), "Wrong geotransform. {}".format(gt) + + assert gdaltest.ngw_ds.GetRasterBand(1).GetOverviewCount() > 0, "No overviews!" + assert ( + gdaltest.ngw_ds.GetRasterBand(1).DataType == gdal.GDT_Byte + ), "Wrong band data type." - assert gdaltest.ngw_ds.GetRasterBand(1).GetOverviewCount() > 0, 'No overviews!' - assert gdaltest.ngw_ds.GetRasterBand(1).DataType == gdal.GDT_Byte, \ - 'Wrong band data type.' ############################################################################### # Check checksum execute success for a small region. + def test_ngw_7(): # FIXME: depends on previous test @@ -227,38 +272,44 @@ def test_ngw_7(): pytest.skip() gdal.ErrorReset() - gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "ON") + gdal.PushErrorHandler("CPLQuietErrorHandler") ovr_band = gdaltest.ngw_ds.GetRasterBand(1).GetOverview(21) assert ovr_band is not None ovr_band.Checksum() gdal.PopErrorHandler() - gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "OFF") msg = gdal.GetLastErrorMsg() assert gdal.GetLastErrorType() != gdal.CE_Failure, msg gdal.ErrorReset() + ############################################################################### # Test getting subdatasets from GetCapabilities + def test_ngw_8(): # FIXME: depends on previous test if gdaltest.ngw_ds is None: pytest.skip() - url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.group_id - ds = gdal.OpenEx(url, gdal.OF_VECTOR | gdal.OF_RASTER ) - assert ds is not None, 'Open of {} failed.'.format(url) + url = "NGW:" + gdaltest.ngw_test_server + "/resource/" + gdaltest.group_id + ds = gdal.OpenEx(url, gdal.OF_VECTOR | gdal.OF_RASTER) + assert ds is not None, "Open of {} failed.".format(url) subdatasets = ds.GetMetadata("SUBDATASETS") - assert subdatasets, 'Did not get expected subdataset count. Get {} subdatasets. Url: {}'.format(len(subdatasets), url) + assert ( + subdatasets + ), "Did not get expected subdataset count. Get {} subdatasets. Url: {}".format( + len(subdatasets), url + ) - name = subdatasets['SUBDATASET_0_NAME'] + name = subdatasets["SUBDATASET_0_NAME"] ds = gdal.OpenEx(name, gdal.OF_RASTER) - assert ds is not None, 'Open of {} failed.'.format(name) + assert ds is not None, "Open of {} failed.".format(name) ds = None diff --git a/autotest/gdrivers/nitf.py b/autotest/gdrivers/nitf.py index 8a9923631d9a..9e3f492ee594 100755 --- a/autotest/gdrivers/nitf.py +++ b/autotest/gdrivers/nitf.py @@ -30,74 +30,81 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import array +import base64 import copy import os -import array -import struct import shutil -import base64 -from osgeo import gdal -from osgeo import ogr -from osgeo import osr - +import struct import gdaltest import pytest -@pytest.fixture(scope='module') +from osgeo import gdal, ogr, osr + + +@pytest.fixture(scope="module") def not_jpeg_9b(): import jpeg + jpeg.test_jpeg_1() - if gdaltest.jpeg_version == '9b': + if gdaltest.jpeg_version == "9b": pytest.skip() + def hex_string(s): return "".join(hex(ord(c))[2:] for c in s) + ############################################################################### # Write/Read test of simple byte reference data. + def test_nitf_1(): - tst = gdaltest.GDALTest('NITF', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "byte.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read test of simple 16bit reference data. def test_nitf_2(): - tst = gdaltest.GDALTest('NITF', 'int16.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "int16.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read RGB image with lat/long georeferencing, and verify. def test_nitf_3(): - tst = gdaltest.GDALTest('NITF', 'rgbsmall.tif', 3, 21349) + tst = gdaltest.GDALTest("NITF", "rgbsmall.tif", 3, 21349) return tst.testCreateCopy() ############################################################################### # Test direction creation of an NITF file. + def nitf_create(creation_options, set_inverted_color_interp=True, createcopy=False): - drv = gdal.GetDriverByName('NITF') + drv = gdal.GetDriverByName("NITF") try: - os.remove('tmp/test_create.ntf') + os.remove("tmp/test_create.ntf") except OSError: pass if createcopy: - ds = gdal.GetDriverByName('MEM').Create('', 200, 100, 3, gdal.GDT_Byte) + ds = gdal.GetDriverByName("MEM").Create("", 200, 100, 3, gdal.GDT_Byte) else: - ds = drv.Create('tmp/test_create.ntf', 200, 100, 3, gdal.GDT_Byte, - creation_options) + ds = drv.Create( + "tmp/test_create.ntf", 200, 100, 3, gdal.GDT_Byte, creation_options + ) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) if set_inverted_color_interp: @@ -111,65 +118,78 @@ def nitf_create(creation_options, set_inverted_color_interp=True, createcopy=Fal my_list = list(range(200)) + list(range(20, 220)) + list(range(30, 230)) try: - raw_data = array.array('h', my_list).tobytes() + raw_data = array.array("h", my_list).tobytes() except: # Python 2 - raw_data = array.array('h', my_list).tostring() + raw_data = array.array("h", my_list).tostring() for line in range(100): - ds.WriteRaster(0, line, 200, 1, raw_data, - buf_type=gdal.GDT_Int16, - band_list=[1, 2, 3]) + ds.WriteRaster( + 0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1, 2, 3] + ) if createcopy: - ds = drv.CreateCopy('tmp/test_create.ntf', ds, - options=creation_options) + ds = drv.CreateCopy("tmp/test_create.ntf", ds, options=creation_options) ds = None + ############################################################################### # Test direction creation of an non-compressed NITF file. def test_nitf_4(): - return nitf_create(['ICORDS=G']) + return nitf_create(["ICORDS=G"]) ############################################################################### # Verify created file -def nitf_check_created_file(checksum1, checksum2, checksum3, set_inverted_color_interp=True): - ds = gdal.Open('tmp/test_create.ntf') + +def nitf_check_created_file( + checksum1, checksum2, checksum3, set_inverted_color_interp=True +): + ds = gdal.Open("tmp/test_create.ntf") chksum = ds.GetRasterBand(1).Checksum() chksum_expect = checksum1 - assert chksum == chksum_expect, 'Did not get expected chksum for band 1' + assert chksum == chksum_expect, "Did not get expected chksum for band 1" chksum = ds.GetRasterBand(2).Checksum() chksum_expect = checksum2 - assert chksum == chksum_expect, 'Did not get expected chksum for band 2' + assert chksum == chksum_expect, "Did not get expected chksum for band 2" chksum = ds.GetRasterBand(3).Checksum() chksum_expect = checksum3 - assert chksum == chksum_expect, 'Did not get expected chksum for band 3' + assert chksum == chksum_expect, "Did not get expected chksum for band 3" geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30.0, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(100, abs=0.1) + and geotransform[1] == pytest.approx(0.1, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(30.0, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-0.1, abs=0.001) + ), "geotransform differs from expected" if set_inverted_color_interp: - assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ - 'Got wrong color interpretation.' + assert ( + ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand + ), "Got wrong color interpretation." - assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ - 'Got wrong color interpretation.' + assert ( + ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand + ), "Got wrong color interpretation." - assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ - 'Got wrong color interpretation.' + assert ( + ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand + ), "Got wrong color interpretation." ds = None + ############################################################################### # Verify file created by nitf_4() @@ -178,16 +198,26 @@ def test_nitf_5(): return nitf_check_created_file(32498, 42602, 38982) + ############################################################################### # Read existing NITF file. Verifies the new adjusted IGEOLO interp. def test_nitf_6(): - tst = gdaltest.GDALTest('NITF', 'nitf/rgb.ntf', 3, 21349) - return tst.testOpen(check_prj='WGS84', - check_gt=(-44.842029478458, 0.003503401360, 0, - -22.930748299319, 0, -0.003503401360)) + tst = gdaltest.GDALTest("NITF", "nitf/rgb.ntf", 3, 21349) + return tst.testOpen( + check_prj="WGS84", + check_gt=( + -44.842029478458, + 0.003503401360, + 0, + -22.930748299319, + 0, + -0.003503401360, + ), + ) + ############################################################################### # NITF in-memory. @@ -195,26 +225,38 @@ def test_nitf_6(): def test_nitf_7(): - tst = gdaltest.GDALTest('NITF', 'rgbsmall.tif', 3, 21349) + tst = gdaltest.GDALTest("NITF", "rgbsmall.tif", 3, 21349) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Verify we can open an NSIF file, and get metadata including BLOCKA. def test_nitf_8(): - ds = gdal.Open('data/nitf/fake_nsif.ntf') + ds = gdal.Open("data/nitf/fake_nsif.ntf") chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 12033 - assert chksum == chksum_expect, 'Did not get expected chksum for band 1' + assert chksum == chksum_expect, "Did not get expected chksum for band 1" md = ds.GetMetadata() - assert md['NITF_FHDR'] == 'NSIF01.00', 'Got wrong FHDR value' + assert md["NITF_FHDR"] == "NSIF01.00", "Got wrong FHDR value" + + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + and md["NITF_BLOCKA_BLOCK_COUNT"] == "01" + and md["NITF_BLOCKA_N_GRAY_01"] == "00000" + and md["NITF_BLOCKA_L_LINES_01"] == "01000" + and md["NITF_BLOCKA_LAYOVER_ANGLE_01"] == "000" + and md["NITF_BLOCKA_SHADOW_ANGLE_01"] == "000" + and md["NITF_BLOCKA_FRLC_LOC_01"] == "+41.319331+020.078400" + and md["NITF_BLOCKA_LRLC_LOC_01"] == "+41.317083+020.126072" + and md["NITF_BLOCKA_LRFC_LOC_01"] == "+41.281634+020.122570" + and md["NITF_BLOCKA_FRFC_LOC_01"] == "+41.283881+020.074924" + ), "BLOCKA metadata has unexpected value." - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+41.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+41.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+41.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+41.283881+020.074924', \ - 'BLOCKA metadata has unexpected value.' ############################################################################### # Create and read a JPEG encoded NITF file. @@ -222,22 +264,25 @@ def test_nitf_8(): def test_nitf_9(): - src_ds = gdal.Open('data/rgbsmall.tif') - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf9.ntf', src_ds, - options=['IC=C3']) + src_ds = gdal.Open("data/rgbsmall.tif") + ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf9.ntf", src_ds, options=["IC=C3"] + ) src_ds = None ds = None - ds = gdal.Open('tmp/nitf9.ntf') + ds = gdal.Open("tmp/nitf9.ntf") (exp_mean, exp_stddev) = (65.9532, 46.9026375565) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'did not get expected mean or standard dev.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "did not get expected mean or standard dev." + + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert md["COMPRESSION"] == "JPEG", "Did not get expected compression value." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' ############################################################################### # For esoteric reasons, createcopy from jpeg compressed nitf files can be @@ -246,17 +291,19 @@ def test_nitf_9(): def test_nitf_10(): - src_ds = gdal.Open('tmp/nitf9.ntf') + src_ds = gdal.Open("tmp/nitf9.ntf") expected_cs = src_ds.GetRasterBand(2).Checksum() src_ds = None - assert expected_cs in (22296, - 22259, - 22415, # libjpeg 9e - ) + assert expected_cs in ( + 22296, + 22259, + 22415, # libjpeg 9e + ) - tst = gdaltest.GDALTest('NITF', '../tmp/nitf9.ntf', 2, expected_cs) + tst = gdaltest.GDALTest("NITF", "../tmp/nitf9.ntf", 2, expected_cs) return tst.testCreateCopy() + ############################################################################### # Test 1bit file ... conveniently very small and easy to include! (#1854) @@ -264,91 +311,108 @@ def test_nitf_10(): def test_nitf_11(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/i_3034c.ntf - tst = gdaltest.GDALTest('NITF', 'nitf/i_3034c.ntf', 1, 170) + tst = gdaltest.GDALTest("NITF", "nitf/i_3034c.ntf", 1, 170) return tst.testOpen() + ############################################################################### # Verify that TRE and CGM access via the metadata domain works. def test_nitf_12(): - ds = gdal.Open('data/nitf/fake_nsif.ntf') + ds = gdal.Open("data/nitf/fake_nsif.ntf") - mdTRE = ds.GetMetadata('TRE') + mdTRE = ds.GetMetadata("TRE") try: # NG bindings - blockA = ds.GetMetadataItem('BLOCKA', 'TRE') + blockA = ds.GetMetadataItem("BLOCKA", "TRE") except: - blockA = mdTRE['BLOCKA'] + blockA = mdTRE["BLOCKA"] - mdCGM = ds.GetMetadata('CGM') + mdCGM = ds.GetMetadata("CGM") try: # NG bindings - segmentCount = ds.GetMetadataItem('SEGMENT_COUNT', 'CGM') + segmentCount = ds.GetMetadataItem("SEGMENT_COUNT", "CGM") except: - segmentCount = mdCGM['SEGMENT_COUNT'] + segmentCount = mdCGM["SEGMENT_COUNT"] ds = None - expectedBlockA = '010000001000000000 +41.319331+020.078400+41.317083+020.126072+41.281634+020.122570+41.283881+020.074924 ' + expectedBlockA = "010000001000000000 +41.319331+020.078400+41.317083+020.126072+41.281634+020.122570+41.283881+020.074924 " - assert mdTRE['BLOCKA'] == expectedBlockA, \ - 'did not find expected BLOCKA from metadata.' + assert ( + mdTRE["BLOCKA"] == expectedBlockA + ), "did not find expected BLOCKA from metadata." - assert blockA == expectedBlockA, 'did not find expected BLOCKA from metadata item.' + assert blockA == expectedBlockA, "did not find expected BLOCKA from metadata item." - assert mdCGM['SEGMENT_COUNT'] == '0', \ - 'did not find expected SEGMENT_COUNT from metadata.' + assert ( + mdCGM["SEGMENT_COUNT"] == "0" + ), "did not find expected SEGMENT_COUNT from metadata." - assert segmentCount == '0', \ - 'did not find expected SEGMENT_COUNT from metadata item.' + assert ( + segmentCount == "0" + ), "did not find expected SEGMENT_COUNT from metadata item." ############################################################################### # Test creation of an NITF file in UTM Zone 11, Southern Hemisphere. + def test_nitf_13(): - drv = gdal.GetDriverByName('NITF') + drv = gdal.GetDriverByName("NITF") gdal.ErrorReset() - ds = drv.Create('tmp/test_13.ntf', 200, 100, 1, gdal.GDT_Byte, - ['ICORDS=S']) - assert gdal.GetLastErrorMsg() == '' + ds = drv.Create("tmp/test_13.ntf", 200, 100, 1, gdal.GDT_Byte, ["ICORDS=S"]) + assert gdal.GetLastErrorMsg() == "" ds.SetGeoTransform((400000, 10, 0.0, 6000000, 0.0, -10)) - ds.SetProjection('PROJCS["UTM Zone 11, Southern Hemisphere",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["Meter",1]]') + ds.SetProjection( + 'PROJCS["UTM Zone 11, Southern Hemisphere",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["Meter",1]]' + ) my_list = list(range(200)) try: - raw_data = array.array('f', my_list).tobytes() + raw_data = array.array("f", my_list).tobytes() except: # Python 2 - raw_data = array.array('f', my_list).tostring() + raw_data = array.array("f", my_list).tostring() for line in range(100): - ds.WriteRaster(0, line, 200, 1, raw_data, - buf_type=gdal.GDT_Int16, - band_list=[1]) + ds.WriteRaster( + 0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1] + ) ds = None + ############################################################################### # Verify previous file def test_nitf_14(): - ds = gdal.Open('tmp/test_13.ntf') + ds = gdal.Open("tmp/test_13.ntf") chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 55964 - assert chksum == chksum_expect, 'Did not get expected chksum for band 1' + assert chksum == chksum_expect, "Did not get expected chksum for band 1" geotransform = ds.GetGeoTransform() - assert geotransform[0] == pytest.approx(400000, abs=.1) and geotransform[1] == pytest.approx(10, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(6000000, abs=.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-10, abs=0.001), \ - 'geotransform differs from expected' + assert ( + geotransform[0] == pytest.approx(400000, abs=0.1) + and geotransform[1] == pytest.approx(10, abs=0.001) + and geotransform[2] == pytest.approx(0, abs=0.001) + and geotransform[3] == pytest.approx(6000000, abs=0.1) + and geotransform[4] == pytest.approx(0, abs=0.001) + and geotransform[5] == pytest.approx(-10, abs=0.001) + ), "geotransform differs from expected" prj = ds.GetProjectionRef() - assert prj.find('PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000]') != -1, \ - 'Coordinate system not UTM Zone 11, Southern Hemisphere' + assert ( + prj.find( + 'PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000]' + ) + != -1 + ), "Coordinate system not UTM Zone 11, Southern Hemisphere" ds = None @@ -357,24 +421,24 @@ def test_nitf_14(): # Test automatic setting of ICORDS=N/S for UTM WGS 84 projections -@pytest.mark.parametrize("epsg_code,icords", [(32631, 'N'), (32731, 'S')]) -def test_nitf_create_copy_automatic_UTM_ICORDS(epsg_code,icords): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 20) +@pytest.mark.parametrize("epsg_code,icords", [(32631, "N"), (32731, "S")]) +def test_nitf_create_copy_automatic_UTM_ICORDS(epsg_code, icords): + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 20) src_ds.SetGeoTransform([-1000, 1000, 0, 2000, 0, -500]) srs = osr.SpatialReference() srs.ImportFromEPSG(epsg_code) src_ds.SetSpatialRef(srs) - outfilename = '/vsimem/test_nitf_create_copy_automatic_UTM_ICORDS.ntf' + outfilename = "/vsimem/test_nitf_create_copy_automatic_UTM_ICORDS.ntf" gdal.ErrorReset() - assert gdal.GetDriverByName('NITF').CreateCopy(outfilename, src_ds) - assert gdal.VSIStatL(outfilename + '.aux.xml') is None + assert gdal.GetDriverByName("NITF").CreateCopy(outfilename, src_ds) + assert gdal.VSIStatL(outfilename + ".aux.xml") is None ds = gdal.Open(outfilename) - assert ds.GetMetadataItem('NITF_ICORDS') == icords + assert ds.GetMetadataItem("NITF_ICORDS") == icords assert ds.GetGeoTransform() == src_ds.GetGeoTransform() assert ds.GetSpatialRef().IsSame(src_ds.GetSpatialRef()) ds = None - gdal.GetDriverByName('NITF').Delete(outfilename) + gdal.GetDriverByName("NITF").Delete(outfilename) ############################################################################### @@ -383,19 +447,25 @@ def test_nitf_create_copy_automatic_UTM_ICORDS(epsg_code,icords): def test_nitf_create_copy_user_provided_IGEOLO_without_ICORDS(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 20) src_ds.SetGeoTransform([-1000, 1000, 0, 2000, 0, -500]) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) src_ds.SetSpatialRef(srs) - outfilename = '/vsimem/test_nitf_create_copy_user_provided_IGEOLO_without_ICORDS.ntf' + outfilename = ( + "/vsimem/test_nitf_create_copy_user_provided_IGEOLO_without_ICORDS.ntf" + ) gdal.ErrorReset() with gdaltest.error_handler(): - assert gdal.GetDriverByName('NITF').CreateCopy(outfilename, src_ds, - options = ['IGEOLO=' + ('0' * 60)]) is None - assert gdal.GetLastErrorMsg() != '' - gdal.GetDriverByName('NITF').Delete(outfilename) + assert ( + gdal.GetDriverByName("NITF").CreateCopy( + outfilename, src_ds, options=["IGEOLO=" + ("0" * 60)] + ) + is None + ) + assert gdal.GetLastErrorMsg() != "" + gdal.GetDriverByName("NITF").Delete(outfilename) ############################################################################### @@ -403,24 +473,25 @@ def test_nitf_create_copy_user_provided_IGEOLO_without_ICORDS(): def test_nitf_create_copy_user_provided_ICORDS_IGEOLO(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 20) src_ds.SetGeoTransform([-1000, 1000, 0, 2000, 0, -500]) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) src_ds.SetSpatialRef(srs) - outfilename = '/vsimem/test_nitf_create_copy_user_provided_ICORDS_IGEOLO.ntf' + outfilename = "/vsimem/test_nitf_create_copy_user_provided_ICORDS_IGEOLO.ntf" gdal.ErrorReset() - gdal.GetDriverByName('NITF').CreateCopy(outfilename, src_ds, - options = ['ICORDS=G', 'IGEOLO=' + ('0' * 60)]) - assert gdal.GetLastErrorMsg() == '' - assert gdal.VSIStatL(outfilename + '.aux.xml') is None + gdal.GetDriverByName("NITF").CreateCopy( + outfilename, src_ds, options=["ICORDS=G", "IGEOLO=" + ("0" * 60)] + ) + assert gdal.GetLastErrorMsg() == "" + assert gdal.VSIStatL(outfilename + ".aux.xml") is None ds = gdal.Open(outfilename) - assert ds.GetMetadataItem('NITF_ICORDS') == 'G' - assert ds.GetMetadataItem('NITF_IGEOLO') == '0' * 60 + assert ds.GetMetadataItem("NITF_ICORDS") == "G" + assert ds.GetMetadataItem("NITF_IGEOLO") == "0" * 60 ds = None - gdal.GetDriverByName('NITF').Delete(outfilename) + gdal.GetDriverByName("NITF").Delete(outfilename) ############################################################################### @@ -429,24 +500,29 @@ def test_nitf_create_copy_user_provided_ICORDS_IGEOLO(): def test_nitf_create_copy_UTM_corner_reprojection_to_long_lat(): - src_ds = gdal.GetDriverByName('MEM').Create('', 10, 20) + src_ds = gdal.GetDriverByName("MEM").Create("", 10, 20) src_ds.SetGeoTransform([-1000, 1000, 0, 2000, 0, -500]) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) src_ds.SetSpatialRef(srs) - outfilename = '/vsimem/test_nitf_create_copy_UTM_corner_reprojection_to_long_lat.ntf' + outfilename = ( + "/vsimem/test_nitf_create_copy_UTM_corner_reprojection_to_long_lat.ntf" + ) gdal.ErrorReset() - gdal.GetDriverByName('NITF').CreateCopy(outfilename, src_ds, - options = ['ICORDS=G']) - assert gdal.GetLastErrorMsg() == '' - assert gdal.VSIStatL(outfilename + '.aux.xml') is None + gdal.GetDriverByName("NITF").CreateCopy(outfilename, src_ds, options=["ICORDS=G"]) + assert gdal.GetLastErrorMsg() == "" + assert gdal.VSIStatL(outfilename + ".aux.xml") is None ds = gdal.Open(outfilename) - assert ds.GetMetadataItem('NITF_ICORDS') == 'G' - assert ds.GetMetadataItem('NITF_IGEOLO') == '000057N0012936W000057N0012445W000412S0012445W000412S0012936W' + assert ds.GetMetadataItem("NITF_ICORDS") == "G" + assert ( + ds.GetMetadataItem("NITF_IGEOLO") + == "000057N0012936W000057N0012445W000412S0012445W000412S0012936W" + ) ds = None - gdal.GetDriverByName('NITF').Delete(outfilename) + gdal.GetDriverByName("NITF").Delete(outfilename) + ############################################################################### # Test creating an in memory copy. @@ -454,10 +530,11 @@ def test_nitf_create_copy_UTM_corner_reprojection_to_long_lat(): def test_nitf_15(): - tst = gdaltest.GDALTest('NITF', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Checks a 1-bit mono with mask table having (0x00) black as transparent with white arrow. @@ -465,7 +542,7 @@ def test_nitf_15(): def test_nitf_16(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3034d.nsf - tst = gdaltest.GDALTest('NITF', 'nitf/ns3034d.nsf', 1, 170) + tst = gdaltest.GDALTest("NITF", "nitf/ns3034d.nsf", 1, 170) return tst.testOpen() @@ -473,12 +550,14 @@ def test_nitf_16(): # Checks a 1-bit RGB/LUT (green arrow) with a mask table (pad pixels having value of 0x00) # and a transparent pixel value of 1 being mapped to green by the LUT + def test_nitf_17(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/i_3034f.ntf - tst = gdaltest.GDALTest('NITF', 'nitf/i_3034f.ntf', 1, 170) + tst = gdaltest.GDALTest("NITF", "nitf/i_3034f.ntf", 1, 170) return tst.testOpen() + ############################################################################### # Test NITF file without image segment @@ -486,13 +565,14 @@ def test_nitf_17(): def test_nitf_18(): # Shut up the warning about missing image segment - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0006A.NTF ds = gdal.Open("data/nitf/U_0006A.NTF") gdal.PopErrorHandler() assert ds.RasterCount == 0 + ############################################################################### # Test BILEVEL (C1) decompression @@ -500,7 +580,7 @@ def test_nitf_18(): def test_nitf_19(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_0/U_1050A.NTF - tst = gdaltest.GDALTest('NITF', 'nitf/U_1050A.NTF', 1, 65024) + tst = gdaltest.GDALTest("NITF", "nitf/U_1050A.NTF", 1, 65024) return tst.testOpen() @@ -508,10 +588,11 @@ def test_nitf_19(): ############################################################################### # Test NITF file consisting only of an header + def test_nitf_20(): # Shut up the warning about file either corrupt or empty - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0002A.NTF ds = gdal.Open("data/nitf/U_0002A.NTF") gdal.PopErrorHandler() @@ -524,78 +605,85 @@ def test_nitf_20(): # # See also nitf_35 for writing TEXT segments. + def test_nitf_21(): # Shut up the warning about missing image segment - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/nitf/ns3114a.nsf') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("data/nitf/ns3114a.nsf") gdal.PopErrorHandler() - mdTEXT = ds.GetMetadata('TEXT') + mdTEXT = ds.GetMetadata("TEXT") try: # NG bindings - data0 = ds.GetMetadataItem('DATA_0', 'TEXT') + data0 = ds.GetMetadataItem("DATA_0", "TEXT") except: - data0 = mdTEXT['DATA_0'] + data0 = mdTEXT["DATA_0"] ds = None - assert mdTEXT['DATA_0'] == 'A', 'did not find expected DATA_0 from metadata.' + assert mdTEXT["DATA_0"] == "A", "did not find expected DATA_0 from metadata." - assert data0 == 'A', 'did not find expected DATA_0 from metadata item.' + assert data0 == "A", "did not find expected DATA_0 from metadata item." ############################################################################### # Write/Read test of simple int32 reference data. + def test_nitf_22(): - tst = gdaltest.GDALTest('NITF', '../../gcore/data/int32.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "../../gcore/data/int32.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read test of simple float32 reference data. def test_nitf_23(): - tst = gdaltest.GDALTest('NITF', '../../gcore/data/float32.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "../../gcore/data/float32.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read test of simple float64 reference data. def test_nitf_24(): - tst = gdaltest.GDALTest('NITF', '../../gcore/data/float64.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "../../gcore/data/float64.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read test of simple uint16 reference data. def test_nitf_25(): - tst = gdaltest.GDALTest('NITF', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "../../gcore/data/uint16.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Write/Read test of simple uint32 reference data. def test_nitf_26(): - tst = gdaltest.GDALTest('NITF', '../../gcore/data/uint32.tif', 1, 4672) + tst = gdaltest.GDALTest("NITF", "../../gcore/data/uint32.tif", 1, 4672) return tst.testCreateCopy() + ############################################################################### # Test Create() with IC=NC compression, and multi-blocks def test_nitf_27(): - nitf_create(['ICORDS=G', 'IC=NC', 'BLOCKXSIZE=10', 'BLOCKYSIZE=10']) + nitf_create(["ICORDS=G", "IC=NC", "BLOCKXSIZE=10", "BLOCKYSIZE=10"]) return nitf_check_created_file(32498, 42602, 38982) @@ -603,42 +691,53 @@ def test_nitf_27(): ############################################################################### # Test Create() with IC=C8 compression with the JP2ECW driver + def test_nitf_28_jp2ecw(): gdaltest.nitf_28_jp2ecw_is_ok = False - if gdal.GetDriverByName('JP2ECW') is None: + if gdal.GetDriverByName("JP2ECW") is None: pytest.skip() import ecw + if not ecw.has_write_support(): pytest.skip() # Deregister other potential conflicting JPEG2000 drivers - gdaltest.deregister_all_jpeg2000_drivers_but('JP2ECW') - - if nitf_create(['ICORDS=G', 'IC=C8', 'TARGET=75'], set_inverted_color_interp=False) == 'success': - ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) - if ret == 'success': + gdaltest.deregister_all_jpeg2000_drivers_but("JP2ECW") + + if ( + nitf_create(["ICORDS=G", "IC=C8", "TARGET=75"], set_inverted_color_interp=False) + == "success" + ): + ret = nitf_check_created_file( + 32398, 42502, 38882, set_inverted_color_interp=False + ) + if ret == "success": gdaltest.nitf_28_jp2ecw_is_ok = True else: - ret = 'fail' + ret = "fail" - tmpfilename = '/vsimem/nitf_28_jp2ecw.ntf' - src_ds = gdal.GetDriverByName('MEM').Create('', 1025, 1025) - gdal.GetDriverByName('NITF').CreateCopy(tmpfilename, src_ds, options=['IC=C8']) + tmpfilename = "/vsimem/nitf_28_jp2ecw.ntf" + src_ds = gdal.GetDriverByName("MEM").Create("", 1025, 1025) + gdal.GetDriverByName("NITF").CreateCopy(tmpfilename, src_ds, options=["IC=C8"]) ds = gdal.Open(tmpfilename) blockxsize, blockysize = ds.GetRasterBand(1).GetBlockSize() ds = None gdal.Unlink(tmpfilename) - if (blockxsize, blockysize) != (256, 256): # 256 since this is hardcoded as such in the ECW driver - gdaltest.post_reason('wrong block size') + if (blockxsize, blockysize) != ( + 256, + 256, + ): # 256 since this is hardcoded as such in the ECW driver + gdaltest.post_reason("wrong block size") print(blockxsize, blockysize) - ret = 'fail' + ret = "fail" gdaltest.reregister_all_jpeg2000_drivers() return ret + ############################################################################### # Test reading the previously create file with the JP2MrSID driver @@ -647,12 +746,12 @@ def test_nitf_28_jp2mrsid(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() - jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') + jp2mrsid_drv = gdal.GetDriverByName("JP2MrSID") if jp2mrsid_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers - gdaltest.deregister_all_jpeg2000_drivers_but('JP2MrSID') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2MrSID") ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) @@ -664,16 +763,17 @@ def test_nitf_28_jp2mrsid(): ############################################################################### # Test reading the previously create file with the JP2KAK driver + def test_nitf_28_jp2kak(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() - jp2kak_drv = gdal.GetDriverByName('JP2KAK') + jp2kak_drv = gdal.GetDriverByName("JP2KAK") if jp2kak_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers - gdaltest.deregister_all_jpeg2000_drivers_but('JP2KAK') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2KAK") ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) @@ -681,6 +781,7 @@ def test_nitf_28_jp2kak(): return ret + ############################################################################### # Test reading the previously create file with the JP2KAK driver @@ -689,12 +790,12 @@ def test_nitf_28_jp2openjpeg(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() - drv = gdal.GetDriverByName('JP2OpenJPEG') + drv = gdal.GetDriverByName("JP2OpenJPEG") if drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers - gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2OpenJPEG") ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) @@ -702,34 +803,44 @@ def test_nitf_28_jp2openjpeg(): return ret + ############################################################################### # Test CreateCopy() with IC=C8 compression with the JP2OpenJPEG driver def test_nitf_28_jp2openjpeg_bis(): - drv = gdal.GetDriverByName('JP2OpenJPEG') + drv = gdal.GetDriverByName("JP2OpenJPEG") if drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers - gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') - - if nitf_create(['ICORDS=G', 'IC=C8', 'QUALITY=25'], set_inverted_color_interp=False, createcopy=True) == 'success': - ret = nitf_check_created_file(31604, 42782, 38791, set_inverted_color_interp=False) + gdaltest.deregister_all_jpeg2000_drivers_but("JP2OpenJPEG") + + if ( + nitf_create( + ["ICORDS=G", "IC=C8", "QUALITY=25"], + set_inverted_color_interp=False, + createcopy=True, + ) + == "success" + ): + ret = nitf_check_created_file( + 31604, 42782, 38791, set_inverted_color_interp=False + ) else: - ret = 'fail' + ret = "fail" - tmpfilename = '/vsimem/nitf_28_jp2openjpeg_bis.ntf' - src_ds = gdal.GetDriverByName('MEM').Create('', 1025, 1025) - gdal.GetDriverByName('NITF').CreateCopy(tmpfilename, src_ds, options=['IC=C8']) + tmpfilename = "/vsimem/nitf_28_jp2openjpeg_bis.ntf" + src_ds = gdal.GetDriverByName("MEM").Create("", 1025, 1025) + gdal.GetDriverByName("NITF").CreateCopy(tmpfilename, src_ds, options=["IC=C8"]) ds = gdal.Open(tmpfilename) blockxsize, blockysize = ds.GetRasterBand(1).GetBlockSize() ds = None gdal.Unlink(tmpfilename) if (blockxsize, blockysize) != (1024, 1024): - gdaltest.post_reason('wrong block size') + gdaltest.post_reason("wrong block size") print(blockxsize, blockysize) - ret = 'fail' + ret = "fail" gdaltest.reregister_all_jpeg2000_drivers() @@ -741,53 +852,81 @@ def test_nitf_28_jp2openjpeg_bis(): def test_nitf_jp2openjpeg_npje_numerically_lossless(): - jp2openjpeg_drv = gdal.GetDriverByName('JP2OpenJPEG') + jp2openjpeg_drv = gdal.GetDriverByName("JP2OpenJPEG") if jp2openjpeg_drv is None: pytest.skip() - src_ds = gdal.Open('../gcore/data/uint16.tif') + src_ds = gdal.Open("../gcore/data/uint16.tif") # May throw a warning with openjpeg < 2.5 with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/tmp.ntf', - src_ds, - strict=False, - options=['IC=C8', - 'ABPP=12', - 'JPEG2000_DRIVER=JP2OpenJPEG', - 'PROFILE=NPJE_NUMERICALLY_LOSSLESS']) - - ds = gdal.Open('/vsimem/tmp.ntf') + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/tmp.ntf", + src_ds, + strict=False, + options=[ + "IC=C8", + "ABPP=12", + "JPEG2000_DRIVER=JP2OpenJPEG", + "PROFILE=NPJE_NUMERICALLY_LOSSLESS", + ], + ) + + ds = gdal.Open("/vsimem/tmp.ntf") assert ds.GetRasterBand(1).Checksum() == 4672 - assert ds.GetMetadataItem('J2KLRA', 'TRE') == '0050000102000000.03125000100.06250000200.12500000300.25000000400.50000000500.60000000600.70000000700.80000000800.90000000901.00000001001.10000001101.20000001201.30000001301.50000001401.70000001502.00000001602.30000001703.50000001803.90000001912.000000' - assert ds.GetMetadataItem('COMRAT', 'DEBUG') in ('N141', 'N142', 'N143', 'N169') + assert ( + ds.GetMetadataItem("J2KLRA", "TRE") + == "0050000102000000.03125000100.06250000200.12500000300.25000000400.50000000500.60000000600.70000000700.80000000800.90000000901.00000001001.10000001101.20000001201.30000001301.50000001401.70000001502.00000001602.30000001703.50000001803.90000001912.000000" + ) + assert ds.GetMetadataItem("COMRAT", "DEBUG") in ("N141", "N142", "N143", "N169") # Get the JPEG2000 code stream subfile - jpeg2000_ds_name = ds.GetMetadataItem('JPEG2000_DATASET_NAME', 'DEBUG') + jpeg2000_ds_name = ds.GetMetadataItem("JPEG2000_DATASET_NAME", "DEBUG") assert jpeg2000_ds_name - structure = gdal.GetJPEG2000StructureAsString(jpeg2000_ds_name, ['ALL=YES']) + structure = gdal.GetJPEG2000StructureAsString(jpeg2000_ds_name, ["ALL=YES"]) assert structure is not None # Check that the structure of the JPEG2000 codestream is the one expected # from the NPJE profile # print(structure) - assert '2' in structure - assert '15' in structure + assert ( + '2' + in structure + ) + assert ( + '15' + in structure + ) assert '1024' in structure assert '1024' in structure - assert '0' in structure + assert ( + '0' + in structure + ) assert '20' in structure assert '0' in structure assert '5' in structure - assert '4' in structure - assert '4' in structure - assert '0' in structure - assert '1' in structure - - if 'TLM' in jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST'): + assert ( + '4' + in structure + ) + assert ( + '4' + in structure + ) + assert ( + '0' + in structure + ) + assert ( + '1' + in structure + ) + + if "TLM" in jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST"): assert '2' in structure - assert '7' in structure + assert ( + '2' + in structure + ) + assert ( + '7' + in structure + ) assert '1024' in structure assert '1024' in structure - assert '0' in structure + assert ( + '0' + in structure + ) assert '19' in structure assert '0' in structure assert '5' in structure - assert '4' in structure - assert '4' in structure - assert '0' in structure - assert '0' in structure - - if 'TLM' in jp2openjpeg_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST'): + assert ( + '4' + in structure + ) + assert ( + '4' + in structure + ) + assert ( + '0' + in structure + ) + assert ( + '0' + in structure + ) + + if "TLM" in jp2openjpeg_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST"): assert '18' in structure - gdal.Unlink('/vsimem/tmp.ntf') + gdal.Unlink("/vsimem/tmp.ntf") + ############################################################################### # Test Create() with a LUT @@ -898,10 +1073,11 @@ def test_nitf_jp2openjpeg_npje_visually_lossless_with_quality(): def test_nitf_29(): - drv = gdal.GetDriverByName('NITF') + drv = gdal.GetDriverByName("NITF") - ds = drv.Create('tmp/test_29.ntf', 1, 1, 1, gdal.GDT_Byte, - ['IREP=RGB/LUT', 'LUT_SIZE=128']) + ds = drv.Create( + "tmp/test_29.ntf", 1, 1, 1, gdal.GDT_Byte, ["IREP=RGB/LUT", "LUT_SIZE=128"] + ) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) @@ -913,104 +1089,156 @@ def test_nitf_29(): ds = None - ds = gdal.Open('tmp/test_29.ntf') + ds = gdal.Open("tmp/test_29.ntf") ct = ds.GetRasterBand(1).GetRasterColorTable() - assert (ct.GetCount() == 129 and \ - ct.GetColorEntry(0) == (255, 255, 255, 255) and \ - ct.GetColorEntry(1) == (255, 255, 0, 255) and \ - ct.GetColorEntry(2) == (255, 0, 255, 255) and \ - ct.GetColorEntry(3) == (0, 255, 255, 255)), 'Wrong color table entry.' - - new_ds = drv.CreateCopy('tmp/test_29_copy.ntf', ds) + assert ( + ct.GetCount() == 129 + and ct.GetColorEntry(0) == (255, 255, 255, 255) + and ct.GetColorEntry(1) == (255, 255, 0, 255) + and ct.GetColorEntry(2) == (255, 0, 255, 255) + and ct.GetColorEntry(3) == (0, 255, 255, 255) + ), "Wrong color table entry." + + new_ds = drv.CreateCopy("tmp/test_29_copy.ntf", ds) del new_ds ds = None - ds = gdal.Open('tmp/test_29_copy.ntf') + ds = gdal.Open("tmp/test_29_copy.ntf") ct = ds.GetRasterBand(1).GetRasterColorTable() - assert (ct.GetCount() == 130 and \ - ct.GetColorEntry(0) == (255, 255, 255, 255) and \ - ct.GetColorEntry(1) == (255, 255, 0, 255) and \ - ct.GetColorEntry(2) == (255, 0, 255, 255) and \ - ct.GetColorEntry(3) == (0, 255, 255, 255)), 'Wrong color table entry.' + assert ( + ct.GetCount() == 130 + and ct.GetColorEntry(0) == (255, 255, 255, 255) + and ct.GetColorEntry(1) == (255, 255, 0, 255) + and ct.GetColorEntry(2) == (255, 0, 255, 255) + and ct.GetColorEntry(3) == (0, 255, 255, 255) + ), "Wrong color table entry." ds = None + ############################################################################### # Verify we can write a file with BLOCKA TRE and read it back properly. def test_nitf_30(): - src_ds = gdal.Open('data/nitf/fake_nsif.ntf') - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf30.ntf', src_ds) + src_ds = gdal.Open("data/nitf/fake_nsif.ntf") + ds = gdal.GetDriverByName("NITF").CreateCopy("tmp/nitf30.ntf", src_ds) chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 12033 - assert chksum == chksum_expect, 'Did not get expected chksum for band 1' + assert chksum == chksum_expect, "Did not get expected chksum for band 1" md = ds.GetMetadata() - assert md['NITF_FHDR'] == 'NSIF01.00', 'Got wrong FHDR value' + assert md["NITF_FHDR"] == "NSIF01.00", "Got wrong FHDR value" - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+41.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+41.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+41.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+41.283881+020.074924', \ - 'BLOCKA metadata has unexpected value.' + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + and md["NITF_BLOCKA_BLOCK_COUNT"] == "01" + and md["NITF_BLOCKA_N_GRAY_01"] == "00000" + and md["NITF_BLOCKA_L_LINES_01"] == "01000" + and md["NITF_BLOCKA_LAYOVER_ANGLE_01"] == "000" + and md["NITF_BLOCKA_SHADOW_ANGLE_01"] == "000" + and md["NITF_BLOCKA_FRLC_LOC_01"] == "+41.319331+020.078400" + and md["NITF_BLOCKA_LRLC_LOC_01"] == "+41.317083+020.126072" + and md["NITF_BLOCKA_LRFC_LOC_01"] == "+41.281634+020.122570" + and md["NITF_BLOCKA_FRFC_LOC_01"] == "+41.283881+020.074924" + ), "BLOCKA metadata has unexpected value." ds = None - gdal.GetDriverByName('NITF').Delete('tmp/nitf30.ntf') + gdal.GetDriverByName("NITF").Delete("tmp/nitf30.ntf") # Test overriding src BLOCKA metadata with NITF_BLOCKA creation options - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_override.ntf', src_ds, - options=['BLOCKA_BLOCK_INSTANCE_01=01', - 'BLOCKA_BLOCK_COUNT=01', - 'BLOCKA_N_GRAY_01=00000', - 'BLOCKA_L_LINES_01=01000', - 'BLOCKA_LAYOVER_ANGLE_01=000', - 'BLOCKA_SHADOW_ANGLE_01=000', - 'BLOCKA_FRLC_LOC_01=+42.319331+020.078400', - 'BLOCKA_LRLC_LOC_01=+42.317083+020.126072', - 'BLOCKA_LRFC_LOC_01=+42.281634+020.122570', - 'BLOCKA_FRFC_LOC_01=+42.283881+020.074924' - ]) - ds = gdal.Open('/vsimem/nitf30_override.ntf') + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf30_override.ntf", + src_ds, + options=[ + "BLOCKA_BLOCK_INSTANCE_01=01", + "BLOCKA_BLOCK_COUNT=01", + "BLOCKA_N_GRAY_01=00000", + "BLOCKA_L_LINES_01=01000", + "BLOCKA_LAYOVER_ANGLE_01=000", + "BLOCKA_SHADOW_ANGLE_01=000", + "BLOCKA_FRLC_LOC_01=+42.319331+020.078400", + "BLOCKA_LRLC_LOC_01=+42.317083+020.126072", + "BLOCKA_LRFC_LOC_01=+42.281634+020.122570", + "BLOCKA_FRFC_LOC_01=+42.283881+020.074924", + ], + ) + ds = gdal.Open("/vsimem/nitf30_override.ntf") md = ds.GetMetadata() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_override.ntf') - - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+42.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+42.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+42.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+42.283881+020.074924', \ - 'BLOCKA metadata has unexpected value.' + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf30_override.ntf") + + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + and md["NITF_BLOCKA_BLOCK_COUNT"] == "01" + and md["NITF_BLOCKA_N_GRAY_01"] == "00000" + and md["NITF_BLOCKA_L_LINES_01"] == "01000" + and md["NITF_BLOCKA_LAYOVER_ANGLE_01"] == "000" + and md["NITF_BLOCKA_SHADOW_ANGLE_01"] == "000" + and md["NITF_BLOCKA_FRLC_LOC_01"] == "+42.319331+020.078400" + and md["NITF_BLOCKA_LRLC_LOC_01"] == "+42.317083+020.126072" + and md["NITF_BLOCKA_LRFC_LOC_01"] == "+42.281634+020.122570" + and md["NITF_BLOCKA_FRFC_LOC_01"] == "+42.283881+020.074924" + ), "BLOCKA metadata has unexpected value." # Test overriding src BLOCKA metadata with TRE=BLOCKA= creation option - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_override.ntf', src_ds, - options=['TRE=BLOCKA=010000001000000000 +42.319331+020.078400+42.317083+020.126072+42.281634+020.122570+42.283881+020.074924xxxxx' - ]) - ds = gdal.Open('/vsimem/nitf30_override.ntf') + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf30_override.ntf", + src_ds, + options=[ + "TRE=BLOCKA=010000001000000000 +42.319331+020.078400+42.317083+020.126072+42.281634+020.122570+42.283881+020.074924xxxxx" + ], + ) + ds = gdal.Open("/vsimem/nitf30_override.ntf") md = ds.GetMetadata() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_override.ntf') - - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+42.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+42.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+42.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+42.283881+020.074924', \ - 'BLOCKA metadata has unexpected value.' + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf30_override.ntf") + + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + and md["NITF_BLOCKA_BLOCK_COUNT"] == "01" + and md["NITF_BLOCKA_N_GRAY_01"] == "00000" + and md["NITF_BLOCKA_L_LINES_01"] == "01000" + and md["NITF_BLOCKA_LAYOVER_ANGLE_01"] == "000" + and md["NITF_BLOCKA_SHADOW_ANGLE_01"] == "000" + and md["NITF_BLOCKA_FRLC_LOC_01"] == "+42.319331+020.078400" + and md["NITF_BLOCKA_LRLC_LOC_01"] == "+42.317083+020.126072" + and md["NITF_BLOCKA_LRFC_LOC_01"] == "+42.281634+020.122570" + and md["NITF_BLOCKA_FRFC_LOC_01"] == "+42.283881+020.074924" + ), "BLOCKA metadata has unexpected value." # Test that gdal_translate -ullr doesn't propagate BLOCKA - gdal.Translate('/vsimem/nitf30_no_src_md.ntf', src_ds, format='NITF', outputBounds=[2, 49, 3, 50]) - ds = gdal.Open('/vsimem/nitf30_no_src_md.ntf') + gdal.Translate( + "/vsimem/nitf30_no_src_md.ntf", + src_ds, + format="NITF", + outputBounds=[2, 49, 3, 50], + ) + ds = gdal.Open("/vsimem/nitf30_no_src_md.ntf") md = ds.GetMetadata() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_no_src_md.ntf') - assert 'NITF_BLOCKA_BLOCK_INSTANCE_01' not in md, \ - 'unexpectdly found BLOCKA metadata.' + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf30_no_src_md.ntf") + assert ( + "NITF_BLOCKA_BLOCK_INSTANCE_01" not in md + ), "unexpectdly found BLOCKA metadata." # Test USE_SRC_NITF_METADATA=NO - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_no_src_md.ntf', src_ds, - options=['USE_SRC_NITF_METADATA=NO']) - ds = gdal.Open('/vsimem/nitf30_no_src_md.ntf') + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf30_no_src_md.ntf", src_ds, options=["USE_SRC_NITF_METADATA=NO"] + ) + ds = gdal.Open("/vsimem/nitf30_no_src_md.ntf") md = ds.GetMetadata() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_no_src_md.ntf') - assert 'NITF_BLOCKA_BLOCK_INSTANCE_01' not in md, \ - 'unexpectdly found BLOCKA metadata.' + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf30_no_src_md.ntf") + assert ( + "NITF_BLOCKA_BLOCK_INSTANCE_01" not in md + ), "unexpectdly found BLOCKA metadata." + ############################################################################### # Verify we can write a file with a custom TRE and read it back properly. @@ -1018,24 +1246,24 @@ def test_nitf_30(): def test_nitf_31(): - nitf_create(['TRE=CUSTOM= Test TRE1\\0MORE', - 'TRE=TOTEST=SecondTRE', - 'ICORDS=G']) + nitf_create(["TRE=CUSTOM= Test TRE1\\0MORE", "TRE=TOTEST=SecondTRE", "ICORDS=G"]) - ds = gdal.Open('tmp/test_create.ntf') + ds = gdal.Open("tmp/test_create.ntf") - md = ds.GetMetadata('TRE') - assert len(md) == 2, 'Did not get expected TRE count' + md = ds.GetMetadata("TRE") + assert len(md) == 2, "Did not get expected TRE count" # Check that the leading space in the CUSTOM metadata item is preserved (#3088, #3204) try: - assert ds.GetMetadataItem('CUSTOM', 'TRE') == ' Test TRE1\\0MORE', \ - 'Did not get expected TRE contents' + assert ( + ds.GetMetadataItem("CUSTOM", "TRE") == " Test TRE1\\0MORE" + ), "Did not get expected TRE contents" except: pass - assert md['CUSTOM'] == ' Test TRE1\\0MORE' and md['TOTEST'] == 'SecondTRE', \ - 'Did not get expected TRE contents' + assert ( + md["CUSTOM"] == " Test TRE1\\0MORE" and md["TOTEST"] == "SecondTRE" + ), "Did not get expected TRE contents" ds = None return nitf_check_created_file(32498, 42602, 38982) @@ -1044,9 +1272,10 @@ def test_nitf_31(): ############################################################################### # Test Create() with ICORDS=D + def test_nitf_32(): - nitf_create(['ICORDS=D']) + nitf_create(["ICORDS=D"]) return nitf_check_created_file(32498, 42602, 38982) @@ -1054,16 +1283,21 @@ def test_nitf_32(): ############################################################################### # Test Create() with ICORDS=D and a consistent BLOCKA + def test_nitf_33(): - nitf_create(['ICORDS=D', - 'BLOCKA_BLOCK_COUNT=01', - 'BLOCKA_BLOCK_INSTANCE_01=01', - 'BLOCKA_L_LINES_01=100', - 'BLOCKA_FRLC_LOC_01=+29.950000+119.950000', - 'BLOCKA_LRLC_LOC_01=+20.050000+119.950000', - 'BLOCKA_LRFC_LOC_01=+20.050000+100.050000', - 'BLOCKA_FRFC_LOC_01=+29.950000+100.050000']) + nitf_create( + [ + "ICORDS=D", + "BLOCKA_BLOCK_COUNT=01", + "BLOCKA_BLOCK_INSTANCE_01=01", + "BLOCKA_L_LINES_01=100", + "BLOCKA_FRLC_LOC_01=+29.950000+119.950000", + "BLOCKA_LRLC_LOC_01=+20.050000+119.950000", + "BLOCKA_LRFC_LOC_01=+20.050000+100.050000", + "BLOCKA_FRFC_LOC_01=+29.950000+100.050000", + ] + ) return nitf_check_created_file(32498, 42602, 38982) @@ -1071,38 +1305,41 @@ def test_nitf_33(): ############################################################################### # Test CreateCopy() of a 16bit image with tiling + def test_nitf_34(): - tst = gdaltest.GDALTest('NITF', 'n43.dt0', 1, 49187, options=['BLOCKSIZE=64']) + tst = gdaltest.GDALTest("NITF", "n43.dt0", 1, 49187, options=["BLOCKSIZE=64"]) return tst.testCreateCopy() + ############################################################################### # Test CreateCopy() writing file with a text segment. def test_nitf_35(): - src_ds = gdal.Open('data/nitf/text_md.vrt') - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_35.ntf', src_ds) + src_ds = gdal.Open("data/nitf/text_md.vrt") + ds = gdal.GetDriverByName("NITF").CreateCopy("tmp/nitf_35.ntf", src_ds) src_ds = None ds = None - ds = gdal.Open('tmp/nitf_35.ntf') + ds = gdal.Open("tmp/nitf_35.ntf") exp_text = """This is text data with a newline.""" - md = ds.GetMetadata('TEXT') - assert md['DATA_0'] == exp_text, 'Did not get expected TEXT metadata.' + md = ds.GetMetadata("TEXT") + assert md["DATA_0"] == exp_text, "Did not get expected TEXT metadata." exp_text = """Also, a second text segment is created.""" - md = ds.GetMetadata('TEXT') - assert md['DATA_1'] == exp_text, 'Did not get expected TEXT metadata.' + md = ds.GetMetadata("TEXT") + assert md["DATA_1"] == exp_text, "Did not get expected TEXT metadata." ds = None - gdal.GetDriverByName('NITF').Delete('tmp/nitf_35.ntf') + gdal.GetDriverByName("NITF").Delete("tmp/nitf_35.ntf") + ############################################################################### # Create and read a JPEG encoded NITF file (C3) with several blocks @@ -1111,72 +1348,85 @@ def test_nitf_35(): def test_nitf_36(): - src_ds = gdal.Open('data/rgbsmall.tif') - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf36.ntf', src_ds, - options=['IC=C3', 'BLOCKSIZE=32', 'QUALITY=100']) + src_ds = gdal.Open("data/rgbsmall.tif") + ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf36.ntf", src_ds, options=["IC=C3", "BLOCKSIZE=32", "QUALITY=100"] + ) src_ds = None ds = None - ds = gdal.Open('tmp/nitf36.ntf') + ds = gdal.Open("tmp/nitf36.ntf") - assert ds.GetRasterBand(1).GetMinimum() is None, \ - 'Did not expect to have minimum value at that point.' + assert ( + ds.GetRasterBand(1).GetMinimum() is None + ), "Did not expect to have minimum value at that point." (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, False) - assert stddev < 0, 'Did not expect to have statistics at that point.' + assert stddev < 0, "Did not expect to have statistics at that point." (exp_mean, exp_stddev) = (65.4208, 47.254550335) (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, True) - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'did not get expected mean or standard dev.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "did not get expected mean or standard dev." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert md["COMPRESSION"] == "JPEG", "Did not get expected compression value." ds = None # Check that statistics are persisted (#3985) - ds = gdal.Open('tmp/nitf36.ntf') + ds = gdal.Open("tmp/nitf36.ntf") - assert ds.GetRasterBand(1).GetMinimum() is not None, \ - 'Should have minimum value at that point.' + assert ( + ds.GetRasterBand(1).GetMinimum() is not None + ), "Should have minimum value at that point." (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, False) - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'Should have statistics at that point.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "Should have statistics at that point." ds = None + ############################################################################### # Create and read a NITF file with 69999 bands def test_nitf_37(): - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf37.ntf', 1, 1, 69999) + ds = gdal.GetDriverByName("NITF").Create("tmp/nitf37.ntf", 1, 1, 69999) ds = None - ds = gdal.Open('tmp/nitf37.ntf') + ds = gdal.Open("tmp/nitf37.ntf") assert ds.RasterCount == 69999 ds = None + ############################################################################### # Create and read a NITF file with 999 images def test_nitf_38(): - ds = gdal.Open('data/byte.tif') + ds = gdal.Open("data/byte.tif") nXSize = ds.RasterXSize nYSize = ds.RasterYSize data = ds.GetRasterBand(1).ReadRaster(0, 0, nXSize, nYSize) expected_cs = ds.GetRasterBand(1).Checksum() - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf38.ntf', nXSize, nYSize, 1, options=['NUMI=999', 'WRITE_ALL_IMAGES=YES']) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf38.ntf", + nXSize, + nYSize, + 1, + options=["NUMI=999", "WRITE_ALL_IMAGES=YES"], + ) ds = None - ds = gdal.Open('NITF_IM:998:tmp/nitf38.ntf', gdal.GA_Update) + ds = gdal.Open("NITF_IM:998:tmp/nitf38.ntf", gdal.GA_Update) ds.GetRasterBand(1).WriteRaster(0, 0, nXSize, nYSize, data) # Create overviews @@ -1184,78 +1434,84 @@ def test_nitf_38(): ds = None - ds = gdal.Open('NITF_IM:0:tmp/nitf38.ntf') + ds = gdal.Open("NITF_IM:0:tmp/nitf38.ntf") assert ds.GetRasterBand(1).Checksum() == 0 ds = None - ds = gdal.Open('NITF_IM:998:tmp/nitf38.ntf') + ds = gdal.Open("NITF_IM:998:tmp/nitf38.ntf") cs = ds.GetRasterBand(1).Checksum() - assert cs == expected_cs, 'bad checksum for image of 998th subdataset' + assert cs == expected_cs, "bad checksum for image of 998th subdataset" # Check the overview cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 1087, 'bad checksum for overview of image of 998th subdataset' + assert cs == 1087, "bad checksum for overview of image of 998th subdataset" - out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/nitf38.vrt', ds) + out_ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/nitf38.vrt", ds) out_ds = None ds = None - ds = gdal.Open('tmp/nitf38.vrt') + ds = gdal.Open("tmp/nitf38.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/nitf38.vrt') + gdal.Unlink("tmp/nitf38.vrt") assert cs == expected_cs - ds = gdal.Open('NITF_IM:998:%s/tmp/nitf38.ntf' % os.getcwd()) - out_ds = gdal.GetDriverByName('VRT').CreateCopy('%s/tmp/nitf38.vrt' % os.getcwd(), ds) + ds = gdal.Open("NITF_IM:998:%s/tmp/nitf38.ntf" % os.getcwd()) + out_ds = gdal.GetDriverByName("VRT").CreateCopy( + "%s/tmp/nitf38.vrt" % os.getcwd(), ds + ) out_ds = None ds = None - ds = gdal.Open('tmp/nitf38.vrt') + ds = gdal.Open("tmp/nitf38.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/nitf38.vrt') + gdal.Unlink("tmp/nitf38.vrt") assert cs == expected_cs - ds = gdal.Open('NITF_IM:998:%s/tmp/nitf38.ntf' % os.getcwd()) - out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/nitf38.vrt', ds) + ds = gdal.Open("NITF_IM:998:%s/tmp/nitf38.ntf" % os.getcwd()) + out_ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/nitf38.vrt", ds) del out_ds ds = None - ds = gdal.Open('tmp/nitf38.vrt') + ds = gdal.Open("tmp/nitf38.vrt") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('tmp/nitf38.vrt') + gdal.Unlink("tmp/nitf38.vrt") assert cs == expected_cs + ############################################################################### # Create and read a JPEG encoded NITF file (M3) with several blocks def test_nitf_39(): - src_ds = gdal.Open('data/rgbsmall.tif') - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf39.ntf', src_ds, - options=['IC=M3', 'BLOCKSIZE=32', 'QUALITY=100']) + src_ds = gdal.Open("data/rgbsmall.tif") + ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf39.ntf", src_ds, options=["IC=M3", "BLOCKSIZE=32", "QUALITY=100"] + ) src_ds = None ds = None - ds = gdal.Open('tmp/nitf39.ntf') + ds = gdal.Open("tmp/nitf39.ntf") (exp_mean, exp_stddev) = (65.4208, 47.254550335) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'did not get expected mean or standard dev.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "did not get expected mean or standard dev." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert md["COMPRESSION"] == "JPEG", "Did not get expected compression value." ds = None + ############################################################################### # Create a 10 GB NITF file @@ -1264,7 +1520,7 @@ def test_nitf_40(): # Determine if the filesystem supports sparse files (we don't want to create a real 10 GB # file ! - if not gdaltest.filesystem_supports_sparse_files('tmp'): + if not gdaltest.filesystem_supports_sparse_files("tmp"): pytest.skip() width = 99000 @@ -1272,15 +1528,17 @@ def test_nitf_40(): x = width - 1 y = height - 1 - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf40.ntf', width, height, options=['BLOCKSIZE=256']) - data = struct.pack('B' * 1, 123) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf40.ntf", width, height, options=["BLOCKSIZE=256"] + ) + data = struct.pack("B" * 1, 123) # Write a non NULL byte at the bottom right corner of the image (around 10 GB offset) ds.GetRasterBand(1).WriteRaster(x, y, 1, 1, data) ds = None # Check that we can fetch it at the right value - ds = gdal.Open('tmp/nitf40.ntf') + ds = gdal.Open("tmp/nitf40.ntf") assert ds.GetRasterBand(1).ReadRaster(x, y, 1, 1) == data ds = None @@ -1293,41 +1551,46 @@ def test_nitf_40(): iBlocky = int(y / blockHeight) ix = x % blockWidth iy = y % blockHeight - offset = 843 + (iBlocky * nBlockx + iBlockx) * blockWidth * blockHeight + (iy * blockWidth + ix) + offset = ( + 843 + + (iBlocky * nBlockx + iBlockx) * blockWidth * blockHeight + + (iy * blockWidth + ix) + ) try: os.SEEK_SET except AttributeError: os.SEEK_SET, os.SEEK_CUR, os.SEEK_END = list(range(3)) - fd = open('tmp/nitf40.ntf', 'rb') + fd = open("tmp/nitf40.ntf", "rb") fd.seek(offset, os.SEEK_SET) bytes_read = fd.read(1) fd.close() - val = struct.unpack('B' * 1, bytes_read)[0] - assert val == 123, ('Bad value at offset %d : %d' % (offset, val)) + val = struct.unpack("B" * 1, bytes_read)[0] + assert val == 123, "Bad value at offset %d : %d" % (offset, val) ############################################################################### # Check reading a 12-bit JPEG compressed NITF + def test_nitf_41(not_jpeg_9b): # Check if JPEG driver supports 12bit JPEG reading/writing - jpg_drv = gdal.GetDriverByName('JPEG') + jpg_drv = gdal.GetDriverByName("JPEG") md = jpg_drv.GetMetadata() - if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: - pytest.skip('12bit jpeg not available') + if md[gdal.DMD_CREATIONDATATYPES].find("UInt16") == -1: + pytest.skip("12bit jpeg not available") - gdal.Unlink('data/nitf/U_4017A.NTF.aux.xml') + gdal.Unlink("data/nitf/U_4017A.NTF.aux.xml") - ds = gdal.Open('data/nitf/U_4017A.NTF') + ds = gdal.Open("data/nitf/U_4017A.NTF") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 2385 and stats[2] <= 2386 ds = None - gdal.Unlink('data/nitf/U_4017A.NTF.aux.xml') + gdal.Unlink("data/nitf/U_4017A.NTF.aux.xml") ############################################################################### @@ -1336,21 +1599,24 @@ def test_nitf_41(not_jpeg_9b): def test_nitf_42(not_jpeg_9b): # Check if JPEG driver supports 12bit JPEG reading/writing - jpg_drv = gdal.GetDriverByName('JPEG') + jpg_drv = gdal.GetDriverByName("JPEG") md = jpg_drv.GetMetadata() - if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: - pytest.skip('12bit jpeg not available') + if md[gdal.DMD_CREATIONDATATYPES].find("UInt16") == -1: + pytest.skip("12bit jpeg not available") - ds = gdal.Open('data/nitf/U_4017A.NTF') - out_ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf42.ntf', ds, options=['IC=C3', 'FHDR=NITF02.10']) + ds = gdal.Open("data/nitf/U_4017A.NTF") + out_ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf42.ntf", ds, options=["IC=C3", "FHDR=NITF02.10"] + ) del out_ds - ds = gdal.Open('tmp/nitf42.ntf') + ds = gdal.Open("tmp/nitf42.ntf") assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 2385 and stats[2] <= 2386 ds = None + ############################################################################### # Test CreateCopy() in IC=C8 with various JPEG2000 drivers @@ -1358,8 +1624,8 @@ def test_nitf_42(not_jpeg_9b): def nitf_43(driver_to_test, options): jp2_drv = gdal.GetDriverByName(driver_to_test) - if driver_to_test == 'JP2ECW' and jp2_drv is not None: - if 'DMD_CREATIONOPTIONLIST' not in jp2_drv.GetMetadata(): + if driver_to_test == "JP2ECW" and jp2_drv is not None: + if "DMD_CREATIONOPTIONLIST" not in jp2_drv.GetMetadata(): jp2_drv = None if jp2_drv is None: @@ -1368,23 +1634,25 @@ def nitf_43(driver_to_test, options): # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) - ds = gdal.Open('data/byte.tif') - gdal.PushErrorHandler('CPLQuietErrorHandler') - out_ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_43.ntf', ds, options=options, strict=0) + ds = gdal.Open("data/byte.tif") + gdal.PushErrorHandler("CPLQuietErrorHandler") + out_ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf_43.ntf", ds, options=options, strict=0 + ) gdal.PopErrorHandler() out_ds = None - out_ds = gdal.Open('tmp/nitf_43.ntf') + out_ds = gdal.Open("tmp/nitf_43.ntf") if out_ds.GetRasterBand(1).Checksum() == 4672: - ret = 'success' + ret = "success" else: - ret = 'fail' + ret = "fail" out_ds = None - if open('tmp/nitf_43.ntf', 'rb').read().decode('LATIN1').find('= 0: - print('GMLJP2 detected !') - ret = 'fail' + if open("tmp/nitf_43.ntf", "rb").read().decode("LATIN1").find("= 0: + print("GMLJP2 detected !") + ret = "fail" - gdal.GetDriverByName('NITF').Delete('tmp/nitf_43.ntf') + gdal.GetDriverByName("NITF").Delete("tmp/nitf_43.ntf") gdaltest.reregister_all_jpeg2000_drivers() @@ -1392,18 +1660,20 @@ def nitf_43(driver_to_test, options): def test_nitf_43_jasper(): - return nitf_43('JPEG2000', ['IC=C8']) + return nitf_43("JPEG2000", ["IC=C8"]) def test_nitf_43_jp2ecw(): import ecw + if not ecw.has_write_support(): pytest.skip() - return nitf_43('JP2ECW', ['IC=C8', 'TARGET=0']) + return nitf_43("JP2ECW", ["IC=C8", "TARGET=0"]) def test_nitf_43_jp2kak(): - return nitf_43('JP2KAK', ['IC=C8', 'QUALITY=100']) + return nitf_43("JP2KAK", ["IC=C8", "QUALITY=100"]) + ############################################################################### # Check creating a monoblock 10000x1 image (ticket #3263) @@ -1411,19 +1681,20 @@ def test_nitf_43_jp2kak(): def test_nitf_44(): - out_ds = gdal.GetDriverByName('NITF').Create('tmp/nitf44.ntf', 10000, 1) + out_ds = gdal.GetDriverByName("NITF").Create("tmp/nitf44.ntf", 10000, 1) out_ds.GetRasterBand(1).Fill(255) out_ds = None - ds = gdal.Open('tmp/nitf44.ntf') + ds = gdal.Open("tmp/nitf44.ntf") - if 'GetBlockSize' in dir(gdal.Band): + if "GetBlockSize" in dir(gdal.Band): (blockx, _) = ds.GetRasterBand(1).GetBlockSize() assert blockx == 10000 assert ds.GetRasterBand(1).Checksum() == 57182 ds = None + ############################################################################### # Check overviews on a JPEG compressed subdataset @@ -1431,23 +1702,24 @@ def test_nitf_44(): def test_nitf_45(): try: - os.remove('tmp/nitf45.ntf.aux.xml') + os.remove("tmp/nitf45.ntf.aux.xml") except OSError: pass - shutil.copyfile('data/nitf/two_images_jpeg.ntf', 'tmp/nitf45.ntf') + shutil.copyfile("data/nitf/two_images_jpeg.ntf", "tmp/nitf45.ntf") - ds = gdal.Open('NITF_IM:1:tmp/nitf45.ntf', gdal.GA_Update) + ds = gdal.Open("NITF_IM:1:tmp/nitf45.ntf", gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) # FIXME ? ds.GetRasterBand(1).GetOverview(0) is None until we reopen ds = None - ds = gdal.Open('NITF_IM:1:tmp/nitf45.ntf') + ds = gdal.Open("NITF_IM:1:tmp/nitf45.ntf") cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 1086, 'did not get expected checksum for overview of subdataset' + assert cs == 1086, "did not get expected checksum for overview of subdataset" ds = None + ############################################################################### # Check overviews on a JPEG2000 compressed subdataset @@ -1462,34 +1734,36 @@ def nitf_46(driver_to_test): gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) try: - os.remove('tmp/nitf46.ntf.aux.xml') + os.remove("tmp/nitf46.ntf.aux.xml") except OSError: pass try: - os.remove('tmp/nitf46.ntf_0.ovr') + os.remove("tmp/nitf46.ntf_0.ovr") except OSError: pass - shutil.copyfile('data/nitf/two_images_jp2.ntf', 'tmp/nitf46.ntf') + shutil.copyfile("data/nitf/two_images_jp2.ntf", "tmp/nitf46.ntf") - ds = gdal.Open('NITF_IM:1:tmp/nitf46.ntf', gdal.GA_Update) + ds = gdal.Open("NITF_IM:1:tmp/nitf46.ntf", gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) # FIXME ? ds.GetRasterBand(1).GetOverview(0) is None until we reopen ds = None - ds = gdal.Open('NITF_IM:1:tmp/nitf46.ntf') + ds = gdal.Open("NITF_IM:1:tmp/nitf46.ntf") if ds.GetRasterBand(1).GetOverview(0) is None: - gdaltest.post_reason('no overview of subdataset') - ret = 'fail' + gdaltest.post_reason("no overview of subdataset") + ret = "fail" else: cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if cs != 1086: print(cs) - gdaltest.post_reason('did not get expected checksum for overview of subdataset') - ret = 'fail' + gdaltest.post_reason( + "did not get expected checksum for overview of subdataset" + ) + ret = "fail" else: - ret = 'success' + ret = "success" ds = None @@ -1499,23 +1773,24 @@ def nitf_46(driver_to_test): def nitf_46_jp2ecw(): - return nitf_46('JP2ECW') + return nitf_46("JP2ECW") def nitf_46_jp2mrsid(): - return nitf_46('JP2MrSID') + return nitf_46("JP2MrSID") def nitf_46_jp2kak(): - return nitf_46('JP2KAK') + return nitf_46("JP2KAK") def test_nitf_46_jasper(): - return nitf_46('JPEG2000') + return nitf_46("JPEG2000") def nitf_46_openjpeg(): - return nitf_46('JP2OpenJPEG') + return nitf_46("JP2OpenJPEG") + ############################################################################### # Check reading of rsets. @@ -1523,17 +1798,19 @@ def nitf_46_openjpeg(): def test_nitf_47(): - ds = gdal.Open('data/nitf/rset.ntf.r0') + ds = gdal.Open("data/nitf/rset.ntf.r0") band = ds.GetRasterBand(2) - assert band.GetOverviewCount() == 2, \ - 'did not get the expected number of rset overviews.' + assert ( + band.GetOverviewCount() == 2 + ), "did not get the expected number of rset overviews." cs = band.GetOverview(1).Checksum() - assert cs == 1297, 'did not get expected checksum for overview of subdataset' + assert cs == 1297, "did not get expected checksum for overview of subdataset" ds = None + ############################################################################### # Check building of standard overviews in place of rset overviews. @@ -1541,35 +1818,36 @@ def test_nitf_47(): def test_nitf_48(): try: - os.remove('tmp/rset.ntf.r0') - os.remove('tmp/rset.ntf.r1') - os.remove('tmp/rset.ntf.r2') - os.remove('tmp/rset.ntf.r0.ovr') + os.remove("tmp/rset.ntf.r0") + os.remove("tmp/rset.ntf.r1") + os.remove("tmp/rset.ntf.r2") + os.remove("tmp/rset.ntf.r0.ovr") except OSError: pass - shutil.copyfile('data/nitf/rset.ntf.r0', 'tmp/rset.ntf.r0') - shutil.copyfile('data/nitf/rset.ntf.r1', 'tmp/rset.ntf.r1') - shutil.copyfile('data/nitf/rset.ntf.r2', 'tmp/rset.ntf.r2') + shutil.copyfile("data/nitf/rset.ntf.r0", "tmp/rset.ntf.r0") + shutil.copyfile("data/nitf/rset.ntf.r1", "tmp/rset.ntf.r1") + shutil.copyfile("data/nitf/rset.ntf.r2", "tmp/rset.ntf.r2") - ds = gdal.Open('tmp/rset.ntf.r0', gdal.GA_Update) + ds = gdal.Open("tmp/rset.ntf.r0", gdal.GA_Update) ds.BuildOverviews(overviewlist=[3]) ds = None - ds = gdal.Open('tmp/rset.ntf.r0') - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get the expected number of rset overviews.' + ds = gdal.Open("tmp/rset.ntf.r0") + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get the expected number of rset overviews." cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 2328, 'did not get expected checksum for overview of subdataset' + assert cs == 2328, "did not get expected checksum for overview of subdataset" ds = None try: - os.remove('tmp/rset.ntf.r0') - os.remove('tmp/rset.ntf.r1') - os.remove('tmp/rset.ntf.r2') - os.remove('tmp/rset.ntf.r0.ovr') + os.remove("tmp/rset.ntf.r0") + os.remove("tmp/rset.ntf.r1") + os.remove("tmp/rset.ntf.r2") + os.remove("tmp/rset.ntf.r0.ovr") except OSError: pass @@ -1580,35 +1858,46 @@ def test_nitf_48(): def test_nitf_49(): - options = ["TEXT=DATA_0=COUCOU", - "TEXT=HEADER_0=ABC", # This content is invalid but who cares here - "CGM=SEGMENT_COUNT=1", - "CGM=SEGMENT_0_SLOC_ROW=25", - "CGM=SEGMENT_0_SLOC_COL=25", - "CGM=SEGMENT_0_SDLVL=2", - "CGM=SEGMENT_0_SALVL=1", - "CGM=SEGMENT_0_DATA=XYZ"] + options = [ + "TEXT=DATA_0=COUCOU", + "TEXT=HEADER_0=ABC", # This content is invalid but who cares here + "CGM=SEGMENT_COUNT=1", + "CGM=SEGMENT_0_SLOC_ROW=25", + "CGM=SEGMENT_0_SLOC_COL=25", + "CGM=SEGMENT_0_SDLVL=2", + "CGM=SEGMENT_0_SALVL=1", + "CGM=SEGMENT_0_DATA=XYZ", + ] - src_ds = gdal.Open('data/nitf/text_md.vrt') + src_ds = gdal.Open("data/nitf/text_md.vrt") # This will check that the creation option overrides the TEXT metadata domain from the source - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf49.ntf', src_ds, - options=options) + ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf49.ntf", src_ds, options=options + ) # Test copy from source TEXT and CGM metadata domains - ds2 = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf49_2.ntf', ds) - - md = ds2.GetMetadata('TEXT') - if 'DATA_0' not in md or md['DATA_0'] != 'COUCOU' or \ - 'HEADER_0' not in md or md['HEADER_0'].find('ABC ') == -1: - gdaltest.post_reason('did not get expected TEXT metadata') + ds2 = gdal.GetDriverByName("NITF").CreateCopy("tmp/nitf49_2.ntf", ds) + + md = ds2.GetMetadata("TEXT") + if ( + "DATA_0" not in md + or md["DATA_0"] != "COUCOU" + or "HEADER_0" not in md + or md["HEADER_0"].find("ABC ") == -1 + ): + gdaltest.post_reason("did not get expected TEXT metadata") print(md) return - md = ds2.GetMetadata('CGM') - if 'SEGMENT_COUNT' not in md or md['SEGMENT_COUNT'] != '1' or \ - 'SEGMENT_0_DATA' not in md or md['SEGMENT_0_DATA'] != 'XYZ': - gdaltest.post_reason('did not get expected CGM metadata') + md = ds2.GetMetadata("CGM") + if ( + "SEGMENT_COUNT" not in md + or md["SEGMENT_COUNT"] != "1" + or "SEGMENT_0_DATA" not in md + or md["SEGMENT_0_DATA"] != "XYZ" + ): + gdaltest.post_reason("did not get expected CGM metadata") print(md) return @@ -1616,6 +1905,7 @@ def test_nitf_49(): ds = None ds2 = None + ############################################################################### # Test TEXT and CGM creation options with Create() (#3376) @@ -1630,19 +1920,22 @@ def test_nitf_50(): "CGM=SEGMENT_0_SLOC_COL=25", "CGM=SEGMENT_0_SDLVL=2", "CGM=SEGMENT_0_SALVL=1", - "CGM=SEGMENT_0_DATA=XYZ"] + "CGM=SEGMENT_0_DATA=XYZ", + ] try: - os.remove('tmp/nitf50.ntf') + os.remove("tmp/nitf50.ntf") except OSError: pass # This will check that the creation option overrides the TEXT metadata domain from the source - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf50.ntf', 100, 100, 3, options=options) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf50.ntf", 100, 100, 3, options=options + ) - ds.WriteRaster(0, 0, 100, 100, ' ', 1, 1, - buf_type=gdal.GDT_Byte, - band_list=[1, 2, 3]) + ds.WriteRaster( + 0, 0, 100, 100, " ", 1, 1, buf_type=gdal.GDT_Byte, band_list=[1, 2, 3] + ) ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) @@ -1652,24 +1945,33 @@ def test_nitf_50(): # when closing the dataset (for JP2 compressed datastreams, we need to wait for the # imagery to be written) ds = None - ds = gdal.Open('tmp/nitf50.ntf') + ds = gdal.Open("tmp/nitf50.ntf") - md = ds.GetMetadata('TEXT') - if 'DATA_0' not in md or md['DATA_0'] != 'COUCOU' or \ - 'HEADER_0' not in md or md['HEADER_0'].find('ABC ') == -1: - gdaltest.post_reason('did not get expected TEXT metadata') + md = ds.GetMetadata("TEXT") + if ( + "DATA_0" not in md + or md["DATA_0"] != "COUCOU" + or "HEADER_0" not in md + or md["HEADER_0"].find("ABC ") == -1 + ): + gdaltest.post_reason("did not get expected TEXT metadata") print(md) return - md = ds.GetMetadata('CGM') - if 'SEGMENT_COUNT' not in md or md['SEGMENT_COUNT'] != '1' or \ - 'SEGMENT_0_DATA' not in md or md['SEGMENT_0_DATA'] != 'XYZ': - gdaltest.post_reason('did not get expected CGM metadata') + md = ds.GetMetadata("CGM") + if ( + "SEGMENT_COUNT" not in md + or md["SEGMENT_COUNT"] != "1" + or "SEGMENT_0_DATA" not in md + or md["SEGMENT_0_DATA"] != "XYZ" + ): + gdaltest.post_reason("did not get expected CGM metadata") print(md) return ds = None + ############################################################################### # Test reading very small images with NBPP < 8 or NBPP == 12 @@ -1677,36 +1979,38 @@ def test_nitf_50(): def test_nitf_51(): for xsize in range(1, 9): for nbpp in [1, 2, 3, 4, 5, 6, 7, 12]: - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf51.ntf', xsize, 1) + ds = gdal.GetDriverByName("NITF").Create("tmp/nitf51.ntf", xsize, 1) ds = None - f = open('tmp/nitf51.ntf', 'rb+') + f = open("tmp/nitf51.ntf", "rb+") # Patch NBPP value at offset 811 f.seek(811) - f.write(struct.pack('B' * 2, 48 + int(nbpp / 10), 48 + nbpp % 10)) + f.write(struct.pack("B" * 2, 48 + int(nbpp / 10), 48 + nbpp % 10)) # Write image data f.seek(843) n = int((xsize * nbpp + 7) / 8) for i in range(n): - f.write(struct.pack('B' * 1, 255)) + f.write(struct.pack("B" * 1, 255)) f.close() - ds = gdal.Open('tmp/nitf51.ntf') + ds = gdal.Open("tmp/nitf51.ntf") if nbpp == 12: - data = ds.GetRasterBand(1).ReadRaster(0, 0, xsize, 1, buf_type=gdal.GDT_UInt16) - arr = struct.unpack('H' * xsize, data) + data = ds.GetRasterBand(1).ReadRaster( + 0, 0, xsize, 1, buf_type=gdal.GDT_UInt16 + ) + arr = struct.unpack("H" * xsize, data) else: data = ds.GetRasterBand(1).ReadRaster(0, 0, xsize, 1) - arr = struct.unpack('B' * xsize, data) + arr = struct.unpack("B" * xsize, data) ds = None for i in range(xsize): if arr[i] != (1 << nbpp) - 1: - print('xsize = %d, nbpp = %d' % (xsize, nbpp)) - pytest.fail('did not get expected data') + print("xsize = %d, nbpp = %d" % (xsize, nbpp)) + pytest.fail("did not get expected data") ############################################################################### @@ -1716,21 +2020,40 @@ def test_nitf_51(): def test_nitf_52(): # Create a fake NITF file with GeoSDE TREs (probably not conformant, but enough to test GDAL code) - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf52.ntf', 1, 1, options=['FILE_TRE=GEOPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345EURM ', - 'FILE_TRE=PRJPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789AC0000000000000000000000000000000', - 'TRE=MAPLOB=M 0001000010000000000100000000000005000000']) - ds = None - - ds = gdal.Open('tmp/nitf52.ntf') + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf52.ntf", + 1, + 1, + options=[ + "FILE_TRE=GEOPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345EURM ", + "FILE_TRE=PRJPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789AC0000000000000000000000000000000", + "TRE=MAPLOB=M 0001000010000000000100000000000005000000", + ], + ) + ds = None + + ds = gdal.Open("tmp/nitf52.ntf") wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None - expected_wkt ="""PROJCS["unnamed",GEOGCS["EUROPEAN 1950, Mean (3 Param)",DATUM["EUROPEAN_1950_Mean_3_Param",SPHEROID["International 1924",6378388,297],TOWGS84[-87,-98,-121,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",0],PARAMETER["longitude_of_center",0],PARAMETER["standard_parallel_1",0],PARAMETER["standard_parallel_2",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" - assert wkt in (expected_wkt, expected_wkt.replace('EUROPEAN_1950_Mean_3_Param', 'EUROPEAN 1950, Mean (3 Param)')) + expected_wkt = """PROJCS["unnamed",GEOGCS["EUROPEAN 1950, Mean (3 Param)",DATUM["EUROPEAN_1950_Mean_3_Param",SPHEROID["International 1924",6378388,297],TOWGS84[-87,-98,-121,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",0],PARAMETER["longitude_of_center",0],PARAMETER["standard_parallel_1",0],PARAMETER["standard_parallel_2",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" + assert wkt in ( + expected_wkt, + expected_wkt.replace( + "EUROPEAN_1950_Mean_3_Param", "EUROPEAN 1950, Mean (3 Param)" + ), + ) + + assert gt == ( + 100000.0, + 10.0, + 0.0, + 5000000.0, + 0.0, + -10.0, + ), "did not get expected geotransform" - assert gt == (100000.0, 10.0, 0.0, 5000000.0, 0.0, -10.0), \ - 'did not get expected geotransform' ############################################################################### # Test reading UTM MGRS @@ -1738,31 +2061,42 @@ def test_nitf_52(): def test_nitf_53(): - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf53.ntf', 2, 2, options=['ICORDS=N']) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf53.ntf", 2, 2, options=["ICORDS=N"] + ) ds = None - f = open('tmp/nitf53.ntf', 'rb+') + f = open("tmp/nitf53.ntf", "rb+") # Patch ICORDS and IGEOLO f.seek(775) - f.write(b'U') - f.write(b'31UBQ1000040000') - f.write(b'31UBQ2000040000') - f.write(b'31UBQ2000030000') - f.write(b'31UBQ1000030000') + f.write(b"U") + f.write(b"31UBQ1000040000") + f.write(b"31UBQ2000040000") + f.write(b"31UBQ2000030000") + f.write(b"31UBQ1000030000") f.close() - ds = gdal.Open('tmp/nitf53.ntf') + ds = gdal.Open("tmp/nitf53.ntf") wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None - assert 'PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]' in wkt, \ - 'did not get expected SRS' + assert ( + 'PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]' + in wkt + ), "did not get expected SRS" + + assert gt == ( + 205000.0, + 10000.0, + 0.0, + 5445000.0, + 0.0, + -10000.0, + ), "did not get expected geotransform" - assert gt == (205000.0, 10000.0, 0.0, 5445000.0, 0.0, -10000.0), \ - 'did not get expected geotransform' ############################################################################### # Test reading RPC00B @@ -1771,16 +2105,19 @@ def test_nitf_53(): def test_nitf_54(): # Create a fake NITF file with RPC00B TRE (probably not conformant, but enough to test GDAL code) - RPC00B = '100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + RPC00B = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf54.ntf', 1, 1, options=['TRE=RPC00B=' + RPC00B]) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf54.ntf", 1, 1, options=["TRE=RPC00B=" + RPC00B] + ) ds = None - ds = gdal.Open('tmp/nitf54.ntf') - md = ds.GetMetadata('RPC') + ds = gdal.Open("tmp/nitf54.ntf") + md = ds.GetMetadata("RPC") ds = None - assert md is not None and 'HEIGHT_OFF' in md + assert md is not None and "HEIGHT_OFF" in md + ############################################################################### # Test reading ICHIPB @@ -1789,16 +2126,19 @@ def test_nitf_54(): def test_nitf_55(): # Create a fake NITF file with ICHIPB TRE (probably not conformant, but enough to test GDAL code) - ICHIPB = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + ICHIPB = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf55.ntf', 1, 1, options=['TRE=ICHIPB=' + ICHIPB]) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf55.ntf", 1, 1, options=["TRE=ICHIPB=" + ICHIPB] + ) ds = None - ds = gdal.Open('tmp/nitf55.ntf') + ds = gdal.Open("tmp/nitf55.ntf") md = ds.GetMetadata() ds = None - assert md is not None and 'ICHIP_SCALE_FACTOR' in md + assert md is not None and "ICHIP_SCALE_FACTOR" in md + ############################################################################### # Test reading USE00A @@ -1807,16 +2147,19 @@ def test_nitf_55(): def test_nitf_56(): # Create a fake NITF file with USE00A TRE (probably not conformant, but enough to test GDAL code) - USE00A = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + USE00A = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf56.ntf', 1, 1, options=['TRE=USE00A=' + USE00A]) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf56.ntf", 1, 1, options=["TRE=USE00A=" + USE00A] + ) ds = None - ds = gdal.Open('tmp/nitf56.ntf') + ds = gdal.Open("tmp/nitf56.ntf") md = ds.GetMetadata() ds = None - assert md is not None and 'NITF_USE00A_ANGLE_TO_NORTH' in md + assert md is not None and "NITF_USE00A_ANGLE_TO_NORTH" in md + ############################################################################### # Test reading GEOLOB @@ -1825,17 +2168,19 @@ def test_nitf_56(): def test_nitf_57(): # Create a fake NITF file with GEOLOB TRE - GEOLOB = '000000360000000360-180.000000000090.000000000000' + GEOLOB = "000000360000000360-180.000000000090.000000000000" - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf57.ntf', 1, 1, options=['TRE=GEOLOB=' + GEOLOB]) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf57.ntf", 1, 1, options=["TRE=GEOLOB=" + GEOLOB] + ) ds = None - ds = gdal.Open('tmp/nitf57.ntf') + ds = gdal.Open("tmp/nitf57.ntf") gt = ds.GetGeoTransform() ds = None if gt != (-180.0, 1.0, 0.0, 90.0, 0.0, -1.0): - gdaltest.post_reason('did not get expected geotransform') + gdaltest.post_reason("did not get expected geotransform") print(gt) return @@ -1847,16 +2192,19 @@ def test_nitf_57(): def test_nitf_58(): # Create a fake NITF file with STDIDC TRE (probably not conformant, but enough to test GDAL code) - STDIDC = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + STDIDC = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf58.ntf', 1, 1, options=['TRE=STDIDC=' + STDIDC]) + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf58.ntf", 1, 1, options=["TRE=STDIDC=" + STDIDC] + ) ds = None - ds = gdal.Open('tmp/nitf58.ntf') + ds = gdal.Open("tmp/nitf58.ntf") md = ds.GetMetadata() ds = None - assert md is not None and 'NITF_STDIDC_ACQUISITION_DATE' in md + assert md is not None and "NITF_STDIDC_ACQUISITION_DATE" in md + ############################################################################### # Test reading IMRFCA and IMASDA @@ -1865,72 +2213,96 @@ def test_nitf_58(): def test_nitf_read_IMRFCA_IMASDA(): # Create a fake NITF file with fake IMRFCA and IMASDA TRE - IMRFCA = '0' * 1760 - IMASDA = '0' * 242 + IMRFCA = "0" * 1760 + IMASDA = "0" * 242 - tmpfile = '/vsimem/nitf_read_IMRFCA_IMASDA.ntf' - gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA, 'TRE=IMASDA=' + IMASDA]) + tmpfile = "/vsimem/nitf_read_IMRFCA_IMASDA.ntf" + gdal.GetDriverByName("NITF").Create( + tmpfile, 1, 1, options=["TRE=IMRFCA=" + IMRFCA, "TRE=IMASDA=" + IMASDA] + ) ds = gdal.Open(tmpfile) - md = ds.GetMetadata('RPC') + md = ds.GetMetadata("RPC") ds = None gdal.Unlink(tmpfile) assert not (md is None or md == {}) # Only IMRFCA - gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA]) + gdal.GetDriverByName("NITF").Create(tmpfile, 1, 1, options=["TRE=IMRFCA=" + IMRFCA]) ds = gdal.Open(tmpfile) - md = ds.GetMetadata('RPC') + md = ds.GetMetadata("RPC") ds = None gdal.Unlink(tmpfile) assert md == {} # Only IMASDA - gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMASDA=' + IMASDA]) + gdal.GetDriverByName("NITF").Create(tmpfile, 1, 1, options=["TRE=IMASDA=" + IMASDA]) ds = gdal.Open(tmpfile) - md = ds.GetMetadata('RPC') + md = ds.GetMetadata("RPC") ds = None gdal.Unlink(tmpfile) assert md == {} # Too short IMRFCA with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA[0:-1], 'TRE=IMASDA=' + IMASDA]) + gdal.GetDriverByName("NITF").Create( + tmpfile, + 1, + 1, + options=["TRE=IMRFCA=" + IMRFCA[0:-1], "TRE=IMASDA=" + IMASDA], + ) ds = gdal.Open(tmpfile) - md = ds.GetMetadata('RPC') + md = ds.GetMetadata("RPC") ds = None gdal.Unlink(tmpfile) assert md == {} # Too short IMASDA with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA, 'TRE=IMASDA=' + IMASDA[0:-1]]) + gdal.GetDriverByName("NITF").Create( + tmpfile, + 1, + 1, + options=["TRE=IMRFCA=" + IMRFCA, "TRE=IMASDA=" + IMASDA[0:-1]], + ) ds = gdal.Open(tmpfile) - md = ds.GetMetadata('RPC') + md = ds.GetMetadata("RPC") ds = None gdal.Unlink(tmpfile) assert md == {} + ############################################################################### # Test georeferencing through .nfw and .hdr files def test_nitf_59(): - shutil.copyfile('data/nitf/nitf59.nfw', 'tmp/nitf59.nfw') - shutil.copyfile('data/nitf/nitf59.hdr', 'tmp/nitf59.hdr') - ds = gdal.GetDriverByName('NITF').Create('tmp/nitf59.ntf', 1, 1, options=['ICORDS=N']) + shutil.copyfile("data/nitf/nitf59.nfw", "tmp/nitf59.nfw") + shutil.copyfile("data/nitf/nitf59.hdr", "tmp/nitf59.hdr") + ds = gdal.GetDriverByName("NITF").Create( + "tmp/nitf59.ntf", 1, 1, options=["ICORDS=N"] + ) ds = None - ds = gdal.Open('tmp/nitf59.ntf') + ds = gdal.Open("tmp/nitf59.ntf") wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None - assert """PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]""" in wkt, \ - 'did not get expected SRS' + assert ( + """PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]""" + in wkt + ), "did not get expected SRS" + + assert gt == ( + 149999.5, + 1.0, + 0.0, + 4500000.5, + 0.0, + -1.0, + ), "did not get expected geotransform" - assert gt == (149999.5, 1.0, 0.0, 4500000.5, 0.0, -1.0), \ - 'did not get expected geotransform' ############################################################################### # Test reading CADRG polar tile georeferencing (#2940) @@ -1939,19 +2311,30 @@ def test_nitf_59(): def test_nitf_60(): # Shut down errors because the file is truncated - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.Open('data/nitf/testtest.on9') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.Open("data/nitf/testtest.on9") gdal.PopErrorHandler() wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None - assert wkt == """PROJCS["ARC_System_Zone_09",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ - 'did not get expected SRS' + assert ( + wkt + == """PROJCS["ARC_System_Zone_09",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" + ), "did not get expected SRS" - ref_gt = [1036422.8453166834, 149.94543479697344, 0.0, 345474.28177222813, 0.0, -149.94543479697404] + ref_gt = [ + 1036422.8453166834, + 149.94543479697344, + 0.0, + 345474.28177222813, + 0.0, + -149.94543479697404, + ] for i in range(6): - assert gt[i] == pytest.approx(ref_gt[i], abs=1e-6), 'did not get expected geotransform' + assert gt[i] == pytest.approx( + ref_gt[i], abs=1e-6 + ), "did not get expected geotransform" ############################################################################### @@ -1962,14 +2345,21 @@ def test_nitf_61(): # Derived from http://www.gwg.nga.mil/ntb/baseline/software/testfile/rsm/SampleFiles/FrameSet1/NITF_Files/i_6130a.zip # but hand edited to have just 1x1 imagery - ds = gdal.Open('data/nitf/i_6130a_truncated.ntf') - md = ds.GetMetadata('TRE') - xml_tre = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("data/nitf/i_6130a_truncated.ntf") + md = ds.GetMetadata("TRE") + xml_tre = ds.GetMetadata("xml:TRE")[0] ds = None - assert md is not None and 'RSMDCA' in md and 'RSMECA' in md and 'RSMPCA' in md and 'RSMIDA' in md + assert ( + md is not None + and "RSMDCA" in md + and "RSMECA" in md + and "RSMPCA" in md + and "RSMIDA" in md + ) + + assert xml_tre.find(' 8192 (#3922) @@ -2088,72 +2519,85 @@ def test_nitf_64(): def test_nitf_65(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_65.ntf', 10000, 100, options=['BLOCKXSIZE=10000']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_65.ntf", 10000, 100, options=["BLOCKXSIZE=10000"] + ) ds = None - ds = gdal.Open('/vsimem/nitf_65.ntf') + ds = gdal.Open("/vsimem/nitf_65.ntf") (block_xsize, _) = ds.GetRasterBand(1).GetBlockSize() ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/nitf_65.ntf') + gdal.Unlink("/vsimem/nitf_65.ntf") assert block_xsize == 10000 + ############################################################################### # Test creating an image with block_height = image_height > 8192 (#3922) def test_nitf_66(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_66.ntf', 100, 10000, options=['BLOCKYSIZE=10000', 'BLOCKXSIZE=50']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_66.ntf", 100, 10000, options=["BLOCKYSIZE=10000", "BLOCKXSIZE=50"] + ) ds = None - ds = gdal.Open('/vsimem/nitf_66.ntf') + ds = gdal.Open("/vsimem/nitf_66.ntf") (_, block_ysize) = ds.GetRasterBand(1).GetBlockSize() ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/nitf_66.ntf') + gdal.Unlink("/vsimem/nitf_66.ntf") assert block_ysize == 10000 + ############################################################################### # Test that we don't use scanline access in illegal cases (#3926) def test_nitf_67(): - src_ds = gdal.Open('data/byte.tif') - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_67.ntf', src_ds, options=['BLOCKYSIZE=1', 'BLOCKXSIZE=10'], strict=0) + src_ds = gdal.Open("data/byte.tif") + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf_67.ntf", + src_ds, + options=["BLOCKYSIZE=1", "BLOCKXSIZE=10"], + strict=0, + ) gdal.PopErrorHandler() ds = None src_ds = None - ds = gdal.Open('/vsimem/nitf_67.ntf') + ds = gdal.Open("/vsimem/nitf_67.ntf") cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/nitf_67.ntf') - gdal.Unlink('/vsimem/nitf_67.ntf.aux.xml') + gdal.Unlink("/vsimem/nitf_67.ntf") + gdal.Unlink("/vsimem/nitf_67.ntf.aux.xml") assert cs == 4672 + ############################################################################### # Test reading NITF_METADATA domain def test_nitf_68(): - ds = gdal.Open('data/nitf/rgb.ntf') - assert len(ds.GetMetadata('NITF_METADATA')) == 2 + ds = gdal.Open("data/nitf/rgb.ntf") + assert len(ds.GetMetadata("NITF_METADATA")) == 2 ds = None - ds = gdal.Open('data/nitf/rgb.ntf') - assert ds.GetMetadataItem('NITFFileHeader', 'NITF_METADATA') + ds = gdal.Open("data/nitf/rgb.ntf") + assert ds.GetMetadataItem("NITFFileHeader", "NITF_METADATA") ds = None + ############################################################################### # Test SetGCPs() support @@ -2178,50 +2622,67 @@ def test_nitf_69(): # Test CreateCopy() vrt_ds = gdal.Open(vrt_txt) - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_69_src.ntf', vrt_ds) + ds = gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_69_src.ntf", vrt_ds) ds = None vrt_ds = None # Just in case - gdal.Unlink('/vsimem/nitf_69_src.ntf.aux.xml') + gdal.Unlink("/vsimem/nitf_69_src.ntf.aux.xml") # Test Create() and SetGCPs() - src_ds = gdal.Open('/vsimem/nitf_69_src.ntf') - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_69_dest.ntf', 20, 20, 1, options=['ICORDS=G']) + src_ds = gdal.Open("/vsimem/nitf_69_src.ntf") + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_69_dest.ntf", 20, 20, 1, options=["ICORDS=G"] + ) ds.SetGCPs(src_ds.GetGCPs(), src_ds.GetGCPProjection()) - ds.SetGCPs(src_ds.GetGCPs(), src_ds.GetGCPProjection()) # To check we can call it several times without error + ds.SetGCPs( + src_ds.GetGCPs(), src_ds.GetGCPProjection() + ) # To check we can call it several times without error ds = None src_ds = None # Now open again - ds = gdal.Open('/vsimem/nitf_69_dest.ntf') + ds = gdal.Open("/vsimem/nitf_69_dest.ntf") got_gcps = ds.GetGCPs() ds = None - gdal.Unlink('/vsimem/nitf_69_src.ntf') - gdal.Unlink('/vsimem/nitf_69_dest.ntf') + gdal.Unlink("/vsimem/nitf_69_src.ntf") + gdal.Unlink("/vsimem/nitf_69_dest.ntf") # Check # Upper-left - assert (got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) and \ - got_gcps[0].GCPX == pytest.approx(2, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(49, abs=1e-5)), \ - 'wrong gcp' + assert ( + got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) + and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) + and got_gcps[0].GCPX == pytest.approx(2, abs=1e-5) + and got_gcps[0].GCPY == pytest.approx(49, abs=1e-5) + ), "wrong gcp" # Upper-right - assert (got_gcps[1].GCPPixel == pytest.approx(19.5, abs=1e-5) and got_gcps[1].GCPLine == pytest.approx(0.5, abs=1e-5) and \ - got_gcps[1].GCPX == pytest.approx(3, abs=1e-5) and got_gcps[1].GCPY == pytest.approx(49.5, abs=1e-5)), \ - 'wrong gcp' + assert ( + got_gcps[1].GCPPixel == pytest.approx(19.5, abs=1e-5) + and got_gcps[1].GCPLine == pytest.approx(0.5, abs=1e-5) + and got_gcps[1].GCPX == pytest.approx(3, abs=1e-5) + and got_gcps[1].GCPY == pytest.approx(49.5, abs=1e-5) + ), "wrong gcp" # Lower-right - assert (got_gcps[2].GCPPixel == pytest.approx(19.5, abs=1e-5) and got_gcps[2].GCPLine == pytest.approx(19.5, abs=1e-5) and \ - got_gcps[2].GCPX == pytest.approx(3, abs=1e-5) and got_gcps[2].GCPY == pytest.approx(48, abs=1e-5)), \ - 'wrong gcp' + assert ( + got_gcps[2].GCPPixel == pytest.approx(19.5, abs=1e-5) + and got_gcps[2].GCPLine == pytest.approx(19.5, abs=1e-5) + and got_gcps[2].GCPX == pytest.approx(3, abs=1e-5) + and got_gcps[2].GCPY == pytest.approx(48, abs=1e-5) + ), "wrong gcp" # Lower-left - assert (got_gcps[3].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[3].GCPLine == pytest.approx(19.5, abs=1e-5) and \ - got_gcps[3].GCPX == pytest.approx(2, abs=1e-5) and got_gcps[3].GCPY == pytest.approx(48, abs=1e-5)), \ - 'wrong gcp' + assert ( + got_gcps[3].GCPPixel == pytest.approx(0.5, abs=1e-5) + and got_gcps[3].GCPLine == pytest.approx(19.5, abs=1e-5) + and got_gcps[3].GCPX == pytest.approx(2, abs=1e-5) + and got_gcps[3].GCPY == pytest.approx(48, abs=1e-5) + ), "wrong gcp" + ############################################################################### # Create and read a JPEG encoded NITF file with NITF dimensions != JPEG dimensions @@ -2229,47 +2690,65 @@ def test_nitf_69(): def test_nitf_70(): - src_ds = gdal.Open('data/rgbsmall.tif') + src_ds = gdal.Open("data/rgbsmall.tif") - ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_70.ntf', src_ds, - options=['IC=C3', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) + ds = gdal.GetDriverByName("NITF").CreateCopy( + "tmp/nitf_70.ntf", src_ds, options=["IC=C3", "BLOCKXSIZE=64", "BLOCKYSIZE=64"] + ) ds = None # For comparison - ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/nitf_70.tif', src_ds, - options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) + ds = gdal.GetDriverByName("GTiff").CreateCopy( + "tmp/nitf_70.tif", + src_ds, + options=[ + "COMPRESS=JPEG", + "PHOTOMETRIC=YCBCR", + "TILED=YES", + "BLOCKXSIZE=64", + "BLOCKYSIZE=64", + ], + ) ds = None src_ds = None - ds = gdal.Open('tmp/nitf_70.ntf') + ds = gdal.Open("tmp/nitf_70.ntf") cs = ds.GetRasterBand(1).Checksum() ds = None - ds = gdal.Open('tmp/nitf_70.tif') + ds = gdal.Open("tmp/nitf_70.tif") cs_ref = ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('NITF').Delete('tmp/nitf_70.ntf') - gdal.GetDriverByName('GTiff').Delete('tmp/nitf_70.tif') + gdal.GetDriverByName("NITF").Delete("tmp/nitf_70.ntf") + gdal.GetDriverByName("GTiff").Delete("tmp/nitf_70.tif") # cs == 21821 is what we get with Conda Windows and libjpeg-9e, and cs_ref == 21962 in that case # TODO (or maybe not! why in the hell should we care about IJG libjpeg): find out why those values aren't equal... assert cs == cs_ref or cs == 21821 + ############################################################################### # Test reading ENGRDA TRE (#6285) def test_nitf_71(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_71.ntf', 1, 1, options=['TRE=ENGRDA=0123456789012345678900210012345678901230123X01200000002XY01X01230123X01200000001X']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_71.ntf", + 1, + 1, + options=[ + "TRE=ENGRDA=0123456789012345678900210012345678901230123X01200000002XY01X01230123X01200000001X" + ], + ) ds = None - ds = gdal.Open('/vsimem/nitf_71.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_71.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_71.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_71.ntf") expected_data = """ @@ -2304,6 +2783,7 @@ def test_nitf_71(): """ assert data == expected_data + ############################################################################### # Test writing and reading RPC00B @@ -2311,271 +2791,308 @@ def test_nitf_71(): def compare_rpc(src_md, md): # Check that we got data with the expected precision for key in src_md: - if key == 'ERR_BIAS' or key == 'ERR_RAND': + if key == "ERR_BIAS" or key == "ERR_RAND": continue - assert key in md, ('fail: %s missing' % key) - if 'COEFF' in key: - expected = [float(v) for v in src_md[key].strip().split(' ')] - found = [float(v) for v in md[key].strip().split(' ')] + assert key in md, "fail: %s missing" % key + if "COEFF" in key: + expected = [float(v) for v in src_md[key].strip().split(" ")] + found = [float(v) for v in md[key].strip().split(" ")] if expected != found: print(md) - pytest.fail('fail: %s value is not the one expected' % key) + pytest.fail("fail: %s value is not the one expected" % key) elif float(src_md[key]) != float(md[key]): print(md) - pytest.fail('fail: %s value is not the one expected' % key) + pytest.fail("fail: %s value is not the one expected" % key) def test_nitf_72(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) # Use full precision src_md_max_precision = { - 'ERR_BIAS': '1234.56', - 'ERR_RAND': '2345.67', - 'LINE_OFF': '345678', - 'SAMP_OFF': '45678', - 'LAT_OFF': '-89.8765', - 'LONG_OFF': '-179.1234', - 'HEIGHT_OFF': '-9876', - 'LINE_SCALE': '987654', - 'SAMP_SCALE': '67890', - 'LAT_SCALE': '-12.3456', - 'LONG_SCALE': '-123.4567', - 'HEIGHT_SCALE': '-1234', - 'LINE_NUM_COEFF': '0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'LINE_DEN_COEFF': '1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'SAMP_NUM_COEFF': '2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'SAMP_DEN_COEFF': '3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', + "ERR_BIAS": "1234.56", + "ERR_RAND": "2345.67", + "LINE_OFF": "345678", + "SAMP_OFF": "45678", + "LAT_OFF": "-89.8765", + "LONG_OFF": "-179.1234", + "HEIGHT_OFF": "-9876", + "LINE_SCALE": "987654", + "SAMP_SCALE": "67890", + "LAT_SCALE": "-12.3456", + "LONG_SCALE": "-123.4567", + "HEIGHT_SCALE": "-1234", + "LINE_NUM_COEFF": "0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "LINE_DEN_COEFF": "1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "SAMP_NUM_COEFF": "2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "SAMP_DEN_COEFF": "3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", } src_md = src_md_max_precision - src_ds.SetMetadata(src_md, 'RPC') + src_ds.SetMetadata(src_md, "RPC") - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) + gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) - assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' + assert gdal.GetLastErrorMsg() == "", "fail: did not expect warning" - if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: - f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') + if gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None: + f = gdal.VSIFOpenL("/vsimem/nitf_72.ntf.aux.xml", "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) - pytest.fail('fail: PAM file not expected') + pytest.fail("fail: PAM file not expected") - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") compare_rpc(src_md, md) - expected_RPC00B_max_precision = '11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' - assert RPC00B == expected_RPC00B_max_precision, 'fail: did not get expected RPC00B' + expected_RPC00B_max_precision = "11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9" + assert RPC00B == expected_RPC00B_max_precision, "fail: did not get expected RPC00B" # Test without ERR_BIAS and ERR_RAND - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_md = copy.copy(src_md_max_precision) - del src_md['ERR_BIAS'] - del src_md['ERR_RAND'] - src_ds.SetMetadata(src_md, 'RPC') + del src_md["ERR_BIAS"] + del src_md["ERR_RAND"] + src_ds.SetMetadata(src_md, "RPC") - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) + gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) - assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' + assert gdal.GetLastErrorMsg() == "", "fail: did not expect warning" - if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: - f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') + if gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None: + f = gdal.VSIFOpenL("/vsimem/nitf_72.ntf.aux.xml", "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) - pytest.fail('fail: PAM file not expected') + pytest.fail("fail: PAM file not expected") - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - expected_RPC00B = '10000.000000.0034567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' - assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' + expected_RPC00B = "10000.000000.0034567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9" + assert RPC00B == expected_RPC00B, "fail: did not get expected RPC00B" # Test that direct RPC00B copy works - src_nitf_ds = gdal.Open('/vsimem/nitf_72.ntf') - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72_copy.ntf', src_nitf_ds) + src_nitf_ds = gdal.Open("/vsimem/nitf_72.ntf") + gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72_copy.ntf", src_nitf_ds) src_nitf_ds = None - ds = gdal.Open('/vsimem/nitf_72_copy.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72_copy.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' + assert RPC00B == expected_RPC00B, "fail: did not get expected RPC00B" - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72_copy.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72_copy.ntf") # Test that RPC00B = NO works - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds, options=['RPC00B=NO']) + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf_72.ntf", src_ds, options=["RPC00B=NO"] + ) - assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ - 'fail: PAM file was expected' + assert ( + gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None + ), "fail: PAM file was expected" - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') - assert RPC00B is None, 'fail: did not expect RPC00B' + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") + assert RPC00B is None, "fail: did not expect RPC00B" - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) # Test padding src_md = { - 'ERR_BIAS': '123', - 'ERR_RAND': '234', - 'LINE_OFF': '3456', - 'SAMP_OFF': '4567', - 'LAT_OFF': '8', - 'LONG_OFF': '17', - 'HEIGHT_OFF': '987', - 'LINE_SCALE': '98765', - 'SAMP_SCALE': '6789', - 'LAT_SCALE': '12', - 'LONG_SCALE': '109', - 'HEIGHT_SCALE': '34', - 'LINE_NUM_COEFF': '0 9.87e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'LINE_DEN_COEFF': '1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'SAMP_NUM_COEFF': '2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', - 'SAMP_DEN_COEFF': '3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', + "ERR_BIAS": "123", + "ERR_RAND": "234", + "LINE_OFF": "3456", + "SAMP_OFF": "4567", + "LAT_OFF": "8", + "LONG_OFF": "17", + "HEIGHT_OFF": "987", + "LINE_SCALE": "98765", + "SAMP_SCALE": "6789", + "LAT_SCALE": "12", + "LONG_SCALE": "109", + "HEIGHT_SCALE": "34", + "LINE_NUM_COEFF": "0 9.87e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "LINE_DEN_COEFF": "1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "SAMP_NUM_COEFF": "2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", + "SAMP_DEN_COEFF": "3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9", } - src_ds.SetMetadata(src_md, 'RPC') + src_ds.SetMetadata(src_md, "RPC") - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) + gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) - assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' + assert gdal.GetLastErrorMsg() == "", "fail: did not expect warning" - if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: - f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') + if gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None: + f = gdal.VSIFOpenL("/vsimem/nitf_72.ntf.aux.xml", "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) - pytest.fail('fail: PAM file not expected') + pytest.fail("fail: PAM file not expected") - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") compare_rpc(src_md, md) - expected_RPC00B = '10123.000234.0000345604567+08.0000+017.0000+098709876506789+12.0000+109.0000+0034+0.000000E+0+9.870000E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' - assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' + expected_RPC00B = "10123.000234.0000345604567+08.0000+017.0000+098709876506789+12.0000+109.0000+0034+0.000000E+0+9.870000E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9" + assert RPC00B == expected_RPC00B, "fail: did not get expected RPC00B" # Test loss of precision - for key in ('LINE_OFF', 'SAMP_OFF', 'LAT_OFF', 'LONG_OFF', 'HEIGHT_OFF', 'LINE_SCALE', 'SAMP_SCALE', 'LAT_SCALE', 'LONG_SCALE', 'HEIGHT_SCALE'): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + for key in ( + "LINE_OFF", + "SAMP_OFF", + "LAT_OFF", + "LONG_OFF", + "HEIGHT_OFF", + "LINE_SCALE", + "SAMP_SCALE", + "LAT_SCALE", + "LONG_SCALE", + "HEIGHT_SCALE", + ): + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_md = copy.copy(src_md_max_precision) - if src_md[key].find('.') < 0: - src_md[key] += '.1' + if src_md[key].find(".") < 0: + src_md[key] += ".1" else: - src_md[key] += '1' + src_md[key] += "1" - src_ds.SetMetadata(src_md, 'RPC') + src_ds.SetMetadata(src_md, "RPC") with gdaltest.error_handler(): - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) - assert ds is not None, 'fail: expected a dataset' + ds = gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) + assert ds is not None, "fail: expected a dataset" ds = None - assert gdal.GetLastErrorMsg() != '', 'fail: expected a warning' + assert gdal.GetLastErrorMsg() != "", "fail: expected a warning" - assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ - 'fail: PAM file was expected' - gdal.Unlink('/vsimem/nitf_72.ntf.aux.xml') + assert ( + gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None + ), "fail: PAM file was expected" + gdal.Unlink("/vsimem/nitf_72.ntf.aux.xml") - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") - assert RPC00B == expected_RPC00B_max_precision, \ - 'fail: did not get expected RPC00B' + assert ( + RPC00B == expected_RPC00B_max_precision + ), "fail: did not get expected RPC00B" # Test loss of precision on coefficient lines - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_md = copy.copy(src_md_max_precision) - src_md['LINE_NUM_COEFF'] = '0 9.876543e-10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9' - src_ds.SetMetadata(src_md, 'RPC') + src_md[ + "LINE_NUM_COEFF" + ] = "0 9.876543e-10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9" + src_ds.SetMetadata(src_md, "RPC") with gdaltest.error_handler(): - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) - assert ds is not None, 'fail: expected a dataset' + ds = gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) + assert ds is not None, "fail: expected a dataset" ds = None - assert gdal.GetLastErrorMsg() != '', 'fail: expected a warning' + assert gdal.GetLastErrorMsg() != "", "fail: expected a warning" - assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ - 'fail: PAM file was expected' - gdal.Unlink('/vsimem/nitf_72.ntf.aux.xml') + assert ( + gdal.VSIStatL("/vsimem/nitf_72.ntf.aux.xml") is not None + ), "fail: PAM file was expected" + gdal.Unlink("/vsimem/nitf_72.ntf.aux.xml") - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_72.ntf") - expected_RPC00B = '11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+0.000000E+0+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' - assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' + expected_RPC00B = "11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+0.000000E+0+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9" + assert RPC00B == expected_RPC00B, "fail: did not get expected RPC00B" # Test RPCTXT creation option with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds, options=['RPCTXT=YES']) + gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/nitf_72.ntf", src_ds, options=["RPCTXT=YES"] + ) - assert gdal.VSIStatL('/vsimem/nitf_72_RPC.TXT') is not None, \ - 'fail: rpc.txt file was expected' + assert ( + gdal.VSIStatL("/vsimem/nitf_72_RPC.TXT") is not None + ), "fail: rpc.txt file was expected" - ds = gdal.Open('/vsimem/nitf_72.ntf') - md = ds.GetMetadata('RPC') - RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') + ds = gdal.Open("/vsimem/nitf_72.ntf") + md = ds.GetMetadata("RPC") + RPC00B = ds.GetMetadataItem("RPC00B", "TRE") fl = ds.GetFileList() ds = None - assert '/vsimem/nitf_72_RPC.TXT' in fl, \ - 'fail: _RPC.TXT file not reported in file list' + assert ( + "/vsimem/nitf_72_RPC.TXT" in fl + ), "fail: _RPC.TXT file not reported in file list" # Check that we get full precision from the _RPC.TXT file compare_rpc(src_md, md) - assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' + assert RPC00B == expected_RPC00B, "fail: did not get expected RPC00B" # Test out of range - for key in ('LINE_OFF', 'SAMP_OFF', 'LAT_OFF', 'LONG_OFF', 'HEIGHT_OFF', 'LINE_SCALE', 'SAMP_SCALE', 'LAT_SCALE', 'LONG_SCALE', 'HEIGHT_SCALE'): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + for key in ( + "LINE_OFF", + "SAMP_OFF", + "LAT_OFF", + "LONG_OFF", + "HEIGHT_OFF", + "LINE_SCALE", + "SAMP_SCALE", + "LAT_SCALE", + "LONG_SCALE", + "HEIGHT_SCALE", + ): + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_md = copy.copy(src_md_max_precision) - if src_md[key].find('-') >= 0: - src_md[key] = '-1' + src_md[key][1:] + if src_md[key].find("-") >= 0: + src_md[key] = "-1" + src_md[key][1:] else: - src_md[key] = '1' + src_md[key] + src_md[key] = "1" + src_md[key] - src_ds.SetMetadata(src_md, 'RPC') + src_ds.SetMetadata(src_md, "RPC") with gdaltest.error_handler(): - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) - assert ds is None, ('fail: expected failure for %s' % key) + ds = gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) + assert ds is None, "fail: expected failure for %s" % key # Test out of rangeon coefficient lines - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) src_md = copy.copy(src_md_max_precision) - src_md['LINE_NUM_COEFF'] = '0 9.876543e10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9' - src_ds.SetMetadata(src_md, 'RPC') + src_md[ + "LINE_NUM_COEFF" + ] = "0 9.876543e10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9" + src_ds.SetMetadata(src_md, "RPC") with gdaltest.error_handler(): - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) - assert ds is None, 'fail: expected failure' + ds = gdal.GetDriverByName("NITF").CreateCopy("/vsimem/nitf_72.ntf", src_ds) + assert ds is None, "fail: expected failure" + ############################################################################### # Test case for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1525 @@ -2584,7 +3101,7 @@ def test_nitf_72(): def test_nitf_73(): with gdaltest.error_handler(): - gdal.Open('data/nitf/oss_fuzz_1525.ntf') + gdal.Open("data/nitf/oss_fuzz_1525.ntf") ############################################################################### @@ -2594,14 +3111,19 @@ def test_nitf_73(): def test_nitf_74(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_74.ntf', 1, 1, options=['FILE_TRE=CCINFA=0012AS 17ge:GENC:3:3-5:AUS00000']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_74.ntf", + 1, + 1, + options=["FILE_TRE=CCINFA=0012AS 17ge:GENC:3:3-5:AUS00000"], + ) ds = None - ds = gdal.Open('/vsimem/nitf_74.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_74.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_74.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_74.ntf") expected_data = """ @@ -2621,6 +3143,7 @@ def test_nitf_74(): """ assert data == expected_data + # - TABLE AG.2 case @@ -2687,18 +3210,26 @@ def test_nitf_75(): """ len_listing_AG1 = len(listing_AG1) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_75.ntf', 1, 1, - options=['TRE=CCINFA=0062RQ 17ge:GENC:3:3-5:PRI000002RQ 20as:ISO2:6:II-3:US-PR000002BM 17ge:GENC:3:3-5:MMR' + - ('%05d' % len_listing_AG1) + ' ' + - listing_AG1 + - '3MMR 19ge:ISO1:3:VII-7:MMR00000' + '2S1 19ge:GENC:3:3-alt:SCT000002YYC16gg:1059:2:ed9:3E00000']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_75.ntf", + 1, + 1, + options=[ + "TRE=CCINFA=0062RQ 17ge:GENC:3:3-5:PRI000002RQ 20as:ISO2:6:II-3:US-PR000002BM 17ge:GENC:3:3-5:MMR" + + ("%05d" % len_listing_AG1) + + " " + + listing_AG1 + + "3MMR 19ge:ISO1:3:VII-7:MMR00000" + + "2S1 19ge:GENC:3:3-alt:SCT000002YYC16gg:1059:2:ed9:3E00000" + ], + ) ds = None - ds = gdal.Open('/vsimem/nitf_75.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_75.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_75.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_75.ntf") expected_data = """ @@ -2757,23 +3288,35 @@ def test_nitf_75(): -""" % (len_listing_AG1, gdal.EscapeString(listing_AG1, gdal.CPLES_XML)) +""" % ( + len_listing_AG1, + gdal.EscapeString(listing_AG1, gdal.CPLES_XML), + ) assert data == expected_data + ############################################################################### # Test parsing MATESA TRE (STDI-0002 App AK) + def test_nitf_76(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_76.ntf', 1, 1, options=['FILE_TRE=MATESA=EO-1_HYPERION FTITLE 006307APR2005_Hyperion_331406N0442000E_SWIR172_001_L1R-01B-BIB-GLAS0005RADIOMTRC_CALIB 0001EO-1_HYPERION FILENAME 0020HypGain_revC.dat.svfPARENT 0001EO-1_HYPERION FILENAME 0032EO12005097_020D020C_r1_WPS_01.L0PRE_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020A0209_r1_WPS_01.L0POST_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020F020E_r1_WPS_01.L0PARENT 0003EO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.L1REO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.AUXEO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.MET']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_76.ntf", + 1, + 1, + options=[ + "FILE_TRE=MATESA=EO-1_HYPERION FTITLE 006307APR2005_Hyperion_331406N0442000E_SWIR172_001_L1R-01B-BIB-GLAS0005RADIOMTRC_CALIB 0001EO-1_HYPERION FILENAME 0020HypGain_revC.dat.svfPARENT 0001EO-1_HYPERION FILENAME 0032EO12005097_020D020C_r1_WPS_01.L0PRE_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020A0209_r1_WPS_01.L0POST_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020F020E_r1_WPS_01.L0PARENT 0003EO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.L1REO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.AUXEO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.MET" + ], + ) ds = None - ds = gdal.Open('/vsimem/nitf_76.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_76.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_76.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_76.ntf") expected_data = """ @@ -2861,19 +3404,28 @@ def test_nitf_76(): """ assert data == expected_data + ############################################################################### # Test parsing MATESA TRE (STDI-0002 App AK) + def test_nitf_77(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_77.ntf', 1, 1, options=['TRE=GRDPSB=01+000027.81PIX_LATLON0000000000010000000000010000000000000000000000']) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_77.ntf", + 1, + 1, + options=[ + "TRE=GRDPSB=01+000027.81PIX_LATLON0000000000010000000000010000000000000000000000" + ], + ) ds = None - ds = gdal.Open('/vsimem/nitf_77.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_77.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_77.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_77.ntf") expected_data = """ @@ -2893,25 +3445,38 @@ def test_nitf_77(): """ assert data == expected_data + ############################################################################### # Test parsing BANDSB TRE (STDI-0002 App X) + def test_nitf_78(): - float_data = "40066666" # == struct.pack(">f", 2.1).hex() - bit_mask = "89800000" # Set bits 31, 27, 24, 23 + float_data = "40066666" # == struct.pack(">f", 2.1).hex() + bit_mask = "89800000" # Set bits 31, 27, 24, 23 - tre_data = "TRE=HEX/BANDSB=" + hex_string("00001RADIANCE S") + float_data*2 + \ - hex_string("0030.00M0030.00M-------M-------M ") + \ - bit_mask + hex_string("DETECTOR ") + float_data + hex_string("U00.851920.01105") + tre_data = ( + "TRE=HEX/BANDSB=" + + hex_string("00001RADIANCE S") + + float_data * 2 + + hex_string( + "0030.00M0030.00M-------M-------M " + ) + + bit_mask + + hex_string("DETECTOR ") + + float_data + + hex_string("U00.851920.01105") + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_78.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_78.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_78.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_78.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_78.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_78.ntf") expected_data = """ @@ -2945,21 +3510,27 @@ def test_nitf_78(): """ assert data == expected_data + ############################################################################### # Test parsing ACCHZB TRE (STDI-0002-1-v5.0 Appendix P) + def test_nitf_79(): - tre_data = "TRE=ACCHZB=01M 00129M 00129004+044.4130499724+33.69234401034+044.4945572008" \ - "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" + tre_data = ( + "TRE=ACCHZB=01M 00129M 00129004+044.4130499724+33.69234401034+044.4945572008" + "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_79.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_79.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_79.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_79.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_79.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_79.ntf") expected_data = """ @@ -2996,21 +3567,27 @@ def test_nitf_79(): """ assert data == expected_data + ############################################################################### # Test parsing ACCVTB TRE (STDI-0002-1-v5.0 Appendix P) + def test_nitf_80(): - tre_data = "TRE=ACCVTB=01M 00095M 00095004+044.4130499724+33.69234401034+044.4945572008" \ - "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" + tre_data = ( + "TRE=ACCVTB=01M 00095M 00095004+044.4130499724+33.69234401034+044.4945572008" + "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_80.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_80.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_80.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_80.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_80.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_80.ntf") expected_data = """ @@ -3047,19 +3624,23 @@ def test_nitf_80(): """ assert data == expected_data + ############################################################################### # Test parsing MSTGTA TRE (STDI-0002-1-v5.0 App E) + def test_nitf_81(): tre_data = "TRE=MSTGTA=012340123456789AB0123456789ABCDE0120123456789AB0123456789AB000123401234560123450TGT_LOC= " - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_81.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_81.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_81.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_81.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_81.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_81.ntf") expected_data = """ @@ -3081,20 +3662,26 @@ def test_nitf_81(): """ assert data == expected_data + ############################################################################### # Test parsing PIATGB TRE (STDI-0002-1-v5.0 App C) + def test_nitf_82(): - tre_data = "TRE=PIATGB=0123456789ABCDE0123456789ABCDE01012340123456789ABCDE012" \ - "TGTNAME= 012+01.234567-012.345678" - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_82.ntf', 1, 1, options=[tre_data]) + tre_data = ( + "TRE=PIATGB=0123456789ABCDE0123456789ABCDE01012340123456789ABCDE012" + "TGTNAME= 012+01.234567-012.345678" + ) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_82.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_82.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_82.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_82.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_82.ntf") expected_data = """ @@ -3113,21 +3700,27 @@ def test_nitf_82(): """ assert data == expected_data + ############################################################################### # Test parsing PIXQLA TRE (STDI-0002-1-v5.0 App AA) + def test_nitf_83(): - tre_data = "TRE=PIXQLA=00100200031Dead " \ - "Saturated Bad " + tre_data = ( + "TRE=PIXQLA=00100200031Dead " + "Saturated Bad " + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_83.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_83.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_83.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_83.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_83.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_83.ntf") expected_data = """ @@ -3155,21 +3748,27 @@ def test_nitf_83(): """ assert data == expected_data + ############################################################################### # Test parsing PIXMTA TRE (STDI-0002-1-v5.0 App AJ) + def test_nitf_84(): - tre_data = "TRE=PIXMTA=0010020.00000000E+000.00000000E+001.00000000E+003.35200000E+03F00001P" \ - "BAND_WAVELENGTH micron D00000" + tre_data = ( + "TRE=PIXMTA=0010020.00000000E+000.00000000E+001.00000000E+003.35200000E+03F00001P" + "BAND_WAVELENGTH micron D00000" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_84.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_84.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_84.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_84.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_84.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_84.ntf") expected_data = """ @@ -3199,41 +3798,54 @@ def test_nitf_84(): """ assert data == expected_data + ############################################################################### # Test creating a TRE with a hexadecimal string + def test_nitf_85(): - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_85.ntf', 1, 1, options=["TRE=HEX/TSTTRE=414243"]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_85.ntf", 1, 1, options=["TRE=HEX/TSTTRE=414243"] + ) ds = None - ds = gdal.Open('/vsimem/nitf_85.ntf') - data = ds.GetMetadata('TRE')['TSTTRE'] + ds = gdal.Open("/vsimem/nitf_85.ntf") + data = ds.GetMetadata("TRE")["TSTTRE"] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_85.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_85.ntf") expected_data = "ABC" assert data == expected_data + ############################################################################### # Test parsing CSEXRB TRE (STDI-0002-1-v5.0 App AH) + def test_nitf_86(): - tre_data = "TRE=HEX/CSEXRB=" + hex_string("824ecf8e-1041-4cce-9edb-bc92d88624ca0047308e4b1-80e4-4777-b70f-f6e4a6881de9") + \ - hex_string("17261ee9-2175-4ff2-86ad-dddda1f8270ccf306a0b-c47c-44fa-af63-463549f6bf98fd99a346-770e-4048-94d8-5a8b2e832b32") + \ - hex_string("EO-1 HYPERNHYPERNF+03819809.03+03731961.77+03475785.73000000000120201012145900.000000000") + \ - "0100000000000000" + "05" + "0000000100000001" "FFFFFFFFFF" + \ - hex_string(" 1181.1 65535000335200256250.000") + \ - hex_string(" 0000132.812+54.861 9991000000") + tre_data = "TRE=HEX/CSEXRB=" + hex_string( + "824ecf8e-1041-4cce-9edb-bc92d88624ca0047308e4b1-80e4-4777-b70f-f6e4a6881de9" + ) + hex_string( + "17261ee9-2175-4ff2-86ad-dddda1f8270ccf306a0b-c47c-44fa-af63-463549f6bf98fd99a346-770e-4048-94d8-5a8b2e832b32" + ) + hex_string( + "EO-1 HYPERNHYPERNF+03819809.03+03731961.77+03475785.73000000000120201012145900.000000000" + ) + "0100000000000000" + "05" + "0000000100000001" "FFFFFFFFFF" + hex_string( + " 1181.1 65535000335200256250.000" + ) + hex_string( + " 0000132.812+54.861 9991000000" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_86.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_86.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_86.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_86.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_86.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_86.ntf") expected_data = """ @@ -3304,30 +3916,49 @@ def test_nitf_86(): """ assert data == expected_data + ############################################################################### # Test parsing ILLUMB TRE (STDI-0002-1-v5.0 App AL) + def test_nitf_87(): - mu = "B5" # \mu per ISO-8859-1 + mu = "B5" # \mu per ISO-8859-1 bit_mask = "7A0000" - tre_data = "TRE=HEX/ILLUMB=" + hex_string("0001") + \ - mu + hex_string("m 8.5192000000E-01") + \ - hex_string("2.5770800000E+00001NUM_BANDS=1 because ILLUMB has no band-dependent content ") + \ - hex_string("World Geodetic System 1984 ") + \ - hex_string("WGE World Geodetic System 1984 ") + \ - hex_string("WE Geodetic ") + \ - hex_string("GEOD") + \ - bit_mask + hex_string("00120050407072410+33.234974+044.333405+27.8100000E+0132.8+54.9167.5+52.5") + \ - hex_string("-163.4004099.2+84.0") - - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_87.ntf', 1, 1, options=[tre_data]) - ds = None - - ds = gdal.Open('/vsimem/nitf_87.ntf') - data = ds.GetMetadata('xml:TRE')[0] - ds = None - - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_87.ntf') + tre_data = ( + "TRE=HEX/ILLUMB=" + + hex_string("0001") + + mu + + hex_string("m 8.5192000000E-01") + + hex_string( + "2.5770800000E+00001NUM_BANDS=1 because ILLUMB has no band-dependent content " + ) + + hex_string( + "World Geodetic System 1984 " + ) + + hex_string( + "WGE World Geodetic System 1984 " + ) + + hex_string( + "WE Geodetic " + ) + + hex_string("GEOD") + + bit_mask + + hex_string( + "00120050407072410+33.234974+044.333405+27.8100000E+0132.8+54.9167.5+52.5" + ) + + hex_string("-163.4004099.2+84.0") + ) + + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_87.ntf", 1, 1, options=[tre_data] + ) + ds = None + + ds = gdal.Open("/vsimem/nitf_87.ntf") + data = ds.GetMetadata("xml:TRE")[0] + ds = None + + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_87.ntf") expected_data = """ @@ -3378,21 +4009,27 @@ def test_nitf_87(): """ assert data == expected_data + ############################################################################### # Test parsing CSWRPB TRE (STDI-0002-1-v5.0 App AH) + def test_nitf_88(): - tre_data = "TRE=CSWRPB=1F199.9999999900000010000002000000300000040000005000000600000070000008" \ - "1111-9.99999999999999E-99+9.99999999999999E+9900000" + tre_data = ( + "TRE=CSWRPB=1F199.9999999900000010000002000000300000040000005000000600000070000008" + "1111-9.99999999999999E-99+9.99999999999999E+9900000" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_88.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_88.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_88.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_88.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_88.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_88.ntf") expected_data = """ @@ -3440,20 +4077,24 @@ def test_nitf_88(): """ assert data == expected_data + ############################################################################### # Test parsing CSRLSB TRE (STDI-0002-1-v5.0 App AH) + def test_nitf_89(): tre_data = "TRE=CSRLSB=0101+11111111.11-22222222.22+33333333.33-44444444.44" - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_89.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_89.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_89.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_89.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_89.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_89.ntf") expected_data = """ @@ -3477,21 +4118,29 @@ def test_nitf_89(): assert data == expected_data + ############################################################################### # Test parsing SECURA TRE (STDI-0002-1-v5.0 App AI) + def test_nitf_90(): - tre_data = "FILE_TRE=SECURA=20201020142500NITF02.10" + " "*207 + "ARH.XML 00068" + \ - " " + tre_data = ( + "FILE_TRE=SECURA=20201020142500NITF02.10" + + " " * 207 + + "ARH.XML 00068" + + ' ' + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_90.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_90.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_90.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_90.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_90.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_90.ntf") expected_data = """ @@ -3508,23 +4157,29 @@ def test_nitf_90(): assert data == expected_data + ############################################################################### # Test parsing SNSPSB TRE (STDI-0002-1-v5.0 App P) + def test_nitf_91(): - tre_data = "TRE=SNSPSB=010001111112222233333M 000001000001000001000001GSL " + \ - "PLTFM INS MOD PRL SID ACT DEG0000001 +111111.11-222222.22" + \ - " meters 000000000000000000000011111111111111111111112222222222222222222222001" + \ - "API Imeters 0123456789" + tre_data = ( + "TRE=SNSPSB=010001111112222233333M 000001000001000001000001GSL " + + "PLTFM INS MOD PRL SID ACT DEG0000001 +111111.11-222222.22" + + " meters 000000000000000000000011111111111111111111112222222222222222222222001" + + "API Imeters 0123456789" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_91.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_91.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_91.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_91.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_91.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_91.ntf") expected_data = """ @@ -3582,24 +4237,30 @@ def test_nitf_91(): assert data == expected_data + ############################################################################### # Test parsing RSMAPB TRE (STDI-0002-1-v5.0 App U) + def test_nitf_RSMAPB(): - tre_data = "TRE=RSMAPB=iid " + \ - "edition tid 01IG+9.99999999999999E+99" + \ - "+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99" + \ - "Y01011230001+9.99999999999999E+99+9.99999999999999E+99" + tre_data = ( + "TRE=RSMAPB=iid " + + "edition tid 01IG+9.99999999999999E+99" + + "+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99+9.99999999999999E+99" + + "Y01011230001+9.99999999999999E+99+9.99999999999999E+99" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_RSMAPB.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_RSMAPB.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_RSMAPB.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_RSMAPB.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_RSMAPB.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_RSMAPB.ntf") expected_data = """ @@ -3647,23 +4308,32 @@ def test_nitf_RSMAPB(): assert data == expected_data + ############################################################################### # Test parsing RSMDCB TRE (STDI-0002-1-v5.0 App U) + def test_nitf_RSMDCB(): - tre_data = "TRE=RSMDCB=iid " + \ - "edition tid 01001iidi" + " "*76 + \ - "01Y01GN" + "+9.99999999999999E+99"*6 + "N01ABCD+9.99999999999999E+99" + tre_data = ( + "TRE=RSMDCB=iid " + + "edition tid 01001iidi" + + " " * 76 + + "01Y01GN" + + "+9.99999999999999E+99" * 6 + + "N01ABCD+9.99999999999999E+99" + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_RSMDCB.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_RSMDCB.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_RSMDCB.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_RSMDCB.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_RSMDCB.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_RSMDCB.ntf") expected_data = """ @@ -3714,24 +4384,38 @@ def test_nitf_RSMDCB(): assert data == expected_data + ############################################################################### # Test parsing RSMECB TRE (STDI-0002-1-v5.0 App U) + def test_nitf_RSMECB(): - tre_data = "TRE=RSMECB=iid " + \ - "edition tid " + \ - "YY01012020110201GN" + "+9.99999999999999E+99"*6 + "N01ABCD02" + "+9.99999999999999E+99"*3 + \ - "1N2" + "+9.99999999999999E+99"*8 + "N2" + "+9.99999999999999E+99"*4 + "2" + "+9.99999999999999E+99"*4 + tre_data = ( + "TRE=RSMECB=iid " + + "edition tid " + + "YY01012020110201GN" + + "+9.99999999999999E+99" * 6 + + "N01ABCD02" + + "+9.99999999999999E+99" * 3 + + "1N2" + + "+9.99999999999999E+99" * 8 + + "N2" + + "+9.99999999999999E+99" * 4 + + "2" + + "+9.99999999999999E+99" * 4 + ) - ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_RSMECB.ntf', 1, 1, options=[tre_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_RSMECB.ntf", 1, 1, options=[tre_data] + ) ds = None - ds = gdal.Open('/vsimem/nitf_RSMECB.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("/vsimem/nitf_RSMECB.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_RSMECB.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_RSMECB.ntf") expected_data = """ @@ -3829,13 +4513,20 @@ def test_nitf_RSMECB(): assert data == expected_data + ############################################################################### # Test creation and reading of Data Extension Segments (DES) + def test_nitf_des(): - des_data = "02U" + " "*166 + r'0004ABCD1234567\0890' + des_data = "02U" + " " * 166 + r"0004ABCD1234567\0890" - ds = gdal.GetDriverByName("NITF").Create("/vsimem/nitf_DES.ntf", 1, 1, options=["DES=DES1=" + des_data, "DES=DES2=" + des_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_DES.ntf", + 1, + 1, + options=["DES=DES1=" + des_data, "DES=DES2=" + des_data], + ) ds = None # DESDATA portion will be Base64 encoded on output @@ -3844,7 +4535,7 @@ def test_nitf_des(): data = ds.GetMetadata("xml:DES")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_DES.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_DES.ntf") expected_data = """ @@ -3896,44 +4587,60 @@ def test_nitf_des(): assert data == expected_data + ############################################################################### # Test creation and reading of Data Extension Segments (DES) + def test_nitf_des_CSSHPA(): - ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/tmp.shp') - lyr = ds.CreateLayer('tmp', geom_type = ogr.wkbPolygon, options = ['DBF_DATE_LAST_UPDATE=2021-01-01']) + ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("/vsimem/tmp.shp") + lyr = ds.CreateLayer( + "tmp", geom_type=ogr.wkbPolygon, options=["DBF_DATE_LAST_UPDATE=2021-01-01"] + ) lyr.CreateField(ogr.FieldDefn("ID", ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField("ID", 1) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((2 49,2 50,3 50,3 49,2 49))')) + f.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("POLYGON((2 49,2 50,3 50,3 49,2 49))") + ) lyr.CreateFeature(f) ds = None files = {} - for ext in ('shp', 'shx', 'dbf'): - f = gdal.VSIFOpenL('/vsimem/tmp.' + ext, 'rb') + for ext in ("shp", "shx", "dbf"): + f = gdal.VSIFOpenL("/vsimem/tmp." + ext, "rb") files[ext] = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) - ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/tmp.shp') + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("/vsimem/tmp.shp") shp_offset = 0 - shx_offset = shp_offset + len(files['shp']) - dbf_offset = shx_offset + len(files['shx']) - shp_shx_dbf = files['shp'] + files['shx'] + files['dbf'] - - des_data = b"02U" + b" "*166 + ('0080CLOUD_SHAPES POLYGON SOURCE123456789ABCSHP%06dSHX%06dDBF%06d' % (shp_offset, shx_offset, dbf_offset)).encode('ascii') + shp_shx_dbf + shx_offset = shp_offset + len(files["shp"]) + dbf_offset = shx_offset + len(files["shx"]) + shp_shx_dbf = files["shp"] + files["shx"] + files["dbf"] + + des_data = ( + b"02U" + + b" " * 166 + + ( + "0080CLOUD_SHAPES POLYGON SOURCE123456789ABCSHP%06dSHX%06dDBF%06d" + % (shp_offset, shx_offset, dbf_offset) + ).encode("ascii") + + shp_shx_dbf + ) escaped_data = gdal.EscapeString(des_data, gdal.CPLES_BackslashQuotable) - ds = gdal.GetDriverByName("NITF").Create("/vsimem/nitf_DES.ntf", 1, 1, options=[b"DES=CSSHPA DES=" + escaped_data]) + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/nitf_DES.ntf", 1, 1, options=[b"DES=CSSHPA DES=" + escaped_data] + ) ds = None ds = gdal.Open("/vsimem/nitf_DES.ntf") data = ds.GetMetadata("xml:DES")[0] ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_DES.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/nitf_DES.ntf") expected_data = """ @@ -3971,43 +4678,57 @@ def test_nitf_des_CSSHPA(): -""" % base64.b64encode(shp_shx_dbf).decode('ascii') +""" % base64.b64encode( + shp_shx_dbf + ).decode( + "ascii" + ) assert data == expected_data + ############################################################################### # Test reading/writing headers in ISO-8859-1 encoding def test_nitf_header_encoding(): # mu character encoded in UTF-8 - test_char = b'\xc2\xb5'.decode("utf-8") - ds = gdal.GetDriverByName('NITF').Create('/vsimem/header_encoding.ntf', 1, 1, - options=["FTITLE=" + test_char, "IID2=" + test_char, "ICOM=" + test_char*80*9]) - ds = None - - ds = gdal.Open('/vsimem/header_encoding.ntf') + test_char = b"\xc2\xb5".decode("utf-8") + ds = gdal.GetDriverByName("NITF").Create( + "/vsimem/header_encoding.ntf", + 1, + 1, + options=[ + "FTITLE=" + test_char, + "IID2=" + test_char, + "ICOM=" + test_char * 80 * 9, + ], + ) + ds = None + + ds = gdal.Open("/vsimem/header_encoding.ntf") md_binary = ds.GetMetadata("NITF_METADATA") md = ds.GetMetadata() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/header_encoding.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/header_encoding.ntf") file_header = md_binary["NITFFileHeader"].split()[1] file_header = base64.b64decode(file_header) # mu character encoded in ISO-8859-1 located at FTITLE position - assert file_header[39:40] == b'\xb5' + assert file_header[39:40] == b"\xb5" image_header = md_binary["NITFImageSubheader"].split()[1] image_header = base64.b64decode(image_header) # mu character encoded in ISO-8859-1 located at IID2 position and ICOM position - assert image_header[43:44] == b'\xb5' - assert image_header[373:1093] == b'\xb5'*80*9 + assert image_header[43:44] == b"\xb5" + assert image_header[373:1093] == b"\xb5" * 80 * 9 # mu character recoded to UTF-8 in string metadata assert md["NITF_FTITLE"] == test_char assert md["NITF_IID2"] == test_char - assert md["NITF_IMAGE_COMMENTS"] == test_char*80*9 + assert md["NITF_IMAGE_COMMENTS"] == test_char * 80 * 9 + ############################################################################### # Test reading C4 compressed file @@ -4015,18 +4736,19 @@ def test_nitf_header_encoding(): def test_nitf_read_C4(): - ds = gdal.Open('data/nitf/RPFTOC01.ON2') + ds = gdal.Open("data/nitf/RPFTOC01.ON2") cs = ds.GetRasterBand(1).Checksum() assert cs == 53599 + ############################################################################### # Test reading a file with a SENSRB TRE def test_nitf_SENSRB(): - ds = gdal.Open('data/nitf/SENSRB_TRE.ntf') - data = ds.GetMetadata('xml:TRE')[0] + ds = gdal.Open("data/nitf/SENSRB_TRE.ntf") + data = ds.GetMetadata("xml:TRE")[0] ds = None expected_data = """ @@ -4133,48 +4855,56 @@ def test_nitf_SENSRB(): assert data == expected_data, data + ############################################################################### # Verify we can read UDID metadata + def test_nitf_valid_udid(): - ds = gdal.Open('data/nitf/valid_udid.ntf') + ds = gdal.Open("data/nitf/valid_udid.ntf") md = ds.GetMetadata() - assert md['NITF_CSDIDA_YEAR'] == '2019', \ - 'UDID CSDIDA metadata has unexpected value.' + assert ( + md["NITF_CSDIDA_YEAR"] == "2019" + ), "UDID CSDIDA metadata has unexpected value." + + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + ), "BLOCKA metadata has unexpected value." - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01', \ - 'BLOCKA metadata has unexpected value.' ############################################################################### # Verify that bad UDID metadata doesn't prevent reading IXSHD metadata + def test_nitf_invalid_udid(): - ds = gdal.Open('data/nitf/invalid_udid.ntf') + ds = gdal.Open("data/nitf/invalid_udid.ntf") md = ds.GetMetadata() - assert 'NITF_CSDIDA_YEAR' not in md, \ - 'Unexpected parings of UDID CSDIDA metadata.' + assert "NITF_CSDIDA_YEAR" not in md, "Unexpected parings of UDID CSDIDA metadata." + + assert ( + md["NITF_BLOCKA_BLOCK_INSTANCE_01"] == "01" + ), "BLOCKA metadata has unexpected value." - assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01', \ - 'BLOCKA metadata has unexpected value.' ############################################################################### # Verify ISUBCAT is present when non-empty. + def test_nitf_isubcat_populated(): # Check a dataset with IQ complex data. - ds = gdal.Open('data/nitf/sar_sicd.ntf') + ds = gdal.Open("data/nitf/sar_sicd.ntf") expected = ["I", "Q"] for b in range(ds.RasterCount): md = ds.GetRasterBand(b + 1).GetMetadata() assert md["NITF_ISUBCAT"] == expected[b] # Check a dataset with an empty ISUBCAT. - ds = gdal.Open('data/nitf/rgb.ntf') + ds = gdal.Open("data/nitf/rgb.ntf") for b in range(ds.RasterCount): md = ds.GetRasterBand(b + 1).GetMetadata() assert "NITF_ISUBCAT" not in md @@ -4189,114 +4919,123 @@ def test_nitf_create_too_large_file(): # Test 1e10 byte limit for a single image gdal.ErrorReset() with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').Create('/vsimem/out.ntf', int(1e5), int(1e5)) - assert gdal.GetLastErrorMsg() != '' + gdal.GetDriverByName("NITF").Create("/vsimem/out.ntf", int(1e5), int(1e5)) + assert gdal.GetLastErrorMsg() != "" # Test 1e12 byte limit for while file gdal.ErrorReset() with gdaltest.error_handler(): - gdal.GetDriverByName('NITF').Create('/vsimem/out.ntf', int(1e5), int(1e5) // 2, - options = ['NUMI=200', 'WRITE_ALL_IMAGES=YES']) - assert gdal.GetLastErrorMsg() != '' + gdal.GetDriverByName("NITF").Create( + "/vsimem/out.ntf", + int(1e5), + int(1e5) // 2, + options=["NUMI=200", "WRITE_ALL_IMAGES=YES"], + ) + assert gdal.GetLastErrorMsg() != "" - gdal.Unlink('/vsimem/out.ntf') + gdal.Unlink("/vsimem/out.ntf") ############################################################################### # Test creating file with multiple image segments + def test_nitf_create_two_images_final_with_C3_compression(): - gdal.Unlink('/vsimem/out.ntf') + gdal.Unlink("/vsimem/out.ntf") - src_ds = gdal.Open('data/rgbsmall.tif') + src_ds = gdal.Open("data/rgbsmall.tif") # Write first image segment, reserve space for a second one and a DES - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/out.ntf', src_ds, - options=['NUMI=2', - 'NUMDES=1']) + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/out.ntf", src_ds, options=["NUMI=2", "NUMDES=1"] + ) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None # Write second and final image segment and DES - des_data = "02U" + " "*166 + r'0004ABCD1234567\0890' - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/out.ntf', src_ds, - options=['APPEND_SUBDATASET=YES', - 'IC=C3', - 'IDLVL=2', - "DES=DES1=" + des_data]) + des_data = "02U" + " " * 166 + r"0004ABCD1234567\0890" + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/out.ntf", + src_ds, + options=["APPEND_SUBDATASET=YES", "IC=C3", "IDLVL=2", "DES=DES1=" + des_data], + ) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - ds = gdal.Open('/vsimem/out.ntf') + ds = gdal.Open("/vsimem/out.ntf") assert ds.GetMetadata("xml:DES") is not None assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() - ds = gdal.Open('NITF_IM:1:/vsimem/out.ntf') + ds = gdal.Open("NITF_IM:1:/vsimem/out.ntf") (exp_mean, exp_stddev) = (65.9532, 46.9026375565) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'did not get expected mean or standard dev.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "did not get expected mean or standard dev." ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/out.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/out.ntf") ############################################################################### # Test creating file with multiple image segments + def test_nitf_create_three_images_final_uncompressed(): - gdal.Unlink('/vsimem/out.ntf') + gdal.Unlink("/vsimem/out.ntf") - src_ds = gdal.Open('data/rgbsmall.tif') + src_ds = gdal.Open("data/rgbsmall.tif") # Write first image segment, reserve space for two other ones and a DES - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/out.ntf', src_ds, - options=['NUMI=3', - 'NUMDES=1']) + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/out.ntf", src_ds, options=["NUMI=3", "NUMDES=1"] + ) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None # Write second image segment - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/out.ntf', src_ds, - options=['APPEND_SUBDATASET=YES', - 'IC=C3', - 'IDLVL=2']) + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/out.ntf", src_ds, options=["APPEND_SUBDATASET=YES", "IC=C3", "IDLVL=2"] + ) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None # Write third and final image segment and DES - des_data = "02U" + " "*166 + r'0004ABCD1234567\0890' - ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/out.ntf', src_ds, - options=['APPEND_SUBDATASET=YES', - 'IDLVL=3', - "DES=DES1=" + des_data]) + des_data = "02U" + " " * 166 + r"0004ABCD1234567\0890" + ds = gdal.GetDriverByName("NITF").CreateCopy( + "/vsimem/out.ntf", + src_ds, + options=["APPEND_SUBDATASET=YES", "IDLVL=3", "DES=DES1=" + des_data], + ) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None - ds = gdal.Open('/vsimem/out.ntf') + ds = gdal.Open("/vsimem/out.ntf") assert ds.GetMetadata("xml:DES") is not None assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() - ds = gdal.Open('NITF_IM:1:/vsimem/out.ntf') + ds = gdal.Open("NITF_IM:1:/vsimem/out.ntf") (exp_mean, exp_stddev) = (65.9532, 46.9026375565) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() - assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ - 'did not get expected mean or standard dev.' + assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx( + stddev, abs=0.1 + ), "did not get expected mean or standard dev." - ds = gdal.Open('NITF_IM:2:/vsimem/out.ntf') + ds = gdal.Open("NITF_IM:2:/vsimem/out.ntf") assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('NITF').Delete('/vsimem/out.ntf') + gdal.GetDriverByName("NITF").Delete("/vsimem/out.ntf") + ############################################################################### # Test writing/reading PAM metadata @@ -4304,29 +5043,29 @@ def test_nitf_create_three_images_final_uncompressed(): def test_nitf_pam_metadata_single_image(): - src_ds = gdal.Open('data/rgbsmall.tif') - out_filename = 'tmp/test_nitf_pam_metadata_single_image.ntf' + src_ds = gdal.Open("data/rgbsmall.tif") + out_filename = "tmp/test_nitf_pam_metadata_single_image.ntf" gdal.ErrorReset() - gdal.GetDriverByName('NITF').CreateCopy(out_filename, src_ds) + gdal.GetDriverByName("NITF").CreateCopy(out_filename, src_ds) assert gdal.GetLastErrorType() == 0 ds = None - assert os.path.exists(out_filename + '.aux.xml') - pam = open(out_filename + '.aux.xml', 'rb').read() - assert b' + open(out_filename + ".aux.xml", "wb").write( + b""" @@ -4334,17 +5073,19 @@ def test_nitf_pam_metadata_single_image(): -""") +""" + ) ds = gdal.Open(out_filename) - assert ds.GetMetadataItem('FOO') == 'BAR' + assert ds.GetMetadataItem("FOO") == "BAR" ds = None - ds = gdal.Open('NITF_IM:0:' + out_filename) - assert ds.GetMetadataItem('FOO') == 'BAR' + ds = gdal.Open("NITF_IM:0:" + out_filename) + assert ds.GetMetadataItem("FOO") == "BAR" ds = None - gdal.GetDriverByName('NITF').Delete(out_filename) + gdal.GetDriverByName("NITF").Delete(out_filename) + ############################################################################### # Test writing/reading PAM metadata @@ -4352,32 +5093,35 @@ def test_nitf_pam_metadata_single_image(): def test_nitf_pam_metadata_several_images(): - src_ds = gdal.Open('data/rgbsmall.tif') - out_filename = 'tmp/test_nitf_pam_metadata_several_images.ntf' - gdal.GetDriverByName('NITF').CreateCopy(out_filename, src_ds, options = ['NUMI=2']) - src_ds2 = gdal.GetDriverByName('MEM').Create('', 1, 1) + src_ds = gdal.Open("data/rgbsmall.tif") + out_filename = "tmp/test_nitf_pam_metadata_several_images.ntf" + gdal.GetDriverByName("NITF").CreateCopy(out_filename, src_ds, options=["NUMI=2"]) + src_ds2 = gdal.GetDriverByName("MEM").Create("", 1, 1) src_ds2.SetGeoTransform(src_ds.GetGeoTransform()) src_ds2.SetSpatialRef(src_ds.GetSpatialRef()) - gdal.GetDriverByName('NITF').CreateCopy(out_filename, src_ds2, options = ['APPEND_SUBDATASET=YES']) + gdal.GetDriverByName("NITF").CreateCopy( + out_filename, src_ds2, options=["APPEND_SUBDATASET=YES"] + ) ds = None - assert os.path.exists(out_filename + '.aux.xml') - pam = open(out_filename + '.aux.xml', 'rb').read() - assert b'= 2607 and stats[2] <= 2608 ds = None try: - os.remove('tmp/cache/U_4020h.ntf.aux.xml') + os.remove("tmp/cache/U_4020h.ntf.aux.xml") except OSError: pass @@ -4698,7 +5523,10 @@ def test_nitf_online_14(not_jpeg_9b): def nitf_online_15(driver_to_test, expected_cs=1054): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/p0_01/p0_01a.ntf', 'p0_01a.ntf'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/p0_01/p0_01a.ntf", + "p0_01a.ntf", + ): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) @@ -4709,13 +5537,13 @@ def nitf_online_15(driver_to_test, expected_cs=1054): # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) - ds = gdal.Open('tmp/cache/p0_01a.ntf') + ds = gdal.Open("tmp/cache/p0_01a.ntf") if ds.GetRasterBand(1).Checksum() == expected_cs: - ret = 'success' + ret = "success" else: print(ds.GetRasterBand(1).Checksum()) - gdaltest.post_reason('Did not get expected checksums') - ret = 'fail' + gdaltest.post_reason("Did not get expected checksums") + ret = "fail" gdaltest.reregister_all_jpeg2000_drivers() @@ -4723,23 +5551,24 @@ def nitf_online_15(driver_to_test, expected_cs=1054): def test_nitf_online_15_jp2ecw(): - return nitf_online_15('JP2ECW') + return nitf_online_15("JP2ECW") def test_nitf_online_15_jp2mrsid(): - return nitf_online_15('JP2MrSID') + return nitf_online_15("JP2MrSID") def test_nitf_online_15_jp2kak(): - return nitf_online_15('JP2KAK') + return nitf_online_15("JP2KAK") def test_nitf_online_15_jasper(): - return nitf_online_15('JPEG2000') + return nitf_online_15("JPEG2000") def test_nitf_online_15_openjpeg(): - return nitf_online_15('JP2OpenJPEG') + return nitf_online_15("JP2OpenJPEG") + ############################################################################### # Test opening a IC=C8 NITF file which has 256-entry palette/LUT in both JP2 Header and image Subheader @@ -4747,7 +5576,10 @@ def test_nitf_online_15_openjpeg(): def nitf_online_16(driver_to_test): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_jp2_2places.ntf', 'file9_jp2_2places.ntf'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_jp2_2places.ntf", + "file9_jp2_2places.ntf", + ): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) @@ -4758,25 +5590,29 @@ def nitf_online_16(driver_to_test): # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) - ds = gdal.Open('tmp/cache/file9_jp2_2places.ntf') + ds = gdal.Open("tmp/cache/file9_jp2_2places.ntf") # JPEG2000 driver - if ds.RasterCount == 3 and \ - ds.GetRasterBand(1).Checksum() == 48954 and \ - ds.GetRasterBand(2).Checksum() == 4939 and \ - ds.GetRasterBand(3).Checksum() == 17734: - ret = 'success' - - elif ds.RasterCount == 1 and \ - ds.GetRasterBand(1).Checksum() == 47664 and \ - ds.GetRasterBand(1).GetRasterColorTable() is not None: - ret = 'success' + if ( + ds.RasterCount == 3 + and ds.GetRasterBand(1).Checksum() == 48954 + and ds.GetRasterBand(2).Checksum() == 4939 + and ds.GetRasterBand(3).Checksum() == 17734 + ): + ret = "success" + + elif ( + ds.RasterCount == 1 + and ds.GetRasterBand(1).Checksum() == 47664 + and ds.GetRasterBand(1).GetRasterColorTable() is not None + ): + ret = "success" else: print(ds.RasterCount) for i in range(ds.RasterCount): print(ds.GetRasterBand(i + 1).Checksum()) print(ds.GetRasterBand(1).GetRasterColorTable()) - gdaltest.post_reason('Did not get expected checksums') - ret = 'fail' + gdaltest.post_reason("Did not get expected checksums") + ret = "fail" gdaltest.reregister_all_jpeg2000_drivers() @@ -4784,23 +5620,24 @@ def nitf_online_16(driver_to_test): def test_nitf_online_16_jp2ecw(): - return nitf_online_16('JP2ECW') + return nitf_online_16("JP2ECW") def test_nitf_online_16_jp2mrsid(): - return nitf_online_16('JP2MrSID') + return nitf_online_16("JP2MrSID") def test_nitf_online_16_jp2kak(): - return nitf_online_16('JP2KAK') + return nitf_online_16("JP2KAK") def test_nitf_online_16_jasper(): - return nitf_online_16('JPEG2000') + return nitf_online_16("JPEG2000") def test_nitf_online_16_openjpeg(): - return nitf_online_16('JP2OpenJPEG') + return nitf_online_16("JP2OpenJPEG") + ############################################################################### # Test opening a IC=C8 NITF file which has 256-entry/LUT in Image Subheader, JP2 header completely removed @@ -4808,7 +5645,10 @@ def test_nitf_online_16_openjpeg(): def nitf_online_17(driver_to_test): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_j2c.ntf', 'file9_j2c.ntf'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_j2c.ntf", + "file9_j2c.ntf", + ): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) @@ -4819,18 +5659,20 @@ def nitf_online_17(driver_to_test): # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) - ds = gdal.Open('tmp/cache/file9_j2c.ntf') - if ds.RasterCount == 1 and \ - ds.GetRasterBand(1).Checksum() == 47664 and \ - ds.GetRasterBand(1).GetRasterColorTable() is not None: - ret = 'success' + ds = gdal.Open("tmp/cache/file9_j2c.ntf") + if ( + ds.RasterCount == 1 + and ds.GetRasterBand(1).Checksum() == 47664 + and ds.GetRasterBand(1).GetRasterColorTable() is not None + ): + ret = "success" else: print(ds.RasterCount) for i in range(ds.RasterCount): print(ds.GetRasterBand(i + 1).Checksum()) print(ds.GetRasterBand(1).GetRasterColorTable()) - gdaltest.post_reason('Did not get expected checksums') - ret = 'fail' + gdaltest.post_reason("Did not get expected checksums") + ret = "fail" gdaltest.reregister_all_jpeg2000_drivers() @@ -4838,73 +5680,102 @@ def nitf_online_17(driver_to_test): def test_nitf_online_17_jp2ecw(): - return nitf_online_17('JP2ECW') + return nitf_online_17("JP2ECW") def test_nitf_online_17_jp2mrsid(): - return nitf_online_17('JP2MrSID') + return nitf_online_17("JP2MrSID") def test_nitf_online_17_jp2kak(): - return nitf_online_17('JP2KAK') + return nitf_online_17("JP2KAK") def test_nitf_online_17_jasper(): - return nitf_online_17('JPEG2000') + return nitf_online_17("JPEG2000") def test_nitf_online_17_openjpeg(): - return nitf_online_17('JP2OpenJPEG') + return nitf_online_17("JP2OpenJPEG") + ############################################################################### # Test polar stereographic CADRG tile. def test_nitf_online_18(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/bugs/bug3337.ntf', 'bug3337.ntf'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/nitf/bugs/bug3337.ntf", "bug3337.ntf" + ): pytest.skip() - ds = gdal.Open('tmp/cache/bug3337.ntf') + ds = gdal.Open("tmp/cache/bug3337.ntf") gt = ds.GetGeoTransform() prj = ds.GetProjection() # If we have functioning coordinate transformer. - if prj[:6] == 'PROJCS': - assert prj.find('Azimuthal_Equidistant') != -1, 'wrong projection?' - expected_gt = (-1669792.3618991028, 724.73626818537502, 0.0, -556597.45396636717, 0.0, -724.73626818537434) - assert gdaltest.geotransform_equals(gt, expected_gt, 1.0), \ - 'did not get expected geotransform.' + if prj[:6] == "PROJCS": + assert prj.find("Azimuthal_Equidistant") != -1, "wrong projection?" + expected_gt = ( + -1669792.3618991028, + 724.73626818537502, + 0.0, + -556597.45396636717, + 0.0, + -724.73626818537434, + ) + assert gdaltest.geotransform_equals( + gt, expected_gt, 1.0 + ), "did not get expected geotransform." # If we do not have a functioning coordinate transformer. else: - assert prj == '' and gdaltest.geotransform_equals(gt, (0, 1, 0, 0, 0, 1), 0.00000001), \ - 'did not get expected empty gt/projection' + assert prj == "" and gdaltest.geotransform_equals( + gt, (0, 1, 0, 0, 0, 1), 0.00000001 + ), "did not get expected empty gt/projection" prj = ds.GetGCPProjection() - assert prj[:6] == 'GEOGCS', 'did not get expected geographic srs' + assert prj[:6] == "GEOGCS", "did not get expected geographic srs" gcps = ds.GetGCPs() gcp3 = gcps[3] - assert gcp3.GCPPixel == 0 and gcp3.GCPLine == 1536 and abs(gcp3.GCPX + 45) <= 0.0000000001 and gcp3.GCPY == pytest.approx(68.78679656, abs=0.00000001), \ - 'did not get expected gcp.' + assert ( + gcp3.GCPPixel == 0 + and gcp3.GCPLine == 1536 + and abs(gcp3.GCPX + 45) <= 0.0000000001 + and gcp3.GCPY == pytest.approx(68.78679656, abs=0.00000001) + ), "did not get expected gcp." ds = None + ############################################################################### # Test CADRG tile crossing dateline (#3383) def test_nitf_online_19(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/0000M033.GN3', '0000M033.GN3'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/nitf/0000M033.GN3", "0000M033.GN3" + ): pytest.skip() - tst = gdaltest.GDALTest('NITF', 'tmp/cache/0000M033.GN3', 1, 38928, - filename_absolute=1) + tst = gdaltest.GDALTest( + "NITF", "tmp/cache/0000M033.GN3", 1, 38928, filename_absolute=1 + ) + + return tst.testOpen( + check_gt=( + 174.375000000000000, + 0.010986328125000, + 0, + 51.923076923076927, + 0, + -0.006760817307692, + ) + ) - return tst.testOpen(check_gt=(174.375000000000000, 0.010986328125000, 0, - 51.923076923076927, 0, -0.006760817307692)) ############################################################################### # Check that the RPF attribute metadata was carried through. @@ -4914,16 +5785,22 @@ def test_nitf_online_19(): def test_nitf_online_20(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/0000M033.GN3', '0000M033.GN3'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/nitf/0000M033.GN3", "0000M033.GN3" + ): pytest.skip() # check that the RPF attribute metadata was carried through. # Special case where the reported size of the attribute subsection is # smaller than really available - ds = gdal.Open('tmp/cache/0000M033.GN3') + ds = gdal.Open("tmp/cache/0000M033.GN3") md = ds.GetMetadata() - assert md['NITF_RPF_CurrencyDate'] == '19941201' and md['NITF_RPF_ProductionDate'] == '19980511' and md['NITF_RPF_SignificantDate'] == '19850305', \ - 'RPF attribute metadata not captured (#3413)' + assert ( + md["NITF_RPF_CurrencyDate"] == "19941201" + and md["NITF_RPF_ProductionDate"] == "19980511" + and md["NITF_RPF_SignificantDate"] == "19850305" + ), "RPF attribute metadata not captured (#3413)" + ############################################################################### # Check that we can read NITF header located in STREAMING_FILE_HEADER DE @@ -4932,16 +5809,19 @@ def test_nitf_online_20(): def test_nitf_online_21(): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3321a.nsf', 'ns3321a.nsf'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3321a.nsf", + "ns3321a.nsf", + ): pytest.skip() - ds = gdal.Open('tmp/cache/ns3321a.nsf') + ds = gdal.Open("tmp/cache/ns3321a.nsf") md = ds.GetMetadata() ds = None # If we get NS3321A, it means we are not exploiting the header from the STREAMING_FILE_HEADER DE segment - assert md['NITF_OSTAID'] == 'I_3321A', \ - 'did not get expected OSTAID value' + assert md["NITF_OSTAID"] == "I_3321A", "did not get expected OSTAID value" + ############################################################################### # Test fix for #3002 (reconcile NITF file with LA segments) @@ -4950,76 +5830,99 @@ def test_nitf_online_21(): def test_nitf_online_22(): - if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0001C.NTF', 'U_0001C.NTF'): + if not gdaltest.download_file( + "http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0001C.NTF", + "U_0001C.NTF", + ): pytest.skip() - ds = gdal.Open('NITF_IM:1:tmp/cache/U_0001C.NTF') + ds = gdal.Open("NITF_IM:1:tmp/cache/U_0001C.NTF") md = ds.GetMetadata() ds = None tab = [ - ('NITF_IDLVL', '6'), - ('NITF_IALVL', '1'), - ('NITF_ILOC_ROW', '360'), - ('NITF_ILOC_COLUMN', '380'), - ('NITF_CCS_ROW', '425'), - ('NITF_CCS_COLUMN', '410'), + ("NITF_IDLVL", "6"), + ("NITF_IALVL", "1"), + ("NITF_ILOC_ROW", "360"), + ("NITF_ILOC_COLUMN", "380"), + ("NITF_CCS_ROW", "425"), + ("NITF_CCS_COLUMN", "410"), ] for item in tab: - assert md[item[0]] == item[1], ('(1) wrong value for %s, got %s instead of %s.' - % (item[0], md[item[0]], item[1])) - - ds = gdal.Open('NITF_IM:2:tmp/cache/U_0001C.NTF') + assert ( + md[item[0]] == item[1] + ), "(1) wrong value for %s, got %s instead of %s." % ( + item[0], + md[item[0]], + item[1], + ) + + ds = gdal.Open("NITF_IM:2:tmp/cache/U_0001C.NTF") md = ds.GetMetadata() ds = None tab = [ - ('NITF_IDLVL', '11'), - ('NITF_IALVL', '2'), - ('NITF_ILOC_ROW', '360'), - ('NITF_ILOC_COLUMN', '40'), - ('NITF_CCS_ROW', '422'), - ('NITF_CCS_COLUMN', '210'), + ("NITF_IDLVL", "11"), + ("NITF_IALVL", "2"), + ("NITF_ILOC_ROW", "360"), + ("NITF_ILOC_COLUMN", "40"), + ("NITF_CCS_ROW", "422"), + ("NITF_CCS_COLUMN", "210"), ] for item in tab: - assert md[item[0]] == item[1], ('(2) wrong value for %s, got %s instead of %s.' - % (item[0], md[item[0]], item[1])) - - ds = gdal.Open('NITF_IM:3:tmp/cache/U_0001C.NTF') + assert ( + md[item[0]] == item[1] + ), "(2) wrong value for %s, got %s instead of %s." % ( + item[0], + md[item[0]], + item[1], + ) + + ds = gdal.Open("NITF_IM:3:tmp/cache/U_0001C.NTF") md = ds.GetMetadata() ds = None tab = [ - ('NITF_IDLVL', '5'), - ('NITF_IALVL', '3'), - ('NITF_ILOC_ROW', '40'), - ('NITF_ILOC_COLUMN', '240'), - ('NITF_CCS_ROW', '-1'), - ('NITF_CCS_COLUMN', '-1'), + ("NITF_IDLVL", "5"), + ("NITF_IALVL", "3"), + ("NITF_ILOC_ROW", "40"), + ("NITF_ILOC_COLUMN", "240"), + ("NITF_CCS_ROW", "-1"), + ("NITF_CCS_COLUMN", "-1"), ] for item in tab: - assert md[item[0]] == item[1], ('(3) wrong value for %s, got %s instead of %s.' - % (item[0], md[item[0]], item[1])) - - ds = gdal.Open('NITF_IM:4:tmp/cache/U_0001C.NTF') + assert ( + md[item[0]] == item[1] + ), "(3) wrong value for %s, got %s instead of %s." % ( + item[0], + md[item[0]], + item[1], + ) + + ds = gdal.Open("NITF_IM:4:tmp/cache/U_0001C.NTF") md = ds.GetMetadata() ds = None tab = [ - ('NITF_IDLVL', '1'), - ('NITF_IALVL', '0'), - ('NITF_ILOC_ROW', '65'), - ('NITF_ILOC_COLUMN', '30'), - ('NITF_CCS_ROW', '65'), - ('NITF_CCS_COLUMN', '30'), + ("NITF_IDLVL", "1"), + ("NITF_IALVL", "0"), + ("NITF_ILOC_ROW", "65"), + ("NITF_ILOC_COLUMN", "30"), + ("NITF_CCS_ROW", "65"), + ("NITF_CCS_COLUMN", "30"), ] for item in tab: - assert md[item[0]] == item[1], ('(4) wrong value for %s, got %s instead of %s.' - % (item[0], md[item[0]], item[1])) + assert ( + md[item[0]] == item[1] + ), "(4) wrong value for %s, got %s instead of %s." % ( + item[0], + md[item[0]], + item[1], + ) ############################################################################### @@ -5028,41 +5931,53 @@ def test_nitf_online_22(): def test_nitf_online_23(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_3058b.ntf', 'U_3058b.ntf'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_3058b.ntf", "U_3058b.ntf" + ): pytest.skip() - tst = gdaltest.GDALTest('NITF', 'tmp/cache/U_3058b.ntf', 1, 44748, filename_absolute=1) + tst = gdaltest.GDALTest( + "NITF", "tmp/cache/U_3058b.ntf", 1, 44748, filename_absolute=1 + ) return tst.testOpen() + ############################################################################### # Test reading ECRG frames def test_nitf_online_24(): - if not gdaltest.download_file('http://www.falconview.org/trac/FalconView/downloads/17', 'ECRG_Sample.zip'): + if not gdaltest.download_file( + "http://www.falconview.org/trac/FalconView/downloads/17", "ECRG_Sample.zip" + ): pytest.skip() try: - os.stat('tmp/cache/ECRG_Sample.zip') + os.stat("tmp/cache/ECRG_Sample.zip") except OSError: pytest.skip() - oldval = gdal.GetConfigOption('NITF_OPEN_UNDERLYING_DS') - gdal.SetConfigOption('NITF_OPEN_UNDERLYING_DS', 'NO') - ds = gdal.Open('/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/clfc/2/000000009s0013.lf2') - gdal.SetConfigOption('NITF_OPEN_UNDERLYING_DS', oldval) + oldval = gdal.GetConfigOption("NITF_OPEN_UNDERLYING_DS") + gdal.SetConfigOption("NITF_OPEN_UNDERLYING_DS", "NO") + ds = gdal.Open( + "/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/clfc/2/000000009s0013.lf2" + ) + gdal.SetConfigOption("NITF_OPEN_UNDERLYING_DS", oldval) assert ds is not None - xml_tre = ds.GetMetadata('xml:TRE')[0] + xml_tre = ds.GetMetadata("xml:TRE")[0] ds = None - assert (not (xml_tre.find('"], "xml:XMP") ds = None # Check - ds = gdal.Open('tmp/pdf_update_xmp.pdf') - xmp = ds.GetMetadata('xml:XMP')[0] + ds = gdal.Open("tmp/pdf_update_xmp.pdf") + xmp = ds.GetMetadata("xml:XMP")[0] ds = None - assert xmp == "", 'did not get expected metadata' + assert xmp == "", "did not get expected metadata" # Update info - ds = gdal.Open('tmp/pdf_update_xmp.pdf', gdal.GA_Update) + ds = gdal.Open("tmp/pdf_update_xmp.pdf", gdal.GA_Update) ds.SetMetadata([""], "xml:XMP") ds = None # Check - ds = gdal.Open('tmp/pdf_update_xmp.pdf') - xmp = ds.GetMetadata('xml:XMP')[0] + ds = gdal.Open("tmp/pdf_update_xmp.pdf") + xmp = ds.GetMetadata("xml:XMP")[0] ds = None - assert xmp == "", 'did not get expected metadata' + assert xmp == "", "did not get expected metadata" # Check PAM doesn't exist - assert not os.path.exists('tmp/pdf_update_xmp.pdf.aux.xml'), \ - 'did not expected .aux.xml' + assert not os.path.exists( + "tmp/pdf_update_xmp.pdf.aux.xml" + ), "did not expected .aux.xml" # Clear info - ds = gdal.Open('tmp/pdf_update_xmp.pdf', gdal.GA_Update) + ds = gdal.Open("tmp/pdf_update_xmp.pdf", gdal.GA_Update) ds.SetMetadata(None, "xml:XMP") ds = None # Check - ds = gdal.Open('tmp/pdf_update_xmp.pdf') - xmp = ds.GetMetadata('xml:XMP') + ds = gdal.Open("tmp/pdf_update_xmp.pdf") + xmp = ds.GetMetadata("xml:XMP") ds = None - assert xmp is None, 'did not get expected metadata' + assert xmp is None, "did not get expected metadata" + + gdaltest.pdf_drv.Delete("tmp/pdf_update_xmp.pdf") - gdaltest.pdf_drv.Delete('tmp/pdf_update_xmp.pdf') ############################################################################### # Check SetGCPs() but with GCPs that resolve to a geotransform @@ -763,19 +935,18 @@ def test_pdf_update_xmp(poppler_or_pdfium_or_podofo): def _pdf_update_gcps(poppler_or_pdfium): dpi = 300 - out_filename = 'tmp/pdf_update_gcps.pdf' + out_filename = "tmp/pdf_update_gcps.pdf" - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") src_wkt = src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() - ds = gdaltest.pdf_drv.CreateCopy(out_filename, src_ds, options=['GEO_ENCODING=NONE', 'DPI=%d' % dpi]) + ds = gdaltest.pdf_drv.CreateCopy( + out_filename, src_ds, options=["GEO_ENCODING=NONE", "DPI=%d" % dpi] + ) ds = None src_ds = None - gcp = [[2., 8., 0, 0], - [2., 18., 0, 0], - [16., 18., 0, 0], - [16., 8., 0, 0]] + gcp = [[2.0, 8.0, 0, 0], [2.0, 18.0, 0, 0], [16.0, 18.0, 0, 0], [16.0, 8.0, 0, 0]] for i in range(4): gcp[i][2] = src_gt[0] + gcp[i][0] * src_gt[1] + gcp[i][1] * src_gt[2] @@ -795,10 +966,24 @@ def _pdf_update_gcps(poppler_or_pdfium): 1 -""" % (gcp[0][0], gcp[0][1], gcp[0][2], gcp[0][3], - gcp[1][0], gcp[1][1], gcp[1][2], gcp[1][3], - gcp[2][0], gcp[2][1], gcp[2][2], gcp[2][3], - gcp[3][0], gcp[3][1], gcp[3][2], gcp[3][3]) +""" % ( + gcp[0][0], + gcp[0][1], + gcp[0][2], + gcp[0][3], + gcp[1][0], + gcp[1][1], + gcp[1][2], + gcp[1][3], + gcp[2][0], + gcp[2][1], + gcp[2][2], + gcp[2][3], + gcp[3][0], + gcp[3][1], + gcp[3][2], + gcp[3][3], + ) vrt_ds = gdal.Open(vrt_txt) gcps = vrt_ds.GetGCPs() vrt_ds = None @@ -815,7 +1000,7 @@ def _pdf_update_gcps(poppler_or_pdfium): got_gcp_count = ds.GetGCPCount() ds.GetGCPs() got_gcp_wkt = ds.GetGCPProjection() - got_neatline = ds.GetMetadataItem('NEATLINE') + got_neatline = ds.GetMetadataItem("NEATLINE") if pdf_is_pdfium(): max_error = 1 @@ -824,14 +1009,16 @@ def _pdf_update_gcps(poppler_or_pdfium): ds = None - assert got_wkt != '', 'did not expect null GetProjectionRef' + assert got_wkt != "", "did not expect null GetProjectionRef" - assert got_gcp_wkt == '', 'did not expect non null GetGCPProjection' + assert got_gcp_wkt == "", "did not expect non null GetGCPProjection" for i in range(6): - assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), 'did not get expected gt' + assert got_gt[i] == pytest.approx( + src_gt[i], abs=1e-8 + ), "did not get expected gt" - assert got_gcp_count == 0, 'did not expect GCPs' + assert got_gcp_count == 0, "did not expect GCPs" got_geom = ogr.CreateGeometryFromWkt(got_neatline) expected_lr = ogr.Geometry(ogr.wkbLinearRing) @@ -841,23 +1028,27 @@ def _pdf_update_gcps(poppler_or_pdfium): expected_geom = ogr.Geometry(ogr.wkbPolygon) expected_geom.AddGeometry(expected_lr) - if ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) != 0: - print('got : %s' % got_neatline) - print('expected : %s' % expected_geom.ExportToWkt()) - pytest.fail('bad neatline') + if ( + ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) + != 0 + ): + print("got : %s" % got_neatline) + print("expected : %s" % expected_geom.ExportToWkt()) + pytest.fail("bad neatline") gdaltest.pdf_drv.Delete(out_filename) def test_pdf_update_gcps_iso32000(poppler_or_pdfium): - gdal.SetConfigOption('GDAL_PDF_GEO_ENCODING', None) + gdal.SetConfigOption("GDAL_PDF_GEO_ENCODING", None) _pdf_update_gcps(poppler_or_pdfium) def test_pdf_update_gcps_ogc_bp(poppler_or_pdfium): - gdal.SetConfigOption('GDAL_PDF_GEO_ENCODING', 'OGC_BP') + gdal.SetConfigOption("GDAL_PDF_GEO_ENCODING", "OGC_BP") _pdf_update_gcps(poppler_or_pdfium) - gdal.SetConfigOption('GDAL_PDF_GEO_ENCODING', None) + gdal.SetConfigOption("GDAL_PDF_GEO_ENCODING", None) + ############################################################################### # Check SetGCPs() but with GCPs that do *not* resolve to a geotransform @@ -865,18 +1056,20 @@ def test_pdf_update_gcps_ogc_bp(poppler_or_pdfium): def test_pdf_set_5_gcps_ogc_bp(poppler_or_pdfium): dpi = 300 - out_filename = 'tmp/pdf_set_5_gcps_ogc_bp.pdf' + out_filename = "tmp/pdf_set_5_gcps_ogc_bp.pdf" - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") src_wkt = src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() src_ds = None - gcp = [[2., 8., 0, 0], - [2., 10., 0, 0], - [2., 18., 0, 0], - [16., 18., 0, 0], - [16., 8., 0, 0]] + gcp = [ + [2.0, 8.0, 0, 0], + [2.0, 10.0, 0, 0], + [2.0, 18.0, 0, 0], + [16.0, 18.0, 0, 0], + [16.0, 8.0, 0, 0], + ] for i, _ in enumerate(gcp): gcp[i][2] = src_gt[0] + gcp[i][0] * src_gt[1] + gcp[i][1] * src_gt[2] @@ -900,17 +1093,36 @@ def test_pdf_set_5_gcps_ogc_bp(poppler_or_pdfium): 1 -""" % (src_wkt, - gcp[0][0], gcp[0][1], gcp[0][2], gcp[0][3], - gcp[1][0], gcp[1][1], gcp[1][2], gcp[1][3], - gcp[2][0], gcp[2][1], gcp[2][2], gcp[2][3], - gcp[3][0], gcp[3][1], gcp[3][2], gcp[3][3], - gcp[4][0], gcp[4][1], gcp[4][2], gcp[4][3]) +""" % ( + src_wkt, + gcp[0][0], + gcp[0][1], + gcp[0][2], + gcp[0][3], + gcp[1][0], + gcp[1][1], + gcp[1][2], + gcp[1][3], + gcp[2][0], + gcp[2][1], + gcp[2][2], + gcp[2][3], + gcp[3][0], + gcp[3][1], + gcp[3][2], + gcp[3][3], + gcp[4][0], + gcp[4][1], + gcp[4][2], + gcp[4][3], + ) vrt_ds = gdal.Open(vrt_txt) vrt_gcps = vrt_ds.GetGCPs() # Create PDF - ds = gdaltest.pdf_drv.CreateCopy(out_filename, vrt_ds, options=['GEO_ENCODING=OGC_BP', 'DPI=%d' % dpi]) + ds = gdaltest.pdf_drv.CreateCopy( + out_filename, vrt_ds, options=["GEO_ENCODING=OGC_BP", "DPI=%d" % dpi] + ) ds = None vrt_ds = None @@ -922,35 +1134,40 @@ def test_pdf_set_5_gcps_ogc_bp(poppler_or_pdfium): got_gcp_count = ds.GetGCPCount() got_gcps = ds.GetGCPs() got_gcp_wkt = ds.GetGCPProjection() - got_neatline = ds.GetMetadataItem('NEATLINE') + got_neatline = ds.GetMetadataItem("NEATLINE") ds = None - assert got_wkt == '', 'did not expect non null GetProjectionRef' + assert got_wkt == "", "did not expect non null GetProjectionRef" - assert got_gcp_wkt != '', 'did not expect null GetGCPProjection' + assert got_gcp_wkt != "", "did not expect null GetGCPProjection" expected_gt = [0, 1, 0, 0, 0, 1] for i in range(6): - assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8), 'did not get expected gt' + assert got_gt[i] == pytest.approx( + expected_gt[i], abs=1e-8 + ), "did not get expected gt" - assert got_gcp_count == len(gcp), 'did not get expected GCP count' + assert got_gcp_count == len(gcp), "did not get expected GCP count" for i in range(got_gcp_count): - assert (got_gcps[i].GCPX == pytest.approx(vrt_gcps[i].GCPX, abs=1e-5) and \ - got_gcps[i].GCPY == pytest.approx(vrt_gcps[i].GCPY, abs=1e-5) and \ - got_gcps[i].GCPPixel == pytest.approx(vrt_gcps[i].GCPPixel, abs=1e-5) and \ - got_gcps[i].GCPLine == pytest.approx(vrt_gcps[i].GCPLine, abs=1e-5)), \ - ('did not get expected GCP (%d)' % i) + assert ( + got_gcps[i].GCPX == pytest.approx(vrt_gcps[i].GCPX, abs=1e-5) + and got_gcps[i].GCPY == pytest.approx(vrt_gcps[i].GCPY, abs=1e-5) + and got_gcps[i].GCPPixel == pytest.approx(vrt_gcps[i].GCPPixel, abs=1e-5) + and got_gcps[i].GCPLine == pytest.approx(vrt_gcps[i].GCPLine, abs=1e-5) + ), ("did not get expected GCP (%d)" % i) got_geom = ogr.CreateGeometryFromWkt(got_neatline) # Not sure this is really what we want, but without any geotransform, we cannot # find projected coordinates - expected_geom = ogr.CreateGeometryFromWkt('POLYGON ((2 8,2 10,2 18,16 18,16 8,2 8))') + expected_geom = ogr.CreateGeometryFromWkt( + "POLYGON ((2 8,2 10,2 18,16 18,16 8,2 8))" + ) if ogrtest.check_feature_geometry(got_geom, expected_geom) != 0: - print('got : %s' % got_neatline) - print('expected : %s' % expected_geom.ExportToWkt()) - pytest.fail('bad neatline') + print("got : %s" % got_neatline) + print("expected : %s" % expected_geom.ExportToWkt()) + pytest.fail("bad neatline") gdaltest.pdf_drv.Delete(out_filename) @@ -958,137 +1175,178 @@ def test_pdf_set_5_gcps_ogc_bp(poppler_or_pdfium): ############################################################################### # Check NEATLINE support + def _pdf_set_neatline(pdf_backend, geo_encoding, dpi=300): - out_filename = 'tmp/pdf_set_neatline.pdf' + out_filename = "tmp/pdf_set_neatline.pdf" - if geo_encoding == 'ISO32000': - neatline = 'POLYGON ((441720 3751320,441720 3750120,441920 3750120,441920 3751320,441720 3751320))' + if geo_encoding == "ISO32000": + neatline = "POLYGON ((441720 3751320,441720 3750120,441920 3750120,441920 3751320,441720 3751320))" else: # For OGC_BP, we can use more than 4 points - neatline = 'POLYGON ((441720 3751320,441720 3751000,441720 3750120,441920 3750120,441920 3751320,441720 3751320))' + neatline = "POLYGON ((441720 3751320,441720 3751000,441720 3750120,441920 3750120,441920 3751320,441720 3751320))" # Test CreateCopy() with NEATLINE - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") expected_gt = src_ds.GetGeoTransform() - ds = gdaltest.pdf_drv.CreateCopy(out_filename, src_ds, options=['NEATLINE=%s' % neatline, 'GEO_ENCODING=%s' % geo_encoding, 'DPI=%d' % dpi]) + ds = gdaltest.pdf_drv.CreateCopy( + out_filename, + src_ds, + options=[ + "NEATLINE=%s" % neatline, + "GEO_ENCODING=%s" % geo_encoding, + "DPI=%d" % dpi, + ], + ) ds = None src_ds = None # Check ds = gdal.Open(out_filename) got_gt = ds.GetGeoTransform() - got_neatline = ds.GetMetadataItem('NEATLINE') + got_neatline = ds.GetMetadataItem("NEATLINE") if pdf_is_pdfium(): - if geo_encoding == 'ISO32000': - expected_gt = (440722.21886505646, 59.894520395349709, 0.020450745157516229, 3751318.6133243339, 0.077268565258743135, -60.009312694035692) + if geo_encoding == "ISO32000": + expected_gt = ( + 440722.21886505646, + 59.894520395349709, + 0.020450745157516229, + 3751318.6133243339, + 0.077268565258743135, + -60.009312694035692, + ) max_error = 1 else: max_error = 0.0001 ds = None for i in range(6): - assert got_gt[i] == pytest.approx(expected_gt[i], abs=2e-7), 'did not get expected gt' + assert got_gt[i] == pytest.approx( + expected_gt[i], abs=2e-7 + ), "did not get expected gt" got_geom = ogr.CreateGeometryFromWkt(got_neatline) expected_geom = ogr.CreateGeometryFromWkt(neatline) - if ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) != 0: - print('got : %s' % got_neatline) - print('expected : %s' % expected_geom.ExportToWkt()) - pytest.fail('bad neatline') + if ( + ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) + != 0 + ): + print("got : %s" % got_neatline) + print("expected : %s" % expected_geom.ExportToWkt()) + pytest.fail("bad neatline") # Test SetMetadataItem() ds = gdal.Open(out_filename, gdal.GA_Update) - neatline = 'POLYGON ((440720 3751320,440720 3750120,441920 3750120,441920 3751320,440720 3751320))' - ds.SetMetadataItem('NEATLINE', neatline) + neatline = "POLYGON ((440720 3751320,440720 3750120,441920 3750120,441920 3751320,440720 3751320))" + ds.SetMetadataItem("NEATLINE", neatline) ds = None # Check - gdal.SetConfigOption('GDAL_PDF_GEO_ENCODING', geo_encoding) + gdal.SetConfigOption("GDAL_PDF_GEO_ENCODING", geo_encoding) ds = gdal.Open(out_filename) got_gt = ds.GetGeoTransform() - got_neatline = ds.GetMetadataItem('NEATLINE') + got_neatline = ds.GetMetadataItem("NEATLINE") if pdf_is_pdfium(): - if geo_encoding == 'ISO32000': - expected_gt = (440722.36151923181, 59.93217744208814, 0.0, 3751318.7819266757, 0.0, -59.941906300000845) + if geo_encoding == "ISO32000": + expected_gt = ( + 440722.36151923181, + 59.93217744208814, + 0.0, + 3751318.7819266757, + 0.0, + -59.941906300000845, + ) ds = None - gdal.SetConfigOption('GDAL_PDF_GEO_ENCODING', None) + gdal.SetConfigOption("GDAL_PDF_GEO_ENCODING", None) for i in range(6): - assert (not (expected_gt[i] == 0 and got_gt[i] != pytest.approx(expected_gt[i], abs=1e-7)) or \ - (expected_gt[i] != 0 and abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) > 1e-7)), \ - 'did not get expected gt' + assert not ( + expected_gt[i] == 0 and got_gt[i] != pytest.approx(expected_gt[i], abs=1e-7) + ) or ( + expected_gt[i] != 0 + and abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) > 1e-7 + ), "did not get expected gt" got_geom = ogr.CreateGeometryFromWkt(got_neatline) expected_geom = ogr.CreateGeometryFromWkt(neatline) - if ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) != 0: - print('got : %s' % got_neatline) - print('expected : %s' % expected_geom.ExportToWkt()) - pytest.fail('bad neatline') + if ( + ogrtest.check_feature_geometry(got_geom, expected_geom, max_error=max_error) + != 0 + ): + print("got : %s" % got_neatline) + print("expected : %s" % expected_geom.ExportToWkt()) + pytest.fail("bad neatline") gdaltest.pdf_drv.Delete(out_filename) def test_pdf_set_neatline_iso32000(poppler_or_pdfium): - return _pdf_set_neatline(poppler_or_pdfium, 'ISO32000') + return _pdf_set_neatline(poppler_or_pdfium, "ISO32000") def test_pdf_set_neatline_ogc_bp(poppler_or_pdfium): - return _pdf_set_neatline(poppler_or_pdfium, 'OGC_BP') + return _pdf_set_neatline(poppler_or_pdfium, "OGC_BP") + ############################################################################### # Check that we can generate identical file def test_pdf_check_identity_iso32000(poppler_or_pdfium): - out_filename = 'tmp/pdf_check_identity_iso32000.pdf' + out_filename = "tmp/pdf_check_identity_iso32000.pdf" - src_ds = gdal.Open('data/pdf/test_pdf.vrt') - out_ds = gdaltest.pdf_drv.CreateCopy(out_filename, src_ds, options=['STREAM_COMPRESS=NONE']) + src_ds = gdal.Open("data/pdf/test_pdf.vrt") + out_ds = gdaltest.pdf_drv.CreateCopy( + out_filename, src_ds, options=["STREAM_COMPRESS=NONE"] + ) del out_ds src_ds = None - f = open('data/pdf/test_iso32000.pdf', 'rb') + f = open("data/pdf/test_iso32000.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdaltest.pdf_drv.Delete(out_filename) + ############################################################################### # Check that we can generate identical file def test_pdf_check_identity_ogc_bp(poppler_or_pdfium): - out_filename = 'tmp/pdf_check_identity_ogc_bp.pdf' + out_filename = "tmp/pdf_check_identity_ogc_bp.pdf" - src_ds = gdal.Open('data/pdf/test_pdf.vrt') - gdal.SetConfigOption('GDAL_PDF_OGC_BP_WRITE_WKT', 'NO') - out_ds = gdaltest.pdf_drv.CreateCopy(out_filename, src_ds, options=['GEO_ENCODING=OGC_BP', 'STREAM_COMPRESS=NONE']) + src_ds = gdal.Open("data/pdf/test_pdf.vrt") + gdal.SetConfigOption("GDAL_PDF_OGC_BP_WRITE_WKT", "NO") + out_ds = gdaltest.pdf_drv.CreateCopy( + out_filename, src_ds, options=["GEO_ENCODING=OGC_BP", "STREAM_COMPRESS=NONE"] + ) del out_ds - gdal.SetConfigOption('GDAL_PDF_OGC_BP_WRITE_WKT', None) + gdal.SetConfigOption("GDAL_PDF_OGC_BP_WRITE_WKT", None) src_ds = None - f = open('data/pdf/test_ogc_bp.pdf', 'rb') + f = open("data/pdf/test_ogc_bp.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdaltest.pdf_drv.Delete(out_filename) + ############################################################################### # Check layers support @@ -1097,43 +1355,52 @@ def test_pdf_layers(poppler_or_pdfium): if not pdf_is_poppler() and not pdf_is_pdfium(): pytest.skip() - ds = gdal.Open('data/pdf/adobe_style_geospatial.pdf') - layers = ds.GetMetadata_List('LAYERS') + ds = gdal.Open("data/pdf/adobe_style_geospatial.pdf") + layers = ds.GetMetadata_List("LAYERS") cs1 = ds.GetRasterBand(1).Checksum() ds = None # if layers != ['LAYER_00_INIT_STATE=ON', 'LAYER_00_NAME=New_Data_Frame', 'LAYER_01_INIT_STATE=ON', 'LAYER_01_NAME=New_Data_Frame.Graticule', 'LAYER_02_INIT_STATE=ON', 'LAYER_02_NAME=Layers', 'LAYER_03_INIT_STATE=ON', 'LAYER_03_NAME=Layers.Measured_Grid', 'LAYER_04_INIT_STATE=ON', 'LAYER_04_NAME=Layers.Graticule']: - assert layers == ['LAYER_00_NAME=New_Data_Frame', 'LAYER_01_NAME=New_Data_Frame.Graticule', 'LAYER_02_NAME=Layers', 'LAYER_03_NAME=Layers.Measured_Grid', 'LAYER_04_NAME=Layers.Graticule'], \ - 'did not get expected layers' + assert layers == [ + "LAYER_00_NAME=New_Data_Frame", + "LAYER_01_NAME=New_Data_Frame.Graticule", + "LAYER_02_NAME=Layers", + "LAYER_03_NAME=Layers.Measured_Grid", + "LAYER_04_NAME=Layers.Graticule", + ], "did not get expected layers" if not pdf_checksum_available(): pytest.skip() # Turn a layer off - gdal.SetConfigOption('GDAL_PDF_LAYERS_OFF', 'New_Data_Frame') - ds = gdal.Open('data/pdf/adobe_style_geospatial.pdf') + gdal.SetConfigOption("GDAL_PDF_LAYERS_OFF", "New_Data_Frame") + ds = gdal.Open("data/pdf/adobe_style_geospatial.pdf") cs2 = ds.GetRasterBand(1).Checksum() ds = None - gdal.SetConfigOption('GDAL_PDF_LAYERS_OFF', None) + gdal.SetConfigOption("GDAL_PDF_LAYERS_OFF", None) - assert cs2 != cs1, 'did not get expected checksum' + assert cs2 != cs1, "did not get expected checksum" # Turn the other layer on - gdal.SetConfigOption('GDAL_PDF_LAYERS', 'Layers') - ds = gdal.Open('data/pdf/adobe_style_geospatial.pdf') + gdal.SetConfigOption("GDAL_PDF_LAYERS", "Layers") + ds = gdal.Open("data/pdf/adobe_style_geospatial.pdf") cs3 = ds.GetRasterBand(1).Checksum() ds = None - gdal.SetConfigOption('GDAL_PDF_LAYERS', None) + gdal.SetConfigOption("GDAL_PDF_LAYERS", None) # So the end result must be identical - assert cs3 == cs2, 'did not get expected checksum' + assert cs3 == cs2, "did not get expected checksum" # Turn another sublayer on - ds = gdal.OpenEx('data/pdf/adobe_style_geospatial.pdf', open_options=['LAYERS=Layers.Measured_Grid']) + ds = gdal.OpenEx( + "data/pdf/adobe_style_geospatial.pdf", + open_options=["LAYERS=Layers.Measured_Grid"], + ) cs4 = ds.GetRasterBand(1).Checksum() ds = None - assert not (cs4 == cs1 or cs4 == cs2), 'did not get expected checksum' + assert not (cs4 == cs1 or cs4 == cs2), "did not get expected checksum" + ############################################################################### # Test MARGIN, EXTRA_STREAM, EXTRA_LAYER_NAME and EXTRA_IMAGES options @@ -1143,35 +1410,41 @@ def test_pdf_custom_layout(poppler_or_pdfium): js = """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/');""" - options = ['LEFT_MARGIN=1', - 'TOP_MARGIN=2', - 'RIGHT_MARGIN=3', - 'BOTTOM_MARGIN=4', - 'DPI=300', - 'LAYER_NAME=byte_tif', - 'EXTRA_STREAM=BT 255 0 0 rg /FTimesRoman 1 Tf 1 0 0 1 1 1 Tm (Footpage string) Tj ET', - 'EXTRA_LAYER_NAME=Footpage_and_logo', - 'EXTRA_IMAGES=data/byte.tif,0.5,0.5,0.2,link=http://gdal.org/,data/byte.tif,0.5,1.5,0.2', - 'JAVASCRIPT=%s' % js] - - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_custom_layout.pdf', src_ds, options=options) + options = [ + "LEFT_MARGIN=1", + "TOP_MARGIN=2", + "RIGHT_MARGIN=3", + "BOTTOM_MARGIN=4", + "DPI=300", + "LAYER_NAME=byte_tif", + "EXTRA_STREAM=BT 255 0 0 rg /FTimesRoman 1 Tf 1 0 0 1 1 1 Tm (Footpage string) Tj ET", + "EXTRA_LAYER_NAME=Footpage_and_logo", + "EXTRA_IMAGES=data/byte.tif,0.5,0.5,0.2,link=http://gdal.org/,data/byte.tif,0.5,1.5,0.2", + "JAVASCRIPT=%s" % js, + ] + + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_custom_layout.pdf", src_ds, options=options + ) ds = None src_ds = None if pdf_is_poppler() or pdf_is_pdfium(): - ds = gdal.Open('tmp/pdf_custom_layout.pdf') + ds = gdal.Open("tmp/pdf_custom_layout.pdf") ds.GetRasterBand(1).Checksum() - layers = ds.GetMetadata_List('LAYERS') + layers = ds.GetMetadata_List("LAYERS") ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_custom_layout.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_custom_layout.pdf") if pdf_is_poppler() or pdf_is_pdfium(): - assert layers == ['LAYER_00_NAME=byte_tif', 'LAYER_01_NAME=Footpage_and_logo'], \ - 'did not get expected layers' + assert layers == [ + "LAYER_00_NAME=byte_tif", + "LAYER_01_NAME=Footpage_and_logo", + ], "did not get expected layers" + - ############################################################################### # Test CLIPPING_EXTENT, EXTRA_RASTERS, EXTRA_RASTERS_LAYER_NAME, OFF_LAYERS, EXCLUSIVE_LAYERS options @@ -1199,46 +1472,53 @@ def test_pdf_extra_rasters(poppler_or_pdfium): """ - f = open('tmp/subbyte.vrt', 'wt') + f = open("tmp/subbyte.vrt", "wt") f.write(subbyte) f.close() - options = ['MARGIN=1', - 'DPI=300', - 'WRITE_USERUNIT=YES', - 'CLIPPING_EXTENT=440780,3750180,441860,3751260', - 'LAYER_NAME=byte_tif', - 'EXTRA_RASTERS=tmp/subbyte.vrt', - 'EXTRA_RASTERS_LAYER_NAME=subbyte', - 'OFF_LAYERS=byte_tif', - 'EXCLUSIVE_LAYERS=byte_tif,subbyte'] - - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_extra_rasters.pdf', src_ds, options=options) + options = [ + "MARGIN=1", + "DPI=300", + "WRITE_USERUNIT=YES", + "CLIPPING_EXTENT=440780,3750180,441860,3751260", + "LAYER_NAME=byte_tif", + "EXTRA_RASTERS=tmp/subbyte.vrt", + "EXTRA_RASTERS_LAYER_NAME=subbyte", + "OFF_LAYERS=byte_tif", + "EXCLUSIVE_LAYERS=byte_tif,subbyte", + ] + + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_extra_rasters.pdf", src_ds, options=options + ) ds = None src_ds = None if pdf_is_poppler() or pdf_is_pdfium(): - ds = gdal.Open('tmp/pdf_extra_rasters.pdf') + ds = gdal.Open("tmp/pdf_extra_rasters.pdf") cs = ds.GetRasterBand(1).Checksum() - layers = ds.GetMetadata_List('LAYERS') + layers = ds.GetMetadata_List("LAYERS") ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_extra_rasters.pdf') - os.unlink('tmp/subbyte.vrt') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_extra_rasters.pdf") + os.unlink("tmp/subbyte.vrt") if pdf_is_poppler() or pdf_is_pdfium(): - assert layers == ['LAYER_00_NAME=byte_tif', 'LAYER_01_NAME=subbyte'], \ - 'did not get expected layers' + assert layers == [ + "LAYER_00_NAME=byte_tif", + "LAYER_01_NAME=subbyte", + ], "did not get expected layers" if pdf_is_poppler(): assert cs in (7926, 8177, 8174, 8165, 8172) + ############################################################################### # Test adding a OGR datasource def test_pdf_write_ogr(poppler_or_pdfium): - f = gdal.VSIFOpenL('tmp/test.csv', 'wb') + f = gdal.VSIFOpenL("tmp/test.csv", "wb") data = """id,foo,WKT,style 1,bar,"MULTIPOLYGON (((440720 3751320,440720 3750120,441020 3750120,441020 3751320,440720 3751320),(440800 3751200,440900 3751200,440900 3751000,440800 3751000,440800 3751200)),((441720 3751320,441720 3750120,441920 3750120,441920 3751320,441720 3751320)))", 2,baz,"LINESTRING(440720 3751320,441920 3750120)","PEN(c:#FF0000,w:5pt,p:""2px 1pt"")" @@ -1248,7 +1528,7 @@ def test_pdf_write_ogr(poppler_or_pdfium): gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL('tmp/test.vrt', 'wb') + f = gdal.VSIFOpenL("tmp/test.vrt", "wb") data = """ tmp/test.csv @@ -1265,20 +1545,24 @@ def test_pdf_write_ogr(poppler_or_pdfium): gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - options = ['OGR_DATASOURCE=tmp/test.vrt', 'OGR_DISPLAY_LAYER_NAMES=A_Layer', 'OGR_DISPLAY_FIELD=foo'] + options = [ + "OGR_DATASOURCE=tmp/test.vrt", + "OGR_DISPLAY_LAYER_NAMES=A_Layer", + "OGR_DISPLAY_FIELD=foo", + ] - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_write_ogr.pdf', src_ds, options=options) + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.pdf_drv.CreateCopy("tmp/pdf_write_ogr.pdf", src_ds, options=options) ds = None src_ds = None if pdf_is_poppler() or pdf_is_pdfium(): - ds = gdal.Open('tmp/pdf_write_ogr.pdf') + ds = gdal.Open("tmp/pdf_write_ogr.pdf") cs_ref = ds.GetRasterBand(1).Checksum() - layers = ds.GetMetadata_List('LAYERS') + layers = ds.GetMetadata_List("LAYERS") ds = None - ogr_ds = ogr.Open('tmp/pdf_write_ogr.pdf') + ogr_ds = ogr.Open("tmp/pdf_write_ogr.pdf") ogr_lyr = ogr_ds.GetLayer(0) feature_count = ogr_lyr.GetFeatureCount() ogr_ds = None @@ -1286,13 +1570,23 @@ def test_pdf_write_ogr(poppler_or_pdfium): if pdf_is_poppler() or pdf_is_pdfium(): cs_tab = [] - rendering_options = ['RASTER', 'VECTOR', 'TEXT', 'RASTER,VECTOR', 'RASTER,TEXT', 'VECTOR,TEXT', 'RASTER,VECTOR,TEXT'] + rendering_options = [ + "RASTER", + "VECTOR", + "TEXT", + "RASTER,VECTOR", + "RASTER,TEXT", + "VECTOR,TEXT", + "RASTER,VECTOR,TEXT", + ] for opt in rendering_options: gdal.ErrorReset() - ds = gdal.OpenEx('tmp/pdf_write_ogr.pdf', open_options=['RENDERING_OPTIONS=%s' % opt]) + ds = gdal.OpenEx( + "tmp/pdf_write_ogr.pdf", open_options=["RENDERING_OPTIONS=%s" % opt] + ) cs = ds.GetRasterBand(1).Checksum() # When misconfigured Poppler with fonts, use this to avoid error - if 'TEXT' in opt and gdal.GetLastErrorMsg().find('font') >= 0: + if "TEXT" in opt and gdal.GetLastErrorMsg().find("font") >= 0: cs = -cs cs_tab.append(cs) ds = None @@ -1302,23 +1596,26 @@ def test_pdf_write_ogr(poppler_or_pdfium): # print('Checksum %s: %d' % (rendering_options[i], cs_tab[i]) ) for j in range(i + 1, len(rendering_options)): if cs_tab[i] == cs_tab[j] and cs_tab[i] >= 0 and cs_tab[j] >= 0: - print('Checksum %s: %d' % (roi, cs_tab[i])) - pytest.fail('Checksum %s: %d' % (rendering_options[j], cs_tab[j])) + print("Checksum %s: %d" % (roi, cs_tab[i])) + pytest.fail("Checksum %s: %d" % (rendering_options[j], cs_tab[j])) # And test that RASTER,VECTOR,TEXT is the default rendering assert abs(cs_tab[len(rendering_options) - 1]) == cs_ref - gdal.GetDriverByName('PDF').Delete('tmp/pdf_write_ogr.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_write_ogr.pdf") - gdal.Unlink('tmp/test.csv') - gdal.Unlink('tmp/test.vrt') + gdal.Unlink("tmp/test.csv") + gdal.Unlink("tmp/test.vrt") if pdf_is_poppler() or pdf_is_pdfium(): - assert layers == ['LAYER_00_NAME=A_Layer', 'LAYER_01_NAME=A_Layer.Text'], \ - 'did not get expected layers' + assert layers == [ + "LAYER_00_NAME=A_Layer", + "LAYER_01_NAME=A_Layer.Text", + ], "did not get expected layers" # Should have filtered out id = 4 - assert feature_count == 3, 'did not get expected feature count' + assert feature_count == 3, "did not get expected feature count" + ############################################################################### # Test adding a OGR datasource with reprojection of OGR SRS to GDAL SRS @@ -1326,7 +1623,7 @@ def test_pdf_write_ogr(poppler_or_pdfium): def test_pdf_write_ogr_with_reprojection(poppler_or_pdfium): - f = gdal.VSIFOpenL('tmp/test.csv', 'wb') + f = gdal.VSIFOpenL("tmp/test.csv", "wb") data = """WKT,id "POINT (-117.641059792392142 33.902263065734573)",1 "POINT (-117.64098016484607 33.891620919037436)",2 @@ -1339,7 +1636,7 @@ def test_pdf_write_ogr_with_reprojection(poppler_or_pdfium): gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - f = gdal.VSIFOpenL('tmp/test.vrt', 'wb') + f = gdal.VSIFOpenL("tmp/test.vrt", "wb") data = """ tmp/test.csv @@ -1353,65 +1650,76 @@ def test_pdf_write_ogr_with_reprojection(poppler_or_pdfium): gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - options = ['OGR_DATASOURCE=tmp/test.vrt', 'OGR_DISPLAY_LAYER_NAMES=A_Layer', 'OGR_DISPLAY_FIELD=foo'] + options = [ + "OGR_DATASOURCE=tmp/test.vrt", + "OGR_DISPLAY_LAYER_NAMES=A_Layer", + "OGR_DISPLAY_FIELD=foo", + ] - src_ds = gdal.Open('data/byte.tif') - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_write_ogr_with_reprojection.pdf', src_ds, options=options) + src_ds = gdal.Open("data/byte.tif") + ds = gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_write_ogr_with_reprojection.pdf", src_ds, options=options + ) del ds src_ds = None - ogr_ds = ogr.Open('tmp/pdf_write_ogr_with_reprojection.pdf') + ogr_ds = ogr.Open("tmp/pdf_write_ogr_with_reprojection.pdf") ogr_lyr = ogr_ds.GetLayer(0) feature_count = ogr_lyr.GetFeatureCount() ogr_ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_write_ogr_with_reprojection.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_write_ogr_with_reprojection.pdf") - gdal.Unlink('tmp/test.csv') - gdal.Unlink('tmp/test.vrt') + gdal.Unlink("tmp/test.csv") + gdal.Unlink("tmp/test.vrt") # Should have filtered out id = 6 - assert feature_count == 5, 'did not get expected feature count' + assert feature_count == 5, "did not get expected feature count" + ############################################################################### # Test direct copy of source JPEG file def test_pdf_jpeg_direct_copy(poppler_or_pdfium): - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() - src_ds = gdal.Open('data/jpeg/byte_with_xmp.jpg') - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_jpeg_direct_copy.pdf', src_ds, options=['XMP=NO']) + src_ds = gdal.Open("data/jpeg/byte_with_xmp.jpg") + ds = gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_jpeg_direct_copy.pdf", src_ds, options=["XMP=NO"] + ) ds = None src_ds = None - ds = gdal.Open('tmp/pdf_jpeg_direct_copy.pdf') + ds = gdal.Open("tmp/pdf_jpeg_direct_copy.pdf") # No XMP at PDF level - assert ds.GetMetadata('xml:XMP') is None + assert ds.GetMetadata("xml:XMP") is None assert ds.RasterXSize == 20 assert not (pdf_checksum_available() and ds.GetRasterBand(1).Checksum() == 0) ds = None # But we can find the original XMP from the JPEG file ! - f = open('tmp/pdf_jpeg_direct_copy.pdf', 'rb') - data = f.read().decode('ISO-8859-1') + f = open("tmp/pdf_jpeg_direct_copy.pdf", "rb") + data = f.read().decode("ISO-8859-1") f.close() - offset = data.find('ns.adobe.com') + offset = data.find("ns.adobe.com") - gdal.Unlink('tmp/pdf_jpeg_direct_copy.pdf') + gdal.Unlink("tmp/pdf_jpeg_direct_copy.pdf") assert offset != -1 + ############################################################################### # Test direct copy of source JPEG file within VRT file def test_pdf_jpeg_in_vrt_direct_copy(poppler_or_pdfium): - if gdal.GetDriverByName('JPEG') is None: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() - src_ds = gdal.Open(""" + src_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, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 @@ -1423,50 +1731,53 @@ def test_pdf_jpeg_in_vrt_direct_copy(poppler_or_pdfium): -""") - ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_jpeg_in_vrt_direct_copy.pdf', src_ds) +""" + ) + ds = gdaltest.pdf_drv.CreateCopy("tmp/pdf_jpeg_in_vrt_direct_copy.pdf", src_ds) ds = None src_ds = None - ds = gdal.Open('tmp/pdf_jpeg_in_vrt_direct_copy.pdf') + ds = gdal.Open("tmp/pdf_jpeg_in_vrt_direct_copy.pdf") # No XMP at PDF level - assert ds.GetMetadata('xml:XMP') is None + assert ds.GetMetadata("xml:XMP") is None assert ds.RasterXSize == 20 assert not (pdf_checksum_available() and ds.GetRasterBand(1).Checksum() == 0) ds = None # But we can find the original XMP from the JPEG file ! - f = open('tmp/pdf_jpeg_in_vrt_direct_copy.pdf', 'rb') - data = f.read().decode('ISO-8859-1') + f = open("tmp/pdf_jpeg_in_vrt_direct_copy.pdf", "rb") + data = f.read().decode("ISO-8859-1") f.close() - offset = data.find('ns.adobe.com') + offset = data.find("ns.adobe.com") - gdal.Unlink('tmp/pdf_jpeg_in_vrt_direct_copy.pdf') + gdal.Unlink("tmp/pdf_jpeg_in_vrt_direct_copy.pdf") assert offset != -1 + ############################################################################### # Test reading georeferencing attached to an image, and not to the page (#4695) -@pytest.mark.parametrize( - 'src_filename', - ['data/byte.tif', 'data/rgbsmall.tif'] -) +@pytest.mark.parametrize("src_filename", ["data/byte.tif", "data/rgbsmall.tif"]) def pdf_georef_on_image(src_filename, pdf_backend): src_ds = gdal.Open(src_filename) - gdal.SetConfigOption('GDAL_PDF_WRITE_GEOREF_ON_IMAGE', 'YES') - out_ds = gdaltest.pdf_drv.CreateCopy('tmp/pdf_georef_on_image.pdf', src_ds, options=['MARGIN=10', 'GEO_ENCODING=NONE']) + gdal.SetConfigOption("GDAL_PDF_WRITE_GEOREF_ON_IMAGE", "YES") + out_ds = gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_georef_on_image.pdf", + src_ds, + options=["MARGIN=10", "GEO_ENCODING=NONE"], + ) del out_ds - gdal.SetConfigOption('GDAL_PDF_WRITE_GEOREF_ON_IMAGE', None) + gdal.SetConfigOption("GDAL_PDF_WRITE_GEOREF_ON_IMAGE", None) if pdf_checksum_available(): src_cs = src_ds.GetRasterBand(1).Checksum() else: src_cs = 0 src_ds = None - ds = gdal.Open('tmp/pdf_georef_on_image.pdf') - subdataset_name = ds.GetMetadataItem('SUBDATASET_1_NAME', 'SUBDATASETS') + ds = gdal.Open("tmp/pdf_georef_on_image.pdf") + subdataset_name = ds.GetMetadataItem("SUBDATASET_1_NAME", "SUBDATASETS") ds = None ds = gdal.Open(subdataset_name) @@ -1477,11 +1788,11 @@ def pdf_georef_on_image(src_filename, pdf_backend): got_cs = 0 ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_georef_on_image.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_georef_on_image.pdf") - assert got_wkt != '', 'did not get projection' + assert got_wkt != "", "did not get projection" - assert not pdf_checksum_available() or src_cs == got_cs, 'did not get same checksum' + assert not pdf_checksum_available() or src_cs == got_cs, "did not get same checksum" ############################################################################### @@ -1490,50 +1801,53 @@ def pdf_georef_on_image(src_filename, pdf_backend): def test_pdf_write_huge(poppler_or_pdfium): if pdf_is_poppler() or pdf_is_pdfium(): - tmp_filename = '/vsimem/pdf_write_huge.pdf' + tmp_filename = "/vsimem/pdf_write_huge.pdf" else: - tmp_filename = 'tmp/pdf_write_huge.pdf' + tmp_filename = "tmp/pdf_write_huge.pdf" for (xsize, ysize) in [(19200, 1), (1, 19200)]: - src_ds = gdal.GetDriverByName('MEM').Create('', xsize, ysize, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", xsize, ysize, 1) ds = gdaltest.pdf_drv.CreateCopy(tmp_filename, src_ds) ds = None ds = gdal.Open(tmp_filename) - assert int(ds.GetMetadataItem('DPI')) == 96 - assert (ds.RasterXSize == src_ds.RasterXSize and \ - ds.RasterYSize == src_ds.RasterYSize) + assert int(ds.GetMetadataItem("DPI")) == 96 + assert ( + ds.RasterXSize == src_ds.RasterXSize + and ds.RasterYSize == src_ds.RasterYSize + ) ds = None gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = gdaltest.pdf_drv.CreateCopy(tmp_filename, src_ds, options=['DPI=72']) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = gdaltest.pdf_drv.CreateCopy(tmp_filename, src_ds, options=["DPI=72"]) gdal.PopErrorHandler() msg = gdal.GetLastErrorMsg() - assert msg != '' + assert msg != "" ds = None ds = gdal.Open(tmp_filename) - assert int(ds.GetMetadataItem('DPI')) == 72 + assert int(ds.GetMetadataItem("DPI")) == 72 ds = None src_ds = None - for option in ['LEFT_MARGIN=14400', 'TOP_MARGIN=14400']: - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + for option in ["LEFT_MARGIN=14400", "TOP_MARGIN=14400"]: + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds = gdaltest.pdf_drv.CreateCopy(tmp_filename, src_ds, options=[option]) gdal.PopErrorHandler() msg = gdal.GetLastErrorMsg() - assert msg != '' + assert msg != "" ds = None ds = gdal.Open(tmp_filename) - assert int(ds.GetMetadataItem('DPI')) == 72 + assert int(ds.GetMetadataItem("DPI")) == 72 ds = None src_ds = None gdal.Unlink(tmp_filename) + ############################################################################### # Test creating overviews @@ -1541,9 +1855,9 @@ def test_pdf_write_huge(poppler_or_pdfium): def test_pdf_overviews(poppler_or_pdfium): if not pdf_is_poppler() and not pdf_is_pdfium(): pytest.skip() - tmp_filename = '/vsimem/pdf_overviews.pdf' + tmp_filename = "/vsimem/pdf_overviews.pdf" - src_ds = gdal.GetDriverByName('MEM').Create('', 1024, 1024, 3) + src_ds = gdal.GetDriverByName("MEM").Create("", 1024, 1024, 3) for i in range(3): src_ds.GetRasterBand(i + 1).Fill(255) ds = gdaltest.pdf_drv.CreateCopy(tmp_filename, src_ds) @@ -1554,12 +1868,12 @@ def test_pdf_overviews(poppler_or_pdfium): ds.GetRasterBand(1).GetOverview(-1) ds.GetRasterBand(1).GetOverview(10) if before >= 1: - assert pdf_is_pdfium(), 'No overview expected at this point!' + assert pdf_is_pdfium(), "No overview expected at this point!" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 5934 elif pdf_is_pdfium(): - pytest.fail('Overview expected at this point!') - ds.BuildOverviews('NONE', [2]) + pytest.fail("Overview expected at this point!") + ds.BuildOverviews("NONE", [2]) after = ds.GetRasterBand(1).GetOverviewCount() assert after == 1 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() @@ -1568,6 +1882,7 @@ def test_pdf_overviews(poppler_or_pdfium): gdaltest.pdf_drv.Delete(tmp_filename) + ############################################################################### # Test password @@ -1578,38 +1893,45 @@ def test_pdf_password(poppler_or_pdfium_or_podofo): # No password with gdaltest.error_handler(): - ds = gdal.Open('data/pdf/byte_enc.pdf') + ds = gdal.Open("data/pdf/byte_enc.pdf") assert ds is None # Wrong password with gdaltest.error_handler(): - ds = gdal.OpenEx('data/pdf/byte_enc.pdf', open_options=['USER_PWD=wrong_password']) + ds = gdal.OpenEx( + "data/pdf/byte_enc.pdf", open_options=["USER_PWD=wrong_password"] + ) assert ds is None # Correct password - ds = gdal.OpenEx('data/pdf/byte_enc.pdf', open_options=['USER_PWD=user_password']) + ds = gdal.OpenEx("data/pdf/byte_enc.pdf", open_options=["USER_PWD=user_password"]) assert ds is not None import test_cli_utilities + if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() # Test ASK_INTERACTIVE with wrong password - cmd_line = test_cli_utilities.get_gdal_translate_path() + ' data/pdf/byte_enc.pdf /vsimem/out.tif -q -oo USER_PWD=ASK_INTERACTIVE < tmp/password.txt' - if sys.platform != 'win32': - cmd_line += ' >/dev/null 2>/dev/null' - - open('tmp/password.txt', 'wb').write('wrong_password'.encode('ASCII')) + cmd_line = ( + test_cli_utilities.get_gdal_translate_path() + + " data/pdf/byte_enc.pdf /vsimem/out.tif -q -oo USER_PWD=ASK_INTERACTIVE < tmp/password.txt" + ) + if sys.platform != "win32": + cmd_line += " >/dev/null 2>/dev/null" + + open("tmp/password.txt", "wb").write("wrong_password".encode("ASCII")) ret = os.system(cmd_line) - os.unlink('tmp/password.txt') + os.unlink("tmp/password.txt") assert ret != 0 # Test ASK_INTERACTIVE with correct password - open('tmp/password.txt', 'wb').write('user_password'.encode('ASCII')) + open("tmp/password.txt", "wb").write("user_password".encode("ASCII")) ret = os.system(cmd_line) - os.unlink('tmp/password.txt') + os.unlink("tmp/password.txt") assert ret == 0 + ############################################################################### # Test multi page support @@ -1620,67 +1942,85 @@ def test_pdf_multipage(poppler_or_pdfium_or_podofo): # 2) gdal_translate gcore/data/rgbsmall.tif rgbsmall.pdf -of PDF # 3) ~/install-podofo-0.9.3/bin/podofomerge byte.pdf rgbsmall.pdf byte_and_rgbsmall_2pages.pdf - ds = gdal.Open('data/pdf/byte_and_rgbsmall_2pages.pdf') + ds = gdal.Open("data/pdf/byte_and_rgbsmall_2pages.pdf") subdatasets = ds.GetSubDatasets() - expected_subdatasets = [('PDF:1:data/pdf/byte_and_rgbsmall_2pages.pdf', 'Page 1 of data/pdf/byte_and_rgbsmall_2pages.pdf'), ('PDF:2:data/pdf/byte_and_rgbsmall_2pages.pdf', 'Page 2 of data/pdf/byte_and_rgbsmall_2pages.pdf')] - assert subdatasets == expected_subdatasets, 'did not get expected subdatasets' + expected_subdatasets = [ + ( + "PDF:1:data/pdf/byte_and_rgbsmall_2pages.pdf", + "Page 1 of data/pdf/byte_and_rgbsmall_2pages.pdf", + ), + ( + "PDF:2:data/pdf/byte_and_rgbsmall_2pages.pdf", + "Page 2 of data/pdf/byte_and_rgbsmall_2pages.pdf", + ), + ] + assert subdatasets == expected_subdatasets, "did not get expected subdatasets" ds = None - ds = gdal.Open('PDF:1:data/pdf/byte_and_rgbsmall_2pages.pdf') - assert ds.RasterXSize == 20, 'wrong width' + ds = gdal.Open("PDF:1:data/pdf/byte_and_rgbsmall_2pages.pdf") + assert ds.RasterXSize == 20, "wrong width" - ds2 = gdal.Open('PDF:2:data/pdf/byte_and_rgbsmall_2pages.pdf') - assert ds2.RasterXSize == 50, 'wrong width' + ds2 = gdal.Open("PDF:2:data/pdf/byte_and_rgbsmall_2pages.pdf") + assert ds2.RasterXSize == 50, "wrong width" with gdaltest.error_handler(): - ds3 = gdal.Open('PDF:0:data/pdf/byte_and_rgbsmall_2pages.pdf') + ds3 = gdal.Open("PDF:0:data/pdf/byte_and_rgbsmall_2pages.pdf") assert ds3 is None with gdaltest.error_handler(): - ds3 = gdal.Open('PDF:3:data/pdf/byte_and_rgbsmall_2pages.pdf') + ds3 = gdal.Open("PDF:3:data/pdf/byte_and_rgbsmall_2pages.pdf") assert ds3 is None with gdaltest.error_handler(): - ds = gdal.Open('PDF:1:/does/not/exist.pdf') + ds = gdal.Open("PDF:1:/does/not/exist.pdf") assert ds is None + ############################################################################### # Test PAM metadata support def test_pdf_metadata(poppler_or_pdfium): - gdal.Translate('tmp/pdf_metadata.pdf', 'data/byte.tif', format='PDF', metadataOptions=['FOO=BAR']) - ds = gdal.Open('tmp/pdf_metadata.pdf') + gdal.Translate( + "tmp/pdf_metadata.pdf", + "data/byte.tif", + format="PDF", + metadataOptions=["FOO=BAR"], + ) + ds = gdal.Open("tmp/pdf_metadata.pdf") md = ds.GetMetadata() - assert 'FOO' in md + assert "FOO" in md ds = None - ds = gdal.Open('tmp/pdf_metadata.pdf') - assert ds.GetMetadataItem('FOO') == 'BAR' + ds = gdal.Open("tmp/pdf_metadata.pdf") + assert ds.GetMetadataItem("FOO") == "BAR" ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_metadata.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_metadata.pdf") + ############################################################################### # Test PAM georef support def test_pdf_pam_georef(poppler_or_pdfium): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") # Default behaviour should result in no PAM file - gdaltest.pdf_drv.CreateCopy('tmp/pdf_pam_georef.pdf', src_ds) - assert not os.path.exists('tmp/pdf_pam_georef.pdf.aux.xml') + gdaltest.pdf_drv.CreateCopy("tmp/pdf_pam_georef.pdf", src_ds) + assert not os.path.exists("tmp/pdf_pam_georef.pdf.aux.xml") # Now disable internal georeferencing, so georef should go to PAM - gdaltest.pdf_drv.CreateCopy('tmp/pdf_pam_georef.pdf', src_ds, options=['GEO_ENCODING=NONE']) - assert os.path.exists('tmp/pdf_pam_georef.pdf.aux.xml') + gdaltest.pdf_drv.CreateCopy( + "tmp/pdf_pam_georef.pdf", src_ds, options=["GEO_ENCODING=NONE"] + ) + assert os.path.exists("tmp/pdf_pam_georef.pdf.aux.xml") - ds = gdal.Open('tmp/pdf_pam_georef.pdf') + ds = gdal.Open("tmp/pdf_pam_georef.pdf") assert ds.GetGeoTransform() == src_ds.GetGeoTransform() assert ds.GetProjectionRef() == src_ds.GetProjectionRef() ds = None - gdal.GetDriverByName('PDF').Delete('tmp/pdf_pam_georef.pdf') + gdal.GetDriverByName("PDF").Delete("tmp/pdf_pam_georef.pdf") ############################################################################### @@ -1758,48 +2098,62 @@ def test_pdf_composition(): """ - gdal.FileFromMemBuffer("/vsimem/test.csv", - """id,WKT + gdal.FileFromMemBuffer( + "/vsimem/test.csv", + """id,WKT 1,"POLYGON((0.5 0.5,0.5 9.5,10 9.5,10 0.5,0.5 0.5))" 2,"POLYGON((10.5 0.5,10.5 4.5,20 4.5,20 0.5,10.5 0.5))" -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/test2.csv", - """id,link,WKT + gdal.FileFromMemBuffer( + "/vsimem/test2.csv", + """id,link,WKT 3,"http://gdal.org","POLYGON((10.5 5.5,10.5 9.5,20 9.5,20 5.5,10.5 5.5))" -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/sym.csv", -"""id,WKT,OGR_STYLE + gdal.FileFromMemBuffer( + "/vsimem/sym.csv", + """id,WKT,OGR_STYLE 1,"POINT(15 7)","SYMBOL(c:#00FF00,id:""ogr-sym-1"",s:1pt)" 2,"POINT(15 5)","SYMBOL(c:#00FF0077,id:""ogr-sym-1"",s:1pt)" 3,"POINT(15 3)","SYMBOL(id:""data/byte.tif"",s:1pt)" -""") +""", + ) - gdal.FileFromMemBuffer("/vsimem/label.csv", -"""id,WKT,OGR_STYLE + gdal.FileFromMemBuffer( + "/vsimem/label.csv", + """id,WKT,OGR_STYLE 1,"POINT(15 1)","LABEL(t:""foo"",s:1pt)" -""") +""", + ) out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) gdal.Unlink("/vsimem/test.csv") gdal.Unlink("/vsimem/test2.csv") gdal.Unlink("/vsimem/sym.csv") gdal.Unlink("/vsimem/label.csv") assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - f = open('data/pdf/test_pdf_composition.pdf', 'rb') + f = open("data/pdf/test_pdf_composition.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -1820,20 +2174,26 @@ def test_pdf_composition_raster_tiled_blending(): """ out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - f = open('data/pdf/test_pdf_composition_raster_tiled_blending.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_raster_tiled_blending.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -1853,31 +2213,42 @@ def test_pdf_composition_pdf_content(poppler_or_pdfium_or_podofo): """ out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" # Poppler output - f = open('data/pdf/test_pdf_composition_pdf_content.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_pdf_content.pdf", "rb") data_ref = f.read() f.close() # PDFium output - f = open('data/pdf/test_pdf_composition_pdf_content_pdfium.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_pdf_content_pdfium.pdf", "rb") data_ref_pdfium = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_got in (data_ref, data_ref_pdfium), 'content does not match reference content' + assert data_got in ( + data_ref, + data_ref_pdfium, + ), "content does not match reference content" gdal.Unlink(out_filename) -def test_pdf_composition_error_pdf_content_missing_filename(poppler_or_pdfium_or_podofo): +def test_pdf_composition_error_pdf_content_missing_filename( + poppler_or_pdfium_or_podofo, +): xml_content = """ @@ -1891,10 +2262,16 @@ def test_pdf_composition_error_pdf_content_missing_filename(poppler_or_pdfium_or out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing dataset' + assert gdal.GetLastErrorMsg() == "Missing dataset" gdal.Unlink(out_filename) @@ -1912,14 +2289,22 @@ def test_pdf_composition_error_pdf_content_non_existing(poppler_or_pdfium_or_pod out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == '/vsimem/non_existing.pdf is not a valid PDF file' + assert gdal.GetLastErrorMsg() == "/vsimem/non_existing.pdf is not a valid PDF file" gdal.Unlink(out_filename) -def test_pdf_composition_error_pdf_content_missing_contents(poppler_or_pdfium_or_podofo): +def test_pdf_composition_error_pdf_content_missing_contents( + poppler_or_pdfium_or_podofo, +): xml_content = """ @@ -1933,14 +2318,22 @@ def test_pdf_composition_error_pdf_content_missing_contents(poppler_or_pdfium_or out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing Contents' + assert gdal.GetLastErrorMsg() == "Missing Contents" gdal.Unlink(out_filename) -def test_pdf_composition_error_pdf_content_missing_contents_stream(poppler_or_pdfium_or_podofo): +def test_pdf_composition_error_pdf_content_missing_contents_stream( + poppler_or_pdfium_or_podofo, +): xml_content = """ @@ -1954,14 +2347,25 @@ def test_pdf_composition_error_pdf_content_missing_contents_stream(poppler_or_pd out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() in ('Missing Contents stream', 'data/pdf/missing_stream.pdf is not a valid PDF file') + assert gdal.GetLastErrorMsg() in ( + "Missing Contents stream", + "data/pdf/missing_stream.pdf is not a valid PDF file", + ) gdal.Unlink(out_filename) -def test_pdf_composition_error_pdf_content_missing_resources(poppler_or_pdfium_or_podofo): +def test_pdf_composition_error_pdf_content_missing_resources( + poppler_or_pdfium_or_podofo, +): xml_content = """ @@ -1975,10 +2379,16 @@ def test_pdf_composition_error_pdf_content_missing_resources(poppler_or_pdfium_o out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing Resources' + assert gdal.GetLastErrorMsg() == "Missing Resources" gdal.Unlink(out_filename) @@ -2009,21 +2419,27 @@ def test_pdf_composition_raster_georeferenced(): """ out_filename = "tmp/tmp.pdf" - with gdaltest.config_option('PDF_COORD_DOUBLE_PRECISION', '12'): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + with gdaltest.config_option("PDF_COORD_DOUBLE_PRECISION", "12"): + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - f = open('data/pdf/test_pdf_composition_raster_georeferenced.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_raster_georeferenced.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -2057,37 +2473,43 @@ def test_pdf_composition_vector_georeferenced(): """ - ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource('/vsimem/test.shp') + ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("/vsimem/test.shp") srs = osr.SpatialReference() srs.ImportFromEPSG(4326) - lyr = ds.CreateLayer('test', srs = srs) - lyr.CreateField(ogr.FieldDefn('OGR_STYLE')) + lyr = ds.CreateLayer("test", srs=srs) + lyr.CreateField(ogr.FieldDefn("OGR_STYLE")) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2.5 49.5)')) - f['OGR_STYLE'] = 'SYMBOL(c:#00FF00,id:"ogr-sym-1",s:1pt);LABEL(t:"foo",s:12pt)' + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(2.5 49.5)")) + f["OGR_STYLE"] = 'SYMBOL(c:#00FF00,id:"ogr-sym-1",s:1pt);LABEL(t:"foo",s:12pt)' lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) ds = None out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource('/vsimem/test.shp') + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("/vsimem/test.shp") - f = open('data/pdf/test_pdf_composition_vector_georeferenced.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_vector_georeferenced.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -2121,37 +2543,45 @@ def test_pdf_composition_vector_georeferenced_reprojected(): """ - ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource('/vsimem/test.shp') + ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("/vsimem/test.shp") srs = osr.SpatialReference() srs.ImportFromEPSG(32631) - lyr = ds.CreateLayer('test', srs = srs) - lyr.CreateField(ogr.FieldDefn('OGR_STYLE')) + lyr = ds.CreateLayer("test", srs=srs) + lyr.CreateField(ogr.FieldDefn("OGR_STYLE")) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(463796.280705071 5483160.94881072)')) - f['OGR_STYLE'] = 'SYMBOL(c:#00FF00,id:"ogr-sym-1",s:1pt);LABEL(t:"foo",s:12pt)' + f.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("POINT(463796.280705071 5483160.94881072)") + ) + f["OGR_STYLE"] = 'SYMBOL(c:#00FF00,id:"ogr-sym-1",s:1pt);LABEL(t:"foo",s:12pt)' lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) ds = None out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource('/vsimem/test.shp') + ogr.GetDriverByName("ESRI Shapefile").DeleteDataSource("/vsimem/test.shp") - f = open('data/pdf/test_pdf_composition_vector_georeferenced.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_vector_georeferenced.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -2180,20 +2610,28 @@ def test_pdf_composition_layer_tree_displayOnlyOnVisiblePages(): """ out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - f = open('data/pdf/test_pdf_composition_layer_tree_displayOnlyOnVisiblePages.pdf', 'rb') + f = open( + "data/pdf/test_pdf_composition_layer_tree_displayOnlyOnVisiblePages.pdf", "rb" + ) data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -2268,20 +2706,26 @@ def test_pdf_composition_outline(): """ out_filename = "tmp/tmp.pdf" - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert out_ds - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" - f = open('data/pdf/test_pdf_composition_outline.pdf', 'rb') + f = open("data/pdf/test_pdf_composition_outline.pdf", "rb") data_ref = f.read() f.close() - f = open(out_filename, 'rb') + f = open(out_filename, "rb") data_got = f.read() f.close() - assert data_ref == data_got, 'content does not match reference content' + assert data_ref == data_got, "content does not match reference content" gdal.Unlink(out_filename) @@ -2290,8 +2734,14 @@ def test_pdf_composition_error_missing_file(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=/vsimem/missing.xml']) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=/vsimem/missing.xml"], + ) assert not out_ds assert gdal.GetLastErrorMsg() == "Cannot open file '/vsimem/missing.xml'" gdal.Unlink(out_filename) @@ -2303,10 +2753,16 @@ def test_pdf_composition_error_missing_page(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'At least one page should be defined' + assert gdal.GetLastErrorMsg() == "At least one page should be defined" gdal.Unlink(out_filename) @@ -2316,10 +2772,16 @@ def test_pdf_composition_error_missing_page_width(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing or invalid Width and/or Height' + assert gdal.GetLastErrorMsg() == "Missing or invalid Width and/or Height" gdal.Unlink(out_filename) @@ -2329,10 +2791,16 @@ def test_pdf_composition_error_missing_page_content(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing Content' + assert gdal.GetLastErrorMsg() == "Missing Content" gdal.Unlink(out_filename) @@ -2347,10 +2815,16 @@ def test_pdf_composition_error_invalid_layer_missing_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing id attribute in Layer' + assert gdal.GetLastErrorMsg() == "Missing id attribute in Layer" gdal.Unlink(out_filename) @@ -2365,10 +2839,16 @@ def test_pdf_composition_error_invalid_layer_missing_name(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing name attribute in Layer' + assert gdal.GetLastErrorMsg() == "Missing name attribute in Layer" gdal.Unlink(out_filename) @@ -2384,10 +2864,16 @@ def test_pdf_composition_error_duplicate_layer_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Layer.id = foo is not unique' + assert gdal.GetLastErrorMsg() == "Layer.id = foo is not unique" gdal.Unlink(out_filename) @@ -2407,10 +2893,16 @@ def test_pdf_composition_error_referencing_invalid_layer_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Referencing layer of unknown id: nonexisting' + assert gdal.GetLastErrorMsg() == "Referencing layer of unknown id: nonexisting" gdal.Unlink(out_filename) @@ -2437,10 +2929,16 @@ def test_pdf_composition_error_missing_srs(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing SRS' + assert gdal.GetLastErrorMsg() == "Missing SRS" gdal.Unlink(out_filename) @@ -2465,10 +2963,16 @@ def test_pdf_composition_error_missing_control_point(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'At least 4 ControlPoint are required' + assert gdal.GetLastErrorMsg() == "At least 4 ControlPoint are required" gdal.Unlink(out_filename) @@ -2495,10 +2999,19 @@ def test_pdf_composition_error_missing_attribute_in_control_point(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'At least one of x, y, GeoX or GeoY attribute missing on ControlPoint' + assert ( + gdal.GetLastErrorMsg() + == "At least one of x, y, GeoX or GeoY attribute missing on ControlPoint" + ) gdal.Unlink(out_filename) @@ -2525,10 +3038,16 @@ def test_pdf_composition_error_invalid_bbox(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Invalid BoundingBox' + assert gdal.GetLastErrorMsg() == "Invalid BoundingBox" gdal.Unlink(out_filename) @@ -2545,10 +3064,16 @@ def test_pdf_composition_error_missing_dataset_attribute(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing dataset' + assert gdal.GetLastErrorMsg() == "Missing dataset" gdal.Unlink(out_filename) @@ -2565,10 +3090,16 @@ def test_pdf_composition_error_invalid_dataset(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.Unlink(out_filename) @@ -2590,10 +3121,16 @@ def test_pdf_composition_duplicate_page_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Duplicated page id 1' + assert gdal.GetLastErrorMsg() == "Duplicated page id 1" gdal.Unlink(out_filename) @@ -2618,10 +3155,16 @@ def test_pdf_composition_outline_item_gotopage_action_missing_page_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing pageId attribute in GotoPageAction' + assert gdal.GetLastErrorMsg() == "Missing pageId attribute in GotoPageAction" gdal.Unlink(out_filename) @@ -2646,10 +3189,19 @@ def test_pdf_composition_outline_item_gotopage_action_pointing_to_invalid_page_i out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'GotoPageAction.pageId = non_existing not pointing to a Page.id' + assert ( + gdal.GetLastErrorMsg() + == "GotoPageAction.pageId = non_existing not pointing to a Page.id" + ) gdal.Unlink(out_filename) @@ -2674,10 +3226,16 @@ def test_pdf_composition_outline_item_setlayerstate_missing_layer_id(): out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Missing layerId' + assert gdal.GetLastErrorMsg() == "Missing layerId" gdal.Unlink(out_filename) @@ -2702,8 +3260,14 @@ def test_pdf_composition_outline_item_setlayerstate_pointing_to_invalid_layer_id out_filename = "/vsimem/tmp.pdf" with gdaltest.error_handler(): - out_ds = gdaltest.pdf_drv.Create(out_filename, 0, 0, 0, gdal.GDT_Unknown, - options = ['COMPOSITION_FILE=' + xml_content]) + out_ds = gdaltest.pdf_drv.Create( + out_filename, + 0, + 0, + 0, + gdal.GDT_Unknown, + options=["COMPOSITION_FILE=" + xml_content], + ) assert not out_ds - assert gdal.GetLastErrorMsg() == 'Referencing layer of unknown id: non_existing' + assert gdal.GetLastErrorMsg() == "Referencing layer of unknown id: non_existing" gdal.Unlink(out_filename) diff --git a/autotest/gdrivers/pds.py b/autotest/gdrivers/pds.py index 16fbe9ba40e0..e10e304365f1 100755 --- a/autotest/gdrivers/pds.py +++ b/autotest/gdrivers/pds.py @@ -30,36 +30,42 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import osr - import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Read a truncated and modified version of http://download.osgeo.org/gdal/data/pds/mc02.img def test_pds_1(): - tst = gdaltest.GDALTest('PDS', 'pds/mc02_truncated.img', 1, 47151) + tst = gdaltest.GDALTest("PDS", "pds/mc02_truncated.img", 1, 47151) expected_prj = """PROJCS["SIMPLE_CYLINDRICAL MARS",GEOGCS["GCS_MARS",DATUM["D_MARS",SPHEROID[""MARS"",3396000,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],PARAMETER["pseudo_standard_parallel_1",0],UNIT["metre",1]]""" - expected_gt = (-10668384.903788566589355, 926.115274429321289, 0, 3852176.483988761901855, 0, -926.115274429321289) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') - tst.testOpen(check_prj=expected_prj, - check_gt=expected_gt) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) + expected_gt = ( + -10668384.903788566589355, + 926.115274429321289, + 0, + 3852176.483988761901855, + 0, + -926.115274429321289, + ) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "-0.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "-0.5") + tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) ############################################################################### # Read a truncated and modified version of ftp://pdsimage2.wr.usgs.gov/cdroms/magellan/mg_1103/fl78n018/fl73n003.img + def test_pds_2(): - tst = gdaltest.GDALTest('PDS', 'pds/fl73n003_truncated.img', 1, 34962) + tst = gdaltest.GDALTest("PDS", "pds/fl73n003_truncated.img", 1, 34962) expected_prj = """PROJCS["SINUSOIDAL VENUS", GEOGCS["GCS_VENUS", DATUM["D_VENUS", @@ -70,23 +76,30 @@ def test_pds_2(): PARAMETER["longitude_of_center",18], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["metre",1]]""" - expected_gt = (587861.55900404998, 75.000002980232239, 0.0, -7815243.4746123618, 0.0, -75.000002980232239) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') - tst.testOpen(check_prj=expected_prj, - check_gt=expected_gt) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) - - ds = gdal.Open('data/pds/fl73n003_truncated.img') + expected_gt = ( + 587861.55900404998, + 75.000002980232239, + 0.0, + -7815243.4746123618, + 0.0, + -75.000002980232239, + ) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "-0.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "-0.5") + tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) + + ds = gdal.Open("data/pds/fl73n003_truncated.img") assert ds.GetRasterBand(1).GetNoDataValue() == 7 assert ds.GetRasterBand(1).GetScale() == 0.2 assert ds.GetRasterBand(1).GetOffset() == -20.2 # Per #3939 we would also like to test a dataset with MISSING_CONSTANT. - ds = gdal.Open('data/pds/fl73n003_alt_truncated.img') + ds = gdal.Open("data/pds/fl73n003_alt_truncated.img") assert ds.GetRasterBand(1).GetNoDataValue() == 7 + ############################################################################### # Read a truncated and modified version of ftp://pdsimage2.wr.usgs.gov/cdroms/messenger/MSGRMDS_1001/DATA/2004_232/EN0001426030M.IMG # 16bits image @@ -95,31 +108,40 @@ def test_pds_2(): def test_pds_3(): # Shut down warning about missing projection - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") - tst = gdaltest.GDALTest('PDS', 'pds/EN0001426030M_truncated.IMG', 1, 1367) + tst = gdaltest.GDALTest("PDS", "pds/EN0001426030M_truncated.IMG", 1, 1367) gt_expected = (0, 1, 0, 0, 0, 1) tst.testOpen(check_gt=gt_expected) - ds = gdal.Open('data/pds/EN0001426030M_truncated.IMG') + ds = gdal.Open("data/pds/EN0001426030M_truncated.IMG") assert ds.GetRasterBand(1).GetNoDataValue() == 0 gdal.PopErrorHandler() + ############################################################################### # Read a hacked example of reading a detached file with an offset #3177. def test_pds_4(): - tst = gdaltest.GDALTest('PDS', 'pds/pds_3177.lbl', 1, 3418) - gt_expected = (6119184.3590369327, 1.0113804322107001, 0.0, -549696.39009125973, 0.0, -1.0113804322107001) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') + tst = gdaltest.GDALTest("PDS", "pds/pds_3177.lbl", 1, 3418) + gt_expected = ( + 6119184.3590369327, + 1.0113804322107001, + 0.0, + -549696.39009125973, + 0.0, + -1.0113804322107001, + ) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "-0.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "-0.5") tst.testOpen(check_gt=gt_expected) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) + ############################################################################### # Read a hacked example of reading a detached file with an offset #3355. @@ -127,9 +149,10 @@ def test_pds_4(): def test_pds_5(): - tst = gdaltest.GDALTest('PDS', 'pds/pds_3355.lbl', 1, 2748) + tst = gdaltest.GDALTest("PDS", "pds/pds_3355.lbl", 1, 2748) return tst.testOpen() + ############################################################################### # Read an image via the PDS label. This is a distinct mode of the PDS # driver mostly intended to support jpeg2000 files with PDS labels. @@ -137,40 +160,46 @@ def test_pds_5(): def test_pds_6(): - if os.path.exists('data/byte.tif.aux.xml'): - os.unlink('data/byte.tif.aux.xml') + if os.path.exists("data/byte.tif.aux.xml"): + os.unlink("data/byte.tif.aux.xml") - tst = gdaltest.GDALTest('PDS', 'pds/ESP_013951_1955_RED.LBL', 1, 4672) + tst = gdaltest.GDALTest("PDS", "pds/ESP_013951_1955_RED.LBL", 1, 4672) gt_expected = (-6139197.5, 0.5, 0.0, 936003.0, 0.0, -0.5) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "-0.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "-0.5") tst.testOpen(check_gt=gt_expected) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) - ds = gdal.Open('data/pds/ESP_013951_1955_RED.LBL') + ds = gdal.Open("data/pds/ESP_013951_1955_RED.LBL") - assert len(ds.GetFileList()) == 2, 'failed to get expected file list.' + assert len(ds.GetFileList()) == 2, "failed to get expected file list." expected_wkt = 'PROJCS["EQUIRECTANGULAR MARS",GEOGCS["GCS_MARS",DATUM["D_MARS",SPHEROID["MARS_localRadius",3394839.8133163,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Equirectangular"],PARAMETER["standard_parallel_1",15],PARAMETER["central_meridian",180],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' wkt = ds.GetProjection() if expected_wkt != wkt: - print('Got: ', wkt) - print('Exp: ', expected_wkt) - pytest.fail('did not get expected coordinate system.') + print("Got: ", wkt) + print("Exp: ", expected_wkt) + pytest.fail("did not get expected coordinate system.") + - ############################################################################### # Read an uncompressed image via the PDS label. (#3943) def test_pds_7(): - tst = gdaltest.GDALTest('PDS', 'pds/LDEM_4.LBL', 1, 50938, - 0, 0, 1440, 2) - gt_expected = (-5450622.3254203796, 7580.8377265930176, 0.0, 2721520.7438468933, 0.0, -7580.8377265930176) + tst = gdaltest.GDALTest("PDS", "pds/LDEM_4.LBL", 1, 50938, 0, 0, 1440, 2) + gt_expected = ( + -5450622.3254203796, + 7580.8377265930176, + 0.0, + 2721520.7438468933, + 0.0, + -7580.8377265930176, + ) prj_expected = """PROJCS["SIMPLE_CYLINDRICAL MOON", GEOGCS["GCS_MOON", DATUM["D_MOON", @@ -184,12 +213,12 @@ def test_pds_7(): PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["metre",1]]""" - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') - tst.testOpen(check_prj=prj_expected, - check_gt=gt_expected) - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "-0.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "-0.5") + tst.testOpen(check_prj=prj_expected, check_gt=gt_expected) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) + ############################################################################### # Test applying adjustment offsets via configuration variables for the @@ -199,25 +228,33 @@ def test_pds_7(): def test_pds_8(): # values for MAGELLAN FMAP data. - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '1.5') - gdal.SetConfigOption('PDS_LineProjOffset_Shift', '1.5') - gdal.SetConfigOption('PDS_SampleProjOffset_Mult', '1.0') - gdal.SetConfigOption('PDS_LineProjOffset_Mult', '-1.0') - - tst = gdaltest.GDALTest('PDS', 'pds/mc02_truncated.img', 1, 47151) - - expected_gt = (10670237.134337425, 926.11527442932129, 0.0, -3854028.7145376205, 0.0, -926.11527442932129) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", "1.5") + gdal.SetConfigOption("PDS_LineProjOffset_Shift", "1.5") + gdal.SetConfigOption("PDS_SampleProjOffset_Mult", "1.0") + gdal.SetConfigOption("PDS_LineProjOffset_Mult", "-1.0") + + tst = gdaltest.GDALTest("PDS", "pds/mc02_truncated.img", 1, 47151) + + expected_gt = ( + 10670237.134337425, + 926.11527442932129, + 0.0, + -3854028.7145376205, + 0.0, + -926.11527442932129, + ) result = tst.testOpen(check_gt=expected_gt) # clear config settings - gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) - gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) - gdal.SetConfigOption('PDS_SampleProjOffset_Mult', None) - gdal.SetConfigOption('PDS_LineProjOffset_Mult', None) + gdal.SetConfigOption("PDS_SampleProjOffset_Shift", None) + gdal.SetConfigOption("PDS_LineProjOffset_Shift", None) + gdal.SetConfigOption("PDS_SampleProjOffset_Mult", None) + gdal.SetConfigOption("PDS_LineProjOffset_Mult", None) return result + ############################################################################### # Test a PDS with an image compressed in a ZIP, and with nodata expressed as # an hexadecimal floating point value (#3939) @@ -226,25 +263,27 @@ def test_pds_8(): def test_pds_9(): # Derived from http://pdsimage.wr.usgs.gov/data/co-v_e_j_s-radar-3-sbdr-v1.0/CORADR_0035/DATA/BIDR/BIEQI49N071_D035_T00AS01_V02.LBL - tst = gdaltest.GDALTest('PDS', 'pds/PDS_WITH_ZIP_IMG.LBL', 1, 0) + tst = gdaltest.GDALTest("PDS", "pds/PDS_WITH_ZIP_IMG.LBL", 1, 0) tst.testOpen() - ds = gdal.Open('data/pds/PDS_WITH_ZIP_IMG.LBL') + ds = gdal.Open("data/pds/PDS_WITH_ZIP_IMG.LBL") got_nd = ds.GetRasterBand(1).GetNoDataValue() - expected_nd = -3.40282265508890445e+38 + expected_nd = -3.40282265508890445e38 assert abs((got_nd - expected_nd) / expected_nd) <= 1e-5 assert ds.GetProjectionRef() + ############################################################################### # Test PDS label with nested arrays (#6970) def test_pds_10(): - gdal.FileFromMemBuffer('/vsimem/pds_10', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/pds_10", + """PDS_VERSION_ID = "PDS3" DATA_FORMAT = "PDS" ^IMAGE = 1 @@ -262,36 +301,43 @@ def test_pds_10(): END_OBJECT = IMAGE END -""") +""", + ) - ds = gdal.Open('/vsimem/pds_10') + ds = gdal.Open("/vsimem/pds_10") - assert ds.GetMetadataItem('NOTE') == '((1,2,3))' + assert ds.GetMetadataItem("NOTE") == "((1,2,3))" - assert ds.GetMetadataItem('PRODUCT_ID') == '({1,2},{3,4})', \ - ds.GetMetadataItem('NOTE') + assert ds.GetMetadataItem("PRODUCT_ID") == "({1,2},{3,4})", ds.GetMetadataItem( + "NOTE" + ) - gdal.FileFromMemBuffer('/vsimem/pds_10', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/pds_10", + """PDS_VERSION_ID = "PDS3" # Unpaired NOTE = (x, y} END -""") +""", + ) with gdaltest.error_handler(): - gdal.Open('/vsimem/pds_10') + gdal.Open("/vsimem/pds_10") - gdal.FileFromMemBuffer('/vsimem/pds_10', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/pds_10", + """PDS_VERSION_ID = "PDS3" # Unpaired NOTE = {x, y) END -""") +""", + ) with gdaltest.error_handler(): - gdal.Open('/vsimem/pds_10') + gdal.Open("/vsimem/pds_10") + + gdal.Unlink("/vsimem/pds_10") - gdal.Unlink('/vsimem/pds_10') ############################################################################### # Read a hacked example of reading an image where the line offset is not @@ -301,7 +347,7 @@ def test_pds_10(): def test_pds_line_offset_not_multiple_of_record(): - tst = gdaltest.GDALTest('PDS', 'pds/map_000_038_truncated.lbl', 1, 14019) + tst = gdaltest.GDALTest("PDS", "pds/map_000_038_truncated.lbl", 1, 14019) return tst.testOpen() @@ -310,13 +356,15 @@ def test_pds_line_offset_not_multiple_of_record(): # Test ability of using OBJECT = FILE section to support CRISM # as well as BAND_STORAGE_TYPE = LINE_INTERLEAVED + def test_pds_band_storage_type_line_interleaved(): - tst = gdaltest.GDALTest('PDS', 'pds/hsp00017ba0_01_ra218s_trr3_truncated.lbl', 1, 64740) + tst = gdaltest.GDALTest( + "PDS", "pds/hsp00017ba0_01_ra218s_trr3_truncated.lbl", 1, 64740 + ) return tst.testOpen() - def test_pds_oblique_cylindrical_read(): # This dataset is a champion in its category. It features: @@ -325,11 +373,16 @@ def test_pds_oblique_cylindrical_read(): # - oblique cylindrical projection # https://pds-imaging.jpl.nasa.gov/data/cassini/cassini_orbiter/CORADR_0101_V03/DATA/BIDR/BIBQH03N123_D101_T020S03_V03.LBL - ds = gdal.Open('data/pds/BIBQH03N123_D101_T020S03_V03_truncated.IMG') + ds = gdal.Open("data/pds/BIBQH03N123_D101_T020S03_V03_truncated.IMG") srs = ds.GetSpatialRef() - assert srs.ExportToProj4() == '+proj=ob_tran +R=2575000 +o_proj=eqc +o_lon_p=-257.744003 +o_lat_p=120.374532 +lon_0=-303.571748 +wktext +no_defs' + assert ( + srs.ExportToProj4() + == "+proj=ob_tran +R=2575000 +o_proj=eqc +o_lon_p=-257.744003 +o_lat_p=120.374532 +lon_0=-303.571748 +wktext +no_defs" + ) gt = ds.GetGeoTransform() - assert gt == pytest.approx((-5347774.07796, 0, 351.11116, -2561707.02336, 351.11116, 0)) + assert gt == pytest.approx( + (-5347774.07796, 0, 351.11116, -2561707.02336, 351.11116, 0) + ) geog_srs = srs.CloneGeogCS() ct = osr.CoordinateTransformation(srs, geog_srs) @@ -349,24 +402,26 @@ def to_lon_lat(pixel, line): # WESTERNMOST_LONGITUDE = 169.8235459 _, lat = to_lon_lat(0, 0) - assert lat == pytest.approx(-31.097321393323572) # MINIMUM_LATITUDE + assert lat == pytest.approx(-31.097321393323572) # MINIMUM_LATITUDE lon, _ = to_lon_lat(ds.RasterXSize, 0) - assert lon == pytest.approx(-169.8290961385244) # WESTERNMOST_LONGITUDE * -1 + assert lon == pytest.approx(-169.8290961385244) # WESTERNMOST_LONGITUDE * -1 _, lat = to_lon_lat(0, ds.RasterYSize) - assert lat == pytest.approx(-31.421452666874025) # MINIMUM_LATITUDE + assert lat == pytest.approx(-31.421452666874025) # MINIMUM_LATITUDE lon, _ = to_lon_lat(ds.RasterXSize, ds.RasterYSize) - assert lon == pytest.approx(-75.787124149033) # EASTERNMOST_LONGITUDE * -1 + assert lon == pytest.approx(-75.787124149033) # EASTERNMOST_LONGITUDE * -1 ############################################################################### + def test_pds_sharp_on_continuing_line(): - gdal.FileFromMemBuffer('/vsimem/test', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/test", + """PDS_VERSION_ID = "PDS3" NOTE = (#9933FF, #FFFF33) @@ -382,21 +437,24 @@ def test_pds_sharp_on_continuing_line(): END_OBJECT = IMAGE END -""") +""", + ) - ds = gdal.Open('/vsimem/test') + ds = gdal.Open("/vsimem/test") - assert ds.GetMetadataItem('NOTE') == '(#9933FF,#FFFF33)' + assert ds.GetMetadataItem("NOTE") == "(#9933FF,#FFFF33)" - gdal.Unlink('/vsimem/test') + gdal.Unlink("/vsimem/test") ############################################################################### + def test_pds_sharp_comma_continuing_line(): - gdal.FileFromMemBuffer('/vsimem/test', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/test", + """PDS_VERSION_ID = "PDS3" NOTE = ("a" ,"b") @@ -412,22 +470,24 @@ def test_pds_sharp_comma_continuing_line(): END_OBJECT = IMAGE END -""") +""", + ) - ds = gdal.Open('/vsimem/test') + ds = gdal.Open("/vsimem/test") - assert ds.GetMetadataItem('NOTE') == '("a","b")' + assert ds.GetMetadataItem("NOTE") == '("a","b")' - gdal.Unlink('/vsimem/test') + gdal.Unlink("/vsimem/test") ############################################################################### # Test reading a Mercator_2SP dataset (#2490) + def test_pds_mercator_2SP(): # Dataset from https://sbnarchive.psi.edu/pds3/dawn/fc/DWNCLCFC2_2/DATA/CE_LAMO_Q_00N_036E_MER_CLR.IMG - ds = gdal.Open('data/pds/CE_LAMO_Q_00N_036E_MER_CLR_truncated.IMG') + ds = gdal.Open("data/pds/CE_LAMO_Q_00N_036E_MER_CLR_truncated.IMG") expected_wkt = """PROJCRS["MERCATOR 1_CERES", BASEGEOGCRS["GCS_1_CERES", DATUM["D_1_CERES", diff --git a/autotest/gdrivers/pds4.py b/autotest/gdrivers/pds4.py index 644005b35361..fa6d24f73edc 100755 --- a/autotest/gdrivers/pds4.py +++ b/autotest/gdrivers/pds4.py @@ -32,107 +32,142 @@ import os import struct - -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import gdaltest import pytest +from osgeo import gdal, ogr, osr + ############################################################################### # Validate XML file against schemas def validate_xml(filename): - if ogr.GetDriverByName('GMLAS') is None: + if ogr.GetDriverByName("GMLAS") is None: pytest.skip() # for GDAL 3.4 / PDS4_PDS_1G00 - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1G00.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1G00.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1G00.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1G00.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1G00_1950.xsd', - 'pds.nasa.gov_pds4_cart_v1_PDS4_CART_1G00_1950.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1G00_1950.xsd", + "pds.nasa.gov_pds4_cart_v1_PDS4_CART_1G00_1950.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1G00_1500.xsd', - 'pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1G00_1500.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1G00_1500.xsd", + "pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1G00_1500.xsd", + force_download=True, + ): pytest.skip() # Used by PDS4_CART_1G00_1950.xsd - if not gdaltest.download_file('https://pds.nasa.gov/pds4/geom/v1/PDS4_GEOM_1G00_1920.xsd', - 'pds.nasa.gov_pds4_geom_v1_PDS4_GEOM_1G00_1920.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/geom/v1/PDS4_GEOM_1G00_1920.xsd", + "pds.nasa.gov_pds4_geom_v1_PDS4_GEOM_1G00_1920.xsd", + force_download=True, + ): pytest.skip() # GDAL 3.3 - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1D00.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1D00.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1D00.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1D00.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1D00_1933.xsd', - 'pds.nasa.gov_pds4_cart_v1_PDS4_CART_1D00_1933.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1D00_1933.xsd", + "pds.nasa.gov_pds4_cart_v1_PDS4_CART_1D00_1933.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1B00.xsd', - 'pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1B00.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1B00.xsd", + "pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1B00.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B00.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B00.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B00.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B00.xsd", + force_download=True, + ): pytest.skip() # Needed by PDS4_CART_1D00_1933 - if not gdaltest.download_file('https://pds.nasa.gov/pds4/geom/v1/PDS4_GEOM_1B10_1700.xsd', - 'pds.nasa.gov_pds4_geom_v1_PDS4_GEOM_1B10_1700.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/geom/v1/PDS4_GEOM_1B10_1700.xsd", + "pds.nasa.gov_pds4_geom_v1_PDS4_GEOM_1B10_1700.xsd", + force_download=True, + ): pytest.skip() - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B10.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B10.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B10.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B10.xsd", + force_download=True, + ): pytest.skip() # Older schemas - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1800.xsd', - force_download=True): + 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): + 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): + 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']) + ds = gdal.OpenEx( + "GMLAS:" + filename, + open_options=[ + "VALIDATE=YES", + "FAIL_IF_VALIDATION_ERROR=YES", + "CONFIG_FILE=falsetmp/cache", + ], + ) return ds is not None + ############################################################################### # Perform simple read test on PDS4 dataset. -@pytest.mark.parametrize("filename", ['pds4/byte_pds4_cart_1700.xml', - 'pds4/byte_pds4_cart_1b00.xml', - 'pds4/byte_pds4_cart_1d00_1933.xml', - 'pds4/byte_pds4_cart_1g00_1950.xml']) + +@pytest.mark.parametrize( + "filename", + [ + "pds4/byte_pds4_cart_1700.xml", + "pds4/byte_pds4_cart_1b00.xml", + "pds4/byte_pds4_cart_1d00_1933.xml", + "pds4/byte_pds4_cart_1g00_1950.xml", + ], +) def test_pds4_read_cart_versions(filename): srs = """PROJCS["Transverse Mercator Earth", GEOGCS["GCS_Earth", @@ -149,16 +184,17 @@ def test_pds4_read_cart_versions(filename): """ gt = (-59280.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) - tst = gdaltest.GDALTest('PDS4', filename, 1, 4672) + tst = gdaltest.GDALTest("PDS4", filename, 1, 4672) return tst.testOpen(check_prj=srs, check_gt=gt) + ############################################################################### # hide_substitution_warnings_error_handler() def hide_substitution_warnings_error_handler_cbk(typ, errno, msg): # pylint: disable=unused-argument - if 'substituted' not in msg and 'VAR_TITLE not defined' not in msg: + if "substituted" not in msg and "VAR_TITLE not defined" not in msg: print(msg) @@ -170,13 +206,14 @@ def hide_substitution_warnings_error_handler(): finally: gdal.PopErrorHandler() + ############################################################################### # Test CreateCopy() with defaults def test_pds4_2(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053) + tst = gdaltest.GDALTest("PDS4", "rgbsmall.tif", 2, 21053) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret @@ -185,21 +222,21 @@ def test_pds4_2(): ############################################################################### def test_pds4_write_utm(): - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") with gdaltest.error_handler(): - gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/temp.xml', src_ds) - ds = gdal.Open('/vsimem/temp.xml') + gdal.GetDriverByName("PDS4").CreateCopy("/vsimem/temp.xml", src_ds) + ds = gdal.Open("/vsimem/temp.xml") assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - f = gdal.VSIFOpenL('/vsimem/temp.xml', 'rb') + f = gdal.VSIFOpenL("/vsimem/temp.xml", "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) assert '-117.6411686' in data, data assert '-117.6281108' in data, data assert '33.90241956' in data, data assert '33.891530168' in data, data - gdal.GetDriverByName('PDS4').Delete('/vsimem/temp.xml') + gdal.GetDriverByName("PDS4").Delete("/vsimem/temp.xml") ############################################################################### @@ -208,92 +245,125 @@ def test_pds4_write_utm(): def test_pds4_3(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BSQ']) + tst = gdaltest.GDALTest( + "PDS4", "rgbsmall.tif", 2, 21053, options=["INTERLEAVE=BSQ"] + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIP def test_pds4_4(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIP']) + tst = gdaltest.GDALTest( + "PDS4", "rgbsmall.tif", 2, 21053, options=["INTERLEAVE=BIP"] + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIL def test_pds4_5(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIL']) + tst = gdaltest.GDALTest( + "PDS4", "rgbsmall.tif", 2, 21053, options=["INTERLEAVE=BIL"] + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BSQ and IMAGE_FORMAT=GEOTIFF def test_pds4_6(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BSQ', 'IMAGE_FORMAT=GEOTIFF']) + tst = gdaltest.GDALTest( + "PDS4", + "rgbsmall.tif", + 2, + 21053, + options=["INTERLEAVE=BSQ", "IMAGE_FORMAT=GEOTIFF"], + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIP and IMAGE_FORMAT=GEOTIFF def test_pds4_7(): - tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIP', 'IMAGE_FORMAT=GEOTIFF']) + tst = gdaltest.GDALTest( + "PDS4", + "rgbsmall.tif", + 2, + 21053, + options=["INTERLEAVE=BIP", "IMAGE_FORMAT=GEOTIFF"], + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test CreateCopy() from BIL to IMAGE_FORMAT=GEOTIFF doesn't result in error def test_pds4_from_bil_to_geotiff(): - tst = gdaltest.GDALTest('PDS4', 'envi/envi_rgbsmall_bil.img', 2, 20669, options=['IMAGE_FORMAT=GEOTIFF']) + tst = gdaltest.GDALTest( + "PDS4", "envi/envi_rgbsmall_bil.img", 2, 20669, options=["IMAGE_FORMAT=GEOTIFF"] + ) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret + ############################################################################### # Test SRS support -@pytest.mark.parametrize('proj4str', ['+proj=eqc +lat_ts=43.75 +lat_0=10 +lon_0=-112.5 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=lcc +lat_1=10 +lat_0=10 +lon_0=-112.5 +k_0=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # LCC_1SP - '+proj=lcc +lat_0=10 +lon_0=-112.5 +lat_1=9 +lat_2=11 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # LCC_2SP - '+proj=omerc +lat_0=10 +lonc=11 +alpha=12 +gamma=12 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Oblique Mercator Azimuth Center - '+proj=omerc +lat_0=10 +lat_1=12 +lon_1=11 +lat_2=14 +lon_2=13 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Oblique Mercator 2 points - '+proj=stere +lat_0=90 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Polar Stereographic - '+proj=poly +lat_0=9 +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=sinu +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=tmerc +lat_0=11 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=merc +lat_ts=2 +lon_0=3 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=merc +lon_0=3 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=ortho +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - '+proj=laea +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', - ]) + +@pytest.mark.parametrize( + "proj4str", + [ + "+proj=eqc +lat_ts=43.75 +lat_0=10 +lon_0=-112.5 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=lcc +lat_1=10 +lat_0=10 +lon_0=-112.5 +k_0=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", # LCC_1SP + "+proj=lcc +lat_0=10 +lon_0=-112.5 +lat_1=9 +lat_2=11 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", # LCC_2SP + "+proj=omerc +lat_0=10 +lonc=11 +alpha=12 +gamma=12 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", # Oblique Mercator Azimuth Center + "+proj=omerc +lat_0=10 +lat_1=12 +lon_1=11 +lat_2=14 +lon_2=13 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", # Oblique Mercator 2 points + "+proj=stere +lat_0=90 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", # Polar Stereographic + "+proj=poly +lat_0=9 +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=sinu +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=tmerc +lat_0=11 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=merc +lat_ts=2 +lon_0=3 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=merc +lon_0=3 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=ortho +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + "+proj=laea +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs", + ], +) def test_pds4_projected_srs(proj4str): - options = ['VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr', - 'VAR_TARGET_TYPE=planet'] + options = [ + "VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr", + "VAR_TARGET_TYPE=planet", + ] - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=options) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, options=options) sr = osr.SpatialReference() sr.ImportFromProj4(proj4str) ds.SetProjection(sr.ExportToWkt()) @@ -302,52 +372,62 @@ def test_pds4_projected_srs(proj4str): ds = None ret = validate_xml(filename) - assert ret, ('validation of file for %s failed' % proj4str) + assert ret, "validation of file for %s failed" % proj4str ds = gdal.Open(filename) wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) got_proj4 = sr.ExportToProj4().strip() - assert got_proj4 == proj4str, '' + assert got_proj4 == proj4str, "" - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) def test_pds4_longlat_srs(): - options = ['VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr', - 'VAR_TARGET_TYPE=planet'] + options = [ + "VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr", + "VAR_TARGET_TYPE=planet", + ] - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" # longlat doesn't roundtrip as such - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=options) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, options=options) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') + sr.ImportFromProj4("+proj=longlat +R=2439400 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with gdaltest.error_handler(): ds = None ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" ds = gdal.Open(filename) wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) got_proj4 = sr.ExportToProj4().strip() - proj4 = '+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs' - assert got_proj4 == proj4, '' + proj4 = "+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs" + assert got_proj4 == proj4, "" got_gt = ds.GetGeoTransform() - expected_gt = (85151.12354629935, 42575.561773149675, 0.0, 2086202.5268843342, 0.0, -85151.12354629935) - assert max([abs(got_gt[i] - expected_gt[i]) for i in range(6)]) <= 1, '' + expected_gt = ( + 85151.12354629935, + 42575.561773149675, + 0.0, + 2086202.5268843342, + 0.0, + -85151.12354629935, + ) + assert max([abs(got_gt[i] - expected_gt[i]) for i in range(6)]) <= 1, "" ds = None - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) + ############################################################################### # Test nodata / mask @@ -355,7 +435,7 @@ def test_pds4_longlat_srs(): def test_pds4_9(): - ds = gdal.Open('data/pds4/byte_pds4_cart_1700.xml') + ds = gdal.Open("data/pds4/byte_pds4_cart_1700.xml") ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 74 @@ -363,19 +443,25 @@ def test_pds4_9(): assert cs == 4800 ds = None - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" # Test copy of all specialConstants - options = ['VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr', - 'VAR_TARGET_TYPE=planet'] + options = [ + "VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr", + "VAR_TARGET_TYPE=planet", + ] with hide_substitution_warnings_error_handler(): - gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', - format='PDS4', creationOptions=options) + gdal.Translate( + filename, + "data/pds4/byte_pds4_cart_1700.xml", + format="PDS4", + creationOptions=options, + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() @@ -386,16 +472,20 @@ def test_pds4_9(): ds = None - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" # Test copy of all specialConstants and override noData - for frmt in ['RAW', 'GEOTIFF']: + for frmt in ["RAW", "GEOTIFF"]: with hide_substitution_warnings_error_handler(): - gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', format='PDS4', - noData=75, - creationOptions=['IMAGE_FORMAT=' + frmt] + options) + gdal.Translate( + filename, + "data/pds4/byte_pds4_cart_1700.xml", + format="PDS4", + noData=75, + creationOptions=["IMAGE_FORMAT=" + frmt] + options, + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() @@ -410,14 +500,17 @@ def test_pds4_9(): ds = None # Test just setting noData - for frmt in ['RAW', 'GEOTIFF']: + for frmt in ["RAW", "GEOTIFF"]: with hide_substitution_warnings_error_handler(): - gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', format='PDS4', - creationOptions=['USE_SRC_LABEL=NO', - 'IMAGE_FORMAT=' + frmt] + options) + gdal.Translate( + filename, + "data/pds4/byte_pds4_cart_1700.xml", + format="PDS4", + creationOptions=["USE_SRC_LABEL=NO", "IMAGE_FORMAT=" + frmt] + options, + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() @@ -426,8 +519,9 @@ def test_pds4_9(): ds = None # Test filling with nodata - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['IMAGE_FORMAT=' + frmt] + options) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["IMAGE_FORMAT=" + frmt] + options + ) ds.GetRasterBand(1).SetNoDataValue(1) with hide_substitution_warnings_error_handler(): ds = None @@ -438,8 +532,9 @@ def test_pds4_9(): ds = None # Test setting nodata and then explicit Fill() - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['IMAGE_FORMAT=' + frmt] + options) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["IMAGE_FORMAT=" + frmt] + options + ) ds.GetRasterBand(1).SetNoDataValue(10) ds.GetRasterBand(1).Fill(1) with hide_substitution_warnings_error_handler(): @@ -450,10 +545,12 @@ def test_pds4_9(): assert cs == 1, frmt ds = None - template = '/vsimem/template.xml' + template = "/vsimem/template.xml" # Empty Special_Constants + optional Reference_List - gdal.FileFromMemBuffer(template, """ + gdal.FileFromMemBuffer( + template, + """ @@ -506,9 +603,11 @@ def test_pds4_9(): -""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template] + options) +""", + ) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + options + ) ds.GetRasterBand(1).SetNoDataValue(10) with hide_substitution_warnings_error_handler(): ds = None @@ -518,19 +617,21 @@ def test_pds4_9(): assert ndv == 10 ds = None - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert 'some comments' in data - assert '' in data - assert 'other comments' in data + assert "some comments" in data + assert "" in data + assert "other comments" in data ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" # Special_Constants with just saturated_constant - gdal.FileFromMemBuffer(template, """ + gdal.FileFromMemBuffer( + template, + """ @@ -576,9 +677,11 @@ def test_pds4_9(): -""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template] + options) +""", + ) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + options + ) ds.GetRasterBand(1).SetNoDataValue(10) with hide_substitution_warnings_error_handler(): ds = None @@ -589,27 +692,29 @@ def test_pds4_9(): ds = None ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) gdal.Unlink(template) + ############################################################################### # Test scale / offset def test_pds4_10(): - filename = '/vsimem/out.xml' - filename2 = '/vsimem/out2.xml' - for frmt in ['RAW', 'GEOTIFF']: - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['IMAGE_FORMAT=' + frmt]) + filename = "/vsimem/out.xml" + filename2 = "/vsimem/out2.xml" + for frmt in ["RAW", "GEOTIFF"]: + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["IMAGE_FORMAT=" + frmt] + ) ds.GetRasterBand(1).SetScale(2) ds.GetRasterBand(1).SetOffset(3) with hide_substitution_warnings_error_handler(): ds = None - gdal.Translate(filename2, filename, format='PDS4') + gdal.Translate(filename2, filename, format="PDS4") ds = gdal.Open(filename2) scale = ds.GetRasterBand(1).GetScale() @@ -618,8 +723,8 @@ def test_pds4_10(): assert offset == 3 ds = None - gdal.GetDriverByName('PDS4').Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename2) + gdal.GetDriverByName("PDS4").Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename2) ############################################################################### @@ -628,22 +733,24 @@ def test_pds4_10(): def test_pds4_11(): - filename = '/vsimem/out.xml' - for (dt, data) in [(gdal.GDT_Byte, struct.pack('B', 255)), - (gdal.GDT_UInt16, struct.pack('H', 65535)), - (gdal.GDT_Int16, struct.pack('h', -32768)), - (gdal.GDT_UInt32, struct.pack('I', 4000000000)), - (gdal.GDT_Int32, struct.pack('i', -2000000000)), - (gdal.GDT_Float32, struct.pack('f', 1.25)), - (gdal.GDT_Float64, struct.pack('d', 1.25)), - (gdal.GDT_CFloat32, struct.pack('ff', 1.25, 2.5)), - (gdal.GDT_CFloat64, struct.pack('dd', 1.25, 2.5))]: - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, dt) + filename = "/vsimem/out.xml" + for (dt, data) in [ + (gdal.GDT_Byte, struct.pack("B", 255)), + (gdal.GDT_UInt16, struct.pack("H", 65535)), + (gdal.GDT_Int16, struct.pack("h", -32768)), + (gdal.GDT_UInt32, struct.pack("I", 4000000000)), + (gdal.GDT_Int32, struct.pack("i", -2000000000)), + (gdal.GDT_Float32, struct.pack("f", 1.25)), + (gdal.GDT_Float64, struct.pack("d", 1.25)), + (gdal.GDT_CFloat32, struct.pack("ff", 1.25, 2.5)), + (gdal.GDT_CFloat64, struct.pack("dd", 1.25, 2.5)), + ]: + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, 1, dt) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, data) with hide_substitution_warnings_error_handler(): ds = None - with gdaltest.config_option('PDS4_FORCE_MASK', 'YES'): + with gdaltest.config_option("PDS4_FORCE_MASK", "YES"): ds = gdal.Open(filename) assert ds.GetRasterBand(1).DataType == dt got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) @@ -652,7 +759,8 @@ def test_pds4_11(): assert cs == 3, dt ds = None - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) + ############################################################################### # Test various creation options @@ -660,39 +768,58 @@ def test_pds4_11(): def test_pds4_12(): - filename = '/vsimem/out.xml' - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['VAR_LOGICAL_IDENTIFIER=logical_identifier', - 'VAR_TITLE=title', - 'VAR_INVESTIGATION_AREA_NAME=ian', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=ialr', - 'VAR_OBSERVING_SYSTEM_NAME=osn', - 'VAR_UNUSED=foo', - 'TEMPLATE=data/pds4/byte_pds4_cart_1700.xml', - 'BOUNDING_DEGREES=1,2,3,4', - 'LATITUDE_TYPE=Planetographic', - 'LONGITUDE_DIRECTION=Positive West', - 'IMAGE_FILENAME=/vsimem/myimage.raw']) + filename = "/vsimem/out.xml" + ds = gdal.GetDriverByName("PDS4").Create( + filename, + 1, + 1, + options=[ + "VAR_LOGICAL_IDENTIFIER=logical_identifier", + "VAR_TITLE=title", + "VAR_INVESTIGATION_AREA_NAME=ian", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=ialr", + "VAR_OBSERVING_SYSTEM_NAME=osn", + "VAR_UNUSED=foo", + "TEMPLATE=data/pds4/byte_pds4_cart_1700.xml", + "BOUNDING_DEGREES=1,2,3,4", + "LATITUDE_TYPE=Planetographic", + "LONGITUDE_DIRECTION=Positive West", + "IMAGE_FILENAME=/vsimem/myimage.raw", + ], + ) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') + sr.ImportFromProj4("+proj=longlat +R=2439400 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds = None - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert 'logical_identifier' in data - assert '1' in data - assert '3' in data - assert '4' in data - assert '2' in data - assert 'Planetographic' in data - assert 'Positive West' in data - assert 'myimage.raw' in data + assert "logical_identifier" in data + assert ( + '1' + in data + ) + assert ( + '3' + in data + ) + assert ( + '4' + in data + ) + assert ( + '2' + in data + ) + assert "Planetographic" in data + assert "Positive West" in data + assert "myimage.raw" in data + + gdal.GetDriverByName("PDS4").Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test subdatasets @@ -700,67 +827,82 @@ def test_pds4_12(): def test_pds4_13(): - ds = gdal.Open('data/pds4/byte_pds4_cart_1700_multi_sds.xml') + ds = gdal.Open("data/pds4/byte_pds4_cart_1700_multi_sds.xml") subds = ds.GetSubDatasets() - expected_subds = [('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1', - 'Image file byte_pds4_cart_1700.img, array first_sds'), - ('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2', - 'Image file byte_pds4_cart_1700.img, array second_sds'), - ('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1', - 'Image file byte_pds4_cart_1700.img, array third_sds')] + expected_subds = [ + ( + "PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1", + "Image file byte_pds4_cart_1700.img, array first_sds", + ), + ( + "PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2", + "Image file byte_pds4_cart_1700.img, array second_sds", + ), + ( + "PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1", + "Image file byte_pds4_cart_1700.img, array third_sds", + ), + ] assert subds == expected_subds - ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1') + ds = gdal.Open("PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1") cs = ds.GetRasterBand(1).Checksum() assert cs == 2315 - ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2') + ds = gdal.Open("PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2") cs = ds.GetRasterBand(1).Checksum() assert cs == 2302 - ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1') + ds = gdal.Open("PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1") cs = ds.GetRasterBand(1).Checksum() assert cs == 3496 - ds = gdal.Open(os.path.join(os.getcwd(), 'data', 'pds4', 'byte_pds4_cart_1700_multi_sds.xml')) + ds = gdal.Open( + os.path.join(os.getcwd(), "data", "pds4", "byte_pds4_cart_1700_multi_sds.xml") + ) subds_name = ds.GetSubDatasets()[0][0] ds = gdal.Open(subds_name) assert ds is not None with gdaltest.error_handler(): - ds = gdal.Open(r'PDS4:c:\do_not\exist.xml:1:1') + ds = gdal.Open(r"PDS4:c:\do_not\exist.xml:1:1") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('PDS4:i_do_not_exist.xml') + ds = gdal.Open("PDS4:i_do_not_exist.xml") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('PDS4:i_do_not_exist.xml:1:1') + ds = gdal.Open("PDS4:i_do_not_exist.xml:1:1") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:3:1') + ds = gdal.Open("PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:3:1") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:3') + ds = gdal.Open("PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:3") assert ds is None + ############################################################################### # Test error cases def test_pds4_14(): - filename = '/vsimem/test.xml' + filename = "/vsimem/test.xml" - gdal.FileFromMemBuffer(filename, "Product_Observational http://pds.nasa.gov/pds4/pds/v1") + gdal.FileFromMemBuffer( + filename, "Product_Observational http://pds.nasa.gov/pds4/pds/v1" + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - gdal.FileFromMemBuffer(filename, """ + gdal.FileFromMemBuffer( + filename, + """ @@ -827,12 +969,15 @@ def test_pds4_14(): -""") +""", + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - gdal.FileFromMemBuffer(filename, """ + gdal.FileFromMemBuffer( + filename, + """ @@ -861,12 +1006,15 @@ def test_pds4_14(): -""") +""", + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - gdal.FileFromMemBuffer(filename, """ + gdal.FileFromMemBuffer( + filename, + """ @@ -890,12 +1038,15 @@ def test_pds4_14(): -""") +""", + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - gdal.FileFromMemBuffer(filename, """ + gdal.FileFromMemBuffer( + filename, + """ @@ -919,12 +1070,15 @@ def test_pds4_14(): -""") +""", + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - gdal.FileFromMemBuffer(filename, """ + gdal.FileFromMemBuffer( + filename, + """ @@ -948,7 +1102,8 @@ def test_pds4_14(): -""") +""", + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None @@ -957,91 +1112,120 @@ def test_pds4_14(): # Invalid value for INTERLEAVE with gdaltest.error_handler(): - ds = gdal.GetDriverByName('PDS4').Create('/vsimem/out.xml', 1, 1, - options=['INTERLEAVE=INVALID']) + ds = gdal.GetDriverByName("PDS4").Create( + "/vsimem/out.xml", 1, 1, options=["INTERLEAVE=INVALID"] + ) assert ds is None # INTERLEAVE=BIL not supported for GeoTIFF in PDS4 with gdaltest.error_handler(): - ds = gdal.GetDriverByName('PDS4').Create('/vsimem/out.xml', 1, 1, - options=['INTERLEAVE=BIL', - 'IMAGE_FORMAT=GEOTIFF']) + ds = gdal.GetDriverByName("PDS4").Create( + "/vsimem/out.xml", 1, 1, options=["INTERLEAVE=BIL", "IMAGE_FORMAT=GEOTIFF"] + ) assert ds is None # Cannot create GeoTIFF file with gdaltest.error_handler(): - ds = gdal.GetDriverByName('PDS4').Create('/i/do_not/exist.xml', 1, 1, - options=['IMAGE_FORMAT=GEOTIFF']) + ds = gdal.GetDriverByName("PDS4").Create( + "/i/do_not/exist.xml", 1, 1, options=["IMAGE_FORMAT=GEOTIFF"] + ) assert ds is None - gdal.Translate('/vsimem/test.tif', 'data/byte.tif') + gdal.Translate("/vsimem/test.tif", "data/byte.tif") # Output file has same name as input file with gdaltest.error_handler(): - ds = gdal.Translate('/vsimem/test.xml', '/vsimem/test.tif', - format='PDS4', creationOptions=['IMAGE_FORMAT=GEOTIFF']) + ds = gdal.Translate( + "/vsimem/test.xml", + "/vsimem/test.tif", + format="PDS4", + creationOptions=["IMAGE_FORMAT=GEOTIFF"], + ) assert ds is None - gdal.Unlink('/vsimem/test.tif') + gdal.Unlink("/vsimem/test.tif") - template = '/vsimem/template.xml' + template = "/vsimem/template.xml" # Missing Product_Observational root gdal.FileFromMemBuffer(template, """""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template]) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + ) gdal.ErrorReset() with gdaltest.error_handler(): ds = None - assert gdal.GetLastErrorMsg() == 'Cannot find Product_Observational element in template' + assert ( + gdal.GetLastErrorMsg() + == "Cannot find Product_Observational element in template" + ) # Missing Target_Identification - gdal.FileFromMemBuffer(template, """ + gdal.FileFromMemBuffer( + template, + """ -""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template]) +""", + ) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + ) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') + sr.ImportFromProj4("+proj=longlat +R=2439400 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) gdal.ErrorReset() with gdaltest.error_handler(): ds = None - assert gdal.GetLastErrorMsg() == 'Cannot find Target_Identification element in template' + assert ( + gdal.GetLastErrorMsg() + == "Cannot find Target_Identification element in template" + ) # Missing Observation_Area - gdal.FileFromMemBuffer(template, """ + gdal.FileFromMemBuffer( + template, + """ -""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template]) +""", + ) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + ) gdal.ErrorReset() with gdaltest.error_handler(): ds = None - assert gdal.GetLastErrorMsg() == 'Cannot find Observation_Area in template' + assert gdal.GetLastErrorMsg() == "Cannot find Observation_Area in template" # Unexpected content found after Observation_Area in template - gdal.FileFromMemBuffer(template, """ + gdal.FileFromMemBuffer( + template, + """ -""") - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template]) +""", + ) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + ) gdal.ErrorReset() with gdaltest.error_handler(): ds = None - assert gdal.GetLastErrorMsg() == 'Unexpected content found after Observation_Area in template' + assert ( + gdal.GetLastErrorMsg() + == "Unexpected content found after Observation_Area in template" + ) gdal.Unlink(template) gdal.Unlink(filename) - gdal.Unlink('/vsimem/test.img') + gdal.Unlink("/vsimem/test.img") + ############################################################################### # Test Create() without geospatial info but from a geospatial enabled template @@ -1049,21 +1233,23 @@ def test_pds4_14(): def test_pds4_15(): - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" with hide_substitution_warnings_error_handler(): - gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=data/pds4/byte_pds4_cart_1700.xml']) + gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=data/pds4/byte_pds4_cart_1700.xml"] + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert '' not in data + assert "" not in data + + gdal.GetDriverByName("PDS4").Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test Create() with geospatial info but from a template without Discipline_Area @@ -1071,11 +1257,12 @@ def test_pds4_15(): def test_pds4_16(): - template = '/vsimem/template.xml' - filename = '/vsimem/out.xml' + template = "/vsimem/template.xml" + filename = "/vsimem/out.xml" - gdal.FileFromMemBuffer(template, - """ @@ -1115,80 +1302,98 @@ def test_pds4_16(): -""") +""", + ) - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=' + template]) + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=" + template] + ) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') + sr.ImportFromProj4("+proj=longlat +R=2439400 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with hide_substitution_warnings_error_handler(): ds = None - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) ret = validate_xml(filename) - assert ret, ('validation failed: %s' % data) + assert ret, "validation failed: %s" % data - assert 'http://pds.nasa.gov/pds4/pds/v1 https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd http://pds.nasa.gov/pds4/cart/v1 https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1700.xsd"' in data + assert ( + 'http://pds.nasa.gov/pds4/pds/v1 https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd http://pds.nasa.gov/pds4/cart/v1 https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1700.xsd"' + in data + ) assert 'xmlns:cart="http://pds.nasa.gov/pds4/cart/v1"' in data - assert '' in data + assert "" in data - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) gdal.Unlink(template) + ############################################################################### # Test ARRAY_TYPE creation option def test_pds4_17(): - options = ['VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr', - 'VAR_TARGET_TYPE=planet', - 'VAR_TARGET=planet'] + options = [ + "VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr", + "VAR_TARGET_TYPE=planet", + "VAR_TARGET=planet", + ] - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" with gdaltest.error_handler(): - gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=['ARRAY_TYPE=Array_2D'] + options) + gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, 1, options=["ARRAY_TYPE=Array_2D"] + options + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert ('' in data and '2' in data and \ - 'Band' not in data and \ - '3' not in data) + assert ( + "" in data + and "2" in data + and "Band" not in data + and "3" not in data + ) - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) # Test multi-band creation with Array_2D with gdaltest.error_handler(): - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 2, options=['ARRAY_TYPE=Array_2D'] + options) - assert ds is None, 'expected failure' + ds = gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, 2, options=["ARRAY_TYPE=Array_2D"] + options + ) + assert ds is None, "expected failure" # Test multi-band creation with Array_3D_Spectrum with gdaltest.error_handler(): - gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 2, options=['ARRAY_TYPE=Array_3D_Spectrum'] + options) + gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, 2, options=["ARRAY_TYPE=Array_3D_Spectrum"] + options + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert '' in data and '3' in data + assert "" in data and "3" in data + + gdal.GetDriverByName("PDS4").Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test RADII creation option @@ -1196,67 +1401,74 @@ def test_pds4_17(): def test_pds4_18(): - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=['RADII=1,2']) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, 1, options=["RADII=1,2"]) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') + sr.ImportFromProj4("+proj=longlat +R=2439400 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with gdaltest.error_handler(): ds = None - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert ('1' in data and \ - '1' in data and \ - '2' in data) + assert ( + '1' in data + and '1' in data + and '2' in data + ) + + gdal.GetDriverByName("PDS4").Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test APPEND_SUBDATASET=YES -@pytest.mark.parametrize('options', [['IMAGE_FORMAT=RAW'], ['IMAGE_FORMAT=GEOTIFF']]) +@pytest.mark.parametrize("options", [["IMAGE_FORMAT=RAW"], ["IMAGE_FORMAT=GEOTIFF"]]) def test_pds4_append_subdataset(options): - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=options) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, 1, options=options) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') + sr.ImportFromProj4("+proj=tmerc +R=6378137 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) - assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) + assert gdal.GetDriverByName("PDS4").CreateCopy( + filename, src_ds, options=["APPEND_SUBDATASET=YES"] + ) ds = gdal.Open(filename) subds = ds.GetSubDatasets() assert len(subds) == 2, subds - ds = gdal.Open('PDS4:/vsimem/out.xml:1:1') + ds = gdal.Open("PDS4:/vsimem/out.xml:1:1") assert ds.GetRasterBand(1).Checksum() == 1 - ds = gdal.Open('PDS4:/vsimem/out.xml:1:2') + ds = gdal.Open("PDS4:/vsimem/out.xml:1:2") assert ds.GetRasterBand(1).Checksum() == 2 src_ds.GetRasterBand(1).Fill(3) - assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) + assert gdal.GetDriverByName("PDS4").CreateCopy( + filename, src_ds, options=["APPEND_SUBDATASET=YES"] + ) - ds = gdal.Open('PDS4:/vsimem/out.xml:1:3') + ds = gdal.Open("PDS4:/vsimem/out.xml:1:3") assert ds.GetRasterBand(1).Checksum() == 3 - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) ############################################################################### @@ -1265,24 +1477,26 @@ def test_pds4_append_subdataset(options): def test_pds4_append_subdataset_not_same_gt(): - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, 1) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') + sr.ImportFromProj4("+proj=tmerc +R=6378137 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2.1, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) - assert not gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) + assert not gdal.GetDriverByName("PDS4").CreateCopy( + filename, src_ds, options=["APPEND_SUBDATASET=YES"] + ) - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) ############################################################################### @@ -1291,47 +1505,54 @@ def test_pds4_append_subdataset_not_same_gt(): def test_pds4_append_subdataset_not_same_srs(): - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" - ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1) + ds = gdal.GetDriverByName("PDS4").Create(filename, 1, 1, 1) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') + sr.ImportFromProj4("+proj=tmerc +R=6378137 +no_defs") ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, 1) sr = osr.SpatialReference() - sr.ImportFromProj4('+proj=tmerc +R=1 +no_defs') + sr.ImportFromProj4("+proj=tmerc +R=1 +no_defs") src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) - assert not gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) + assert not gdal.GetDriverByName("PDS4").CreateCopy( + filename, src_ds, options=["APPEND_SUBDATASET=YES"] + ) + + gdal.GetDriverByName("PDS4").Delete(filename) - gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### -def _test_createlabelonly(src_ds, - expected_content = None, - filename = '/vsimem/out.xml', - validate = False, - creation_options = []): +def _test_createlabelonly( + src_ds, + expected_content=None, + filename="/vsimem/out.xml", + validate=False, + creation_options=[], +): src_ds_name = src_ds.GetDescription() src_driver_name = src_ds.GetDriver().GetDescription() with gdaltest.error_handler(): - assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['CREATE_LABEL_ONLY=YES'] + creation_options) + assert gdal.GetDriverByName("PDS4").CreateCopy( + filename, src_ds, options=["CREATE_LABEL_ONLY=YES"] + creation_options + ) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds found_src_ds_name = False for fname in ds.GetFileList(): - if fname.replace('\\', '/') == src_ds_name.replace('\\', '/'): + if fname.replace("\\", "/") == src_ds_name.replace("\\", "/"): found_src_ds_name = True assert found_src_ds_name, ds.GetFileList() assert ds.RasterCount == src_ds.RasterCount @@ -1339,19 +1560,22 @@ def _test_createlabelonly(src_ds, assert ds.RasterYSize == src_ds.RasterYSize with gdaltest.error_handler(): for i in range(ds.RasterCount): - assert ds.GetRasterBand(i+1).Checksum() == src_ds.GetRasterBand(i+1).Checksum() + assert ( + ds.GetRasterBand(i + 1).Checksum() + == src_ds.GetRasterBand(i + 1).Checksum() + ) ds = None src_ds = None if validate: ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert 'Binary file pre-existing PDS4 label' in data, data + assert "Binary file pre-existing PDS4 label" in data, data if expected_content: if isinstance(expected_content, list): for expected_content_item in expected_content: @@ -1359,20 +1583,27 @@ def _test_createlabelonly(src_ds, else: assert expected_content in data, data - gdal.GetDriverByName('PDS4').Delete(filename) + gdal.GetDriverByName("PDS4").Delete(filename) assert gdal.VSIStatL(src_ds_name) gdal.GetDriverByName(src_driver_name).Delete(src_ds_name) + ############################################################################### # Test CREATE_LABEL_ONLY=YES with ENVI def test_pds4_createlabelonly_envi(): - gdal.FileFromMemBuffer('/vsimem/envi_rgbsmall_bip.img', open('data/envi/envi_rgbsmall_bip.img', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/envi_rgbsmall_bip.hdr', open('data/envi/envi_rgbsmall_bip.hdr', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/envi_rgbsmall_bip.img", + open("data/envi/envi_rgbsmall_bip.img", "rb").read(), + ) + gdal.FileFromMemBuffer( + "/vsimem/envi_rgbsmall_bip.hdr", + open("data/envi/envi_rgbsmall_bip.hdr", "rb").read(), + ) - src_ds = gdal.Open('/vsimem/envi_rgbsmall_bip.img') + src_ds = gdal.Open("/vsimem/envi_rgbsmall_bip.img") return _test_createlabelonly(src_ds) @@ -1382,16 +1613,22 @@ def test_pds4_createlabelonly_envi(): def test_pds4_createlabelonly_gtiff(): - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif')) + gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/byte.tif", gdal.Open("data/byte.tif") + ) - options = ['VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier', - 'VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr'] + options = [ + "VAR_LOGICAL_IDENTIFIER=urn:foo:bar:baz:logical_identifier", + "VAR_INVESTIGATION_AREA_LID_REFERENCE=urn:foo:bar:baz:ialr", + ] - src_ds = gdal.Open('/vsimem/byte.tif') - return _test_createlabelonly(src_ds, - expected_content = 'TIFF 6.0', - validate = True, - creation_options = options) + src_ds = gdal.Open("/vsimem/byte.tif") + return _test_createlabelonly( + src_ds, + expected_content="TIFF 6.0", + validate=True, + creation_options=options, + ) ############################################################################### @@ -1400,12 +1637,16 @@ def test_pds4_createlabelonly_gtiff(): def test_pds4_createlabelonly_gtiff_error(): - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif'), options=['TILED=YES']) - src_ds = gdal.Open('/vsimem/byte.tif') + gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/byte.tif", gdal.Open("data/byte.tif"), options=["TILED=YES"] + ) + src_ds = gdal.Open("/vsimem/byte.tif") with gdaltest.error_handler(): - assert not gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/out.xml', src_ds, options=['CREATE_LABEL_ONLY=YES']) + assert not gdal.GetDriverByName("PDS4").CreateCopy( + "/vsimem/out.xml", src_ds, options=["CREATE_LABEL_ONLY=YES"] + ) src_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/byte.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/byte.tif") ############################################################################### @@ -1414,10 +1655,14 @@ def test_pds4_createlabelonly_gtiff_error(): def test_pds4_createlabelonly_bigtiff(): - gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif'), options=['BIGTIFF=YES']) + gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/byte.tif", gdal.Open("data/byte.tif"), options=["BIGTIFF=YES"] + ) - src_ds = gdal.Open('/vsimem/byte.tif') - return _test_createlabelonly(src_ds, expected_content = 'TIFF 6.0') + src_ds = gdal.Open("/vsimem/byte.tif") + return _test_createlabelonly( + src_ds, expected_content="TIFF 6.0" + ) ############################################################################### @@ -1426,10 +1671,14 @@ def test_pds4_createlabelonly_bigtiff(): def test_pds4_createlabelonly_isis3(): - gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/input.cub', gdal.Open('../gcore/data/uint16.tif')) + gdal.GetDriverByName("ISIS3").CreateCopy( + "/vsimem/input.cub", gdal.Open("../gcore/data/uint16.tif") + ) - src_ds = gdal.Open('/vsimem/input.cub') - return _test_createlabelonly(src_ds, expected_content = 'ISIS3') + src_ds = gdal.Open("/vsimem/input.cub") + return _test_createlabelonly( + src_ds, expected_content="ISIS3" + ) ############################################################################### @@ -1438,10 +1687,15 @@ def test_pds4_createlabelonly_isis3(): def test_pds4_createlabelonly_vicar(): - gdal.FileFromMemBuffer('/vsimem/test_vicar_truncated.bin', open('data/vicar/test_vicar_truncated.bin', 'rb').read()) + gdal.FileFromMemBuffer( + "/vsimem/test_vicar_truncated.bin", + open("data/vicar/test_vicar_truncated.bin", "rb").read(), + ) - src_ds = gdal.Open('/vsimem/test_vicar_truncated.bin') - return _test_createlabelonly(src_ds, expected_content = 'VICAR2') + src_ds = gdal.Open("/vsimem/test_vicar_truncated.bin") + return _test_createlabelonly( + src_ds, expected_content="VICAR2" + ) ############################################################################### @@ -1450,17 +1704,21 @@ def test_pds4_createlabelonly_vicar(): def test_pds4_createlabelonly_fits(): - fits_drv = gdal.GetDriverByName('FITS') + fits_drv = gdal.GetDriverByName("FITS") if not fits_drv: pytest.skip() - fits_drv.CreateCopy('tmp/input.fits', gdal.Open('../gcore/data/int16.tif')) + fits_drv.CreateCopy("tmp/input.fits", gdal.Open("../gcore/data/int16.tif")) - src_ds = gdal.Open('tmp/input.fits') - return _test_createlabelonly(src_ds, - expected_content = ['FITS 3.0', - 'Bottom to Top'], - filename = 'tmp/out.xml') + src_ds = gdal.Open("tmp/input.fits") + return _test_createlabelonly( + src_ds, + expected_content=[ + "FITS 3.0", + "Bottom to Top", + ], + filename="tmp/out.xml", + ) ############################################################################### @@ -1469,11 +1727,14 @@ def test_pds4_createlabelonly_fits(): def test_pds4_createlabelonly_pds3(): - gdal.FileFromMemBuffer('/vsimem/mc02_truncated.img', open('data/pds/mc02_truncated.img', 'rb').read()) - - src_ds = gdal.Open('/vsimem/mc02_truncated.img') - return _test_createlabelonly(src_ds, expected_content = 'PDS3') + gdal.FileFromMemBuffer( + "/vsimem/mc02_truncated.img", open("data/pds/mc02_truncated.img", "rb").read() + ) + src_ds = gdal.Open("/vsimem/mc02_truncated.img") + return _test_createlabelonly( + src_ds, expected_content="PDS3" + ) ############################################################################### @@ -1483,46 +1744,54 @@ def test_pds4_createlabelonly_pds3(): def test_pds4_spectral_characteristics(): # Needed by template_with_sp.xml - if not gdaltest.download_file('http://pds.nasa.gov/pds4/sp/v1/PDS4_SP_1100.xsd', - 'pds.nasa.gov_pds4_sp_v1_PDS4_SP_1100.xsd', - force_download=True): + if not gdaltest.download_file( + "http://pds.nasa.gov/pds4/sp/v1/PDS4_SP_1100.xsd", + "pds.nasa.gov_pds4_sp_v1_PDS4_SP_1100.xsd", + force_download=True, + ): pytest.skip() # Needed by PDS4_SP_1100.xsd - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1100.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1100.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1100.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1100.xsd", + force_download=True, + ): pytest.skip() # Needed by template_with_sp.xml - if not gdaltest.download_file('http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1600.xsd', - 'pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1600.xsd', - force_download=True): + if not gdaltest.download_file( + "http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1600.xsd", + "pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1600.xsd", + force_download=True, + ): pytest.skip() # Needed by PDS4_DISP_1600.xsd - if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1600.xsd', - 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1600.xsd', - force_download=True): + if not gdaltest.download_file( + "https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1600.xsd", + "pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1600.xsd", + force_download=True, + ): pytest.skip() - filename = '/vsimem/out.xml' + filename = "/vsimem/out.xml" with hide_substitution_warnings_error_handler(): - gdal.GetDriverByName('PDS4').Create(filename, 1, 1, - options=['TEMPLATE=data/pds4/template_with_sp.xml']) + gdal.GetDriverByName("PDS4").Create( + filename, 1, 1, options=["TEMPLATE=data/pds4/template_with_sp.xml"] + ) ret = validate_xml(filename) - assert ret, 'validation failed' + assert ret, "validation failed" - f = gdal.VSIFOpenL(filename, 'rb') + f = gdal.VSIFOpenL(filename, "rb") if f: - data = gdal.VSIFReadL(1, 100000, f).decode('ascii') + data = gdal.VSIFReadL(1, 100000, f).decode("ascii") gdal.VSIFCloseL(f) - assert '' in data - assert 'Spectral_Qube_Object' in data - - gdal.GetDriverByName('PDS4').Delete(filename) + assert "" in data + assert "Spectral_Qube_Object" in data + gdal.GetDriverByName("PDS4").Delete(filename) ############################################################################### @@ -1531,19 +1800,27 @@ def test_pds4_spectral_characteristics(): def check_pds4_oblique_cylindrical(filename): ds = gdal.Open(filename) - assert ds.GetSpatialRef().ExportToProj4().startswith('+proj=ob_tran +R=2575000 +o_proj=eqc +o_lon_p=-158.352054 +o_lat_p=191.769776 +lon_0=-163.331591 ') - assert ds.GetGeoTransform() == pytest.approx((-3190898.22208, 0, 351.11116, -764017.88416, 351.11116, 0), rel=1e-8) + assert ( + ds.GetSpatialRef() + .ExportToProj4() + .startswith( + "+proj=ob_tran +R=2575000 +o_proj=eqc +o_lon_p=-158.352054 +o_lat_p=191.769776 +lon_0=-163.331591 " + ) + ) + assert ds.GetGeoTransform() == pytest.approx( + (-3190898.22208, 0, 351.11116, -764017.88416, 351.11116, 0), rel=1e-8 + ) + def test_pds4_oblique_cylindrical_read(): - check_pds4_oblique_cylindrical('data/pds4/oblique_cylindrical.xml') + check_pds4_oblique_cylindrical("data/pds4/oblique_cylindrical.xml") def test_pds4_oblique_cylindrical_write(): - src_ds = gdal.Open('data/pds4/oblique_cylindrical.xml') - filename = '/vsimem/out.xml' + src_ds = gdal.Open("data/pds4/oblique_cylindrical.xml") + filename = "/vsimem/out.xml" - gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds) + gdal.GetDriverByName("PDS4").CreateCopy(filename, src_ds) check_pds4_oblique_cylindrical(filename) - gdal.GetDriverByName('PDS4').Delete(filename) - + gdal.GetDriverByName("PDS4").Delete(filename) diff --git a/autotest/gdrivers/plmosaic.py b/autotest/gdrivers/plmosaic.py index 6732d6c21b23..51e1a454b51a 100755 --- a/autotest/gdrivers/plmosaic.py +++ b/autotest/gdrivers/plmosaic.py @@ -33,24 +33,24 @@ import shutil import struct - -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Find PLMosaic driver def test_plmosaic_1(): - gdaltest.plmosaic_drv = gdal.GetDriverByName('PLMosaic') + gdaltest.plmosaic_drv = gdal.GetDriverByName("PLMosaic") if gdaltest.plmosaic_drv is not None: return pytest.skip() + ############################################################################### # Error: no API_KEY @@ -61,12 +61,13 @@ def test_plmosaic_2(): pytest.skip() gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error case: invalid root URL @@ -77,12 +78,13 @@ def test_plmosaic_3(): pytest.skip() gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/does_not_exist/') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/does_not_exist/") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error case: invalid JSON @@ -92,15 +94,16 @@ def test_plmosaic_4(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root', """{""") + gdal.FileFromMemBuffer("/vsimem/root", """{""") gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error case: not a JSON dictionary @@ -110,15 +113,16 @@ def test_plmosaic_5(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root', """null""") + gdal.FileFromMemBuffer("/vsimem/root", """null""") gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error case: missing "mosaics" element @@ -128,15 +132,16 @@ def test_plmosaic_6(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root', """{}""") + gdal.FileFromMemBuffer("/vsimem/root", """{}""") gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() assert ds is None + ############################################################################### # Valid root but no mosaics @@ -146,16 +151,20 @@ def test_plmosaic_7(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root', """{ + gdal.FileFromMemBuffer( + "/vsimem/root", + """{ "mosaics": [], -}""") +}""", + ) - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) assert ds is None ds = None + ############################################################################### # Valid root with 2 mosaics @@ -165,7 +174,9 @@ def test_plmosaic_8(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root', """{ + gdal.FileFromMemBuffer( + "/vsimem/root", + """{ "_links" : { "_next": "/vsimem/root/?page=2" }, "mosaics": [ { @@ -178,8 +189,11 @@ def test_plmosaic_8(): "quad_download": true } ], -}""") - gdal.FileFromMemBuffer('/vsimem/root/?page=2', """{ +}""", + ) + gdal.FileFromMemBuffer( + "/vsimem/root/?page=2", + """{ "_links" : { "_next": null }, "mosaics": [ { @@ -201,14 +215,21 @@ def test_plmosaic_8(): "quad_download": true } ], -}""") - - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) - assert ds.GetMetadata("SUBDATASETS") == {'SUBDATASET_2_NAME': 'PLMOSAIC:mosaic=another_mosaic_name', 'SUBDATASET_2_DESC': 'Mosaic another_mosaic_name', 'SUBDATASET_1_NAME': 'PLMOSAIC:mosaic=my_mosaic_name', 'SUBDATASET_1_DESC': 'Mosaic my_mosaic_name'} +}""", + ) + + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) + assert ds.GetMetadata("SUBDATASETS") == { + "SUBDATASET_2_NAME": "PLMOSAIC:mosaic=another_mosaic_name", + "SUBDATASET_2_DESC": "Mosaic another_mosaic_name", + "SUBDATASET_1_NAME": "PLMOSAIC:mosaic=my_mosaic_name", + "SUBDATASET_1_DESC": "Mosaic my_mosaic_name", + } ds = None + ############################################################################### # Error case: invalid mosaic @@ -219,11 +240,19 @@ def test_plmosaic_9(): pytest.skip() gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=does_not_exist']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=does_not_exist"], + ) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() - assert ds is None and gdal.GetLastErrorMsg().find('/vsimem/root/?name__is=does_not_exist') >= 0 + assert ( + ds is None + and gdal.GetLastErrorMsg().find("/vsimem/root/?name__is=does_not_exist") >= 0 + ) + ############################################################################### # Invalid mosaic definition: invalid JSON @@ -234,13 +263,16 @@ def test_plmosaic_9bis(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') + gdal.FileFromMemBuffer("/vsimem/root/?name__is=my_mosaic", """{""") + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('JSON parsing error') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("JSON parsing error") >= 0 + ############################################################################### # Invalid mosaic definition: JSON without mosaics array @@ -251,13 +283,16 @@ def test_plmosaic_9ter(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') + gdal.FileFromMemBuffer("/vsimem/root/?name__is=my_mosaic", """{}""") + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('No mosaic my_mosaic') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("No mosaic my_mosaic") >= 0 + ############################################################################### # Invalid mosaic definition: missing parameters @@ -268,18 +303,24 @@ def test_plmosaic_10(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic" }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Missing required parameter') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("Missing required parameter") >= 0 + ############################################################################### # Invalid mosaic definition: unsupported projection @@ -290,7 +331,9 @@ def test_plmosaic_11(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -301,13 +344,19 @@ def test_plmosaic_11(): "resolution": 4.77731426716 } }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Unsupported coordinate_system') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ( + ds is None and gdal.GetLastErrorMsg().find("Unsupported coordinate_system") >= 0 + ) + ############################################################################### # Invalid mosaic definition: unsupported datatype @@ -318,7 +367,9 @@ def test_plmosaic_12(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -329,13 +380,17 @@ def test_plmosaic_12(): "resolution": 4.77731426716 } }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Unsupported data_type') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("Unsupported data_type") >= 0 + ############################################################################### # Invalid mosaic definition: unsupported resolution @@ -346,7 +401,9 @@ def test_plmosaic_13(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -357,13 +414,17 @@ def test_plmosaic_13(): "resolution": 1.1234 } }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Unsupported resolution') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("Unsupported resolution") >= 0 + ############################################################################### # Invalid mosaic definition: unsupported quad_size @@ -374,7 +435,9 @@ def test_plmosaic_14(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -385,13 +448,17 @@ def test_plmosaic_14(): "resolution": 4.77731426716 } }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) + ds = gdal.OpenEx( + "PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo", "MOSAIC=my_mosaic"] + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Unsupported quad_size') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert ds is None and gdal.GetLastErrorMsg().find("Unsupported quad_size") >= 0 + ############################################################################### # Nearly valid mosaic definition. Warning about invalid links.tiles @@ -402,7 +469,9 @@ def test_plmosaic_15(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -419,17 +488,23 @@ def test_plmosaic_15(): }, "quad_download": true }] -}""") - gdal.SetConfigOption('PL_URL', '/vsimem/root') +}""", + ) + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH=tmp"], + ) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert gdal.GetLastErrorMsg().find('Invalid _links.tiles') >= 0 + gdal.SetConfigOption("PL_URL", None) + assert gdal.GetLastErrorMsg().find("Invalid _links.tiles") >= 0 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None ds = None + ############################################################################### # Valid mosaic definition @@ -440,11 +515,13 @@ def test_plmosaic_16(): pytest.skip() try: - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") except OSError: pass - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -461,10 +538,13 @@ def test_plmosaic_16(): }, "quad_download": true }] -}""") +}""", + ) # Valid root: one single mosaic, should open the dataset directly - gdal.FileFromMemBuffer('/vsimem/root', """{ + gdal.FileFromMemBuffer( + "/vsimem/root", + """{ "mosaics": [ { "id": "my_mosaic_id", @@ -476,22 +556,31 @@ def test_plmosaic_16(): "quad_download": true } ], -}""") +}""", + ) - gdal.SetConfigOption('PL_URL', '/vsimem/root') + gdal.SetConfigOption("PL_URL", "/vsimem/root") gdal.PushErrorHandler() - ds = gdal.OpenEx('PLMosaic:api_key=foo,unsupported_option=val', gdal.OF_RASTER) + ds = gdal.OpenEx("PLMosaic:api_key=foo,unsupported_option=val", gdal.OF_RASTER) gdal.PopErrorHandler() - gdal.SetConfigOption('PL_URL', None) - assert ds is None and gdal.GetLastErrorMsg().find('Unsupported option unsupported_option') >= 0 - - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", None) + assert ( + ds is None + and gdal.GetLastErrorMsg().find("Unsupported option unsupported_option") >= 0 + ) + + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) assert ds.GetMetadata("SUBDATASETS") == {} - assert ds.GetMetadata() == {'LAST_ACQUIRED': 'last_date', 'NAME': 'my_mosaic', 'FIRST_ACQUIRED': 'first_date'} + assert ds.GetMetadata() == { + "LAST_ACQUIRED": "last_date", + "NAME": "my_mosaic", + "FIRST_ACQUIRED": "first_date", + } ds = None + ############################################################################### # Open with explicit MOSAIC dataset open option @@ -501,118 +590,166 @@ def test_plmosaic_17(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH=tmp"], + ) + gdal.SetConfigOption("PL_URL", None) assert ds is not None - assert ds.GetMetadata() == {'LAST_ACQUIRED': 'last_date', 'NAME': 'my_mosaic', 'FIRST_ACQUIRED': 'first_date'} - assert ds.GetProjectionRef().find('3857') >= 0 + assert ds.GetMetadata() == { + "LAST_ACQUIRED": "last_date", + "NAME": "my_mosaic", + "FIRST_ACQUIRED": "first_date", + } + assert ds.GetProjectionRef().find("3857") >= 0 assert ds.RasterXSize == 8388608 assert ds.RasterYSize == 8388608 got_gt = ds.GetGeoTransform() - expected_gt = (-20037508.34, 4.7773142671600004, 0.0, 20037508.34, 0.0, -4.7773142671600004) + expected_gt = ( + -20037508.34, + 4.7773142671600004, + 0.0, + 20037508.34, + 0.0, + -4.7773142671600004, + ) for i in range(6): - assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8), ds.GetGeoTransform() - assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL', \ - ds.GetMetadata('IMAGE_STRUCTURE') + assert got_gt[i] == pytest.approx( + expected_gt[i], abs=1e-8 + ), ds.GetGeoTransform() + assert ( + ds.GetMetadataItem("INTERLEAVE", "IMAGE_STRUCTURE") == "PIXEL" + ), ds.GetMetadata("IMAGE_STRUCTURE") assert ds.GetRasterBand(1).GetOverviewCount() == 15 assert ds.GetRasterBand(1).GetOverview(-1) is None - assert ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount()) is None + assert ( + ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount()) is None + ) assert ds.GetRasterBand(1).GetOverview(0) is not None try: - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") except OSError: pass for i in range(12): # Read at one nonexistent position. ds.GetRasterBand(1).ReadRaster(4096 * i, 0, 1, 1) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" for i in range(11, -1, -1): # Again in the same quad, but in different block, to test cache ds.GetRasterBand(1).ReadRaster(4096 * i + 256, 0, 1, 1) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" for i in range(12): # Again in the same quad, but in different block, to test cache ds.GetRasterBand(1).ReadRaster(4096 * i + 512, 256, 1, 1) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds.FlushCache() # Invalid tile content - gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/0-2047/full', 'garbage') + gdal.FileFromMemBuffer("/vsimem/root/my_mosaic_id/quads/0-2047/full", "garbage") gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() - os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') + os.stat("tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif") ds.FlushCache() - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") # GeoTIFF but with wrong dimensions - gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 1, 1, 1) + gdal.GetDriverByName("GTiff").Create( + "/vsimem/root/my_mosaic_id/quads/0-2047/full", 1, 1, 1 + ) gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() - os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') + os.stat("tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif") ds.FlushCache() - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") # Good GeoTIFF - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/root/my_mosaic_id/quads/0-2047/full", + 4096, + 4096, + 4, + options=["INTERLEAVE=BAND", "SPARSE_OK=YES"], + ) tmp_ds.GetRasterBand(1).Fill(255) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - val = struct.unpack('B', val)[0] + val = struct.unpack("B", val)[0] assert val == 255 - os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') + os.stat("tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif") ds.FlushCache() # Read again from file cache. # We change the file behind the scene (but not changing its size) # to demonstrate that the cached tile is still use - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/root/my_mosaic_id/quads/0-2047/full", + 4096, + 4096, + 4, + options=["INTERLEAVE=BAND", "SPARSE_OK=YES"], + ) tmp_ds.GetRasterBand(1).Fill(1) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - val = struct.unpack('B', val)[0] + val = struct.unpack("B", val)[0] assert val == 255 ds = None # Read again from file cache, but with TRUST_CACHE=YES # delete the full GeoTIFF before - gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/full') - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:API_KEY=foo,MOSAIC=my_mosaic,CACHE_PATH=tmp,TRUST_CACHE=YES', gdal.OF_RASTER) - gdal.SetConfigOption('PL_URL', None) + gdal.Unlink("/vsimem/root/my_mosaic_id/quads/0-2047/full") + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:API_KEY=foo,MOSAIC=my_mosaic,CACHE_PATH=tmp,TRUST_CACHE=YES", + gdal.OF_RASTER, + ) + gdal.SetConfigOption("PL_URL", None) val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - val = struct.unpack('B', val)[0] + val = struct.unpack("B", val)[0] assert val == 255 ds = None # Read again from file cache but the metatile has changed in between - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) - gdal.SetConfigOption('PL_URL', None) - - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) - tmp_ds.SetMetadataItem('foo', 'bar') + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH=tmp"], + ) + gdal.SetConfigOption("PL_URL", None) + + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/root/my_mosaic_id/quads/0-2047/full", + 4096, + 4096, + 4, + options=["INTERLEAVE=BAND", "SPARSE_OK=YES"], + ) + tmp_ds.SetMetadataItem("foo", "bar") tmp_ds.GetRasterBand(1).Fill(254) tmp_ds = None val = ds.ReadRaster(0, 0, 1, 1) - val = struct.unpack('B' * 4, val) + val = struct.unpack("B" * 4, val) assert val == (254, 0, 0, 0) + ############################################################################### # Test location info @@ -622,29 +759,41 @@ def test_plmosaic_18(): if gdaltest.plmosaic_drv is None: pytest.skip() - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH=tmp"], + ) + gdal.SetConfigOption("PL_URL", None) - ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') - assert ret == """ + ret = ds.GetRasterBand(1).GetMetadataItem("Pixel_0_0", "LocationInfo") + assert ( + ret + == """ """ + ) old_ret = ret - ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') + ret = ds.GetRasterBand(1).GetMetadataItem("Pixel_0_0", "LocationInfo") assert ret == old_ret - gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/0-2047/items', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/my_mosaic_id/quads/0-2047/items", + """{ "items": [ { "link": "foo" } ] -}""") +}""", + ) ds.FlushCache() - ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') - assert ret == """ + ret = ds.GetRasterBand(1).GetMetadataItem("Pixel_0_0", "LocationInfo") + assert ( + ret + == """ foo @@ -652,8 +801,10 @@ def test_plmosaic_18(): """ + ) ds = None + ############################################################################### # Try error in saving in cache @@ -663,20 +814,25 @@ def test_plmosaic_19(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=/does_not_exist']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH=/does_not_exist"], + ) + gdal.SetConfigOption("PL_URL", None) gdal.PushErrorHandler() val = ds.ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() - val = struct.unpack('B' * 4, val) + val = struct.unpack("B" * 4, val) assert val == (254, 0, 0, 0) val = ds.ReadRaster(256, 0, 1, 1) - val = struct.unpack('B' * 4, val) + val = struct.unpack("B" * 4, val) assert val == (254, 0, 0, 0) ds = None + ############################################################################### # Try disabling cache @@ -686,18 +842,23 @@ def test_plmosaic_20(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=["API_KEY=foo", "MOSAIC=my_mosaic", "CACHE_PATH="], + ) + gdal.SetConfigOption("PL_URL", None) val = ds.ReadRaster(0, 0, 1, 1) - val = struct.unpack('B' * 4, val) + val = struct.unpack("B" * 4, val) assert val == (254, 0, 0, 0) val = ds.ReadRaster(256, 0, 1, 1) - val = struct.unpack('B' * 4, val) + val = struct.unpack("B" * 4, val) assert val == (254, 0, 0, 0) ds = None + ############################################################################### # Try use_tiles @@ -707,29 +868,40 @@ def test_plmosaic_21(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=', 'USE_TILES=YES']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=[ + "API_KEY=foo", + "MOSAIC=my_mosaic", + "CACHE_PATH=", + "USE_TILES=YES", + ], + ) + gdal.SetConfigOption("PL_URL", None) gdal.ErrorReset() gdal.PushErrorHandler() ds.ReadRaster(256, 512, 1, 1) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(256, 512, 1, 1) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() gdal.PushErrorHandler() ds.GetRasterBand(1).ReadBlock(1, 2) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" - gdal.FileFromMemBuffer('/vsimem/root/?name__is=mosaic_uint16', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=mosaic_uint16", + """{ "mosaics": [{ "id": "mosaic_uint16", "name": "mosaic_uint16", @@ -746,18 +918,35 @@ def test_plmosaic_21(): }, "quad_download": true }] -}""") +}""", + ) # Should emit a warning gdal.ErrorReset() gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=mosaic_uint16', 'CACHE_PATH=', 'USE_TILES=YES']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=[ + "API_KEY=foo", + "MOSAIC=mosaic_uint16", + "CACHE_PATH=", + "USE_TILES=YES", + ], + ) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg().find('Cannot use tile API for full resolution data on non Byte mosaic') >= 0 - - gdal.FileFromMemBuffer('/vsimem/root/?name__is=mosaic_without_tiles', """{ + assert ( + gdal.GetLastErrorMsg().find( + "Cannot use tile API for full resolution data on non Byte mosaic" + ) + >= 0 + ) + + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=mosaic_without_tiles", + """{ "mosaics": [{ "id": "mosaic_without_tiles", "name": "mosaic_without_tiles", @@ -771,16 +960,32 @@ def test_plmosaic_21(): "last_acquired": "last_date", "quad_download": true }] -}""") +}""", + ) # Should emit a warning gdal.ErrorReset() gdal.PushErrorHandler() - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=mosaic_without_tiles', 'CACHE_PATH=', 'USE_TILES=YES']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx( + "PLMosaic:", + gdal.OF_RASTER, + open_options=[ + "API_KEY=foo", + "MOSAIC=mosaic_without_tiles", + "CACHE_PATH=", + "USE_TILES=YES", + ], + ) + gdal.SetConfigOption("PL_URL", None) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg().find('Cannot find tile definition, so use_tiles will be ignored') >= 0 + assert ( + gdal.GetLastErrorMsg().find( + "Cannot find tile definition, so use_tiles will be ignored" + ) + >= 0 + ) + ############################################################################### # Valid mosaic definition with bbox @@ -792,11 +997,13 @@ def test_plmosaic_with_bbox(): pytest.skip() try: - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") except OSError: pass - gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/?name__is=my_mosaic", + """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", @@ -819,10 +1026,13 @@ def test_plmosaic_with_bbox(): }, "quad_download": true }] -}""") +}""", + ) # Valid root: one single mosaic, should open the dataset directly - gdal.FileFromMemBuffer('/vsimem/root', """{ + gdal.FileFromMemBuffer( + "/vsimem/root", + """{ "mosaics": [ { "id": "my_mosaic_id", @@ -834,35 +1044,54 @@ def test_plmosaic_with_bbox(): "quad_download": true } ], -}""") +}""", + ) - gdal.SetConfigOption('PL_URL', '/vsimem/root') - ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) - gdal.SetConfigOption('PL_URL', None) + gdal.SetConfigOption("PL_URL", "/vsimem/root") + ds = gdal.OpenEx("PLMosaic:", gdal.OF_RASTER, open_options=["API_KEY=foo"]) + gdal.SetConfigOption("PL_URL", None) assert ds.RasterXSize == 233472 assert ds.RasterYSize == 286720 got_gt = ds.GetGeoTransform() - expected_gt = (-11134123.286585508, 4.77731426716, 0.0, 4872401.930333553, 0.0, -4.77731426716) + expected_gt = ( + -11134123.286585508, + 4.77731426716, + 0.0, + 4872401.930333553, + 0.0, + -4.77731426716, + ) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) # Good GeoTIFF - tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/455-1272/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) + tmp_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/root/my_mosaic_id/quads/455-1272/full", + 4096, + 4096, + 4, + options=["INTERLEAVE=BAND", "SPARSE_OK=YES"], + ) tmp_ds.GetRasterBand(1).Fill(125) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) - val = struct.unpack('B', val)[0] + val = struct.unpack("B", val)[0] assert val == 125 - gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/455-1272/items', """{ + gdal.FileFromMemBuffer( + "/vsimem/root/my_mosaic_id/quads/455-1272/items", + """{ "items": [ { "link": "bar" } ] -}""") +}""", + ) - ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') - assert ret == """ + ret = ds.GetRasterBand(1).GetMetadataItem("Pixel_0_0", "LocationInfo") + assert ( + ret + == """ bar @@ -870,6 +1099,8 @@ def test_plmosaic_with_bbox(): """ + ) + ############################################################################### # @@ -880,25 +1111,21 @@ def test_plmosaic_cleanup(): if gdaltest.plmosaic_drv is None: pytest.skip() - gdal.Unlink('/vsimem/root_no_mosaics') - gdal.Unlink('/vsimem/root') - gdal.Unlink('/vsimem/root/?page=2') - gdal.Unlink('/vsimem/root/?name__is=my_mosaic') - gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/full') - gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/items') - gdal.Unlink('/vsimem/root/my_mosaic_id/quads/455-1272/full') - gdal.Unlink('/vsimem/root/my_mosaic_id/quads/455-1272/items') - gdal.Unlink('/vsimem/root/?name__is=mosaic_uint16') - gdal.Unlink('/vsimem/root/?name__is=mosaic_without_tiles') + gdal.Unlink("/vsimem/root_no_mosaics") + gdal.Unlink("/vsimem/root") + gdal.Unlink("/vsimem/root/?page=2") + gdal.Unlink("/vsimem/root/?name__is=my_mosaic") + gdal.Unlink("/vsimem/root/my_mosaic_id/quads/0-2047/full") + gdal.Unlink("/vsimem/root/my_mosaic_id/quads/0-2047/items") + gdal.Unlink("/vsimem/root/my_mosaic_id/quads/455-1272/full") + gdal.Unlink("/vsimem/root/my_mosaic_id/quads/455-1272/items") + gdal.Unlink("/vsimem/root/?name__is=mosaic_uint16") + gdal.Unlink("/vsimem/root/?name__is=mosaic_without_tiles") - if gdal.ReadDir('/vsimem/root') is not None: - print(gdal.ReadDir('/vsimem/root')) + if gdal.ReadDir("/vsimem/root") is not None: + print(gdal.ReadDir("/vsimem/root")) try: - shutil.rmtree('tmp/plmosaic_cache') + shutil.rmtree("tmp/plmosaic_cache") except OSError: pass - - - - diff --git a/autotest/gdrivers/png.py b/autotest/gdrivers/png.py index efb1916f4a8b..66ebbf0181ab 100755 --- a/autotest/gdrivers/png.py +++ b/autotest/gdrivers/png.py @@ -30,45 +30,50 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Read test of simple byte reference data. def test_png_1(): - tst = gdaltest.GDALTest('PNG', 'png/test.png', 1, 57921) + tst = gdaltest.GDALTest("PNG", "png/test.png", 1, 57921) return tst.testOpen() + ############################################################################### # Test lossless copying. def test_png_2(): - tst = gdaltest.GDALTest('PNG', 'png/test.png', 1, 57921) + tst = gdaltest.GDALTest("PNG", "png/test.png", 1, 57921) return tst.testCreateCopy() + ############################################################################### # Verify the geotransform, colormap, and nodata setting for test file. def test_png_3(): - ds = gdal.Open('data/png/test.png') + ds = gdal.Open("data/png/test.png") cm = ds.GetRasterBand(1).GetRasterColorTable() - assert cm.GetCount() == 16 and cm.GetColorEntry(0) == (255, 255, 255, 0) and cm.GetColorEntry(1) == (255, 255, 208, 255), \ - 'Wrong colormap entries' + assert ( + cm.GetCount() == 16 + and cm.GetColorEntry(0) == (255, 255, 255, 0) + and cm.GetColorEntry(1) == (255, 255, 208, 255) + ), "Wrong colormap entries" cm = None - assert int(ds.GetRasterBand(1).GetNoDataValue()) == 0, 'Wrong nodata value.' + assert int(ds.GetRasterBand(1).GetNoDataValue()) == 0, "Wrong nodata value." # This geotransform test is also verifying the fix for bug 1414, as # the world file is in a mixture of numeric representations for the @@ -79,40 +84,43 @@ def test_png_3(): gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(gt_expected[i], abs=0.0001): - print('expected:', gt_expected) - print('got:', gt) - pytest.fail('Mixed locale world file read improperly.') + print("expected:", gt_expected) + print("got:", gt) + pytest.fail("Mixed locale world file read improperly.") + - ############################################################################### # Test RGB mode creation and reading. def test_png_4(): - tst = gdaltest.GDALTest('PNG', 'rgbsmall.tif', 3, 21349) + tst = gdaltest.GDALTest("PNG", "rgbsmall.tif", 3, 21349) return tst.testCreateCopy() + ############################################################################### # Test RGBA 16bit read support. def test_png_5(): - tst = gdaltest.GDALTest('PNG', 'png/rgba16.png', 3, 1815) + tst = gdaltest.GDALTest("PNG", "png/rgba16.png", 3, 1815) return tst.testOpen() + ############################################################################### # Test RGBA 16bit mode creation and reading. def test_png_6(): - tst = gdaltest.GDALTest('PNG', 'png/rgba16.png', 4, 4873) + tst = gdaltest.GDALTest("PNG", "png/rgba16.png", 4, 4873) return tst.testCreateCopy() + ############################################################################### # Test RGB NODATA_VALUES metadata write (and read) support. # This is handled via the tRNS block in PNG. @@ -120,21 +128,22 @@ def test_png_6(): def test_png_7(): - drv = gdal.GetDriverByName('PNG') - srcds = gdal.Open('data/png/tbbn2c16.png') + drv = gdal.GetDriverByName("PNG") + srcds = gdal.Open("data/png/tbbn2c16.png") - dstds = drv.CreateCopy('tmp/png7.png', srcds) + dstds = drv.CreateCopy("tmp/png7.png", srcds) srcds = None - dstds = gdal.Open('tmp/png7.png') + dstds = gdal.Open("tmp/png7.png") md = dstds.GetMetadata() dstds = None - assert md['NODATA_VALUES'] == '32639 32639 32639', 'NODATA_VALUES wrong' + assert md["NODATA_VALUES"] == "32639 32639 32639", "NODATA_VALUES wrong" dstds = None - drv.Delete('tmp/png7.png') + drv.Delete("tmp/png7.png") + ############################################################################### # Test PNG file with broken IDAT chunk. This poor man test of clean @@ -143,66 +152,71 @@ def test_png_7(): def test_png_8(): - drv = gdal.GetDriverByName('PNG') - ds_src = gdal.Open('data/png/idat_broken.png') + drv = gdal.GetDriverByName("PNG") + ds_src = gdal.Open("data/png/idat_broken.png") md = ds_src.GetMetadata() - assert not md, 'metadata list not expected' + assert not md, "metadata list not expected" # Number of bands has been preserved - assert ds_src.RasterCount == 4, 'wrong number of bands' + assert ds_src.RasterCount == 4, "wrong number of bands" # No reading is performed, so we expect valid reference b = ds_src.GetRasterBand(1) - assert b is not None, 'band 1 is missing' + assert b is not None, "band 1 is missing" # We're not interested in returned value but internal state of GDAL. - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") b.ComputeBandStats() err = gdal.GetLastErrorNo() gdal.PopErrorHandler() - assert err != 0, 'error condition expected' + assert err != 0, "error condition expected" - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds_dst = drv.CreateCopy('tmp/idat_broken.png', ds_src) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds_dst = drv.CreateCopy("tmp/idat_broken.png", ds_src) err = gdal.GetLastErrorNo() gdal.PopErrorHandler() ds_src = None - assert err != 0, 'error condition expected' + assert err != 0, "error condition expected" - assert ds_dst is None, 'dataset not expected' + assert ds_dst is None, "dataset not expected" - os.remove('tmp/idat_broken.png') + os.remove("tmp/idat_broken.png") ############################################################################### # Test creating an in memory copy. + def test_png_9(): - tst = gdaltest.GDALTest('PNG', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("PNG", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test writing to /vsistdout/ def test_png_10(): - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('PNG').CreateCopy('/vsistdout_redirect//vsimem/tmp.png', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("PNG").CreateCopy( + "/vsistdout_redirect//vsimem/tmp.png", src_ds + ) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None - ds = gdal.Open('/vsimem/tmp.png') + ds = gdal.Open("/vsimem/tmp.png") assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672 - gdal.Unlink('/vsimem/tmp.png') + gdal.Unlink("/vsimem/tmp.png") + ############################################################################### # Test CreateCopy() interruption @@ -210,58 +224,95 @@ def test_png_10(): def test_png_11(): - tst = gdaltest.GDALTest('PNG', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("PNG", "byte.tif", 1, 4672) ret = tst.testCreateCopy(vsimem=1, interrupt_during_copy=True) - gdal.Unlink('/vsimem/byte.tif.tst') + gdal.Unlink("/vsimem/byte.tif.tst") return ret + ############################################################################### # Test optimized IRasterIO def test_png_12(): - ds = gdal.Open('../gcore/data/stefan_full_rgba.png') + ds = gdal.Open("../gcore/data/stefan_full_rgba.png") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] # Band interleaved data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) - tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) + tmp_ds = gdal.GetDriverByName("Mem").Create( + "", ds.RasterXSize, ds.RasterYSize, ds.RasterCount + ) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs # Pixel interleaved - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=ds.RasterCount, buf_band_space=1) - tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) - tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=ds.RasterCount, buf_band_space=1) + data = ds.ReadRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + buf_pixel_space=ds.RasterCount, + buf_band_space=1, + ) + tmp_ds = gdal.GetDriverByName("Mem").Create( + "", ds.RasterXSize, ds.RasterYSize, ds.RasterCount + ) + tmp_ds.WriteRaster( + 0, + 0, + ds.RasterXSize, + ds.RasterYSize, + data, + buf_pixel_space=ds.RasterCount, + buf_band_space=1, + ) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs # Pixel interleaved with padding - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=5, buf_band_space=1) - tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) - tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=5, buf_band_space=1) + data = ds.ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=5, buf_band_space=1 + ) + tmp_ds = gdal.GetDriverByName("Mem").Create( + "", ds.RasterXSize, ds.RasterYSize, ds.RasterCount + ) + tmp_ds.WriteRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=5, buf_band_space=1 + ) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs + ############################################################################### # Test metadata def test_png_13(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) - src_ds.SetMetadataItem('foo', 'bar') - src_ds.SetMetadataItem('COPYRIGHT', 'copyright value') - src_ds.SetMetadataItem('DESCRIPTION', 'will be overridden by creation option') - out_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['WRITE_METADATA_AS_TEXT=YES', 'DESCRIPTION=my desc']) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1) + src_ds.SetMetadataItem("foo", "bar") + src_ds.SetMetadataItem("COPYRIGHT", "copyright value") + src_ds.SetMetadataItem("DESCRIPTION", "will be overridden by creation option") + out_ds = gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/tmp.png", + src_ds, + options=["WRITE_METADATA_AS_TEXT=YES", "DESCRIPTION=my desc"], + ) md = out_ds.GetMetadata() - assert len(md) == 3 and md['foo'] == 'bar' and md['Copyright'] == 'copyright value' and md['Description'] == 'my desc' + assert ( + len(md) == 3 + and md["foo"] == "bar" + and md["Copyright"] == "copyright value" + and md["Description"] == "my desc" + ) out_ds = None # check that no PAM file is created - assert gdal.VSIStatL('/vsimem/tmp.png.aux.xml') != 0 - gdal.Unlink('/vsimem/tmp.png') + assert gdal.VSIStatL("/vsimem/tmp.png.aux.xml") != 0 + gdal.Unlink("/vsimem/tmp.png") + ############################################################################### # Test support for nbits < 8 @@ -269,35 +320,36 @@ def test_png_13(): def test_png_14(): - src_ds = gdal.Open('../gcore/data/oddsize1bit.tif') + src_ds = gdal.Open("../gcore/data/oddsize1bit.tif") expected_cs = src_ds.GetRasterBand(1).Checksum() - gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds) - out_ds = gdal.Open('/vsimem/tmp.png') + gdal.GetDriverByName("PNG").CreateCopy("/vsimem/tmp.png", src_ds) + out_ds = gdal.Open("/vsimem/tmp.png") cs = out_ds.GetRasterBand(1).Checksum() - nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') - gdal.Unlink('/vsimem/tmp.png') + nbits = out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") + gdal.Unlink("/vsimem/tmp.png") assert cs == expected_cs - assert nbits == '1' + assert nbits == "1" # check that no PAM file is created - assert gdal.VSIStatL('/vsimem/tmp.png.aux.xml') != 0 + assert gdal.VSIStatL("/vsimem/tmp.png.aux.xml") != 0 # Test explicit NBITS - gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['NBITS=2']) - out_ds = gdal.Open('/vsimem/tmp.png') - nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') - gdal.Unlink('/vsimem/tmp.png') - assert nbits == '2' + gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/tmp.png", src_ds, options=["NBITS=2"] + ) + out_ds = gdal.Open("/vsimem/tmp.png") + nbits = out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") + gdal.Unlink("/vsimem/tmp.png") + assert nbits == "2" # Test (wrong) explicit NBITS with gdaltest.error_handler(): - gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['NBITS=7']) - out_ds = gdal.Open('/vsimem/tmp.png') - nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') - gdal.Unlink('/vsimem/tmp.png') + gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/tmp.png", src_ds, options=["NBITS=7"] + ) + out_ds = gdal.Open("/vsimem/tmp.png") + nbits = out_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") + gdal.Unlink("/vsimem/tmp.png") assert nbits is None - - - diff --git a/autotest/gdrivers/png_profile.py b/autotest/gdrivers/png_profile.py index 58a143e108f5..1f3be9897ab2 100755 --- a/autotest/gdrivers/png_profile.py +++ b/autotest/gdrivers/png_profile.py @@ -30,71 +30,69 @@ # Part of a free package of ICC profile found at: # http://sourceforge.net/projects/openicc/files/OpenICC-Profiles/ -import os import base64 +import os - -from osgeo import gdal import pytest +from osgeo import gdal ############################################################################### # Test writing and reading of ICC profile in CreateCopy() + def test_png_copy_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('PNG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + driver = gdal.GetDriverByName("PNG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.png', ds) + ds2 = driver.CreateCopy("tmp/icc_test.png", ds) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc with pytest.raises(OSError): - os.stat('tmp/icc_test.png.aux.xml') - + os.stat("tmp/icc_test.png.aux.xml") # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") md = ds2.GetMetadata("COLOR_PROFILE") ds2 = None with pytest.raises(OSError): - os.stat('tmp/icc_test.png.aux.xml') - + os.stat("tmp/icc_test.png.aux.xml") - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with GetMetadataItem() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") source_icc_profile = ds2.GetMetadataItem("SOURCE_ICC_PROFILE", "COLOR_PROFILE") ds2 = None with pytest.raises(OSError): - os.stat('tmp/icc_test.png.aux.xml') - + os.stat("tmp/icc_test.png.aux.xml") assert source_icc_profile == icc - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.png') + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.png") def cvtTuple2String(t): - return str(t).lstrip('([').rstrip(')]') + return str(t).lstrip("([").rstrip(")]") + ############################################################################### # Test writing and reading of ICC profile in CreateCopy() options @@ -102,36 +100,37 @@ def cvtTuple2String(t): def test_png_copy_options_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('PNG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("PNG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) + ds2 = driver.CreateCopy("tmp/icc_test.png", ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc + + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.png") - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.png') ############################################################################### # Test writing and reading of ICC colorimetric data from options @@ -142,62 +141,71 @@ def test_png_copy_options_colorimetric_data(): source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) - options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), - 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), - 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), - 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), - 'PNG_GAMMA=1.5'] + options = [ + "SOURCE_PRIMARIES_RED=" + cvtTuple2String(source_primaries[0]), + "SOURCE_PRIMARIES_GREEN=" + cvtTuple2String(source_primaries[1]), + "SOURCE_PRIMARIES_BLUE=" + cvtTuple2String(source_primaries[2]), + "SOURCE_WHITEPOINT=" + cvtTuple2String(source_whitepoint), + "PNG_GAMMA=1.5", + ] - driver = gdal.GetDriverByName('PNG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("PNG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) + ds2 = driver.CreateCopy("tmp/icc_test.png", ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) - assert float(md['PNG_GAMMA']) == 1.5 + assert float(md["PNG_GAMMA"]) == 1.5 # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) + + assert float(md["PNG_GAMMA"]) == 1.5 - assert float(md['PNG_GAMMA']) == 1.5 + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.png") - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.png') ############################################################################### # Test writing and reading of ICC colorimetric data in the file @@ -208,65 +216,74 @@ def test_png_copy_colorimetric_data(): source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) - options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), - 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), - 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), - 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint)] + options = [ + "SOURCE_PRIMARIES_RED=" + cvtTuple2String(source_primaries[0]), + "SOURCE_PRIMARIES_GREEN=" + cvtTuple2String(source_primaries[1]), + "SOURCE_PRIMARIES_BLUE=" + cvtTuple2String(source_primaries[2]), + "SOURCE_WHITEPOINT=" + cvtTuple2String(source_whitepoint), + ] - options2 = ['PNG_GAMMA=1.5'] + options2 = ["PNG_GAMMA=1.5"] - driver = gdal.GetDriverByName('PNG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + driver = gdal.GetDriverByName("PNG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) ds = None - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options2) + ds2 = driver.CreateCopy("tmp/icc_test.png", ds, options=options2) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) - assert float(md['PNG_GAMMA']) == 1.5 + assert float(md["PNG_GAMMA"]) == 1.5 # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) - assert float(md['PNG_GAMMA']) == 1.5 + assert float(md["PNG_GAMMA"]) == 1.5 + + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.png") - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.png') ############################################################################### # Test sRGB @@ -274,32 +291,30 @@ def test_png_copy_colorimetric_data(): def test_png_sRGB(): # Create dummy file - options = ['SOURCE_ICC_PROFILE_NAME=sRGB'] + options = ["SOURCE_ICC_PROFILE_NAME=sRGB"] - driver = gdal.GetDriverByName('PNG') - driver_tiff = gdal.GetDriverByName('GTiff') - ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("PNG") + driver_tiff = gdal.GetDriverByName("GTiff") + ds = driver_tiff.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) + ds2 = driver.CreateCopy("tmp/icc_test.png", ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE_NAME'] == 'sRGB' + assert md["SOURCE_ICC_PROFILE_NAME"] == "sRGB" # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test.png') + ds2 = gdal.Open("tmp/icc_test.png") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE_NAME'] == 'sRGB' - - driver_tiff.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test.png') - -############################################################################ + assert md["SOURCE_ICC_PROFILE_NAME"] == "sRGB" + driver_tiff.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test.png") +############################################################################ diff --git a/autotest/gdrivers/pnm.py b/autotest/gdrivers/pnm.py index 551b3704d742..41f2c6172408 100755 --- a/autotest/gdrivers/pnm.py +++ b/autotest/gdrivers/pnm.py @@ -28,54 +28,59 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Read Test grayscale (PGM) def test_pnm_1(): - tst = gdaltest.GDALTest('PNM', 'pnm/byte.pgm', 1, 4672) + tst = gdaltest.GDALTest("PNM", "pnm/byte.pgm", 1, 4672) return tst.testOpen() + ############################################################################### # Write Test grayscale (PGM) def test_pnm_2(): - tst = gdaltest.GDALTest('PNM', 'pnm/byte.pgm', 1, 4672) + tst = gdaltest.GDALTest("PNM", "pnm/byte.pgm", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Read Test RGB (PPM) def test_pnm_3(): - tst = gdaltest.GDALTest('PNM', 'pnm/rgbsmall.ppm', 2, 21053) + tst = gdaltest.GDALTest("PNM", "pnm/rgbsmall.ppm", 2, 21053) return tst.testOpen() + ############################################################################### # Write Test RGB (PPM) def test_pnm_4(): - tst = gdaltest.GDALTest('PNM', 'pnm/rgbsmall.ppm', 2, 21053) + tst = gdaltest.GDALTest("PNM", "pnm/rgbsmall.ppm", 2, 21053) return tst.testCreateCopy() + @pytest.mark.parametrize("nbands", [1, 3]) def test_pnm_write_non_standard_extension(nbands): gdal.ErrorReset() with gdaltest.error_handler(): - gdal.GetDriverByName('PNM').Create('foo.foo', 1, 1, nbands) + gdal.GetDriverByName("PNM").Create("foo.foo", 1, 1, nbands) assert gdal.GetLastErrorType() != 0 - gdal.Unlink('foo.foo') + gdal.Unlink("foo.foo") diff --git a/autotest/gdrivers/postgisraster.py b/autotest/gdrivers/postgisraster.py index 27255efb00f8..02e1df2c6691 100755 --- a/autotest/gdrivers/postgisraster.py +++ b/autotest/gdrivers/postgisraster.py @@ -31,14 +31,11 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import ogr -from osgeo import osr - - import gdaltest import pytest +from osgeo import gdal, ogr, osr + # # To initialize the required PostGISRaster DB instance, run data/load_postgisraster_test_data.sh # @@ -49,22 +46,26 @@ def test_postgisraster_init(): - gdaltest.postgisrasterDriver = gdal.GetDriverByName('PostGISRaster') + gdaltest.postgisrasterDriver = gdal.GetDriverByName("PostGISRaster") if gdaltest.postgisrasterDriver is None: pytest.skip() - if gdal.GetConfigOption('APPVEYOR'): + if gdal.GetConfigOption("APPVEYOR"): gdaltest.postgisrasterDriver = None pytest.skip() - val = gdal.GetConfigOption('GDAL_PG_CONNECTION_STRING', None) + val = gdal.GetConfigOption("GDAL_PG_CONNECTION_STRING", None) if val is not None: gdaltest.pg_connection_string = val else: gdaltest.pg_connection_string = "host='localhost' dbname='autotest'" - gdaltest.postgisraster_connection_string_without_schema = "PG:" + gdaltest.pg_connection_string - gdaltest.postgisraster_connection_string = gdaltest.postgisraster_connection_string_without_schema + gdaltest.postgisraster_connection_string_without_schema = ( + "PG:" + gdaltest.pg_connection_string + ) + gdaltest.postgisraster_connection_string = ( + gdaltest.postgisraster_connection_string_without_schema + ) # Make sure we have SRID=26711 in spatial_ref_sys with gdaltest.error_handler(): @@ -78,8 +79,13 @@ def test_postgisraster_init(): wkt = sr.ExportToWkt() proj4 = sr.ExportToProj4() ds.ExecuteSQL("DELETE FROM spatial_ref_sys WHERE auth_srid = 26711") - ds.ExecuteSQL("INSERT INTO spatial_ref_sys (srid,auth_name,auth_srid,srtext,proj4text) VALUES (26711,'EPSG',26711,'%s','%s')" % (wkt, proj4)) - ds.ExecuteSQL("ALTER DATABASE autotest SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG'") + ds.ExecuteSQL( + "INSERT INTO spatial_ref_sys (srid,auth_name,auth_srid,srtext,proj4text) VALUES (26711,'EPSG',26711,'%s','%s')" + % (wkt, proj4) + ) + ds.ExecuteSQL( + "ALTER DATABASE autotest SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG'" + ) ds.ExecuteSQL("ALTER DATABASE autotest SET postgis.enable_outdb_rasters = true") ds.ExecuteSQL("SELECT pg_reload_conf()") ds = None @@ -91,7 +97,7 @@ def test_postgisraster_init(): # If we cannot open the table, try force loading the data if ds is None: - gdaltest.runexternal('bash data/load_postgisraster_test_data.sh') + gdaltest.runexternal("bash data/load_postgisraster_test_data.sh") with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") @@ -102,7 +108,7 @@ def test_postgisraster_init(): if gdaltest.postgisrasterDriver is None: pytest.skip() - + ############################################################################### # @@ -112,12 +118,12 @@ def test_postgisraster_test_open_error1(): pytest.skip() with gdaltest.error_handler(): - ds = gdal.Open(gdaltest.postgisraster_connection_string + - "table='nonexistent'") + ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='nonexistent'") if ds is None: return pytest.fail() + ############################################################################### # @@ -131,6 +137,7 @@ def test_postgisraster_test_open_error2(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") assert ds is not None + ############################################################################### # @@ -139,16 +146,17 @@ def test_postgisraster_compare_utm(): if gdaltest.postgisrasterDriver is None: pytest.skip() - src_ds = gdal.Open('data/utm.tif') + src_ds = gdal.Open("data/utm.tif") with gdaltest.error_handler(): dst_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") # dataset actually contains many sub-datasets. test the first one - dst_ds = gdal.Open(dst_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME']) + dst_ds = gdal.Open(dst_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"]) diff = gdaltest.compare_ds(src_ds, dst_ds, width=100, height=100, verbose=1) assert diff == 0 + ############################################################################### # @@ -157,16 +165,19 @@ def test_postgisraster_compare_small_world(): if gdaltest.postgisrasterDriver is None: pytest.skip() - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") with gdaltest.error_handler(): - dst_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + dst_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # dataset actually contains many sub-datasets. test the first one - dst_ds = gdal.Open(dst_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME']) + dst_ds = gdal.Open(dst_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"]) diff = gdaltest.compare_ds(src_ds, dst_ds, width=40, height=20, verbose=1) assert diff == 0 + ############################################################################### # @@ -176,7 +187,7 @@ def test_postgisraster_test_utm_open(): pytest.skip() # First open tif file - src_ds = gdal.Open('data/utm.tif') + src_ds = gdal.Open("data/utm.tif") prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() @@ -189,9 +200,16 @@ def test_postgisraster_test_utm_open(): main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") # Try to open PostGISRaster with the same data than original tif file - tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 1, cs, filename_absolute=1) + tst = gdaltest.GDALTest( + "PostGISRaster", + main_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"], + 1, + cs, + filename_absolute=1, + ) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) + ############################################################################### # @@ -201,7 +219,7 @@ def test_postgisraster_test_small_world_open_b1(): pytest.skip() # First open tif file - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() @@ -211,12 +229,21 @@ def test_postgisraster_test_small_world_open_b1(): cs = rb.Checksum() with gdaltest.error_handler(): - main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + main_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # Try to open PostGISRaster with the same data than original tif file - tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 1, cs, filename_absolute=1) + tst = gdaltest.GDALTest( + "PostGISRaster", + main_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"], + 1, + cs, + filename_absolute=1, + ) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) + ############################################################################### # @@ -226,7 +253,7 @@ def test_postgisraster_test_small_world_open_b2(): pytest.skip() # First open tif file - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() @@ -236,12 +263,21 @@ def test_postgisraster_test_small_world_open_b2(): cs = rb.Checksum() with gdaltest.error_handler(): - main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + main_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # Try to open PostGISRaster with the same data than original tif file - tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 2, cs, filename_absolute=1) + tst = gdaltest.GDALTest( + "PostGISRaster", + main_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"], + 2, + cs, + filename_absolute=1, + ) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) + ############################################################################### # @@ -251,7 +287,7 @@ def test_postgisraster_test_small_world_open_b3(): pytest.skip() # First open tif file - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() @@ -261,10 +297,18 @@ def test_postgisraster_test_small_world_open_b3(): cs = rb.Checksum() with gdaltest.error_handler(): - main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + main_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # Checksum for each band can be obtained by gdalinfo -checksum - tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 3, cs, filename_absolute=1) + tst = gdaltest.GDALTest( + "PostGISRaster", + main_ds.GetMetadata("SUBDATASETS")["SUBDATASET_1_NAME"], + 3, + cs, + filename_absolute=1, + ) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) @@ -274,9 +318,13 @@ def test_postgisraster_test_create_copy_bad_conn_string(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) - new_ds = gdaltest.postgisrasterDriver.CreateCopy("bogus connection string", src_ds, strict=True) + new_ds = gdaltest.postgisrasterDriver.CreateCopy( + "bogus connection string", src_ds, strict=True + ) assert new_ds is None @@ -286,13 +334,17 @@ def test_postgisraster_test_create_copy_no_dbname(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # This is set in order to prevent GDAL from attempting to auto-identify # a bogus PG: filename to the postgis raster driver - options = ['APPEND_SUBDATASET=YES'] + options = ["APPEND_SUBDATASET=YES"] - new_ds = gdaltest.postgisrasterDriver.CreateCopy("PG: no database name", src_ds, strict=True, options=options) + new_ds = gdaltest.postgisrasterDriver.CreateCopy( + "PG: no database name", src_ds, strict=True, options=options + ) assert new_ds is None @@ -302,13 +354,20 @@ def test_postgisraster_test_create_copy_no_tablename(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) # This is set in order to prevent GDAL from attempting to auto-identify # a bogus PG: filename to the postgis raster driver - options = ['APPEND_SUBDATASET=YES'] + options = ["APPEND_SUBDATASET=YES"] - new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string, src_ds, strict=True, options=options) + new_ds = gdaltest.postgisrasterDriver.CreateCopy( + gdaltest.postgisraster_connection_string, + src_ds, + strict=True, + options=options, + ) assert new_ds is None @@ -322,13 +381,21 @@ def test_postgisraster_test_create_copy_and_delete(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) - new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string + "table='small_world_copy'", src_ds, strict=True) + new_ds = gdaltest.postgisrasterDriver.CreateCopy( + gdaltest.postgisraster_connection_string + "table='small_world_copy'", + src_ds, + strict=True, + ) assert new_ds is not None - deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy'") + deleted = gdaltest.postgisrasterDriver.Delete( + gdaltest.postgisraster_connection_string + "table='small_world_copy'" + ) assert not deleted @@ -341,72 +408,90 @@ def test_postgisraster_test_create_copy_and_delete_phases(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS').keys() + src_md = src_ds.GetMetadata("SUBDATASETS").keys() - new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string + "table='small_world_copy'", src_ds, strict=True) + new_ds = gdaltest.postgisrasterDriver.CreateCopy( + gdaltest.postgisraster_connection_string + "table='small_world_copy'", + src_ds, + strict=True, + ) - new_md = new_ds.GetMetadata('SUBDATASETS').keys() + new_md = new_ds.GetMetadata("SUBDATASETS").keys() # done with src src_ds = None if new_ds is None: - pytest.fail('No new dataset was created during copy.') + pytest.fail("No new dataset was created during copy.") elif len(src_md) != len(new_md): - pytest.fail('Metadata differs between new and old rasters.') + pytest.fail("Metadata differs between new and old rasters.") - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_copy' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] ds = None # should delete all raster parts over 50 - deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy' where='rid>50'") + deleted = gdaltest.postgisrasterDriver.Delete( + gdaltest.postgisraster_connection_string + + "table='small_world_copy' where='rid>50'" + ) - assert not deleted, 'Delete returned an error.' + assert not deleted, "Delete returned an error." - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_copy'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS').keys() + src_md = src_ds.GetMetadata("SUBDATASETS").keys() if src_ds is None: - pytest.fail('Could not open reduced dataset (1).') + pytest.fail("Could not open reduced dataset (1).") elif len(src_md) != 100: # The length of the metadata contains two pcs of # information per raster, so 50 rasters remaining = 100 keys print(len(src_md)) - pytest.fail( - 'Expected 100 keys of metadata for 50 subdataset rasters.') + pytest.fail("Expected 100 keys of metadata for 50 subdataset rasters.") # done with src src_ds = None - deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy' where='rid<=25'") + deleted = gdaltest.postgisrasterDriver.Delete( + gdaltest.postgisraster_connection_string + + "table='small_world_copy' where='rid<=25'" + ) - assert not deleted, 'Delete returned an error.' + assert not deleted, "Delete returned an error." - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_copy'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS').keys() + src_md = src_ds.GetMetadata("SUBDATASETS").keys() if src_ds is None: - pytest.fail('Could not open reduced dataset (2).') + pytest.fail("Could not open reduced dataset (2).") elif len(src_md) != 50: # The length of the metadata contains two pcs of # information per raster, so 25 rasters remaining = 50 keys print(len(src_md)) - pytest.fail('Expected 50 keys of metadata for 25 subdataset rasters.') + pytest.fail("Expected 50 keys of metadata for 25 subdataset rasters.") # done with src src_ds = None - deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy'") + deleted = gdaltest.postgisrasterDriver.Delete( + gdaltest.postgisraster_connection_string + "table='small_world_copy'" + ) - assert not deleted, 'Delete returned an error.' + assert not deleted, "Delete returned an error." - def test_postgisraster_test_norid(): """ @@ -416,19 +501,26 @@ def test_postgisraster_test_norid(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_noid'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_noid'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS') + src_md = src_ds.GetMetadata("SUBDATASETS") # Check each subdataset for k in src_md.keys(): - if k[-4:] == 'NAME': + if k[-4:] == "NAME": # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table - assert src_md[k].find('ST_UpperLeftX') >= 0 and src_md[k].find('ST_UpperLeftY') >= 0 + assert ( + src_md[k].find("ST_UpperLeftX") >= 0 + and src_md[k].find("ST_UpperLeftY") >= 0 + ) with gdaltest.error_handler(): - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_noid' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_noid' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -442,21 +534,30 @@ def test_postgisraster_test_serial(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_serial'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_serial'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS') + src_md = src_ds.GetMetadata("SUBDATASETS") import re # Check each subdataset for k in src_md.keys(): - if k[-4:] == 'NAME': + if k[-4:] == "NAME": # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table - assert re.search(r"""where='"serialid" = \d+'""", src_md[k]), (k, ':', src_md[k]) + assert re.search(r"""where='"serialid" = \d+'""", src_md[k]), ( + k, + ":", + src_md[k], + ) with gdaltest.error_handler(): - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_serial' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_serial' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -470,21 +571,30 @@ def test_postgisraster_test_unique(): pytest.skip() with gdaltest.error_handler(): - src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_unique'") + src_ds = gdal.Open( + gdaltest.postgisraster_connection_string + "table='small_world_unique'" + ) - src_md = src_ds.GetMetadata('SUBDATASETS') + src_md = src_ds.GetMetadata("SUBDATASETS") import re # Check each subdataset for k in src_md.keys(): - if k[-4:] == 'NAME': + if k[-4:] == "NAME": # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table - assert re.search(r"""where='"uniq" = \d+'""", src_md[k]), (k, ':', src_md[k]) + assert re.search(r"""where='"uniq" = \d+'""", src_md[k]), ( + k, + ":", + src_md[k], + ) with gdaltest.error_handler(): - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_unique' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_unique' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -493,7 +603,10 @@ def test_postgisraster_test_constraint(): if gdaltest.postgisrasterDriver is None: pytest.skip() - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_constraint' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_constraint' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -502,7 +615,10 @@ def test_postgisraster_test_constraint_with_spi(): if gdaltest.postgisrasterDriver is None: pytest.skip() - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_constraint_with_spi' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_constraint_with_spi' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -515,16 +631,19 @@ def test_postgisraster_test_outdb(): # For some reason fails with # ERROR 1: PostGISRasterRasterBand::IRasterIO(): ERROR: rt_band_load_offline_data: Cannot open offline raster: /home/travis/build/rouault/gdal/autotest/gdrivers/data/small_world.tif # See https://api.travis-ci.org/v3/job/428972866/log.txt - if gdaltest.is_travis_branch('ubuntu_1804'): + if gdaltest.is_travis_branch("ubuntu_1804"): pytest.skip() ds = ogr.Open(gdaltest.postgisraster_connection_string_without_schema) - sql_lyr = ds.ExecuteSQL('SHOW postgis.enable_outdb_rasters') + sql_lyr = ds.ExecuteSQL("SHOW postgis.enable_outdb_rasters") has_guc = sql_lyr is not None ds.ReleaseResultSet(sql_lyr) ds = None - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_outdb_constraint' mode=2" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] expected_cs = [30111, 32302, 40026] if has_guc else [0, 0, 0] assert cs == expected_cs @@ -534,7 +653,10 @@ def test_postgisraster_test_outdb_client_side(): if gdaltest.postgisrasterDriver is None: pytest.skip() - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -543,7 +665,10 @@ def test_postgisraster_test_outdb_client_side_force_ireadblock(): if gdaltest.postgisrasterDriver is None: pytest.skip() - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side" + ) with gdaltest.SetCacheMax(0): cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] @@ -557,18 +682,18 @@ def test_postgisraster_test_outdb_client_side_if_possible(): # For some reason fails with # ERROR 1: PostGISRasterRasterBand::IRasterIO(): ERROR: rt_band_load_offline_data: Cannot open offline raster: /home/travis/build/rouault/gdal/autotest/gdrivers/data/small_world.tif # See https://api.travis-ci.org/v3/job/484385907/log.txt - if gdaltest.is_travis_branch('ubuntu_1804'): + if gdaltest.is_travis_branch("ubuntu_1804"): pytest.skip() - ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side_if_possible") + ds = gdal.Open( + gdaltest.postgisraster_connection_string + + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side_if_possible" + ) cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_cleanup(): - gdal.Unlink('data/small_world.tif.aux.xml') - gdal.Unlink('data/utm.tif.aux.xml') - - - + gdal.Unlink("data/small_world.tif.aux.xml") + gdal.Unlink("data/utm.tif.aux.xml") diff --git a/autotest/gdrivers/prf.py b/autotest/gdrivers/prf.py index bff724205a0b..8848869be9c2 100755 --- a/autotest/gdrivers/prf.py +++ b/autotest/gdrivers/prf.py @@ -25,67 +25,68 @@ ############################################################################### - import gdaltest -from osgeo import gdal import pytest +from osgeo import gdal + ############################################################################### def test_prf_1(): - tst = gdaltest.GDALTest('prf', './PRF/ph.prf', 1, 43190) + tst = gdaltest.GDALTest("prf", "./PRF/ph.prf", 1, 43190) return tst.testOpen(check_gt=(1, 2, 3, -7, 5, 6)) def test_prf_2(): - ds = gdal.Open('./data/PRF/dem.x-dem') + ds = gdal.Open("./data/PRF/dem.x-dem") - assert ds.RasterXSize == 4330, 'Invalid dataset width' + assert ds.RasterXSize == 4330, "Invalid dataset width" - assert ds.RasterYSize == 4663, 'Invalid dataset height' + assert ds.RasterYSize == 4663, "Invalid dataset height" unittype = ds.GetRasterBand(1).GetUnitType() - assert unittype == 'm', 'Failed to read elevation units from x-dem' + assert unittype == "m", "Failed to read elevation units from x-dem" datatype = ds.GetRasterBand(1).DataType - assert datatype == gdal.GDT_Float32, 'Failed to read datatype' + assert datatype == gdal.GDT_Float32, "Failed to read datatype" expectedOvCount = 1 if ds.GetRasterBand(1).GetOverviewCount() != expectedOvCount: - print('Overview count must be %d' % expectedOvCount) - print('But GetOverviewCount returned %d' % ds.GetRasterBand(1).GetOverviewCount()) - pytest.fail('did not get expected number of overviews') + print("Overview count must be %d" % expectedOvCount) + print( + "But GetOverviewCount returned %d" % ds.GetRasterBand(1).GetOverviewCount() + ) + pytest.fail("did not get expected number of overviews") overview = ds.GetRasterBand(1).GetOverview(0) - assert overview.XSize == 1082, ('Invalid dataset width %d' % overview.XSize) - assert overview.YSize == 1165, ('Invalid dataset height %d' % overview.YSize) + assert overview.XSize == 1082, "Invalid dataset width %d" % overview.XSize + assert overview.YSize == 1165, "Invalid dataset height %d" % overview.YSize ds = None def test_prf_3(): - ds = gdal.Open('./data/PRF/ph.prf') + ds = gdal.Open("./data/PRF/ph.prf") expectedOvCount = 0 if ds.GetRasterBand(1).GetOverviewCount() != expectedOvCount: - print('Overview count must be %d' % expectedOvCount) - print('But GetOverviewCount returned %d' % ds.GetRasterBand(1).GetOverviewCount()) - pytest.fail('did not get expected number of overviews') + print("Overview count must be %d" % expectedOvCount) + print( + "But GetOverviewCount returned %d" % ds.GetRasterBand(1).GetOverviewCount() + ) + pytest.fail("did not get expected number of overviews") ds = None def test_prf_4(): - tst = gdaltest.GDALTest('prf', './PRF/dem.x-dem', 1, 0) + tst = gdaltest.GDALTest("prf", "./PRF/dem.x-dem", 1, 0) return tst.testOpen(check_gt=(1.5, 1.0, 0.0, 9329.0, 0.0, -2.0)) ############################################################################### - - - diff --git a/autotest/gdrivers/r.py b/autotest/gdrivers/r.py index 82aaf89cbee4..78ee2a6afa80 100755 --- a/autotest/gdrivers/r.py +++ b/autotest/gdrivers/r.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,39 +37,39 @@ def test_r_1(): - tst = gdaltest.GDALTest('R', 'r/r_test.asc', 2, 202) + tst = gdaltest.GDALTest("R", "r/r_test.asc", 2, 202) return tst.testOpen() + ############################################################################### # Perform a simple read test on a binary (uncompressed) file. def test_r_2(): - tst = gdaltest.GDALTest('R', 'r/r_test.rdb', 1, 202) + tst = gdaltest.GDALTest("R", "r/r_test.rdb", 1, 202) return tst.testOpen() + ############################################################################### # Verify a simple createcopy operation with 16bit data. def test_r_3(): - tst = gdaltest.GDALTest('R', 'byte.tif', 1, 4672, - options=['ASCII=YES']) + tst = gdaltest.GDALTest("R", "byte.tif", 1, 4672, options=["ASCII=YES"]) return tst.testCreateCopy() + ############################################################################### # Test creating a compressed binary stream and reading it back. def test_r_4(): - tst = gdaltest.GDALTest('R', 'byte.tif', 1, 4672) - return tst.testCreateCopy(new_filename='tmp/r_4.rda') - -############################################################################### - + tst = gdaltest.GDALTest("R", "byte.tif", 1, 4672) + return tst.testCreateCopy(new_filename="tmp/r_4.rda") +############################################################################### diff --git a/autotest/gdrivers/rasdaman.py b/autotest/gdrivers/rasdaman.py index eb4e123d86b6..5be713027bbf 100755 --- a/autotest/gdrivers/rasdaman.py +++ b/autotest/gdrivers/rasdaman.py @@ -28,12 +28,11 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + # # The rasdaman DB must be created like this : # cd $RASDAMAN_INSTALL_DIR/bin @@ -46,12 +45,14 @@ def test_rasdaman_1(): - gdaltest.rasdamanDriver = gdal.GetDriverByName('RASDAMAN') + gdaltest.rasdamanDriver = gdal.GetDriverByName("RASDAMAN") if gdaltest.rasdamanDriver is None: pytest.skip() try: - ds = gdal.Open("rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from rgb as a'") + ds = gdal.Open( + "rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from rgb as a'" + ) except: gdaltest.rasdamanDriver = None @@ -62,7 +63,8 @@ def test_rasdaman_1(): pytest.skip() cs = ds.GetRasterBand(1).Checksum() - assert cs == 61774, 'did not get expected checksum' + assert cs == 61774, "did not get expected checksum" + ############################################################################### # Test opening a non existing collection @@ -72,9 +74,12 @@ def test_rasdaman_2(): if gdaltest.rasdamanDriver is None: pytest.skip() - ds = gdal.Open("rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from notexisting as a'") + ds = gdal.Open( + "rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from notexisting as a'" + ) assert ds is None + ############################################################################### # Test syntax error @@ -86,6 +91,3 @@ def test_rasdaman_3(): ds = gdal.Open("rasdaman:query='select'") assert ds is None - - - diff --git a/autotest/gdrivers/rasterlite.py b/autotest/gdrivers/rasterlite.py index 5fbd90811cc9..992edf7afbbc 100755 --- a/autotest/gdrivers/rasterlite.py +++ b/autotest/gdrivers/rasterlite.py @@ -30,26 +30,26 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import ogr - import gdaltest import pytest +from osgeo import gdal, ogr + ############################################################################### # Get the rasterlite driver def test_rasterlite_1(): - gdaltest.rasterlite_drv = gdal.GetDriverByName('RASTERLITE') - gdaltest.epsilon_drv = gdal.GetDriverByName('EPSILON') + gdaltest.rasterlite_drv = gdal.GetDriverByName("RASTERLITE") + gdaltest.epsilon_drv = gdal.GetDriverByName("EPSILON") # This is to speed-up the runtime of tests on EXT4 filesystems # Do not use this for production environment if you care about data safety # w.r.t system/OS crashes, unless you know what you are doing. - gdal.SetConfigOption('OGR_SQLITE_SYNCHRONOUS', 'OFF') + gdal.SetConfigOption("OGR_SQLITE_SYNCHRONOUS", "OFF") + ############################################################################### # Test opening a rasterlite DB without overviews @@ -62,58 +62,74 @@ def test_rasterlite_2(): # Test if SQLite3 supports rtrees try: - os.remove('tmp/testrtree.sqlite') + os.remove("tmp/testrtree.sqlite") except OSError: pass - ds2 = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/testrtree.sqlite') + ds2 = ogr.GetDriverByName("SQLite").CreateDataSource("tmp/testrtree.sqlite") gdal.ErrorReset() - ds2.ExecuteSQL('CREATE VIRTUAL TABLE testrtree USING rtree(id,minX,maxX,minY,maxY)') + ds2.ExecuteSQL("CREATE VIRTUAL TABLE testrtree USING rtree(id,minX,maxX,minY,maxY)") ds2.Destroy() try: - os.remove('tmp/testrtree.sqlite') + os.remove("tmp/testrtree.sqlite") except OSError: pass - if gdal.GetLastErrorMsg().find('rtree') != -1: + if gdal.GetLastErrorMsg().find("rtree") != -1: gdaltest.rasterlite_drv = None - pytest.skip('Please upgrade your sqlite3 library to be able to read Rasterlite DBs (needs rtree support)!') + pytest.skip( + "Please upgrade your sqlite3 library to be able to read Rasterlite DBs (needs rtree support)!" + ) gdal.ErrorReset() - ds = gdal.Open('data/rasterlite/rasterlite.sqlite') + ds = gdal.Open("data/rasterlite/rasterlite.sqlite") if ds is None: - if gdal.GetLastErrorMsg().find('unsupported file format') != -1: + if gdal.GetLastErrorMsg().find("unsupported file format") != -1: gdaltest.rasterlite_drv = None - pytest.skip('Please upgrade your sqlite3 library to be able to read Rasterlite DBs!') + pytest.skip( + "Please upgrade your sqlite3 library to be able to read Rasterlite DBs!" + ) pytest.fail() - assert ds.RasterCount == 3, 'expected 3 bands' + assert ds.RasterCount == 3, "expected 3 bands" - assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'did not expect overview' + assert ds.GetRasterBand(1).GetOverviewCount() == 0, "did not expect overview" cs = ds.GetRasterBand(1).Checksum() expected_cs = 11746 - assert cs == expected_cs or cs == 11751, \ - ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 11751 + ), "for band 1, cs = %d, different from expected_cs = %d" % (cs, expected_cs) cs = ds.GetRasterBand(2).Checksum() expected_cs = 19843 - assert cs == expected_cs or cs == 20088 or cs == 20083, \ - ('for band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 20088 or cs == 20083 + ), "for band 2, cs = %d, different from expected_cs = %d" % (cs, expected_cs) cs = ds.GetRasterBand(3).Checksum() expected_cs = 48911 - assert cs == expected_cs or cs == 47978, \ - ('for band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 47978 + ), "for band 3, cs = %d, different from expected_cs = %d" % (cs, expected_cs) - assert ds.GetProjectionRef().find('WGS_1984') != -1, \ - ('projection_ref = %s' % ds.GetProjectionRef()) + assert ds.GetProjectionRef().find("WGS_1984") != -1, ( + "projection_ref = %s" % ds.GetProjectionRef() + ) gt = ds.GetGeoTransform() - expected_gt = (-180.0, 360. / ds.RasterXSize, 0.0, 90.0, 0.0, -180. / ds.RasterYSize) + expected_gt = ( + -180.0, + 360.0 / ds.RasterXSize, + 0.0, + 90.0, + 0.0, + -180.0 / ds.RasterYSize, + ) for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-15) ds = None + ############################################################################### # Test opening a rasterlite DB with overviews @@ -123,29 +139,42 @@ def test_rasterlite_3(): if gdaltest.rasterlite_drv is None: pytest.skip() - ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pyramids.sqlite,table=test') + ds = gdal.Open("RASTERLITE:data/rasterlite/rasterlite_pyramids.sqlite,table=test") - assert ds.RasterCount == 3, 'expected 3 bands' + assert ds.RasterCount == 3, "expected 3 bands" - assert ds.GetRasterBand(1).GetOverviewCount() == 1, 'expected 1 overview' + assert ds.GetRasterBand(1).GetOverviewCount() == 1, "expected 1 overview" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 59551 - assert cs == expected_cs or cs == 59833, \ - ('for overview of band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 59833 + ), "for overview of band 1, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) cs = ds.GetRasterBand(2).GetOverview(0).Checksum() expected_cs = 59603 - assert cs == expected_cs or cs == 59588, \ - ('for overview of band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 59588 + ), "for overview of band 2, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) cs = ds.GetRasterBand(3).GetOverview(0).Checksum() expected_cs = 42173 - assert cs == expected_cs or cs == 42361, \ - ('for overview of band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert ( + cs == expected_cs or cs == 42361 + ), "for overview of band 3, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) ds = None + ############################################################################### # Test opening a rasterlite DB with color table and user-defined spatial extent @@ -155,22 +184,27 @@ def test_rasterlite_4(): if gdaltest.rasterlite_drv is None: pytest.skip() - ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,minx=0,miny=0,maxx=180,maxy=90') + ds = gdal.Open( + "RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,minx=0,miny=0,maxx=180,maxy=90" + ) - assert ds.RasterCount == 1, 'expected 1 band' + assert ds.RasterCount == 1, "expected 1 band" assert ds.RasterXSize == 169 and ds.RasterYSize == 85 ct = ds.GetRasterBand(1).GetRasterColorTable() - assert ct is not None, 'did not get color table' + assert ct is not None, "did not get color table" cs = ds.GetRasterBand(1).Checksum() expected_cs = 36473 - assert cs == expected_cs, \ - ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert cs == expected_cs, "for band 1, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) ds = None + ############################################################################### # Test opening a rasterlite DB with color table and do color table expansion @@ -180,30 +214,37 @@ def test_rasterlite_5(): if gdaltest.rasterlite_drv is None: pytest.skip() - ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,bands=3') + ds = gdal.Open("RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,bands=3") - assert ds.RasterCount == 3, 'expected 3 bands' + assert ds.RasterCount == 3, "expected 3 bands" ct = ds.GetRasterBand(1).GetRasterColorTable() - assert ct is None, 'did not expect color table' + assert ct is None, "did not expect color table" cs = ds.GetRasterBand(1).Checksum() expected_cs = 506 - assert cs == expected_cs, \ - ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert cs == expected_cs, "for band 1, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) cs = ds.GetRasterBand(2).Checksum() expected_cs = 3842 - assert cs == expected_cs, \ - ('for band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert cs == expected_cs, "for band 2, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) cs = ds.GetRasterBand(3).Checksum() expected_cs = 59282 - assert cs == expected_cs, \ - ('for band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) + assert cs == expected_cs, "for band 3, cs = %d, different from expected_cs = %d" % ( + cs, + expected_cs, + ) ds = None + ############################################################################### # Test CreateCopy() @@ -214,8 +255,10 @@ def test_rasterlite_6(): pytest.skip() # Test first if spatialite is available - gdal.PushErrorHandler('CPLQuietErrorHandler') - ogr_ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/spatialite_test.db', options=['SPATIALITE=YES']) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ogr_ds = ogr.GetDriverByName("SQLite").CreateDataSource( + "tmp/spatialite_test.db", options=["SPATIALITE=YES"] + ) if ogr_ds is not None: sql_lyr = ogr_ds.ExecuteSQL("SELECT AsText(GeomFromText('POINT(0 1)'))") else: @@ -231,24 +274,30 @@ def test_rasterlite_6(): ogr_ds.Destroy() # Test now CreateCopy() - src_ds = gdal.Open('data/byte.tif') - ds = gdal.GetDriverByName('RASTERLITE').CreateCopy('RASTERLITE:tmp/byte.sqlite,table=byte', src_ds) + src_ds = gdal.Open("data/byte.tif") + ds = gdal.GetDriverByName("RASTERLITE").CreateCopy( + "RASTERLITE:tmp/byte.sqlite,table=byte", src_ds + ) assert ds is not None - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - 'Wrong checksum' + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), "Wrong checksum" gt = ds.GetGeoTransform() expected_gt = src_ds.GetGeoTransform() for i in range(6): - assert not abs(gt[i] - expected_gt[i] > 1e-5), \ - ('Expected : %s\nGot : %s' % (expected_gt, gt)) + assert not abs(gt[i] - expected_gt[i] > 1e-5), "Expected : %s\nGot : %s" % ( + expected_gt, + gt, + ) - assert ds.GetProjectionRef().find('NAD27 / UTM zone 11N') != -1, 'Wrong SRS' + assert ds.GetProjectionRef().find("NAD27 / UTM zone 11N") != -1, "Wrong SRS" src_ds = None ds = None + ############################################################################### # Test BuildOverviews() @@ -261,26 +310,31 @@ def test_rasterlite_7(): if gdaltest.has_spatialite is False: pytest.skip() - ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) + ds = gdal.Open("tmp/byte.sqlite", gdal.GA_Update) # Resampling method is not taken into account - ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) + ds.BuildOverviews("NEAREST", overviewlist=[2, 4]) - assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192, \ - 'Wrong checksum for overview 0' + assert ( + ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192 + ), "Wrong checksum for overview 0" - assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 233, \ - 'Wrong checksum for overview 1' + assert ( + ds.GetRasterBand(1).GetOverview(1).Checksum() == 233 + ), "Wrong checksum for overview 1" # Reopen and test ds = None - ds = gdal.Open('tmp/byte.sqlite') + ds = gdal.Open("tmp/byte.sqlite") + + assert ( + ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192 + ), "Wrong checksum for overview 0" - assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192, \ - 'Wrong checksum for overview 0' + assert ( + ds.GetRasterBand(1).GetOverview(1).Checksum() == 233 + ), "Wrong checksum for overview 1" - assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 233, \ - 'Wrong checksum for overview 1' ############################################################################### # Test CleanOverviews() @@ -294,12 +348,13 @@ def test_rasterlite_8(): if gdaltest.has_spatialite is False: pytest.skip() - ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) + ds = gdal.Open("tmp/byte.sqlite", gdal.GA_Update) ds.BuildOverviews(overviewlist=[]) assert ds.GetRasterBand(1).GetOverviewCount() == 0 + ############################################################################### # Create a rasterlite dataset with EPSILON tiles @@ -315,10 +370,13 @@ def test_rasterlite_9(): if gdaltest.epsilon_drv is None: pytest.skip() - tst = gdaltest.GDALTest('RASTERLITE', 'byte.tif', 1, 4866, options=['DRIVER=EPSILON']) + tst = gdaltest.GDALTest( + "RASTERLITE", "byte.tif", 1, 4866, options=["DRIVER=EPSILON"] + ) return tst.testCreateCopy(check_gt=1, check_srs=1, check_minmax=0) + ############################################################################### # Create a rasterlite dataset with EPSILON tiles @@ -334,10 +392,13 @@ def test_rasterlite_10(): if gdaltest.epsilon_drv is None: pytest.skip() - tst = gdaltest.GDALTest('RASTERLITE', 'rgbsmall.tif', 1, 23189, options=['DRIVER=EPSILON']) + tst = gdaltest.GDALTest( + "RASTERLITE", "rgbsmall.tif", 1, 23189, options=["DRIVER=EPSILON"] + ) return tst.testCreateCopy(check_gt=1, check_srs=1, check_minmax=0) + ############################################################################### # Test BuildOverviews() with AVERAGE resampling @@ -350,22 +411,25 @@ def test_rasterlite_11(): if gdaltest.has_spatialite is False: pytest.skip() - ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) + ds = gdal.Open("tmp/byte.sqlite", gdal.GA_Update) ds.BuildOverviews(overviewlist=[]) # Resampling method is not taken into account - ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) + ds.BuildOverviews("AVERAGE", overviewlist=[2, 4]) # Reopen and test ds = None - ds = gdal.Open('tmp/byte.sqlite') + ds = gdal.Open("tmp/byte.sqlite") - assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1152, \ - 'Wrong checksum for overview 0' + assert ( + ds.GetRasterBand(1).GetOverview(0).Checksum() == 1152 + ), "Wrong checksum for overview 0" + + assert ( + ds.GetRasterBand(1).GetOverview(1).Checksum() == 215 + ), "Wrong checksum for overview 1" - assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 215, \ - 'Wrong checksum for overview 1' ############################################################################### # Test opening a .rasterlite file @@ -379,8 +443,9 @@ def test_rasterlite_12(): if gdaltest.has_spatialite is False: pytest.skip() - ds = gdal.Open('data/rasterlite/byte.rasterlite') - assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' + ds = gdal.Open("data/rasterlite/byte.rasterlite") + assert ds.GetRasterBand(1).Checksum() == 4672, "validation failed" + ############################################################################### # Test opening a .rasterlite.sql file @@ -394,11 +459,12 @@ def test_rasterlite_13(): if gdaltest.has_spatialite is False: pytest.skip() - if gdaltest.rasterlite_drv.GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != 'YES': + if gdaltest.rasterlite_drv.GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != "YES": pytest.skip() - ds = gdal.Open('data/rasterlite/byte.rasterlite.sql') - assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' + ds = gdal.Open("data/rasterlite/byte.rasterlite.sql") + assert ds.GetRasterBand(1).Checksum() == 4672, "validation failed" + ############################################################################### # Cleanup @@ -410,25 +476,21 @@ def test_rasterlite_cleanup(): pytest.skip() try: - os.remove('tmp/spatialite_test.db') + os.remove("tmp/spatialite_test.db") except OSError: pass try: - os.remove('tmp/byte.sqlite') + os.remove("tmp/byte.sqlite") except OSError: pass try: - os.remove('tmp/byte.tif.tst') + os.remove("tmp/byte.tif.tst") except OSError: pass try: - os.remove('tmp/rgbsmall.tif.tst') + os.remove("tmp/rgbsmall.tif.tst") except OSError: pass - - - - diff --git a/autotest/gdrivers/rik.py b/autotest/gdrivers/rik.py index c232c56d201d..3504502ca203 100755 --- a/autotest/gdrivers/rik.py +++ b/autotest/gdrivers/rik.py @@ -29,12 +29,12 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test a RIK map # Data downloaded from : http://www.lantmateriet.se/upload/filer/kartor/programvaror/sverige500_swe99.zip @@ -42,45 +42,50 @@ def test_rik_online_1(): - if gdal.GetDriverByName('RIK') is None: + if gdal.GetDriverByName("RIK") is None: pytest.skip() - if not gdaltest.download_file('http://www.lantmateriet.se/upload/filer/kartor/programvaror/sverige500_swe99.zip', 'sverige500_swe99.zip'): + if not gdaltest.download_file( + "http://www.lantmateriet.se/upload/filer/kartor/programvaror/sverige500_swe99.zip", + "sverige500_swe99.zip", + ): pytest.skip() try: - os.stat('tmp/cache/sverige500_swe99.rik') - file_to_test = 'tmp/cache/sverige500_swe99.rik' + os.stat("tmp/cache/sverige500_swe99.rik") + file_to_test = "tmp/cache/sverige500_swe99.rik" except OSError: try: - print('Uncompressing ZIP file...') + print("Uncompressing ZIP file...") import zipfile - zfobj = zipfile.ZipFile('tmp/cache/sverige500_swe99.zip') - outfile = open('tmp/cache/sverige500_swe99.rik', 'wb') - outfile.write(zfobj.read('sverige500_swe99.rik')) + + zfobj = zipfile.ZipFile("tmp/cache/sverige500_swe99.zip") + outfile = open("tmp/cache/sverige500_swe99.rik", "wb") + outfile.write(zfobj.read("sverige500_swe99.rik")) outfile.close() - file_to_test = 'tmp/cache/sverige500_swe99.rik' + file_to_test = "tmp/cache/sverige500_swe99.rik" except OSError: pytest.skip() - tst = gdaltest.GDALTest('RIK', file_to_test, 1, 17162, filename_absolute=1) + tst = gdaltest.GDALTest("RIK", file_to_test, 1, 17162, filename_absolute=1) return tst.testOpen() + ############################################################################### # Test a LZW compressed RIK dataset def test_rik_online_2(): - if gdal.GetDriverByName('RIK') is None: + if gdal.GetDriverByName("RIK") is None: pytest.skip() - if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/3674/ab-del.rik', 'ab-del.rik'): + if not gdaltest.download_file( + "http://trac.osgeo.org/gdal/raw-attachment/ticket/3674/ab-del.rik", "ab-del.rik" + ): pytest.skip() - tst = gdaltest.GDALTest('RIK', 'tmp/cache/ab-del.rik', 1, 44974, filename_absolute=1) + tst = gdaltest.GDALTest( + "RIK", "tmp/cache/ab-del.rik", 1, 44974, filename_absolute=1 + ) return tst.testOpen() - - - - diff --git a/autotest/gdrivers/rl2.py b/autotest/gdrivers/rl2.py index a28f3d6961e0..0e7d9fd6a9ef 100755 --- a/autotest/gdrivers/rl2.py +++ b/autotest/gdrivers/rl2.py @@ -29,26 +29,25 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal, ogr - - import gdaltest import pytest +from osgeo import gdal, ogr + ############################################################################### # Get the rl2 driver def test_rl2_1(): - gdaltest.rl2_drv = gdal.GetDriverByName('SQLite') + gdaltest.rl2_drv = gdal.GetDriverByName("SQLite") if gdaltest.rl2_drv is None: pytest.skip() - if gdaltest.rl2_drv.GetMetadataItem('DCAP_RASTER') is None: + if gdaltest.rl2_drv.GetMetadataItem("DCAP_RASTER") is None: gdaltest.rl2_drv = None pytest.skip() - + ############################################################################### # Test opening a rl2 DB gray level @@ -58,11 +57,11 @@ def test_rl2_2(): if gdaltest.rl2_drv is None: pytest.skip() - ds = gdal.Open('data/rasterlite2/byte.rl2') + ds = gdal.Open("data/rasterlite2/byte.rl2") - assert ds.RasterCount == 1, 'expected 1 band' + assert ds.RasterCount == 1, "expected 1 band" - assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'did not expect overview' + assert ds.GetRasterBand(1).GetOverviewCount() == 0, "did not expect overview" cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 @@ -73,7 +72,7 @@ def test_rl2_2(): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-15) wkt = ds.GetProjectionRef() - assert '26711' in wkt + assert "26711" in wkt assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex @@ -87,13 +86,14 @@ def test_rl2_2(): expected_subds = [] assert subds == expected_subds - gdal.SetConfigOption('RL2_SHOW_ALL_PYRAMID_LEVELS', 'YES') - ds = gdal.Open('data/rasterlite2/byte.rl2') - gdal.SetConfigOption('RL2_SHOW_ALL_PYRAMID_LEVELS', None) + gdal.SetConfigOption("RL2_SHOW_ALL_PYRAMID_LEVELS", "YES") + ds = gdal.Open("data/rasterlite2/byte.rl2") + gdal.SetConfigOption("RL2_SHOW_ALL_PYRAMID_LEVELS", None) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 + ############################################################################### # Test opening a rl2 DB gray level @@ -103,7 +103,7 @@ def test_rl2_3(): if gdaltest.rl2_drv is None: pytest.skip() - ds = gdal.Open('data/rasterlite2/small_world.rl2') + ds = gdal.Open("data/rasterlite2/small_world.rl2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand @@ -121,10 +121,21 @@ def test_rl2_3(): assert cs == 51412 subds = ds.GetSubDatasets() - expected_subds = [('RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:1:world_west', 'Coverage small_world, section world_west / 1'), ('RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:2:world_east', 'Coverage small_world, section world_east / 2')] + expected_subds = [ + ( + "RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:1:world_west", + "Coverage small_world, section world_west / 1", + ), + ( + "RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:2:world_east", + "Coverage small_world, section world_east / 2", + ), + ] assert subds == expected_subds - ds = gdal.Open('RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:1:world_west') + ds = gdal.Open( + "RASTERLITE2:data/rasterlite2/small_world.rl2:small_world:1:world_west" + ) cs = ds.GetRasterBand(1).Checksum() assert cs == 3721 @@ -134,6 +145,7 @@ def test_rl2_3(): cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 35686 + ############################################################################### # Test opening a rl2 DB paletted @@ -143,7 +155,7 @@ def test_rl2_4(): if gdaltest.rl2_drv is None: pytest.skip() - ds = gdal.Open('data/rasterlite2/small_world_pct.rl2') + ds = gdal.Open("data/rasterlite2/small_world_pct.rl2") assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex @@ -160,6 +172,7 @@ def test_rl2_4(): cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 35614 + ############################################################################### # Test opening a rl2 DB with various data types @@ -169,30 +182,47 @@ def test_rl2_5(): if gdaltest.rl2_drv is None: pytest.skip() - ds = gdal.Open('data/rasterlite2/multi_type.rl2') + ds = gdal.Open("data/rasterlite2/multi_type.rl2") subds = ds.GetSubDatasets() - expected_subds = [('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint8', 'Coverage uint8'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int8', 'Coverage int8'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint16', 'Coverage uint16'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int16', 'Coverage int16'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint32', 'Coverage uint32'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int32', 'Coverage int32'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:float', 'Coverage float'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:double', 'Coverage double'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:1bit', 'Coverage 1bit'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:2bit', 'Coverage 2bit'), ('RASTERLITE2:data/rasterlite2/multi_type.rl2:4bit', 'Coverage 4bit')] + expected_subds = [ + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint8", "Coverage uint8"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int8", "Coverage int8"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint16", "Coverage uint16"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int16", "Coverage int16"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint32", "Coverage uint32"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int32", "Coverage int32"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:float", "Coverage float"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:double", "Coverage double"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:1bit", "Coverage 1bit"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:2bit", "Coverage 2bit"), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:4bit", "Coverage 4bit"), + ] assert subds == expected_subds - tests = [('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint8', gdal.GDT_Byte, 4672), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int8', gdal.GDT_Byte, 4575), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint16', gdal.GDT_UInt16, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int16', gdal.GDT_Int16, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:uint32', gdal.GDT_UInt32, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:int32', gdal.GDT_Int32, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:float', gdal.GDT_Float32, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:double', gdal.GDT_Float64, 4457), - ('RASTERLITE2:data/rasterlite2/multi_type.rl2:1bit', gdal.GDT_Byte, 4873)] + tests = [ + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint8", gdal.GDT_Byte, 4672), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int8", gdal.GDT_Byte, 4575), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint16", gdal.GDT_UInt16, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int16", gdal.GDT_Int16, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:uint32", gdal.GDT_UInt32, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:int32", gdal.GDT_Int32, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:float", gdal.GDT_Float32, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:double", gdal.GDT_Float64, 4457), + ("RASTERLITE2:data/rasterlite2/multi_type.rl2:1bit", gdal.GDT_Byte, 4873), + ] for (subds_name, dt, expected_cs) in tests: ds = gdal.Open(subds_name) assert ds.GetRasterBand(1).DataType == dt, subds_name cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs - if subds_name == 'RASTERLITE2:data/rasterlite2/multi_type.rl2:int8': - assert ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE' + if subds_name == "RASTERLITE2:data/rasterlite2/multi_type.rl2:int8": + assert ( + ds.GetRasterBand(1).GetMetadataItem("PIXELTYPE", "IMAGE_STRUCTURE") + == "SIGNEDBYTE" + ) + - ############################################################################### # Test CreateCopy() on a grayscale uint8 @@ -202,9 +232,10 @@ def test_rl2_6(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() on a RGB @@ -214,9 +245,12 @@ def test_rl2_7(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'small_world.tif', 1, 30111, options=['COMPRESS=PNG']) + tst = gdaltest.GDALTest( + "SQLite", "small_world.tif", 1, 30111, options=["COMPRESS=PNG"] + ) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a paletted dataset @@ -226,9 +260,12 @@ def test_rl2_8(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'small_world_pct.tif', 1, 14890, options=['COMPRESS=PNG']) + tst = gdaltest.GDALTest( + "SQLite", "small_world_pct.tif", 1, 14890, options=["COMPRESS=PNG"] + ) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() on a DATAGRID uint16 @@ -238,9 +275,10 @@ def test_rl2_9(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/uint16.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a DATAGRID int16 @@ -250,9 +288,10 @@ def test_rl2_10(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/int16.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/int16.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a DATAGRID uint32 @@ -262,9 +301,10 @@ def test_rl2_11(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/uint32.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/uint32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a DATAGRID int32 @@ -274,9 +314,10 @@ def test_rl2_12(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/int32.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/int32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a DATAGRID float @@ -286,9 +327,10 @@ def test_rl2_13(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/float32.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/float32.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a DATAGRID double @@ -298,9 +340,10 @@ def test_rl2_14(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/float64.tif', 1, 4672) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/float64.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) + ############################################################################### # Test CreateCopy() on a 1 bit paletted @@ -310,9 +353,10 @@ def test_rl2_15(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', '../../gcore/data/1bit.bmp', 1, 200) + tst = gdaltest.GDALTest("SQLite", "../../gcore/data/1bit.bmp", 1, 200) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() on a forced 1 bit @@ -322,9 +366,12 @@ def test_rl2_16(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'byte.tif', 1, 4873, options=['NBITS=1', 'COMPRESS=CCITTFAX4']) + tst = gdaltest.GDALTest( + "SQLite", "byte.tif", 1, 4873, options=["NBITS=1", "COMPRESS=CCITTFAX4"] + ) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() on a forced 2 bit @@ -334,9 +381,12 @@ def test_rl2_17(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'byte.tif', 1, 4873, options=['NBITS=2', 'COMPRESS=DEFLATE']) + tst = gdaltest.GDALTest( + "SQLite", "byte.tif", 1, 4873, options=["NBITS=2", "COMPRESS=DEFLATE"] + ) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() on a forced 4 bit @@ -346,9 +396,10 @@ def test_rl2_18(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'byte.tif', 1, 2541, options=['NBITS=4']) + tst = gdaltest.GDALTest("SQLite", "byte.tif", 1, 2541, options=["NBITS=4"]) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test CreateCopy() with forced monochrome @@ -358,9 +409,12 @@ def test_rl2_19(): if gdaltest.rl2_drv is None: pytest.skip() - tst = gdaltest.GDALTest('SQLite', 'byte.tif', 1, 4873, options=['PIXEL_TYPE=MONOCHROME']) + tst = gdaltest.GDALTest( + "SQLite", "byte.tif", 1, 4873, options=["PIXEL_TYPE=MONOCHROME"] + ) return tst.testCreateCopy(vsimem=1, check_minmax=False) + ############################################################################### # Test incompatibilities on CreateCopy() # Se https://www.gaia-gis.it/fossil/librasterlite2/wiki?name=reference_table @@ -371,43 +425,53 @@ def test_rl2_20(): if gdaltest.rl2_drv is None: pytest.skip() - tests = [('MONOCHROME', 2, gdal.GDT_Byte, 'NONE', None, None), - ('MONOCHROME', 1, gdal.GDT_UInt16, 'NONE', None, None), - ('PALETTE', 1, gdal.GDT_Byte, 'NONE', None, None), - ('PALETTE', 1, gdal.GDT_UInt16, 'NONE', None, gdal.ColorTable()), - ('GRAYSCALE', 2, gdal.GDT_Byte, 'NONE', None, None), - ('GRAYSCALE', 1, gdal.GDT_UInt16, 'NONE', None, None), - ('RGB', 1, gdal.GDT_Byte, 'NONE', None, None), - ('RGB', 3, gdal.GDT_Int16, 'NONE', None, None), - ('MULTIBAND', 1, gdal.GDT_Byte, 'NONE', None, None), - ('MULTIBAND', 256, gdal.GDT_Byte, 'NONE', None, None), - ('MULTIBAND', 2, gdal.GDT_Int16, 'NONE', None, None), - ('DATAGRID', 2, gdal.GDT_Byte, 'NONE', None, None), - ('DATAGRID', 1, gdal.GDT_CFloat32, 'NONE', None, None), - ('MONOCHROME', 1, gdal.GDT_Byte, 'JPEG', None, None), - ('PALETTE', 1, gdal.GDT_Byte, 'JPEG', None, gdal.ColorTable()), - ('GRAYSCALE', 1, gdal.GDT_Byte, 'CCITTFAX4', None, None), - ('RGB', 3, gdal.GDT_Byte, 'CCITTFAX4', None, None), - ('RGB', 3, gdal.GDT_UInt16, 'JPEG', None, None), - ('MULTIBAND', 3, gdal.GDT_Byte, 'CCITTFAX4', None, None), - ('MULTIBAND', 3, gdal.GDT_UInt16, 'CCITTFAX4', None, None), - ('MULTIBAND', 2, gdal.GDT_Byte, 'CCITTFAX4', None, None), - ('DATAGRID', 1, gdal.GDT_Byte, 'CCITTFAX4', None, None), - ('DATAGRID', 1, gdal.GDT_Int16, 'CCITTFAX4', None, None), ] + tests = [ + ("MONOCHROME", 2, gdal.GDT_Byte, "NONE", None, None), + ("MONOCHROME", 1, gdal.GDT_UInt16, "NONE", None, None), + ("PALETTE", 1, gdal.GDT_Byte, "NONE", None, None), + ("PALETTE", 1, gdal.GDT_UInt16, "NONE", None, gdal.ColorTable()), + ("GRAYSCALE", 2, gdal.GDT_Byte, "NONE", None, None), + ("GRAYSCALE", 1, gdal.GDT_UInt16, "NONE", None, None), + ("RGB", 1, gdal.GDT_Byte, "NONE", None, None), + ("RGB", 3, gdal.GDT_Int16, "NONE", None, None), + ("MULTIBAND", 1, gdal.GDT_Byte, "NONE", None, None), + ("MULTIBAND", 256, gdal.GDT_Byte, "NONE", None, None), + ("MULTIBAND", 2, gdal.GDT_Int16, "NONE", None, None), + ("DATAGRID", 2, gdal.GDT_Byte, "NONE", None, None), + ("DATAGRID", 1, gdal.GDT_CFloat32, "NONE", None, None), + ("MONOCHROME", 1, gdal.GDT_Byte, "JPEG", None, None), + ("PALETTE", 1, gdal.GDT_Byte, "JPEG", None, gdal.ColorTable()), + ("GRAYSCALE", 1, gdal.GDT_Byte, "CCITTFAX4", None, None), + ("RGB", 3, gdal.GDT_Byte, "CCITTFAX4", None, None), + ("RGB", 3, gdal.GDT_UInt16, "JPEG", None, None), + ("MULTIBAND", 3, gdal.GDT_Byte, "CCITTFAX4", None, None), + ("MULTIBAND", 3, gdal.GDT_UInt16, "CCITTFAX4", None, None), + ("MULTIBAND", 2, gdal.GDT_Byte, "CCITTFAX4", None, None), + ("DATAGRID", 1, gdal.GDT_Byte, "CCITTFAX4", None, None), + ("DATAGRID", 1, gdal.GDT_Int16, "CCITTFAX4", None, None), + ] for (pixel_type, band_count, dt, compress, nbits, pct) in tests: - src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, band_count, dt) + src_ds = gdal.GetDriverByName("MEM").Create("", 1, 1, band_count, dt) if pct is not None: src_ds.GetRasterBand(1).SetColorTable(pct) if nbits is not None: - src_ds.GetRasterBand(1).SetMetadataItem('NBITS', nbits, 'IMAGE_STRUCTURE') - options = ['PIXEL_TYPE=' + pixel_type, 'COMPRESS=' + compress] + src_ds.GetRasterBand(1).SetMetadataItem("NBITS", nbits, "IMAGE_STRUCTURE") + options = ["PIXEL_TYPE=" + pixel_type, "COMPRESS=" + compress] with gdaltest.error_handler(): - out_ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_20.rl2', src_ds, options=options) - assert out_ds is None, \ - ('Expected error for %s, band=%d, dt=%d, %s, nbits=%s' % (pixel_type, band_count, dt, compress, nbits)) + out_ds = gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_20.rl2", src_ds, options=options + ) + assert out_ds is None, "Expected error for %s, band=%d, dt=%d, %s, nbits=%s" % ( + pixel_type, + band_count, + dt, + compress, + nbits, + ) + + gdal.Unlink("/vsimem/rl2_20.rl2") - gdal.Unlink('/vsimem/rl2_20.rl2') ############################################################################### # Test compression methods @@ -418,36 +482,47 @@ def test_rl2_21(): if gdaltest.rl2_drv is None: pytest.skip() - tests = [('DEFLATE', None), - ('LZMA', None), - ('PNG', None), - ('JPEG', None), - ('JPEG', 50), - ('JPEG', 100), - ('WEBP', None), - ('WEBP', 50), - ('WEBP', 100), - ('JPEG2000', None), - ('JPEG2000', 50), - ('JPEG2000', 100)] - - src_ds = gdal.Open('data/byte.tif') + tests = [ + ("DEFLATE", None), + ("LZMA", None), + ("PNG", None), + ("JPEG", None), + ("JPEG", 50), + ("JPEG", 100), + ("WEBP", None), + ("WEBP", 50), + ("WEBP", 100), + ("JPEG2000", None), + ("JPEG2000", 50), + ("JPEG2000", 100), + ] + + src_ds = gdal.Open("data/byte.tif") for (compress, quality) in tests: - if gdaltest.rl2_drv.GetMetadataItem('DMD_CREATIONOPTIONLIST').find(compress) < 0: - print('Skipping test of %s, since it is not available in the run-time librasterlite2' % compress) + if ( + gdaltest.rl2_drv.GetMetadataItem("DMD_CREATIONOPTIONLIST").find(compress) + < 0 + ): + print( + "Skipping test of %s, since it is not available in the run-time librasterlite2" + % compress + ) continue - options = ['COMPRESS=' + compress] + options = ["COMPRESS=" + compress] if quality is not None: - options += ['QUALITY=' + str(quality)] - out_ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_21.rl2', src_ds, options=options) - assert out_ds is not None, \ - ('Got error with %s, quality=%d' % (compress, quality)) - assert out_ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE').find(compress) >= 0, \ - ('Compression %s does not seem to have been applied' % compress) + options += ["QUALITY=" + str(quality)] + out_ds = gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_21.rl2", src_ds, options=options + ) + assert out_ds is not None, "Got error with %s, quality=%d" % (compress, quality) + assert ( + out_ds.GetMetadataItem("COMPRESSION", "IMAGE_STRUCTURE").find(compress) >= 0 + ), ("Compression %s does not seem to have been applied" % compress) + + gdal.Unlink("/vsimem/rl2_21.rl2") - gdal.Unlink('/vsimem/rl2_21.rl2') ############################################################################### # Test APPEND_SUBDATASET @@ -458,31 +533,46 @@ def test_rl2_22(): if gdaltest.rl2_drv is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') + src_ds = gdal.Open("data/byte.tif") - ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/rl2_22.rl2', options=['SPATIALITE=YES']) - ds.CreateLayer('foo', None, ogr.wkbPoint) + ds = ogr.GetDriverByName("SQLite").CreateDataSource( + "/vsimem/rl2_22.rl2", options=["SPATIALITE=YES"] + ) + ds.CreateLayer("foo", None, ogr.wkbPoint) ds = None - ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_22.rl2', src_ds, options=['APPEND_SUBDATASET=YES', 'COVERAGE=byte']) + ds = gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_22.rl2", src_ds, options=["APPEND_SUBDATASET=YES", "COVERAGE=byte"] + ) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - ds = gdal.OpenEx('/vsimem/rl2_22.rl2') + ds = gdal.OpenEx("/vsimem/rl2_22.rl2") assert ds.RasterXSize == 20 assert ds.GetLayerCount() == 1 - left_ds = gdal.Translate('left', src_ds, srcWin=[0, 0, 10, 20], format='MEM') - right_ds = gdal.Translate('', src_ds, srcWin=[10, 0, 10, 20], format='MEM') - - gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_22.rl2', left_ds, options=['COVERAGE=left_right']) - ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_22.rl2', right_ds, options=['APPEND_SUBDATASET=YES', 'COVERAGE=left_right', 'SECTION=right']) + left_ds = gdal.Translate("left", src_ds, srcWin=[0, 0, 10, 20], format="MEM") + right_ds = gdal.Translate("", src_ds, srcWin=[10, 0, 10, 20], format="MEM") + + gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_22.rl2", left_ds, options=["COVERAGE=left_right"] + ) + ds = gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_22.rl2", + right_ds, + options=["APPEND_SUBDATASET=YES", "COVERAGE=left_right", "SECTION=right"], + ) assert ds.GetRasterBand(1).Checksum() == 4672 - src_ds = gdal.Open('data/rgbsmall.tif') - ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_22.rl2', src_ds, options=['APPEND_SUBDATASET=YES', 'COVERAGE=rgbsmall']) + src_ds = gdal.Open("data/rgbsmall.tif") + ds = gdaltest.rl2_drv.CreateCopy( + "/vsimem/rl2_22.rl2", + src_ds, + options=["APPEND_SUBDATASET=YES", "COVERAGE=rgbsmall"], + ) assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/rl2_22.rl2') + gdal.Unlink("/vsimem/rl2_22.rl2") + ############################################################################### # Test BuildOverviews @@ -493,21 +583,22 @@ def test_rl2_23(): if gdaltest.rl2_drv is None: pytest.skip() - src_ds = gdal.Open('data/byte.tif') - src_ds = gdal.Translate('', src_ds, format='MEM', width=2048, height=2048) - ds = gdaltest.rl2_drv.CreateCopy('/vsimem/rl2_23.rl2', src_ds) - ret = ds.BuildOverviews('NEAR', [2]) + src_ds = gdal.Open("data/byte.tif") + src_ds = gdal.Translate("", src_ds, format="MEM", width=2048, height=2048) + ds = gdaltest.rl2_drv.CreateCopy("/vsimem/rl2_23.rl2", src_ds) + ret = ds.BuildOverviews("NEAR", [2]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 5 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs != 0 - ret = ds.BuildOverviews('NONE', []) + ret = ds.BuildOverviews("NONE", []) assert ret == 0 - ds = gdal.Open('/vsimem/rl2_23.rl2') + ds = gdal.Open("/vsimem/rl2_23.rl2") assert ds.GetRasterBand(1).GetOverviewCount() != 5 ds = None - gdal.Unlink('/vsimem/rl2_23.rl2') + gdal.Unlink("/vsimem/rl2_23.rl2") + ############################################################################### # Test opening a .rl2.sql file @@ -518,11 +609,15 @@ def test_rl2_24(): if gdaltest.rl2_drv is None: pytest.skip() - if gdal.GetDriverByName('SQLite').GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != 'YES': + if ( + gdal.GetDriverByName("SQLite").GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") + != "YES" + ): pytest.skip() - ds = gdal.Open('data/rasterlite2/byte.rl2.sql') - assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' + ds = gdal.Open("data/rasterlite2/byte.rl2.sql") + assert ds.GetRasterBand(1).Checksum() == 4672, "validation failed" + ############################################################################### # Test Create() @@ -534,7 +629,4 @@ def test_rl2_error_create(): pytest.skip() with gdaltest.error_handler(): - assert gdaltest.rl2_drv.Create('/vsimem/out.db', 1, 1) is None - - - + assert gdaltest.rl2_drv.Create("/vsimem/out.db", 1, 1) is None diff --git a/autotest/gdrivers/rmf.py b/autotest/gdrivers/rmf.py index a44fc8a3212b..99bba195a543 100755 --- a/autotest/gdrivers/rmf.py +++ b/autotest/gdrivers/rmf.py @@ -30,134 +30,132 @@ import os - import gdaltest -from osgeo import gdal -from osgeo import osr import pytest +from osgeo import gdal, osr + ############################################################################### # Perform simple read tests. def test_rmf_1(): - tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/byte.rsw", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_rmf_2(): - tst = gdaltest.GDALTest('rmf', 'rmf/byte-lzw.rsw', 1, 40503) + tst = gdaltest.GDALTest("rmf", "rmf/byte-lzw.rsw", 1, 40503) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_3(): - tst = gdaltest.GDALTest('rmf', 'rmf/float64.mtw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/float64.mtw", 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_rmf_4(): - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 1, 21212) - tst.testOpen(check_gt=(-44.840320, 0.003432, 0, - -22.932584, 0, -0.003432)) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall.rsw", 1, 21212) + tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 2, 21053) - tst.testOpen(check_gt=(-44.840320, 0.003432, 0, - -22.932584, 0, -0.003432)) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall.rsw", 2, 21053) + tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 3, 21349) - tst.testOpen(check_gt=(-44.840320, 0.003432, 0, - -22.932584, 0, -0.003432)) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall.rsw", 3, 21349) + tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) def test_rmf_5(): - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 1, 40503) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall-lzw.rsw", 1, 40503) with gdaltest.error_handler(): tst.testOpen() - - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 2, 41429) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall-lzw.rsw", 2, 41429) with gdaltest.error_handler(): tst.testOpen() - - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 3, 40238) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall-lzw.rsw", 3, 40238) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_6(): - tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 1, 7782) + tst = gdaltest.GDALTest("rmf", "rmf/big-endian.rsw", 1, 7782) with gdaltest.error_handler(): tst.testOpen() - - tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 2, 8480) + + tst = gdaltest.GDALTest("rmf", "rmf/big-endian.rsw", 2, 8480) with gdaltest.error_handler(): tst.testOpen() - - tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 3, 4195) + + tst = gdaltest.GDALTest("rmf", "rmf/big-endian.rsw", 3, 4195) with gdaltest.error_handler(): return tst.testOpen() + ############################################################################### # Create simple copy and check. def test_rmf_7(): - tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/byte.rsw", 1, 4672) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1) def test_rmf_8(): - tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 2, 21053) + tst = gdaltest.GDALTest("rmf", "rmf/rgbsmall.rsw", 2, 21053) return tst.testCreateCopy(check_srs=1, check_gt=1) + ############################################################################### # Create RMFHUGE=YES def test_rmf_9(): - tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672, options=['RMFHUGE=YES']) + tst = gdaltest.GDALTest("rmf", "rmf/byte.rsw", 1, 4672, options=["RMFHUGE=YES"]) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1) + ############################################################################### # Compressed DEM def test_rmf_10(): - tst = gdaltest.GDALTest('rmf', 'rmf/t100.mtw', 1, 6388) + tst = gdaltest.GDALTest("rmf", "rmf/t100.mtw", 1, 6388) with gdaltest.error_handler(): return tst.testOpen() + ############################################################################### # Overviews def test_rmf_11(): - test_fn = '/vsigzip/data/rmf/overviews.rsw.gz' + test_fn = "/vsigzip/data/rmf/overviews.rsw.gz" src_ds = gdal.Open(test_fn) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." band1 = src_ds.GetRasterBand(1) - assert band1.GetOverviewCount() == 3, 'overviews is missing' + assert band1.GetOverviewCount() == 3, "overviews is missing" ovr_n = (0, 1, 2) ovr_size = (256, 64, 16) @@ -166,82 +164,91 @@ def test_rmf_11(): 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) + 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()) + msg = "overview wrong checksum: overview %d, checksum = %d," % ( + i, + ovr_band.Checksum(), + ) pytest.fail(msg) - + ############################################################################### # Check file open with cucled header offsets . def test_rmf_12a(): - tst = gdaltest.GDALTest('rmf', 'rmf/cucled-1.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/cucled-1.rsw", 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) + ############################################################################### # Check file open with cucled header offsets . def test_rmf_12b(): - tst = gdaltest.GDALTest('rmf', 'rmf/cucled-2.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/cucled-2.rsw", 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) + ############################################################################### # Check file open with invalid subheader marker. def test_rmf_12c(): - tst = gdaltest.GDALTest('rmf', 'rmf/invalid-subheader.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/invalid-subheader.rsw", 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) + ############################################################################### # Check file open with corrupted subheader. def test_rmf_12d(): - tst = gdaltest.GDALTest('rmf', 'rmf/corrupted-subheader.rsw', 1, 4672) + tst = gdaltest.GDALTest("rmf", "rmf/corrupted-subheader.rsw", 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) + ############################################################################### # Build overviews and check def rmf_build_ov(source, testid, options, ov_sizes, crs, reopen=False, pass_count=1): - rmf_drv = gdal.GetDriverByName('RMF') - assert rmf_drv is not None, 'RMF driver not found.' + rmf_drv = gdal.GetDriverByName("RMF") + assert rmf_drv is not None, "RMF driver not found." src_ds = gdal.Open(source, gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - test_ds_name = 'tmp/ov-' + testid + '.tst' + 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.' + 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.' + 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' + assert err == 0, "BuildOverviews reports an error" src_ds = None src_ds = gdal.Open(test_ds_name, gdal.GA_ReadOnly) @@ -249,274 +256,323 @@ def rmf_build_ov(source, testid, options, ov_sizes, crs, reopen=False, pass_coun for iBand in range(src_ds.RasterCount): band = src_ds.GetRasterBand(iBand + 1) - assert band.GetOverviewCount() == 2, 'overviews missing' + 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) + 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()) + msg = ( + "overview wrong checksum: band %d, overview %d, checksum = %d," + % (iBand, iOverview, ovr_band.Checksum()) + ) pytest.fail(msg) src_ds = None os.remove(test_ds_name) + ############################################################################### # Build overviews on newly created RSW file def test_rmf_13(): - return rmf_build_ov(source='data/rmf/byte.rsw', - testid='13', - options=['RMFHUGE=NO'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087, 1087, 1087], [328, 328, 328]], - reopen=False) + return rmf_build_ov( + source="data/rmf/byte.rsw", + testid="13", + options=["RMFHUGE=NO"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087, 1087, 1087], [328, 328, 328]], + reopen=False, + ) + ############################################################################### # Build overviews on newly created huge RSW file def test_rmf_14(): - return rmf_build_ov(source='data/rmf/byte.rsw', - testid='14', - options=['RMFHUGE=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087, 1087, 1087], [328, 328, 328]], - reopen=False) + return rmf_build_ov( + source="data/rmf/byte.rsw", + testid="14", + options=["RMFHUGE=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087, 1087, 1087], [328, 328, 328]], + reopen=False, + ) + ############################################################################### # Build overviews on closed and reopened RSW file def test_rmf_15(): - return rmf_build_ov(source='data/rmf/byte.rsw', - testid='15', - options=['RMFHUGE=NO'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087, 1087, 1087], [328, 328, 328]], - reopen=True) + return rmf_build_ov( + source="data/rmf/byte.rsw", + testid="15", + options=["RMFHUGE=NO"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087, 1087, 1087], [328, 328, 328]], + reopen=True, + ) + ############################################################################### # Build overviews on closed and reopened huge RSW file def test_rmf_16(): - return rmf_build_ov(source='data/rmf/byte.rsw', - testid='16', - options=['RMFHUGE=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087, 1087, 1087], [328, 328, 328]], - reopen=True) + return rmf_build_ov( + source="data/rmf/byte.rsw", + testid="16", + options=["RMFHUGE=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087, 1087, 1087], [328, 328, 328]], + reopen=True, + ) + ############################################################################### # Build overviews on newly created MTW file def test_rmf_17(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='17', - options=['RMFHUGE=NO', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087, 1087, 1087], [328, 328, 328]], - reopen=False) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="17", + options=["RMFHUGE=NO", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087, 1087, 1087], [328, 328, 328]], + reopen=False, + ) + ############################################################################### # Build overviews on newly created MTW file def test_rmf_18(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='18', - options=['RMFHUGE=YES', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=False) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="18", + options=["RMFHUGE=YES", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=False, + ) + ############################################################################### # Build overviews on closed and reopened MTW file def test_rmf_19(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='19', - options=['RMFHUGE=NO', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=True) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="19", + options=["RMFHUGE=NO", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=True, + ) + ############################################################################### # Build overviews on closed and reopened huge MTW file def test_rmf_20(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='20', - options=['RMFHUGE=YES', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=True) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="20", + options=["RMFHUGE=YES", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=True, + ) + ############################################################################### # Recreate overviews on newly created MTW file def test_rmf_21(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='21', - options=['RMFHUGE=NO', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=False, - pass_count=2) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="21", + options=["RMFHUGE=NO", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=False, + pass_count=2, + ) + ############################################################################### # Recreate overviews on newly created huge MTW file def test_rmf_22(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='22', - options=['RMFHUGE=YES', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=False, - pass_count=2) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="22", + options=["RMFHUGE=YES", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=False, + pass_count=2, + ) ############################################################################### # Recreate overviews on closed and reopened MTW file + def test_rmf_23(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='23', - options=['RMFHUGE=NO', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=True, - pass_count=2) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="23", + options=["RMFHUGE=NO", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=True, + pass_count=2, + ) + ############################################################################### # Recreate overviews on closed and reopened huge MTW file def test_rmf_24(): - return rmf_build_ov(source='data/rmf/float64.mtw', - testid='24', - options=['RMFHUGE=YES', 'MTW=YES'], - ov_sizes=[[10, 10], [5, 5]], - crs=[[1087], [328]], - reopen=True, - pass_count=2) + return rmf_build_ov( + source="data/rmf/float64.mtw", + testid="24", + options=["RMFHUGE=YES", "MTW=YES"], + ov_sizes=[[10, 10], [5, 5]], + crs=[[1087], [328]], + reopen=True, + pass_count=2, + ) + ############################################################################### # Nodata write test def test_rmf_25(): - rmf_drv = gdal.GetDriverByName('RMF') - assert rmf_drv is not None, 'RMF driver not found.' + rmf_drv = gdal.GetDriverByName("RMF") + assert rmf_drv is not None, "RMF driver not found." - src_ds = gdal.Open('data/rmf/byte.rsw', gdal.GA_ReadOnly) + src_ds = gdal.Open("data/rmf/byte.rsw", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + assert src_ds is not None, "Failed to open test dataset." - test_ds_name = 'tmp/nodata.rsw' + 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.' + 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.' + 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.' + 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.' + 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.' + 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.' + 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.' + rmf_drv = gdal.GetDriverByName("RMF") + assert rmf_drv is not None, "RMF driver not found." - src_ds = gdal.Open('data/rmf/float64.mtw', gdal.GA_ReadOnly) + src_ds = gdal.Open("data/rmf/float64.mtw", gdal.GA_ReadOnly) - assert src_ds is not None, 'Failed to open test dataset.' + 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_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') + test_ds.GetRasterBand(1).SetUnitType("cm") unittype = test_ds.GetRasterBand(1).GetUnitType() - assert unittype == 'cm', 'Invalid UnitType after CreateCopy.' + 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.' + 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') + 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.' + 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.' + assert unittype == "mm", "Invalid UnitType after dataset update." - test_ds.GetRasterBand(1).SetUnitType('ft') + test_ds.GetRasterBand(1).SetUnitType("ft") unittype = test_ds.GetRasterBand(1).GetUnitType() - assert unittype == 'mm', 'Invalid UnitType after dataset update.' + 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: + if gdal.GetDriverByName("JPEG") is None: pytest.skip() - cs1 = [50553, 27604, 36652] # - cs2 = [51009, 27640, 37765] # osx, clang + cs1 = [50553, 27604, 36652] # + cs2 = [51009, 27640, 37765] # osx, clang - ds = gdal.Open('data/rmf/jpeg-in-rmf.rsw', gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open test dataset.' + ds = gdal.Open("data/rmf/jpeg-in-rmf.rsw", gdal.GA_ReadOnly) + assert ds is not None, "Failed to open test dataset." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'JPEG', \ - ('"COMPRESSION" value is "%s" but expected "JPEG"' % - md['COMPRESSION']) + 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))) + assert cs == cs1 or cs == cs2, "Invalid checksum %s expected %s or %s." % ( + str(cs), + str(cs1), + str(cs2), + ) ############################################################################### @@ -525,74 +581,80 @@ def test_rmf_27(): def test_rmf_28a(): - ds = gdal.Open('data/rmf/byte-lzw.rsw', gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open test dataset.' + ds = gdal.Open("data/rmf/byte-lzw.rsw", gdal.GA_ReadOnly) + assert ds is not None, "Failed to open test dataset." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'LZW', \ - ('"COMPRESSION" value is "%s" but expected "LZW"' % - md['COMPRESSION']) + md = ds.GetMetadata("IMAGE_STRUCTURE") + assert md["COMPRESSION"] == "LZW", ( + '"COMPRESSION" value is "%s" but expected "LZW"' % md["COMPRESSION"] + ) def test_rmf_28b(): - ds = gdal.Open('data/rmf/t100.mtw', gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open test dataset.' + ds = gdal.Open("data/rmf/t100.mtw", gdal.GA_ReadOnly) + assert ds is not None, "Failed to open test dataset." - md = ds.GetMetadata('IMAGE_STRUCTURE') - assert md['COMPRESSION'] == 'RMF_DEM', \ - ('"COMPRESSION" value is "%s" but expected "RMF_DEM"' % - md['COMPRESSION']) + 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.' + rmf_drv = gdal.GetDriverByName("RMF") + assert rmf_drv is not None, "RMF driver not found." - ds = gdal.Open('data/rmf/byte.rsw', gdal.GA_ReadOnly) - assert ds is not None, 'Failed to open test dataset.' + ds = gdal.Open("data/rmf/byte.rsw", gdal.GA_ReadOnly) + assert ds is not None, "Failed to open test dataset." - test_ds_name = 'tmp/epsg.rsw' + test_ds_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.' + assert test_ds is not None, "Failed to create test dataset copy." sr = osr.SpatialReference() - sr.SetFromUserInput('EPSG:3388') + sr.SetFromUserInput("EPSG:3388") test_ds.SetProjection(sr.ExportToWkt()) - test_ds = None; + 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.' + 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))) + assert ( + str(sr.GetAuthorityCode(None)) == "3388" + ), "EPSG code is %s expected 3388." % str(sr.GetAuthorityCode(None)) ############################################################################### # Check interleaved access + def test_rmf_30(): - ds_name = 'tmp/interleaved.tif' - gdal.Translate(ds_name, 'data/rmf/rgbsmall-lzw.rsw', - format='GTiff') + ds_name = "tmp/interleaved.tif" + gdal.Translate(ds_name, "data/rmf/rgbsmall-lzw.rsw", format="GTiff") ds = gdal.Open(ds_name) - assert ds is not None, ('Can\'t open ' + ds_name) + 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))) + 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), + ) ############################################################################### @@ -601,71 +663,76 @@ def test_rmf_30(): def test_rmf_31a(): - tst = gdaltest.GDALTest('rmf', 'small_world.tif', 1, - 30111, options=['COMPRESS=NONE']) + 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']) + 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_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) + assert ds is not None, "Can't open " + ds_name expected_cs1 = [25789, 27405, 31974] - expected_cs2 = [23764, 25265, 33585] # osx - expected_cs_jpeg9e = [21031, 26574, 34780] # libjpeg 9e - cs = [ds.GetRasterBand(1).Checksum(), - ds.GetRasterBand(2).Checksum(), - ds.GetRasterBand(3).Checksum()] + expected_cs2 = [23764, 25265, 33585] # osx + expected_cs_jpeg9e = [21031, 26574, 34780] # libjpeg 9e + cs = [ + ds.GetRasterBand(1).Checksum(), + ds.GetRasterBand(2).Checksum(), + ds.GetRasterBand(3).Checksum(), + ] assert cs in (expected_cs1, expected_cs2, expected_cs_jpeg9e) def test_rmf_31d(): - tst = gdaltest.GDALTest('rmf', 'rmf/t100.mtw', 1, - 6388, options=['MTW=YES', 'COMPRESS=RMF_DEM']) + tst = gdaltest.GDALTest( + "rmf", "rmf/t100.mtw", 1, 6388, options=["MTW=YES", "COMPRESS=RMF_DEM"] + ) return tst.testCreateCopy(check_minmax=0, check_srs=1, check_gt=1) def rmf_31e_data_gen(min_val, max_val, stripeSize, sx): - numpy = pytest.importorskip('numpy') - x = numpy.array([[min_val,max_val//2],[max_val,1]], dtype = numpy.int32) - x = numpy.block([[x, numpy.flip(x,0)], - [numpy.flip(x, 1), x.transpose()]]) + numpy = pytest.importorskip("numpy") + x = numpy.array([[min_val, max_val // 2], [max_val, 1]], dtype=numpy.int32) + x = numpy.block([[x, numpy.flip(x, 0)], [numpy.flip(x, 1), x.transpose()]]) x = numpy.tile(x, (stripeSize // x.shape[0], sx // x.shape[1])) return x def test_rmf_31e(): - numpy = pytest.importorskip('numpy') + numpy = pytest.importorskip("numpy") - drv = gdal.GetDriverByName('Gtiff') + 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) + 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) + buff = numpy.zeros((sx, stripeSize), dtype=numpy.int32) tst_ds.GetRasterBand(1).WriteArray(buff, 0, 0) # 4-bit deltas @@ -674,37 +741,38 @@ def test_rmf_31e(): # 8-bit deltas buff = rmf_31e_data_gen(0, 256 - 1, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*2) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 2) # 12-bit deltas - buff = rmf_31e_data_gen(0, 256*16 - 1, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*3) + buff = rmf_31e_data_gen(0, 256 * 16 - 1, stripeSize, sx) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 3) # 16-bit deltas - buff = rmf_31e_data_gen(0, 256*256 - 1, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*4) + buff = rmf_31e_data_gen(0, 256 * 256 - 1, stripeSize, sx) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 4) # 24-bit deltas - buff = rmf_31e_data_gen(0, 256*256*256 - 1, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*5) + buff = rmf_31e_data_gen(0, 256 * 256 * 256 - 1, stripeSize, sx) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 5) # 32-bit deltas - buff = rmf_31e_data_gen(0, 256*256*256*128 - 1, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*6) + buff = rmf_31e_data_gen(0, 256 * 256 * 256 * 128 - 1, stripeSize, sx) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 6) # Negative values - buff = rmf_31e_data_gen(-(256*256*256 - 2), 256*256*256 - 2, stripeSize, sx) - tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*7) + buff = rmf_31e_data_gen(-(256 * 256 * 256 - 2), 256 * 256 * 256 - 2, stripeSize, sx) + tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize * 7) tst_ds = None tst_ds = gdal.Open(tst_name) - assert tst_ds is not None, ('Can\'t 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']) + 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) @@ -712,13 +780,18 @@ def test_rmf_31e(): ############################################################################### # 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') + 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) + tst = gdaltest.GDALTest("rmf", "../" + ds_name, 1, 5540) res = tst.testOpen(check_gt=None) os.remove(ds_name) @@ -727,11 +800,15 @@ def test_rmf_32a(): 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') + 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) + tst = gdaltest.GDALTest("rmf", "../" + ds_name, 1, 5540) res = tst.testOpen(check_gt=None) os.remove(ds_name) @@ -743,16 +820,22 @@ def test_rmf_32b(): 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) + 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 @@ -764,57 +847,68 @@ def test_rmf_32c(): def test_rmf_33a(): - tst = gdaltest.GDALTest('rmf', 'rmf/1bit.rsw', 1, 34325) + tst = gdaltest.GDALTest("rmf", "rmf/1bit.rsw", 1, 34325) return tst.testOpen() def test_rmf_33b(): - tst = gdaltest.GDALTest('rmf', 'rmf/4bit.rsw', 1, 55221) + tst = gdaltest.GDALTest("rmf", "rmf/4bit.rsw", 1, 55221) return tst.testOpen() def test_rmf_33c(): - tst = gdaltest.GDALTest('rmf', 'rmf/4bit-lzw.rsw', 1, 55221) + tst = gdaltest.GDALTest("rmf", "rmf/4bit-lzw.rsw", 1, 55221) return tst.testOpen() ############################################################################### -# Flush NoData blocks in MTW +# Flush NoData blocks in MTW def test_rmf_34(): - numpy = pytest.importorskip('numpy') - - drv = gdal.GetDriverByName('RMF') - tst_name = 'tmp/rmf_34.mtw' - tst_ds = drv.Create(tst_name, 32, 32, 1, gdal.GDT_Int32, - options=['MTW=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16'] ) - assert tst_ds is not None, ('Can\'t create ' + tst_name) + numpy = pytest.importorskip("numpy") + + drv = gdal.GetDriverByName("RMF") + tst_name = "tmp/rmf_34.mtw" + tst_ds = drv.Create( + tst_name, + 32, + 32, + 1, + gdal.GDT_Int32, + options=["MTW=YES", "BLOCKXSIZE=16", "BLOCKYSIZE=16"], + ) + assert tst_ds is not None, "Can't create " + tst_name nodata = 0 tst_ds.GetRasterBand(1).SetNoDataValue(nodata) # Write NoData block - buff = numpy.full((16, 16), nodata, dtype = numpy.int32) + buff = numpy.full((16, 16), nodata, dtype=numpy.int32) assert gdal.CE_None == tst_ds.GetRasterBand(1).WriteArray(buff, 0, 0) gdal.ErrorReset() tst_ds.FlushCache() - assert gdal.GetLastErrorType() == gdal.CE_None, 'Flush cache failed: ' + gdal.GetLastErrorMsg() + assert gdal.GetLastErrorType() == gdal.CE_None, ( + "Flush cache failed: " + gdal.GetLastErrorMsg() + ) # Write valid block min_valid_data, max_valid_data = 1, 2 - buff = numpy.full((16, 16), min_valid_data, dtype = numpy.int32) + buff = numpy.full((16, 16), min_valid_data, dtype=numpy.int32) assert gdal.CE_None == tst_ds.GetRasterBand(1).WriteArray(buff, 16, 0) - buff = numpy.full((16, 16), max_valid_data, dtype = numpy.int32) + buff = numpy.full((16, 16), max_valid_data, dtype=numpy.int32) assert gdal.CE_None == tst_ds.GetRasterBand(1).WriteArray(buff, 16, 16) tst_ds.FlushCache() - assert gdal.GetLastErrorType() == gdal.CE_None, 'Flush cache failed: ' + gdal.GetLastErrorMsg() + assert gdal.GetLastErrorType() == gdal.CE_None, ( + "Flush cache failed: " + gdal.GetLastErrorMsg() + ) tst_ds = None tst_ds = gdal.Open(tst_name) - assert tst_ds is not None, ('Can\'t open ' + tst_name) - assert min_valid_data == int(tst_ds.GetMetadataItem('ELEVATION_MINIMUM')) - assert max_valid_data == int(tst_ds.GetMetadataItem('ELEVATION_MAXIMUM')) + assert tst_ds is not None, "Can't open " + tst_name + assert min_valid_data == int(tst_ds.GetMetadataItem("ELEVATION_MINIMUM")) + assert max_valid_data == int(tst_ds.GetMetadataItem("ELEVATION_MAXIMUM")) tst_ds = None os.remove(tst_name) + ############################################################################### diff --git a/autotest/gdrivers/roipac.py b/autotest/gdrivers/roipac.py index c4c5c26d2e56..59b0610f644a 100755 --- a/autotest/gdrivers/roipac.py +++ b/autotest/gdrivers/roipac.py @@ -29,18 +29,17 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Perform simple read test. def test_roipac_1(): - tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) + tst = gdaltest.GDALTest("roi_pac", "roipac/srtm.dem", 1, 64074) prj = """GEOGCS["WGS 84", DATUM["WGS_1984", @@ -54,9 +53,11 @@ def test_roipac_1(): AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" - return tst.testOpen(check_prj=prj, - check_gt=(-180.0083333, 0.0083333333, 0.0, - -59.9916667, 0.0, -0.0083333333)) + return tst.testOpen( + check_prj=prj, + check_gt=(-180.0083333, 0.0083333333, 0.0, -59.9916667, 0.0, -0.0083333333), + ) + ############################################################################### # Test reading of metadata from the ROI_PAC metadata domain @@ -64,9 +65,10 @@ def test_roipac_1(): def test_roipac_2(): - ds = gdal.Open('data/roipac/srtm.dem') - val = ds.GetMetadataItem('YMAX', 'ROI_PAC') - assert val == '9' + ds = gdal.Open("data/roipac/srtm.dem") + val = ds.GetMetadataItem("YMAX", "ROI_PAC") + assert val == "9" + ############################################################################### # Verify this can be exported losslessly. @@ -74,8 +76,9 @@ def test_roipac_2(): def test_roipac_3(): - tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) - return tst.testCreateCopy(check_gt=1, new_filename='strm.tst.dem') + tst = gdaltest.GDALTest("roi_pac", "roipac/srtm.dem", 1, 64074) + return tst.testCreateCopy(check_gt=1, new_filename="strm.tst.dem") + ############################################################################### # Verify VSIF*L capacity @@ -83,8 +86,9 @@ def test_roipac_3(): def test_roipac_4(): - tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) - return tst.testCreateCopy(check_gt=1, new_filename='strm.tst.dem', vsimem=1) + tst = gdaltest.GDALTest("roi_pac", "roipac/srtm.dem", 1, 64074) + return tst.testCreateCopy(check_gt=1, new_filename="strm.tst.dem", vsimem=1) + ############################################################################### # Verify offset/scale metadata reading @@ -92,24 +96,21 @@ def test_roipac_4(): def test_roipac_5(): - ds = gdal.Open('data/roipac/srtm.dem') + ds = gdal.Open("data/roipac/srtm.dem") band = ds.GetRasterBand(1) offset = band.GetOffset() assert offset == 1 scale = band.GetScale() assert scale == 2 + ############################################################################### # Test .flg def test_roipac_6(): - tst = gdaltest.GDALTest('roi_pac', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("roi_pac", "byte.tif", 1, 4672) with gdaltest.error_handler(): - ret = tst.testCreateCopy(check_gt=1, new_filename='byte.flg', vsimem=1) + ret = tst.testCreateCopy(check_gt=1, new_filename="byte.flg", vsimem=1) return ret - - - - diff --git a/autotest/gdrivers/rpftoc.py b/autotest/gdrivers/rpftoc.py index 8b0053f01b1b..753a1df30086 100755 --- a/autotest/gdrivers/rpftoc.py +++ b/autotest/gdrivers/rpftoc.py @@ -30,76 +30,103 @@ import os import shutil -from osgeo import gdal - import gdaltest +from osgeo import gdal + ############################################################################### # Read a simple and hand-made RPFTOC dataset, made of one single CADRG frame # whose content is fully empty. def test_rpftoc_1(): - tst = gdaltest.GDALTest('RPFTOC', 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', 1, 53599, filename_absolute=1) - gt = (1.9999416000000001, 0.0017833876302083334, 0.0, 36.000117500000002, 0.0, -0.0013461816406249993) + tst = gdaltest.GDALTest( + "RPFTOC", + "NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC", + 1, + 53599, + filename_absolute=1, + ) + gt = ( + 1.9999416000000001, + 0.0017833876302083334, + 0.0, + 36.000117500000002, + 0.0, + -0.0013461816406249993, + ) return tst.testOpen(check_gt=gt) + ############################################################################### # Same test as rpftoc_1, but the dataset is forced to be opened in RGBA mode def test_rpftoc_2(): - gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'YES') - tst = gdaltest.GDALTest('RPFTOC', 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', 1, 0, filename_absolute=1) + gdal.SetConfigOption("RPFTOC_FORCE_RGBA", "YES") + tst = gdaltest.GDALTest( + "RPFTOC", + "NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC", + 1, + 0, + filename_absolute=1, + ) res = tst.testOpen() - gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'NO') + gdal.SetConfigOption("RPFTOC_FORCE_RGBA", "NO") return res + ############################################################################### # Test reading the metadata def test_rpftoc_3(): - ds = gdal.Open('data/nitf/A.TOC') - md = ds.GetMetadata('SUBDATASETS') - assert 'SUBDATASET_1_NAME' in md and md['SUBDATASET_1_NAME'] == 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', \ - 'missing SUBDATASET_1_NAME metadata' - - ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC') + ds = gdal.Open("data/nitf/A.TOC") + md = ds.GetMetadata("SUBDATASETS") + assert ( + "SUBDATASET_1_NAME" in md + and md["SUBDATASET_1_NAME"] + == "NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC" + ), "missing SUBDATASET_1_NAME metadata" + + ds = gdal.Open("NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC") md = ds.GetMetadata() - assert 'FILENAME_0' in md and md['FILENAME_0'].replace('\\', '/') == 'data/nitf/RPFTOC01.ON2' + assert ( + "FILENAME_0" in md + and md["FILENAME_0"].replace("\\", "/") == "data/nitf/RPFTOC01.ON2" + ) + ############################################################################### # Add an overview def test_rpftoc_4(): - gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'YES') + gdal.SetConfigOption("RPFTOC_FORCE_RGBA", "YES") - shutil.copyfile('data/nitf/A.TOC', 'tmp/A.TOC') - shutil.copyfile('data/nitf/RPFTOC01.ON2', 'tmp/RPFTOC01.ON2') + shutil.copyfile("data/nitf/A.TOC", "tmp/A.TOC") + shutil.copyfile("data/nitf/RPFTOC01.ON2", "tmp/RPFTOC01.ON2") - ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC') + ds = gdal.Open("NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC") err = ds.BuildOverviews(overviewlist=[2, 4]) - assert err == 0, 'BuildOverviews reports an error' + assert err == 0, "BuildOverviews reports an error" - assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ - 'Overview missing on target file.' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 2 + ), "Overview missing on target file." ds = None - ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC') - assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ - 'Overview missing on target file after re-open.' + ds = gdal.Open("NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC") + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 2 + ), "Overview missing on target file after re-open." ds = None - gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'NO') - - os.unlink('tmp/A.TOC') - os.unlink('tmp/A.TOC.1.ovr') - os.unlink('tmp/RPFTOC01.ON2') - - + gdal.SetConfigOption("RPFTOC_FORCE_RGBA", "NO") + os.unlink("tmp/A.TOC") + os.unlink("tmp/A.TOC.1.ovr") + os.unlink("tmp/RPFTOC01.ON2") diff --git a/autotest/gdrivers/rraster.py b/autotest/gdrivers/rraster.py index 27441b7c9ba1..ef419bc159e8 100755 --- a/autotest/gdrivers/rraster.py +++ b/autotest/gdrivers/rraster.py @@ -30,42 +30,45 @@ ############################################################################### import pprint -from osgeo import gdal -from osgeo import osr - import gdaltest +from osgeo import gdal, osr + ############################################################################### # Perform simple read test. -def test_rraster_1(filename='data/rraster/byte_rraster1.grd', check_prj=None): +def test_rraster_1(filename="data/rraster/byte_rraster1.grd", check_prj=None): - tst = gdaltest.GDALTest('RRASTER', filename, 1, 4672, filename_absolute=True) - ref_ds = gdal.Open('data/byte.tif') + tst = gdaltest.GDALTest("RRASTER", filename, 1, 4672, filename_absolute=True) + ref_ds = gdal.Open("data/byte.tif") if check_prj is None: check_prj = ref_ds.GetProjectionRef() - tst.testOpen(check_prj=check_prj, - check_gt=ref_ds.GetGeoTransform(), - check_min=74, - check_max=255) + tst.testOpen( + check_prj=check_prj, + check_gt=ref_ds.GetGeoTransform(), + check_min=74, + check_max=255, + ) ds = gdal.Open(filename) - assert ds.GetRasterBand(1).GetDescription() == 'byte' + assert ds.GetRasterBand(1).GetDescription() == "byte" + ############################################################################### def test_rraster_1_copy(): - filename = '/vsimem/rraster/byte_rraster.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster1.grd', format='RRASTER') - assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' + filename = "/vsimem/rraster/byte_rraster.grd" + gdal.Translate(filename, "data/rraster/byte_rraster1.grd", format="RRASTER") + assert not gdal.VSIStatL(filename + ".aux.xml"), "did not expect .aux.xml" sr = osr.SpatialReference() sr.ImportFromEPSG(26711) test_rraster_1(filename, check_prj=sr.ExportToWkt()) - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### @@ -73,299 +76,314 @@ def test_rraster_1_copy(): def _compare_val(got, expected, key_name, to_print): if isinstance(got, list) and isinstance(expected, list): if len(got) != len(expected): - print('Unexpected number of elements for %s. Got %d, expected %d' % (key_name, len(got), len(expected))) + print( + "Unexpected number of elements for %s. Got %d, expected %d" + % (key_name, len(got), len(expected)) + ) pprint.pprint(to_print) return False for i, val in enumerate(got): - if not _compare_val(val, expected[i], '%s[%d]' % (key_name, i), to_print): + if not _compare_val(val, expected[i], "%s[%d]" % (key_name, i), to_print): return False elif isinstance(got, dict) and isinstance(expected, dict): if not _is_dict_included_in_dict(got, expected, key_name, to_print): pprint.pprint(to_print) return False elif got != expected: - print('Value for %s is different' % key_name) + print("Value for %s is different" % key_name) pprint.pprint(got) return False return True + ############################################################################### -def _is_dict_included_in_dict(got, expected, key_name='', to_print=None): +def _is_dict_included_in_dict(got, expected, key_name="", to_print=None): if to_print is None: to_print = got for k in expected: if k not in got: - print('Missing %s' % k) + print("Missing %s" % k) return False - if not _compare_val(got[k], expected[k], key_name + '/' + k, to_print): + if not _compare_val(got[k], expected[k], key_name + "/" + k, to_print): return False return True + ############################################################################### -def test_rraster_rgba(filename='data/rraster/rgba_rraster.grd'): +def test_rraster_rgba(filename="data/rraster/rgba_rraster.grd"): ds = gdal.Open(filename) - info = gdal.Info(ds, computeChecksum=True, format='json') + info = gdal.Info(ds, computeChecksum=True, format="json") expected_info = { - 'bands': [{'band': 1, - 'block': [2, 1], - 'checksum': 19, - 'colorInterpretation': 'Red', - 'description': 'red'}, - {'band': 2, - 'block': [2, 1], - 'checksum': 27, - 'colorInterpretation': 'Green', - 'description': 'green'}, - {'band': 3, - 'block': [2, 1], - 'checksum': 22, - 'colorInterpretation': 'Blue', - 'description': 'blue'}, - {'band': 4, - 'block': [2, 1], - 'checksum': 7, - 'colorInterpretation': 'Alpha', - 'description': 'alpha'}] + "bands": [ + { + "band": 1, + "block": [2, 1], + "checksum": 19, + "colorInterpretation": "Red", + "description": "red", + }, + { + "band": 2, + "block": [2, 1], + "checksum": 27, + "colorInterpretation": "Green", + "description": "green", + }, + { + "band": 3, + "block": [2, 1], + "checksum": 22, + "colorInterpretation": "Blue", + "description": "blue", + }, + { + "band": 4, + "block": [2, 1], + "checksum": 7, + "colorInterpretation": "Alpha", + "description": "alpha", + }, + ] } assert _is_dict_included_in_dict(info, expected_info) + ############################################################################### def test_rraster_rgba_copy(): - filename = '/vsimem/rgba_rraster.grd' - - for creationOptions in [[], ['INTERLEAVE=BIP'], ['INTERLEAVE=BIL'], ['INTERLEAVE=BSQ']]: - gdal.Translate(filename, 'data/rraster/rgba_rraster.grd', format='RRASTER', - creationOptions=creationOptions) - assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' + filename = "/vsimem/rgba_rraster.grd" + + for creationOptions in [ + [], + ["INTERLEAVE=BIP"], + ["INTERLEAVE=BIL"], + ["INTERLEAVE=BSQ"], + ]: + gdal.Translate( + filename, + "data/rraster/rgba_rraster.grd", + format="RRASTER", + creationOptions=creationOptions, + ) + assert not gdal.VSIStatL(filename + ".aux.xml"), "did not expect .aux.xml" print(creationOptions) test_rraster_rgba(filename) - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) ############################################################################### -def test_rraster_ct_rgb(filename='data/rraster/byte_rraster_ct_rgb.grd'): +def test_rraster_ct_rgb(filename="data/rraster/byte_rraster_ct_rgb.grd"): ds = gdal.Open(filename) - info = gdal.Info(ds, format='json') + info = gdal.Info(ds, format="json") expected_info = { - 'bands': [{'band': 1, - 'colorInterpretation': 'Palette', - 'colorTable': {'count': 2, - 'entries': [[10, 20, 30, 255], - [11, 21, 31, 255]], - 'palette': 'RGB'}, - 'type': 'Byte'}] + "bands": [ + { + "band": 1, + "colorInterpretation": "Palette", + "colorTable": { + "count": 2, + "entries": [[10, 20, 30, 255], [11, 21, 31, 255]], + "palette": "RGB", + }, + "type": "Byte", + } + ] } assert _is_dict_included_in_dict(info, expected_info) + ############################################################################### def test_rraster_ct_rgb_copy(): - filename = '/vsimem/rraster/byte_rraster_ct_rgb.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster_ct_rgb.grd', format='RRASTER') - assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' + filename = "/vsimem/rraster/byte_rraster_ct_rgb.grd" + gdal.Translate(filename, "data/rraster/byte_rraster_ct_rgb.grd", format="RRASTER") + assert not gdal.VSIStatL(filename + ".aux.xml"), "did not expect .aux.xml" test_rraster_ct_rgb(filename) - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### -def test_rraster_ct_rgba(filename='data/rraster/byte_rraster_ct_rgba.grd'): +def test_rraster_ct_rgba(filename="data/rraster/byte_rraster_ct_rgba.grd"): ds = gdal.Open(filename) - info = gdal.Info(ds, format='json') + info = gdal.Info(ds, format="json") expected_info = { - 'bands': [{'band': 1, - 'colorInterpretation': 'Palette', - 'colorTable': {'count': 2, - 'entries': [[10, 20, 30, 0], - [11, 21, 31, 255]], - 'palette': 'RGB'}, - 'type': 'Byte'}] + "bands": [ + { + "band": 1, + "colorInterpretation": "Palette", + "colorTable": { + "count": 2, + "entries": [[10, 20, 30, 0], [11, 21, 31, 255]], + "palette": "RGB", + }, + "type": "Byte", + } + ] } assert _is_dict_included_in_dict(info, expected_info) + ############################################################################### def test_rraster_ct_rgba_copy(): - filename = '/vsimem/rraster/byte_rraster_ct_rgba.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster_ct_rgba.grd', format='RRASTER') - assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' + filename = "/vsimem/rraster/byte_rraster_ct_rgba.grd" + gdal.Translate(filename, "data/rraster/byte_rraster_ct_rgba.grd", format="RRASTER") + assert not gdal.VSIStatL(filename + ".aux.xml"), "did not expect .aux.xml" test_rraster_ct_rgba(filename) - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### -def test_rraster_rat(filename='data/rraster/byte_rraster_rat.grd'): +def test_rraster_rat(filename="data/rraster/byte_rraster_rat.grd"): ds = gdal.Open(filename) - info = gdal.Info(ds, format='json') + info = gdal.Info(ds, format="json") expected_info = { - 'bands': [{'band': 1, - 'block': [20, 1], - 'colorInterpretation': 'Undefined', - 'metadata': {}, - 'type': 'Byte'}], - 'rat': {'fieldDefn': [{'index': 0, - 'name': 'ID', - 'type': 0, - 'usage': 0}, - {'index': 1, - 'name': 'int_field', - 'type': 0, - 'usage': 0}, - {'index': 2, - 'name': 'numeric_field', - 'type': 1, - 'usage': 0}, - {'index': 3, - 'name': 'string_field', - 'type': 2, - 'usage': 0}, - {'index': 4, - 'name': 'red', - 'type': 0, - 'usage': 6}, - {'index': 5, - 'name': 'green', - 'type': 0, - 'usage': 7}, - {'index': 6, - 'name': 'blue', - 'type': 0, - 'usage': 8}, - {'index': 7, - 'name': 'alpha', - 'type': 0, - 'usage': 9}, - {'index': 8, - 'name': 'pixelcount', - 'type': 0, - 'usage': 1}, - {'index': 9, - 'name': 'name', - 'type': 2, - 'usage': 2}], - 'row': [{'f': [0, - 10, - 1.2, - 'foo', - 0, - 2, - 4, - 6, - 8, - 'baz'], - 'index': 0}, - {'f': [1, - 11, - 2.3, - 'bar', - 1, - 3, - 5, - 7, - 9, - 'baw'], - 'index': 1}]} + "bands": [ + { + "band": 1, + "block": [20, 1], + "colorInterpretation": "Undefined", + "metadata": {}, + "type": "Byte", + } + ], + "rat": { + "fieldDefn": [ + {"index": 0, "name": "ID", "type": 0, "usage": 0}, + {"index": 1, "name": "int_field", "type": 0, "usage": 0}, + {"index": 2, "name": "numeric_field", "type": 1, "usage": 0}, + {"index": 3, "name": "string_field", "type": 2, "usage": 0}, + {"index": 4, "name": "red", "type": 0, "usage": 6}, + {"index": 5, "name": "green", "type": 0, "usage": 7}, + {"index": 6, "name": "blue", "type": 0, "usage": 8}, + {"index": 7, "name": "alpha", "type": 0, "usage": 9}, + {"index": 8, "name": "pixelcount", "type": 0, "usage": 1}, + {"index": 9, "name": "name", "type": 2, "usage": 2}, + ], + "row": [ + {"f": [0, 10, 1.2, "foo", 0, 2, 4, 6, 8, "baz"], "index": 0}, + {"f": [1, 11, 2.3, "bar", 1, 3, 5, 7, 9, "baw"], "index": 1}, + ], + }, } assert _is_dict_included_in_dict(info, expected_info) + ############################################################################### def test_rraster_rat_copy(): - filename = '/vsimem/rraster/byte_rraster_rat.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster_rat.grd', format='RRASTER') - assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' + filename = "/vsimem/rraster/byte_rraster_rat.grd" + gdal.Translate(filename, "data/rraster/byte_rraster_rat.grd", format="RRASTER") + assert not gdal.VSIStatL(filename + ".aux.xml"), "did not expect .aux.xml" test_rraster_rat(filename) - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### def test_rraster_signedbyte(): - filename = '/vsimem/rraster_signedbyte.grd' - filename2 = '/vsimem/rraster_signedbyte2.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster.grd', format='RRASTER', - creationOptions=['PIXELTYPE=SIGNEDBYTE']) - gdal.Translate(filename2, filename, format='RRASTER') + filename = "/vsimem/rraster_signedbyte.grd" + filename2 = "/vsimem/rraster_signedbyte2.grd" + gdal.Translate( + filename, + "data/rraster/byte_rraster.grd", + format="RRASTER", + creationOptions=["PIXELTYPE=SIGNEDBYTE"], + ) + gdal.Translate(filename2, filename, format="RRASTER") ds = gdal.Open(filename2) - assert ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE' + assert ( + ds.GetRasterBand(1).GetMetadataItem("PIXELTYPE", "IMAGE_STRUCTURE") + == "SIGNEDBYTE" + ) assert ds.GetRasterBand(1).GetMinimum() == -124 ds = None - gdal.GetDriverByName('RRASTER').Delete(filename) - gdal.GetDriverByName('RRASTER').Delete(filename2) + gdal.GetDriverByName("RRASTER").Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename2) + ############################################################################### def test_rraster_datatypes(): - filename = '/vsimem/temp.grd' + filename = "/vsimem/temp.grd" - for srcfilename in ['../gcore/data/uint16.tif', - '../gcore/data/int16.tif', - '../gcore/data/uint32.tif', - '../gcore/data/int32.tif', - '../gcore/data/float32.tif', - '../gcore/data/float64.tif']: + for srcfilename in [ + "../gcore/data/uint16.tif", + "../gcore/data/int16.tif", + "../gcore/data/uint32.tif", + "../gcore/data/int32.tif", + "../gcore/data/float32.tif", + "../gcore/data/float64.tif", + ]: src_ds = gdal.Open(srcfilename) - gdal.Translate(filename, src_ds, format='RRASTER') + gdal.Translate(filename, src_ds, format="RRASTER") ds = gdal.Open(filename) - assert ds.GetRasterBand(1).DataType == src_ds.GetRasterBand(1).DataType, \ - srcfilename - assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ - srcfilename + assert ( + ds.GetRasterBand(1).DataType == src_ds.GetRasterBand(1).DataType + ), srcfilename + assert ( + ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() + ), srcfilename + + gdal.GetDriverByName("RRASTER").Delete(filename) - gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_nodata_and_metadata(): - filename = '/vsimem/temp.grd' - ds = gdal.GetDriverByName('RRASTER').Create(filename, 1, 1) + filename = "/vsimem/temp.grd" + ds = gdal.GetDriverByName("RRASTER").Create(filename, 1, 1) ds.GetRasterBand(1).SetNoDataValue(1) ds.GetRasterBand(1).SetColorTable(None) ds.GetRasterBand(1).SetDefaultRAT(None) - ds.SetMetadataItem('CREATOR', 'GDAL') - ds.SetMetadataItem('CREATED', 'Today') + ds.SetMetadataItem("CREATOR", "GDAL") + ds.SetMetadataItem("CREATED", "Today") ds = None ds = gdal.Open(filename) - assert ds.GetMetadata() == {'CREATOR': 'GDAL', 'CREATED': 'Today'} + assert ds.GetMetadata() == {"CREATOR": "GDAL", "CREATED": "Today"} assert ds.GetRasterBand(1).GetNoDataValue() == 1 ds = None - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### def test_rraster_update(): - filename = '/vsimem/temp.grd' - gdal.Translate(filename, 'data/rraster/byte_rraster.grd', format='RRASTER') + filename = "/vsimem/temp.grd" + gdal.Translate(filename, "data/rraster/byte_rraster.grd", format="RRASTER") gdal.Open(filename, gdal.GA_Update) ds = gdal.Open(filename, gdal.GA_Update) assert ds.GetRasterBand(1).Checksum() == 4672 @@ -375,15 +393,16 @@ def test_rraster_update(): assert ds.GetRasterBand(1).Checksum() == 0 ds = None - gdal.GetDriverByName('RRASTER').Delete(filename) + gdal.GetDriverByName("RRASTER").Delete(filename) + ############################################################################### def test_rraster_colorinterpretation(): - filename = '/vsimem/temp.grd' - ds = gdal.GetDriverByName('RRASTER').Create(filename, 1, 1, 4) + filename = "/vsimem/temp.grd" + ds = gdal.GetDriverByName("RRASTER").Create(filename, 1, 1, 4) ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) @@ -396,8 +415,4 @@ def test_rraster_colorinterpretation(): assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None - gdal.GetDriverByName('RRASTER').Delete(filename) - - - - + gdal.GetDriverByName("RRASTER").Delete(filename) diff --git a/autotest/gdrivers/rs2.py b/autotest/gdrivers/rs2.py index 38f30a298bf8..6d1ae9d5b4a8 100755 --- a/autotest/gdrivers/rs2.py +++ b/autotest/gdrivers/rs2.py @@ -29,9 +29,9 @@ ############################################################################### +import gdaltest from osgeo import gdal -import gdaltest ############################################################################### # Test reading a - fake - RS2 dataset. Note: the XML file was written by studying @@ -40,37 +40,43 @@ def test_rs2_1(): - tst = gdaltest.GDALTest('RS2', 'rs2/product.xml', 1, 4672) + tst = gdaltest.GDALTest("RS2", "rs2/product.xml", 1, 4672) return tst.testOpen() def test_rs2_2(): - tst = gdaltest.GDALTest('RS2', 'RADARSAT_2_CALIB:BETA0:data/rs2/product.xml', 1, 4848, filename_absolute=1) + tst = gdaltest.GDALTest( + "RS2", + "RADARSAT_2_CALIB:BETA0:data/rs2/product.xml", + 1, + 4848, + filename_absolute=1, + ) return tst.testOpen() + # Test reading our dummy RPC def test_rs2_3(): - ds = gdal.Open('data/rs2/product.xml') - got_rpc = ds.GetMetadata('RPC') - expected_rpc = {'ERR_BIAS': 'biasError', - 'ERR_RAND': 'randomError', - 'HEIGHT_OFF': 'heightOffset', - 'HEIGHT_SCALE': 'heightScale', - 'LAT_OFF': 'latitudeOffset', - 'LAT_SCALE': 'latitudeScale', - 'LINE_DEN_COEFF': 'lineDenominatorCoefficients', - 'LINE_NUM_COEFF': 'lineNumeratorCoefficients', - 'LINE_OFF': 'lineOffset', - 'LINE_SCALE': 'lineScale', - 'LONG_OFF': 'longitudeOffset', - 'LONG_SCALE': 'longitudeScale', - 'SAMP_DEN_COEFF': 'pixelDenominatorCoefficients', - 'SAMP_NUM_COEFF': 'pixelNumeratorCoefficients', - 'SAMP_OFF': 'pixelOffset', - 'SAMP_SCALE': 'pixelScale'} + ds = gdal.Open("data/rs2/product.xml") + got_rpc = ds.GetMetadata("RPC") + expected_rpc = { + "ERR_BIAS": "biasError", + "ERR_RAND": "randomError", + "HEIGHT_OFF": "heightOffset", + "HEIGHT_SCALE": "heightScale", + "LAT_OFF": "latitudeOffset", + "LAT_SCALE": "latitudeScale", + "LINE_DEN_COEFF": "lineDenominatorCoefficients", + "LINE_NUM_COEFF": "lineNumeratorCoefficients", + "LINE_OFF": "lineOffset", + "LINE_SCALE": "lineScale", + "LONG_OFF": "longitudeOffset", + "LONG_SCALE": "longitudeScale", + "SAMP_DEN_COEFF": "pixelDenominatorCoefficients", + "SAMP_NUM_COEFF": "pixelNumeratorCoefficients", + "SAMP_OFF": "pixelOffset", + "SAMP_SCALE": "pixelScale", + } assert got_rpc == expected_rpc - - - diff --git a/autotest/gdrivers/safe.py b/autotest/gdrivers/safe.py index 17dc2ba10f27..6794b28fc187 100755 --- a/autotest/gdrivers/safe.py +++ b/autotest/gdrivers/safe.py @@ -29,9 +29,10 @@ ############################################################################### -from osgeo import gdal import gdaltest +from osgeo import gdal + ############################################################################### # Test reading a - fake - SAFE dataset. Note: the tiff files are fake, # reduced to 1% of their initial size and metadata stripped @@ -39,64 +40,82 @@ def test_safe_1(): - tst = gdaltest.GDALTest( - 'SAFE', - 'SAFE_FAKE/test.SAFE/manifest.safe', 1, 65372) + tst = gdaltest.GDALTest("SAFE", "SAFE_FAKE/test.SAFE/manifest.safe", 1, 65372) return tst.testOpen() def test_safe_2(): - tst = gdaltest.GDALTest( - 'SAFE', 'SAFE_FAKE/test.SAFE/manifest.safe', 2, 3732) + tst = gdaltest.GDALTest("SAFE", "SAFE_FAKE/test.SAFE/manifest.safe", 2, 3732) return tst.testOpen() def test_safe_3(): tst = gdaltest.GDALTest( - 'SAFE', - 'SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE/manifest.safe:IW_VH:AMPLITUDE', 1, 65372, filename_absolute=1) + "SAFE", + "SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE/manifest.safe:IW_VH:AMPLITUDE", + 1, + 65372, + filename_absolute=1, + ) return tst.testOpen() def test_safe_4(): tst = gdaltest.GDALTest( - 'SAFE', - 'SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE/manifest.safe:IW_VV:AMPLITUDE', 1, 3732, filename_absolute=1) + "SAFE", + "SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE/manifest.safe:IW_VV:AMPLITUDE", + 1, + 3732, + filename_absolute=1, + ) return tst.testOpen() def test_safe_5(): tst = gdaltest.GDALTest( - 'SAFE', - 'SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE:IW:AMPLITUDE', 1, 65372, filename_absolute=1) + "SAFE", + "SENTINEL1_CALIB:UNCALIB:data/SAFE_FAKE/test.SAFE:IW:AMPLITUDE", + 1, + 65372, + filename_absolute=1, + ) return tst.testOpen() def test_safe_WV(): - ds = gdal.Open('data/SAFE_FAKE_WV') + ds = gdal.Open("data/SAFE_FAKE_WV") assert ds is not None subds = ds.GetSubDatasets() assert len(subds) == 10 - assert 'SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV1_VV_001:INTENSITY' in [x[0].replace('\\', '/') for x in subds] + assert ( + "SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV1_VV_001:INTENSITY" + in [x[0].replace("\\", "/") for x in subds] + ) - ds = gdal.Open('SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV1_VV_001:INTENSITY') + ds = gdal.Open( + "SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV1_VV_001:INTENSITY" + ) assert ds is not None assert len(ds.GetSubDatasets()) == 0 assert len(ds.GetGCPs()) == 1 - assert 'SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV2_VV_002:INTENSITY' in [x[0].replace('\\', '/') for x in subds] + assert ( + "SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV2_VV_002:INTENSITY" + in [x[0].replace("\\", "/") for x in subds] + ) - ds = gdal.Open('SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV2_VV_002:INTENSITY') + ds = gdal.Open( + "SENTINEL1_CALIB:SIGMA0:data/SAFE_FAKE_WV/manifest.safe:WV2_VV_002:INTENSITY" + ) assert ds is not None assert len(ds.GetSubDatasets()) == 0 assert len(ds.GetGCPs()) == 2 with gdaltest.error_handler(): - assert gdal.Open(subds[0][0] + 'xxxx') is None - + assert gdal.Open(subds[0][0] + "xxxx") is None diff --git a/autotest/gdrivers/saga.py b/autotest/gdrivers/saga.py index 3ecfe4ec1276..b0f19188712e 100755 --- a/autotest/gdrivers/saga.py +++ b/autotest/gdrivers/saga.py @@ -30,19 +30,20 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import gdalconst import gdaltest +from osgeo import gdal, gdalconst + ############################################################################### # Test opening def test_saga_1(): - tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) - return tst.testOpen(check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", + tst = gdaltest.GDALTest("SAGA", "saga/4byteFloat.sdat", 1, 108) + return tst.testOpen( + check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", GEOGCS["GCS_North_American_1927", DATUM["North_American_Datum_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], @@ -54,7 +55,9 @@ def test_saga_1(): PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], - UNIT["Meter",1]]""") + UNIT["Meter",1]]""" + ) + ############################################################################### # Test copying a reference sample with CreateCopy() @@ -62,8 +65,9 @@ def test_saga_1(): def test_saga_2(): - tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) - return tst.testCreateCopy(new_filename='tmp/createcopy.sdat', check_srs=True) + tst = gdaltest.GDALTest("SAGA", "saga/4byteFloat.sdat", 1, 108) + return tst.testCreateCopy(new_filename="tmp/createcopy.sdat", check_srs=True) + ############################################################################### # Test copying a reference sample with Create() @@ -71,8 +75,9 @@ def test_saga_2(): def test_saga_3(): - tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) - return tst.testCreate(new_filename='tmp/copy.sdat', out_bands=1) + tst = gdaltest.GDALTest("SAGA", "saga/4byteFloat.sdat", 1, 108) + return tst.testCreate(new_filename="tmp/copy.sdat", out_bands=1) + ############################################################################### # Test CreateCopy() for various data types @@ -80,21 +85,23 @@ def test_saga_3(): 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'] + 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': + 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) + tst.testCreateCopy(new_filename="tmp/test4.sdat", check_minmax=check_minmax) ############################################################################### @@ -103,21 +110,25 @@ def test_saga_4(): 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'] + 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': + 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) + tst.testCreate( + new_filename="tmp/test5.sdat", out_bands=1, check_minmax=check_minmax + ) ############################################################################### @@ -126,38 +137,41 @@ def test_saga_5(): 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] + 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 = gdal.GetDriverByName("SAGA").Create("tmp/test6.sdat", 2, 2, 1, gdal_type) ds = None - ds = gdal.Open('tmp/test6.sdat') + 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' + + 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' + assert nodata == expected_nodata[i], "did not get expected nodata value" ds = None try: - os.remove('tmp/test6.sgrd') - os.remove('tmp/test6.sdat') + os.remove("tmp/test6.sgrd") + os.remove("tmp/test6.sdat") except OSError: pass @@ -168,16 +182,18 @@ def test_saga_6(): def test_saga_7(): - tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) - return tst.testCreateCopy(new_filename='/vsimem/createcopy.sdat') + tst = gdaltest.GDALTest("SAGA", "saga/4byteFloat.sdat", 1, 108) + return tst.testCreateCopy(new_filename="/vsimem/createcopy.sdat") ############################################################################### # Test zipped saga grid (.sg-grd-z) + def test_saga_8(): - tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sg-grd-z', 1, 108) - return tst.testOpen(check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", + tst = gdaltest.GDALTest("SAGA", "saga/4byteFloat.sg-grd-z", 1, 108) + return tst.testOpen( + check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", GEOGCS["GCS_North_American_1927", DATUM["North_American_Datum_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], @@ -189,7 +205,9 @@ def test_saga_8(): PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], - UNIT["Meter",1]]""") + UNIT["Meter",1]]""" + ) + ############################################################################## # Test setnodata @@ -197,10 +215,10 @@ def test_saga_9(): gdal_type = gdal.GDT_Float64 - ds = gdal.GetDriverByName('SAGA').Create('tmp/test9.sdat', 2, 2, 1, gdal_type) + ds = gdal.GetDriverByName("SAGA").Create("tmp/test9.sdat", 2, 2, 1, gdal_type) ds = None - ds = gdal.Open('tmp/test9.sdat') + ds = gdal.Open("tmp/test9.sdat") with gdaltest.error_handler(): ret = ds.GetRasterBand(1).SetNoDataValue(56) assert ret == gdalconst.CE_Failure @@ -208,7 +226,7 @@ def test_saga_9(): assert ds.GetRasterBand(1).GetNoDataValue() == -99999 ds = None - ds = gdal.Open('tmp/test9.sdat', gdal.GA_Update) + ds = gdal.Open("tmp/test9.sdat", gdal.GA_Update) ret = ds.GetRasterBand(1).SetNoDataValue(56) assert ret == gdalconst.CE_None @@ -217,12 +235,11 @@ def test_saga_9(): ds = None - with open('tmp/test9.sgrd', 'r') as f: + with open("tmp/test9.sgrd", "r") as f: header_string = f.read() assert "NODATA_VALUE\t= 56.000000" in header_string try: - os.remove('tmp/test9.sgrd') - os.remove('tmp/test9.sdat') + os.remove("tmp/test9.sgrd") + os.remove("tmp/test9.sdat") except OSError: pass - diff --git a/autotest/gdrivers/sar_ceos.py b/autotest/gdrivers/sar_ceos.py index 4d953e4e194f..895712fcd6ed 100755 --- a/autotest/gdrivers/sar_ceos.py +++ b/autotest/gdrivers/sar_ceos.py @@ -34,10 +34,14 @@ def test_sar_ceos_app_1(): - tst = gdaltest.GDALTest('SAR_CEOS', 'data/sar_ceos/ottawa_patch.img', 1, 1327, filename_absolute=1) + tst = gdaltest.GDALTest( + "SAR_CEOS", "data/sar_ceos/ottawa_patch.img", 1, 1327, filename_absolute=1 + ) return tst.testOpen() + def test_sar_ceos_asf_2(): - tst = gdaltest.GDALTest('SAR_CEOS', 'data/sar_ceos/R1_26161_FN1_F164.D', 1, 16643, filename_absolute=1) + tst = gdaltest.GDALTest( + "SAR_CEOS", "data/sar_ceos/R1_26161_FN1_F164.D", 1, 16643, filename_absolute=1 + ) return tst.testOpen() - diff --git a/autotest/gdrivers/sdts.py b/autotest/gdrivers/sdts.py index a08f7f245181..b2714ffb504e 100755 --- a/autotest/gdrivers/sdts.py +++ b/autotest/gdrivers/sdts.py @@ -28,12 +28,10 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr - - import gdaltest +from osgeo import gdal, osr + ############################################################################### # Test a truncated version of an SDTS DEM downloaded at # http://thor-f5.er.usgs.gov/sdts/datasets/raster/dem/dem_oct_2001/1107834.dem.sdts.tar.gz @@ -41,18 +39,17 @@ def test_sdts_1(): - tst = gdaltest.GDALTest('SDTS', 'STDS_1107834_truncated/1107CATD.DDF', 1, 61672) + tst = gdaltest.GDALTest("SDTS", "STDS_1107834_truncated/1107CATD.DDF", 1, 61672) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD27') + srs.SetWellKnownGeogCS("NAD27") srs.SetUTM(16) - tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(666015, 30, 0, 5040735, 0, -30), - check_filelist=False) + tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(666015, 30, 0, 5040735, 0, -30), + check_filelist=False, + ) - ds = gdal.Open('data/STDS_1107834_truncated/1107CATD.DDF') + ds = gdal.Open("data/STDS_1107834_truncated/1107CATD.DDF") md = ds.GetMetadata() - assert md['TITLE'] == 'ALANSON, MI-24000' - - - + assert md["TITLE"] == "ALANSON, MI-24000" diff --git a/autotest/gdrivers/sentinel2.py b/autotest/gdrivers/sentinel2.py index 3c69ff9f8ad8..229a30020dba 100755 --- a/autotest/gdrivers/sentinel2.py +++ b/autotest/gdrivers/sentinel2.py @@ -34,12 +34,12 @@ import tempfile import uuid import zipfile -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + def _zip_a_dir(tfile, sdir): zf = zipfile.ZipFile(tfile, "w", zipfile.ZIP_DEFLATED) @@ -58,134 +58,151 @@ def _zip_a_dir(tfile, sdir): def test_sentinel2_l1c_1(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' + filename_xml = ( + "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml" + ) gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 32N', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:10m:EPSG_32632', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:20m:EPSG_32632', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution, UTM 32N', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:60m:EPSG_32632', - 'SUBDATASET_4_DESC': 'RGB preview, UTM 32N', - 'SUBDATASET_4_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:PREVIEW:EPSG_32632'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution, UTM 32N", + "SUBDATASET_1_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:10m:EPSG_32632", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N", + "SUBDATASET_2_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:20m:EPSG_32632", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 with 60m resolution, UTM 32N", + "SUBDATASET_3_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:60m:EPSG_32632", + "SUBDATASET_4_DESC": "RGB preview, UTM 32N", + "SUBDATASET_4_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:PREVIEW:EPSG_32632", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L1C:', - 'SENTINEL2_L1C:foo.xml:10m:EPSG_32632', - 'SENTINEL2_L1C:%s' % filename_xml, - 'SENTINEL2_L1C:%s:' % filename_xml, - 'SENTINEL2_L1C:%s:10m' % filename_xml, - 'SENTINEL2_L1C:%s:10m:' % filename_xml, - 'SENTINEL2_L1C:%s:10m:EPSG_' % filename_xml, - 'SENTINEL2_L1C:%s:50m:EPSG_32632' % filename_xml, - 'SENTINEL2_L1C:%s:10m:EPSG_32633' % filename_xml]: + for name in [ + "SENTINEL2_L1C:", + "SENTINEL2_L1C:foo.xml:10m:EPSG_32632", + "SENTINEL2_L1C:%s" % filename_xml, + "SENTINEL2_L1C:%s:" % filename_xml, + "SENTINEL2_L1C:%s:10m" % filename_xml, + "SENTINEL2_L1C:%s:10m:" % filename_xml, + "SENTINEL2_L1C:%s:10m:EPSG_" % filename_xml, + "SENTINEL2_L1C:%s:50m:EPSG_32632" % filename_xml, + "SENTINEL2_L1C:%s:10m:EPSG_32633" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name + ############################################################################### # Test opening a L1C subdataset on the 10m bands def test_sentinel2_l1c_2(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' + filename_xml = ( + "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml" + ) gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L1C:%s:10m:EPSG_32632' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + ds = gdal.Open("SENTINEL2_L1C:%s:10m:EPSG_32632" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 20984 and ds.RasterYSize == 20980 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 @@ -200,19 +217,22 @@ def test_sentinel2_l1c_2(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B4', - 'BANDWIDTH': '30', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1500', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '665', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B4", + "BANDWIDTH": "30", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1500", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "665", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -220,22 +240,25 @@ def test_sentinel2_l1c_2(): assert band.DataType == gdal.GDT_UInt16 - assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' + assert band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "12" band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B8', - 'BANDWIDTH': '115', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1000', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '842', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B8", + "BANDWIDTH": "115", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1000", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "842", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -246,8 +269,12 @@ def test_sentinel2_l1c_2(): def test_sentinel2_l1c_3(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' - ds = gdal.OpenEx('SENTINEL2_L1C:%s:60m:EPSG_32632' % filename_xml, open_options=['ALPHA=YES']) + filename_xml = ( + "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml" + ) + ds = gdal.OpenEx( + "SENTINEL2_L1C:%s:60m:EPSG_32632" % filename_xml, open_options=["ALPHA=YES"] + ) assert ds is not None assert ds.RasterCount == 4 @@ -258,18 +285,21 @@ def test_sentinel2_l1c_3(): gdal.ErrorReset() cs = band.Checksum() - assert cs == 0 and gdal.GetLastErrorMsg() == '' + assert cs == 0 and gdal.GetLastErrorMsg() == "" band.ReadRaster() + ############################################################################### # Test opening a L1C subdataset on the PREVIEW bands def test_sentinel2_l1c_4(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' - ds = gdal.OpenEx('SENTINEL2_L1C:%s:PREVIEW:EPSG_32632' % filename_xml) + filename_xml = ( + "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml" + ) + ds = gdal.OpenEx("SENTINEL2_L1C:%s:PREVIEW:EPSG_32632" % filename_xml) assert ds is not None assert ds.RasterCount == 3 @@ -278,6 +308,7 @@ def test_sentinel2_l1c_4(): # main XML + 2 granule XML + 2 jp2 if len(fl) != 1 + 2 + 2: import pprint + pprint.pprint(fl) pytest.fail() @@ -286,6 +317,7 @@ def test_sentinel2_l1c_4(): assert band.DataType == gdal.GDT_Byte + ############################################################################### # Test opening invalid XML files @@ -293,21 +325,24 @@ def test_sentinel2_l1c_4(): def test_sentinel2_l1c_5(): # Invalid XML - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ -""") + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ +""", + ) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632") assert ds is None # File is OK, but granule MTD are missing - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -371,72 +406,80 @@ def test_sentinel2_l1c_5(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - gdal.Open('/vsimem/test.xml') - assert gdal.GetLastErrorMsg() != '' + gdal.Open("/vsimem/test.xml") + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632") assert ds is None # No Product_Info - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632") assert ds is None # No Product_Organisation - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632") assert ds is None # No Band_List - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None # No valid bands - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -448,33 +491,38 @@ def test_sentinel2_l1c_5(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None - gdal.Unlink('/vsimem/test.xml') + gdal.Unlink("/vsimem/test.xml") + ############################################################################### # Windows specific test to test support for long filenames -@pytest.mark.skipif(sys.platform != 'win32', reason='Incorrect platform') +@pytest.mark.skipif(sys.platform != "win32", reason="Incorrect platform") def test_sentinel2_l1c_6(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' - filename_xml = '\\\\?\\' + os.getcwd() + '\\' + filename_xml - filename_xml = filename_xml.replace('/', '\\') + filename_xml = ( + "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml" + ) + filename_xml = "\\\\?\\" + os.getcwd() + "\\" + filename_xml + filename_xml = filename_xml.replace("/", "\\") gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" - subds_name = ds.GetMetadataItem('SUBDATASET_1_NAME', 'SUBDATASETS') + subds_name = ds.GetMetadataItem("SUBDATASET_1_NAME", "SUBDATASETS") gdal.ErrorReset() ds = gdal.Open(subds_name) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" + ############################################################################### # Test with a real JP2 tile @@ -482,8 +530,9 @@ def test_sentinel2_l1c_6(): def test_sentinel2_l1c_7(): - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -500,10 +549,12 @@ def test_sentinel2_l1c_7(): -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml", + """ S2A_OPER_MSI_L1C_bla_N01.03 @@ -525,26 +576,33 @@ def test_sentinel2_l1c_7(): -""") +""", + ) # Open with missing tile with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753') + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753") ds = None - f = open('data/jpeg2000/gtsmall_10_uint16.jp2', 'rb') - f2 = gdal.VSIFOpenL('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2', 'wb') + f = open("data/jpeg2000/gtsmall_10_uint16.jp2", "rb") + f2 = gdal.VSIFOpenL( + "/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2", + "wb", + ) data = f.read() gdal.VSIFWriteL(data, 1, len(data), f2) gdal.VSIFCloseL(f2) f.close() - ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753') - nbits = ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') - assert nbits == '10' + ds = gdal.Open("SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753") + nbits = ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") + assert nbits == "10" + + gdal.Unlink("/vsimem/test.xml") + gdal.Unlink( + "/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2" + ) - gdal.Unlink('/vsimem/test.xml') - gdal.Unlink('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2') ############################################################################### # Test opening a L1C tile @@ -552,74 +610,83 @@ def test_sentinel2_l1c_7(): def test_sentinel2_l1c_tile_1(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' + filename_xml = "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml" gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0', - 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DOWNLINK_PRIORITY": "NOMINAL", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + "TILE_ID": "S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m', - 'SUBDATASET_4_DESC': 'RGB preview', - 'SUBDATASET_4_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution", + "SUBDATASET_1_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 with 20m resolution", + "SUBDATASET_2_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 with 60m resolution", + "SUBDATASET_3_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m", + "SUBDATASET_4_DESC": "RGB preview", + "SUBDATASET_4_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L1C_TILE:', - 'SENTINEL2_L1C_TILE:foo.xml:10m', - 'SENTINEL2_L1C_TILE:%s' % filename_xml, - 'SENTINEL2_L1C_TILE:%s:' % filename_xml]: + for name in [ + "SENTINEL2_L1C_TILE:", + "SENTINEL2_L1C_TILE:foo.xml:10m", + "SENTINEL2_L1C_TILE:%s" % filename_xml, + "SENTINEL2_L1C_TILE:%s:" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name @@ -631,36 +698,44 @@ def test_sentinel2_l1c_tile_1(): def test_sentinel2_l1c_tile_2(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' + filename_xml = "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml" gdal.ErrorReset() - gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', 'NO') # Simulate absence of main MTD file + gdal.SetConfigOption( + "SENTINEL2_USE_MAIN_MTD", "NO" + ) # Simulate absence of main MTD file ds = gdal.Open(filename_xml) - gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', None) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} + gdal.SetConfigOption("SENTINEL2_USE_MAIN_MTD", None) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DOWNLINK_PRIORITY": "NOMINAL", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "TILE_ID": "S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m', - 'SUBDATASET_4_DESC': 'RGB preview', - 'SUBDATASET_4_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution", + "SUBDATASET_1_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 with 20m resolution", + "SUBDATASET_2_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 with 60m resolution", + "SUBDATASET_3_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m", + "SUBDATASET_4_DESC": "RGB preview", + "SUBDATASET_4_NAME": "SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -671,58 +746,61 @@ def test_sentinel2_l1c_tile_2(): def test_sentinel2_l1c_tile_3(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' + filename_xml = "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml" gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L1C_TILE:%s:10m' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0', - 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} + ds = gdal.Open("SENTINEL2_L1C_TILE:%s:10m" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DOWNLINK_PRIORITY": "NOMINAL", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + "TILE_ID": "S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 @@ -731,19 +809,22 @@ def test_sentinel2_l1c_tile_3(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B4', - 'BANDWIDTH': '30', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1500', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '665', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B4", + "BANDWIDTH": "30", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1500", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "665", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -751,22 +832,25 @@ def test_sentinel2_l1c_tile_3(): assert band.DataType == gdal.GDT_UInt16 - assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' + assert band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "12" band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B8', - 'BANDWIDTH': '115', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1000', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '842', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B8", + "BANDWIDTH": "115", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1000", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "842", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -777,35 +861,42 @@ def test_sentinel2_l1c_tile_3(): def test_sentinel2_l1c_tile_4(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' + filename_xml = "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml" gdal.ErrorReset() - gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', 'NO') # Simulate absence of main MTD file - ds = gdal.OpenEx('SENTINEL2_L1C_TILE:%s:10m' % filename_xml, open_options=['ALPHA=YES']) - gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', None) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} + gdal.SetConfigOption( + "SENTINEL2_USE_MAIN_MTD", "NO" + ) # Simulate absence of main MTD file + ds = gdal.OpenEx( + "SENTINEL2_L1C_TILE:%s:10m" % filename_xml, open_options=["ALPHA=YES"] + ) + gdal.SetConfigOption("SENTINEL2_USE_MAIN_MTD", None) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DOWNLINK_PRIORITY": "NOMINAL", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "TILE_ID": "S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 5 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 @@ -814,17 +905,20 @@ def test_sentinel2_l1c_tile_4(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B4', - 'BANDWIDTH': '30', - 'BANDWIDTH_UNIT': 'nm', - 'WAVELENGTH': '665', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B4", + "BANDWIDTH": "30", + "BANDWIDTH_UNIT": "nm", + "WAVELENGTH": "665", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -832,33 +926,34 @@ def test_sentinel2_l1c_tile_4(): assert band.DataType == gdal.GDT_UInt16 - assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' + assert band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "12" band = ds.GetRasterBand(5) assert band.GetColorInterpretation() == gdal.GCI_AlphaBand + ############################################################################### # Test opening a L1C tile subdataset on the preview bands def test_sentinel2_l1c_tile_5(): - filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' + filename_xml = "data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml" gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L1C_TILE:%s:PREVIEW' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + ds = gdal.Open("SENTINEL2_L1C_TILE:%s:PREVIEW" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" assert ds.RasterXSize == 343 and ds.RasterYSize == 343 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 320.0, 0.0, 5100060.0, 0.0, -320.0) assert ds.RasterCount == 3 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TQR.jp2 3 @@ -867,6 +962,7 @@ def test_sentinel2_l1c_tile_5(): """ assert placement_vrt in vrt + ############################################################################### # Test opening invalid XML files @@ -874,20 +970,23 @@ def test_sentinel2_l1c_tile_5(): def test_sentinel2_l1c_tile_6(): # Invalid XML - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ -""") + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ +""", + ) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C_TILE:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1C_TILE:/vsimem/test.xml:10m") assert ds is None - gdal.FileFromMemBuffer('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml", + """ S2A_OPER_MSI_L1C_bla_N01.03 @@ -909,17 +1008,21 @@ def test_sentinel2_l1c_tile_6(): -""") +""", + ) # Just tell it doesn't crash without any tile - gdal.Open('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml') + gdal.Open("/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml") with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1C_TILE:/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml:10m') + ds = gdal.Open( + "SENTINEL2_L1C_TILE:/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml:10m" + ) assert ds is None - gdal.Unlink('/vsimem/test.xml') - gdal.Unlink('/vsimem/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml') + gdal.Unlink("/vsimem/test.xml") + gdal.Unlink("/vsimem/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml") + ############################################################################### # Test opening a L1B product @@ -927,67 +1030,78 @@ def test_sentinel2_l1c_tile_6(): def test_sentinel2_l1b_1(): - filename_xml = 'data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/S2B_OPER_MTD_SAFL1B.xml' + filename_xml = ( + "data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/S2B_OPER_MTD_SAFL1B.xml" + ) gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1B', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1B', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2B_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2B", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1B", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1B", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 of granule S2B_OPER_MTD_L1B.xml with 10m resolution', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 of granule S2B_OPER_MTD_L1B.xml with 20m resolution', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 of granule S2B_OPER_MTD_L1B.xml with 60m resolution', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 of granule S2B_OPER_MTD_L1B.xml with 10m resolution", + "SUBDATASET_1_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 of granule S2B_OPER_MTD_L1B.xml with 20m resolution", + "SUBDATASET_2_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 of granule S2B_OPER_MTD_L1B.xml with 60m resolution", + "SUBDATASET_3_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 3 subdatasets for i in range(3): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L1B:', - 'SENTINEL2_L1B:foo.xml:10m', - 'SENTINEL2_L1B:%s' % filename_xml, - 'SENTINEL2_L1B:%s:' % filename_xml, - 'SENTINEL2_L1B:%s:30m' % filename_xml]: + for name in [ + "SENTINEL2_L1B:", + "SENTINEL2_L1B:foo.xml:10m", + "SENTINEL2_L1B:%s" % filename_xml, + "SENTINEL2_L1B:%s:" % filename_xml, + "SENTINEL2_L1B:%s:30m" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name @@ -999,74 +1113,83 @@ def test_sentinel2_l1b_1(): def test_sentinel2_l1b_2(): - filename_xml = 'data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml' + filename_xml = "data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml" gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DETECTOR_ID': '02', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'FOOTPRINT': 'POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'GRANULE_ID': 'S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03', - 'INCIDENCE_AZIMUTH_ANGLE': '96', - 'INCIDENCE_ZENITH_ANGLE': '8', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1B', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1B', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SOLAR_AZIMUTH_ANGLE': '158', - 'SOLAR_ZENITH_ANGLE': '43', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2B_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2B", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DETECTOR_ID": "02", + "DOWNLINK_PRIORITY": "NOMINAL", + "FOOTPRINT": "POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "GRANULE_ID": "S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03", + "INCIDENCE_AZIMUTH_ANGLE": "96", + "INCIDENCE_ZENITH_ANGLE": "8", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1B", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1B", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "SENSOR_QUALITY_FLAG": "PASSED", + "SOLAR_AZIMUTH_ANGLE": "158", + "SOLAR_ZENITH_ANGLE": "43", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - subdatasets_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} - got_md = ds.GetMetadata('SUBDATASETS') + subdatasets_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution", + "SUBDATASET_1_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 with 20m resolution", + "SUBDATASET_2_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 with 60m resolution", + "SUBDATASET_3_NAME": "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != subdatasets_md: import pprint + pprint.pprint(got_md) pytest.fail() cwd = os.getcwd() gdal.ErrorReset() try: - os.chdir('data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03') - ds = gdal.Open('S2B_OPER_MTD_L1B.xml') + os.chdir( + "data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03" + ) + ds = gdal.Open("S2B_OPER_MTD_L1B.xml") finally: os.chdir(cwd) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -1078,89 +1201,104 @@ def test_sentinel2_l1b_2(): def test_sentinel2_l1b_3(): gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', - 'DATASTRIP_ID': 'S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'DETECTOR_ID': '02', - 'DOWNLINK_PRIORITY': 'NOMINAL', - 'FOOTPRINT': 'POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'GRANULE_ID': 'S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03', - 'INCIDENCE_AZIMUTH_ANGLE': '96', - 'INCIDENCE_ZENITH_ANGLE': '8', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1B', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1B', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'SENSING_TIME': '2015-12-31T23:59:59.999Z', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SOLAR_AZIMUTH_ANGLE': '158', - 'SOLAR_ZENITH_ANGLE': '43', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + ds = gdal.Open( + "SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m" + ) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUDY_PIXEL_PERCENTAGE": "0", + "DATASTRIP_ID": "S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2B_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2B", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "DETECTOR_ID": "02", + "DOWNLINK_PRIORITY": "NOMINAL", + "FOOTPRINT": "POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "GRANULE_ID": "S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03", + "INCIDENCE_AZIMUTH_ANGLE": "96", + "INCIDENCE_ZENITH_ANGLE": "8", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1B", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1B", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "SENSING_TIME": "2015-12-31T23:59:59.999Z", + "SENSOR_QUALITY_FLAG": "PASSED", + "SOLAR_AZIMUTH_ANGLE": "158", + "SOLAR_ZENITH_ANGLE": "43", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1276 and ds.RasterYSize == 384 - assert ds.GetGCPProjection().find('4326') >= 0 + assert ds.GetGCPProjection().find("4326") >= 0 gcps = ds.GetGCPs() assert len(gcps) == 5 - assert (gcps[0].GCPPixel == 0 and \ - gcps[0].GCPLine == 0 and \ - gcps[0].GCPX == 11 and \ - gcps[0].GCPY == 46 and \ - gcps[0].GCPZ == 1) - - assert (gcps[1].GCPPixel == 0 and \ - gcps[1].GCPLine == 384 and \ - gcps[1].GCPX == 11 and \ - gcps[1].GCPY == 45 and \ - gcps[1].GCPZ == 2) - - assert (gcps[2].GCPPixel == 1276 and \ - gcps[2].GCPLine == 384 and \ - gcps[2].GCPX == 13 and \ - gcps[2].GCPY == 45 and \ - gcps[2].GCPZ == 3) - - assert (gcps[3].GCPPixel == 1276 and \ - gcps[3].GCPLine == 0 and \ - gcps[3].GCPX == 13 and \ - gcps[3].GCPY == 46 and \ - gcps[3].GCPZ == 4) - - assert (gcps[4].GCPPixel == 1276. / 2 and \ - gcps[4].GCPLine == 384. / 2 and \ - gcps[4].GCPX == 12 and \ - gcps[4].GCPY == 45.5 and \ - gcps[4].GCPZ == 2.5) + assert ( + gcps[0].GCPPixel == 0 + and gcps[0].GCPLine == 0 + and gcps[0].GCPX == 11 + and gcps[0].GCPY == 46 + and gcps[0].GCPZ == 1 + ) + + assert ( + gcps[1].GCPPixel == 0 + and gcps[1].GCPLine == 384 + and gcps[1].GCPX == 11 + and gcps[1].GCPY == 45 + and gcps[1].GCPZ == 2 + ) + + assert ( + gcps[2].GCPPixel == 1276 + and gcps[2].GCPLine == 384 + and gcps[2].GCPX == 13 + and gcps[2].GCPY == 45 + and gcps[2].GCPZ == 3 + ) + + assert ( + gcps[3].GCPPixel == 1276 + and gcps[3].GCPLine == 0 + and gcps[3].GCPX == 13 + and gcps[3].GCPY == 46 + and gcps[3].GCPZ == 4 + ) + + assert ( + gcps[4].GCPPixel == 1276.0 / 2 + and gcps[4].GCPLine == 384.0 / 2 + and gcps[4].GCPX == 12 + and gcps[4].GCPY == 45.5 + and gcps[4].GCPZ == 2.5 + ) assert ds.RasterCount == 3 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2 1 @@ -1169,23 +1307,27 @@ def test_sentinel2_l1b_3(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B1', - 'BANDWIDTH': '20', - 'BANDWIDTH_UNIT': 'nm', - 'WAVELENGTH': '443', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B1", + "BANDWIDTH": "20", + "BANDWIDTH_UNIT": "nm", + "WAVELENGTH": "443", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 - assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' + assert band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "12" + ############################################################################### # Test opening a L1B granule (with missing tile, without any ../../main_mtd.xml) @@ -1193,8 +1335,9 @@ def test_sentinel2_l1b_3(): def test_sentinel2_l1b_4(): - gdal.FileFromMemBuffer('/vsimem/foo/S2B_PROD_MTD_foo.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/foo/S2B_PROD_MTD_foo.xml", + """ @@ -1206,10 +1349,12 @@ def test_sentinel2_l1b_4(): -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml", + """ S2A_OPER_MSI_L1C_bla_N01.03 @@ -1223,26 +1368,33 @@ def test_sentinel2_l1b_4(): -""") +""", + ) # Open with missing tile with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') + ds = gdal.Open( + "SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m" + ) ds = None # Now open with missing main MTD - gdal.Unlink('/vsimem/foo/S2B_PROD_MTD_foo.xml') + gdal.Unlink("/vsimem/foo/S2B_PROD_MTD_foo.xml") - f = open('data/jpeg2000/gtsmall_10_uint16.jp2', 'rb') - f2 = gdal.VSIFOpenL('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2', 'wb') + f = open("data/jpeg2000/gtsmall_10_uint16.jp2", "rb") + f2 = gdal.VSIFOpenL( + "/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2", + "wb", + ) data = f.read() gdal.VSIFWriteL(data, 1, len(data), f2) gdal.VSIFCloseL(f2) f.close() # With brief granule metadata (no Granule_Dimensions) - gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml", + """ S2A_OPER_MSI_L1C_bla_N01.03 @@ -1250,13 +1402,17 @@ def test_sentinel2_l1b_4(): -""") - ds = gdal.Open('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') +""", + ) + ds = gdal.Open( + "SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m" + ) assert ds.RasterXSize == 500 # With standard granule metadata (with Granule_Dimensions) - gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml", + """ S2A_OPER_MSI_L1C_bla_N01.03 @@ -1270,25 +1426,35 @@ def test_sentinel2_l1b_4(): -""") +""", + ) - ds = gdal.Open('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml') - expected_md = {'SUBDATASET_1_DESC': 'Bands B1 with 60m resolution', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} - got_md = ds.GetMetadata('SUBDATASETS') + ds = gdal.Open("/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml") + expected_md = { + "SUBDATASET_1_DESC": "Bands B1 with 60m resolution", + "SUBDATASET_1_NAME": "SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() ds = None - ds = gdal.OpenEx('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m', open_options=['ALPHA=YES']) + ds = gdal.OpenEx( + "SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m", + open_options=["ALPHA=YES"], + ) assert ds is not None assert ds.RasterCount == 2 ds = None - gdal.Unlink('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml') - gdal.Unlink('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2') + gdal.Unlink("/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml") + gdal.Unlink( + "/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2" + ) + ############################################################################### # Test opening invalid XML files @@ -1297,63 +1463,72 @@ def test_sentinel2_l1b_4(): def test_sentinel2_l1b_5(): # Invalid XML - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ -""") + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ +""", + ) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None # No Product_Info - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None # No Product_Organisation - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None # No Band_List - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None # No valid bands - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -1365,44 +1540,50 @@ def test_sentinel2_l1b_5(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None # Invalid XML - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ -""") + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ +""", + ) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None # No Granule_Dimensions - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None # No ROWS - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -1413,16 +1594,18 @@ def test_sentinel2_l1b_5(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None # No NCOLS - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -1433,31 +1616,35 @@ def test_sentinel2_l1b_5(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None # Not the desired resolution - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') + ds = gdal.Open("SENTINEL2_L1B:/vsimem/test.xml:10m") assert ds is None - gdal.Unlink('/vsimem/test.xml') + gdal.Unlink("/vsimem/test.xml") + + gdal.Unlink("/vsimem/test.xml") - gdal.Unlink('/vsimem/test.xml') ############################################################################### # Test opening a L2A product @@ -1465,94 +1652,105 @@ def test_sentinel2_l1b_5(): def test_sentinel2_l2a_1(): - filename_xml = 'data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml' + filename_xml = ( + "data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml" + ) gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'AOT_RETRIEVAL_ACCURACY': '0', - 'BARE_SOILS_PERCENTAGE': '0', - 'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'CLOUD_SHADOW_PERCENTAGE': '0', - 'DARK_FEATURES_PERCENTAGE': '0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '0', - 'L1C_TOA_QUANTIFICATION_VALUE': '1000', - 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', - 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_BOA_QUANTIFICATION_VALUE': '1000', - 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', - 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', - 'LOW_PROBA_CLOUDS_PERCENTAGE': '0', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '0', - 'NODATA_PIXEL_PERCENTAGE': '0', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-2Ap', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI2Ap', - 'RADIATIVE_TRANSFER_ACCURAY': '0', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0', - 'THIN_CIRRUS_PERCENTAGE': '0', - 'VEGETATION_PERCENTAGE': '0', - 'WATER_PERCENTAGE': '0', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "AOT_RETRIEVAL_ACCURACY": "0", + "BARE_SOILS_PERCENTAGE": "0", + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "CLOUD_SHADOW_PERCENTAGE": "0", + "DARK_FEATURES_PERCENTAGE": "0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "0", + "L1C_TOA_QUANTIFICATION_VALUE": "1000", + "L1C_TOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_AOT_QUANTIFICATION_VALUE": "1000.0", + "L2A_AOT_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_BOA_QUANTIFICATION_VALUE": "1000", + "L2A_BOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_WVP_QUANTIFICATION_VALUE": "1000.0", + "L2A_WVP_QUANTIFICATION_VALUE_UNIT": "cm", + "LOW_PROBA_CLOUDS_PERCENTAGE": "0", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "0", + "NODATA_PIXEL_PERCENTAGE": "0", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-2Ap", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI2Ap", + "RADIATIVE_TRANSFER_ACCURAY": "0", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0", + "SENSOR_QUALITY_FLAG": "PASSED", + "SNOW_ICE_PERCENTAGE": "0", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + "THIN_CIRRUS_PERCENTAGE": "0", + "VEGETATION_PERCENTAGE": "0", + "WATER_PERCENTAGE": "0", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B1, B2, B3, B4, B5, B6, B7, B9, B10, B11, B12, B8A, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 32N', - 'SUBDATASET_1_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:60m:EPSG_32632', - 'SUBDATASET_2_DESC': 'RGB preview, UTM 32N', - 'SUBDATASET_2_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:PREVIEW:EPSG_32632'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B1, B2, B3, B4, B5, B6, B7, B9, B10, B11, B12, B8A, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 32N", + "SUBDATASET_1_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:60m:EPSG_32632", + "SUBDATASET_2_DESC": "RGB preview, UTM 32N", + "SUBDATASET_2_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:PREVIEW:EPSG_32632", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L2A:', - 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', - 'SENTINEL2_L2A:%s' % filename_xml, - 'SENTINEL2_L2A:%s:' % filename_xml, - 'SENTINEL2_L2A:%s:10m' % filename_xml, - 'SENTINEL2_L2A:%s:10m:' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, - 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: + for name in [ + "SENTINEL2_L2A:", + "SENTINEL2_L2A:foo.xml:10m:EPSG_32632", + "SENTINEL2_L2A:%s" % filename_xml, + "SENTINEL2_L2A:%s:" % filename_xml, + "SENTINEL2_L2A:%s:10m" % filename_xml, + "SENTINEL2_L2A:%s:10m:" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_" % filename_xml, + "SENTINEL2_L2A:%s:50m:EPSG_32632" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_32633" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name @@ -1564,76 +1762,81 @@ def test_sentinel2_l2a_1(): def test_sentinel2_l2a_2(): - filename_xml = 'data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml' + filename_xml = ( + "data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml" + ) gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32632' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'AOT_RETRIEVAL_ACCURACY': '0', - 'BARE_SOILS_PERCENTAGE': '0', - 'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'CLOUD_SHADOW_PERCENTAGE': '0', - 'DARK_FEATURES_PERCENTAGE': '0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '0', - 'L1C_TOA_QUANTIFICATION_VALUE': '1000', - 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', - 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_BOA_QUANTIFICATION_VALUE': '1000', - 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', - 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', - 'LOW_PROBA_CLOUDS_PERCENTAGE': '0', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '0', - 'NODATA_PIXEL_PERCENTAGE': '0', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-2Ap', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI2Ap', - 'RADIATIVE_TRANSFER_ACCURAY': '0', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0', - 'THIN_CIRRUS_PERCENTAGE': '0', - 'VEGETATION_PERCENTAGE': '0', - 'WATER_PERCENTAGE': '0', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0'} + ds = gdal.Open("SENTINEL2_L2A:%s:60m:EPSG_32632" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "AOT_RETRIEVAL_ACCURACY": "0", + "BARE_SOILS_PERCENTAGE": "0", + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "CLOUD_SHADOW_PERCENTAGE": "0", + "DARK_FEATURES_PERCENTAGE": "0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "0", + "L1C_TOA_QUANTIFICATION_VALUE": "1000", + "L1C_TOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_AOT_QUANTIFICATION_VALUE": "1000.0", + "L2A_AOT_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_BOA_QUANTIFICATION_VALUE": "1000", + "L2A_BOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_WVP_QUANTIFICATION_VALUE": "1000.0", + "L2A_WVP_QUANTIFICATION_VALUE_UNIT": "cm", + "LOW_PROBA_CLOUDS_PERCENTAGE": "0", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "0", + "NODATA_PIXEL_PERCENTAGE": "0", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-2Ap", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI2Ap", + "RADIATIVE_TRANSFER_ACCURAY": "0", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0", + "SENSOR_QUALITY_FLAG": "PASSED", + "SNOW_ICE_PERCENTAGE": "0", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + "THIN_CIRRUS_PERCENTAGE": "0", + "VEGETATION_PERCENTAGE": "0", + "WATER_PERCENTAGE": "0", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 60.0, 0.0, 5100060.0, 0.0, -60.0) assert ds.RasterCount == 17 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B01_60m.jp2 1 @@ -1642,19 +1845,22 @@ def test_sentinel2_l2a_2(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B1', - 'BANDWIDTH': '20', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1900', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '443', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B1", + "BANDWIDTH": "20", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1900", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "443", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -1665,33 +1871,37 @@ def test_sentinel2_l2a_2(): assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'AOT'} + expected_md = {"BANDNAME": "AOT"} if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() scl_band = 0 for i in range(ds.RasterCount): - if ds.GetRasterBand(i + 1).GetMetadataItem('BANDNAME') == 'SCL': + if ds.GetRasterBand(i + 1).GetMetadataItem("BANDNAME") == "SCL": scl_band = i + 1 assert scl_band != 0 band = ds.GetRasterBand(scl_band) - expected_categories = ['NODATA', - 'SATURATED_DEFECTIVE', - 'DARK_FEATURE_SHADOW', - 'CLOUD_SHADOW', - 'VEGETATION', - 'BARE_SOIL_DESERT', - 'WATER', - 'CLOUD_LOW_PROBA', - 'CLOUD_MEDIUM_PROBA', - 'CLOUD_HIGH_PROBA', - 'THIN_CIRRUS', - 'SNOW_ICE'] + expected_categories = [ + "NODATA", + "SATURATED_DEFECTIVE", + "DARK_FEATURE_SHADOW", + "CLOUD_SHADOW", + "VEGETATION", + "BARE_SOIL_DESERT", + "WATER", + "CLOUD_LOW_PROBA", + "CLOUD_MEDIUM_PROBA", + "CLOUD_HIGH_PROBA", + "THIN_CIRRUS", + "SNOW_ICE", + ] got_categories = band.GetCategoryNames() if got_categories != expected_categories: import pprint + pprint.pprint(got_categories) pytest.fail() @@ -1703,21 +1913,24 @@ def test_sentinel2_l2a_2(): def test_sentinel2_l2a_3(): # Invalid XML - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ -""") + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ +""", + ) with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.xml') + ds = gdal.Open("/vsimem/test.xml") assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632") assert ds is None # File is OK, but granule MTD are missing - gdal.FileFromMemBuffer('/vsimem/test.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/test.xml", + """ @@ -1752,19 +1965,21 @@ def test_sentinel2_l2a_3(): -""") +""", + ) gdal.ErrorReset() with gdaltest.error_handler(): - gdal.Open('/vsimem/test.xml') - assert gdal.GetLastErrorMsg() != '' + gdal.Open("/vsimem/test.xml") + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632') + ds = gdal.Open("SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632") assert ds is None - gdal.Unlink('/vsimem/test.xml') + gdal.Unlink("/vsimem/test.xml") + ############################################################################### # Test opening a L2A MSIL2A product @@ -1772,187 +1987,187 @@ def test_sentinel2_l2a_3(): def test_sentinel2_l2a_4(): - filename_xml = 'data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml' + filename_xml = "data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml" gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" expected_md = { - 'AOT_QUANTIFICATION_VALUE': '1000.0', - 'AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'AOT_RETRIEVAL_ACCURACY': '0.0', - 'BOA_QUANTIFICATION_VALUE': '10000', - 'BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'CLOUD_COVERAGE_ASSESSMENT': '54.4', - 'CLOUD_SHADOW_PERCENTAGE': '1.5', - 'DARK_FEATURES_PERCENTAGE': '1.5', - 'DATATAKE_1_DATATAKE_SENSING_START': '2018-08-18T09:40:31.024Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20180818T094031_016478_N02.08', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0.0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))', - 'FORMAT_CORRECTNESS': 'PASSED', - 'GENERAL_QUALITY': 'PASSED', - 'GENERATION_TIME': '2018-08-18T12:03:45.000000Z', - 'GEOMETRIC_QUALITY': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '15.3', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '24.1', - 'NODATA_PIXEL_PERCENTAGE': '0.0', - 'NOT_VEGETATED_PERCENTAGE': '3.5', - 'PREVIEW_GEO_INFO': 'Not applicable', - 'PREVIEW_IMAGE_URL': 'Not applicable', - 'PROCESSING_BASELINE': '02.08', - 'PROCESSING_LEVEL': 'Level-2A', - 'PRODUCT_START_TIME': '2018-08-18T09:40:31.024Z', - 'PRODUCT_STOP_TIME': '2018-08-18T09:40:31.024Z', - 'PRODUCT_TYPE': 'S2MSI2A', - 'PRODUCT_URI': 'S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE', - 'RADIATIVE_TRANSFER_ACCURACY': '0.0', - 'RADIOMETRIC_QUALITY': 'PASSED', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', - 'SENSOR_QUALITY': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0.4', - 'SPECIAL_VALUE_NODATA': '0', - 'SPECIAL_VALUE_SATURATED': '6', - 'THIN_CIRRUS_PERCENTAGE': '14.9', - 'UNCLASSIFIED_PERCENTAGE': '5.7', - 'VEGETATION_PERCENTAGE': '14.0', - 'WATER_PERCENTAGE': '18.7', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0', - 'WVP_QUANTIFICATION_VALUE': '1000.0', - 'WVP_QUANTIFICATION_VALUE_UNIT': 'cm'} + "AOT_QUANTIFICATION_VALUE": "1000.0", + "AOT_QUANTIFICATION_VALUE_UNIT": "none", + "AOT_RETRIEVAL_ACCURACY": "0.0", + "BOA_QUANTIFICATION_VALUE": "10000", + "BOA_QUANTIFICATION_VALUE_UNIT": "none", + "CLOUD_COVERAGE_ASSESSMENT": "54.4", + "CLOUD_SHADOW_PERCENTAGE": "1.5", + "DARK_FEATURES_PERCENTAGE": "1.5", + "DATATAKE_1_DATATAKE_SENSING_START": "2018-08-18T09:40:31.024Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20180818T094031_016478_N02.08", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "36", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0.0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))", + "FORMAT_CORRECTNESS": "PASSED", + "GENERAL_QUALITY": "PASSED", + "GENERATION_TIME": "2018-08-18T12:03:45.000000Z", + "GEOMETRIC_QUALITY": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "15.3", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "24.1", + "NODATA_PIXEL_PERCENTAGE": "0.0", + "NOT_VEGETATED_PERCENTAGE": "3.5", + "PREVIEW_GEO_INFO": "Not applicable", + "PREVIEW_IMAGE_URL": "Not applicable", + "PROCESSING_BASELINE": "02.08", + "PROCESSING_LEVEL": "Level-2A", + "PRODUCT_START_TIME": "2018-08-18T09:40:31.024Z", + "PRODUCT_STOP_TIME": "2018-08-18T09:40:31.024Z", + "PRODUCT_TYPE": "S2MSI2A", + "PRODUCT_URI": "S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE", + "RADIATIVE_TRANSFER_ACCURACY": "0.0", + "RADIOMETRIC_QUALITY": "PASSED", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0.0", + "SENSOR_QUALITY": "PASSED", + "SNOW_ICE_PERCENTAGE": "0.4", + "SPECIAL_VALUE_NODATA": "0", + "SPECIAL_VALUE_SATURATED": "6", + "THIN_CIRRUS_PERCENTAGE": "14.9", + "UNCLASSIFIED_PERCENTAGE": "5.7", + "VEGETATION_PERCENTAGE": "14.0", + "WATER_PERCENTAGE": "18.7", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0.0", + "WVP_QUANTIFICATION_VALUE": "1000.0", + "WVP_QUANTIFICATION_VALUE_UNIT": "cm", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() expected_md = { - 'SUBDATASET_1_DESC': - 'Bands B2, B3, B4, B8 with 10m resolution, UTM 34N', - 'SUBDATASET_1_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634', - 'SUBDATASET_2_DESC': - 'Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N', - 'SUBDATASET_2_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634', - 'SUBDATASET_3_DESC': - 'Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N', - 'SUBDATASET_3_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634', - 'SUBDATASET_4_DESC': - 'True color image, UTM 34N', - 'SUBDATASET_4_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634'} - got_md = ds.GetMetadata('SUBDATASETS') + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution, UTM 34N", + "SUBDATASET_1_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N", + "SUBDATASET_2_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634", + "SUBDATASET_3_DESC": "Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N", + "SUBDATASET_3_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634", + "SUBDATASET_4_DESC": "True color image, UTM 34N", + "SUBDATASET_4_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L2A:', - 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', - 'SENTINEL2_L2A:%s' % filename_xml, - 'SENTINEL2_L2A:%s:' % filename_xml, - 'SENTINEL2_L2A:%s:10m' % filename_xml, - 'SENTINEL2_L2A:%s:10m:' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, - 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: + for name in [ + "SENTINEL2_L2A:", + "SENTINEL2_L2A:foo.xml:10m:EPSG_32632", + "SENTINEL2_L2A:%s" % filename_xml, + "SENTINEL2_L2A:%s:" % filename_xml, + "SENTINEL2_L2A:%s:10m" % filename_xml, + "SENTINEL2_L2A:%s:10m:" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_" % filename_xml, + "SENTINEL2_L2A:%s:50m:EPSG_32632" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_32633" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name - ############################################################################### # Test opening a L2A MSIL2A subdataset on the 60m bands def test_sentinel2_l2a_5(): - filename_xml = 'data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml' + filename_xml = "data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml" gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32634' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + ds = gdal.Open("SENTINEL2_L2A:%s:60m:EPSG_32634" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" expected_md = { - 'AOT_QUANTIFICATION_VALUE': '1000.0', - 'AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'AOT_RETRIEVAL_ACCURACY': '0.0', - 'BOA_QUANTIFICATION_VALUE': '10000', - 'BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'CLOUD_COVERAGE_ASSESSMENT': '54.4', - 'CLOUD_SHADOW_PERCENTAGE': '1.5', - 'DARK_FEATURES_PERCENTAGE': '1.5', - 'DATATAKE_1_DATATAKE_SENSING_START': '2018-08-18T09:40:31.024Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20180818T094031_016478_N02.08', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0.0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FORMAT_CORRECTNESS': 'PASSED', - 'GENERAL_QUALITY': 'PASSED', - 'GENERATION_TIME': '2018-08-18T12:03:45.000000Z', - 'GEOMETRIC_QUALITY': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '15.3', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '24.1', - 'NODATA_PIXEL_PERCENTAGE': '0.0', - 'NOT_VEGETATED_PERCENTAGE': '3.5', - 'PREVIEW_GEO_INFO': 'Not applicable', - 'PREVIEW_IMAGE_URL': 'Not applicable', - 'PROCESSING_BASELINE': '02.08', - 'PROCESSING_LEVEL': 'Level-2A', - 'PRODUCT_START_TIME': '2018-08-18T09:40:31.024Z', - 'PRODUCT_STOP_TIME': '2018-08-18T09:40:31.024Z', - 'PRODUCT_TYPE': 'S2MSI2A', - 'PRODUCT_URI': 'S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE', - 'RADIATIVE_TRANSFER_ACCURACY': '0.0', - 'RADIOMETRIC_QUALITY': 'PASSED', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', - 'SENSOR_QUALITY': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0.4', - 'SPECIAL_VALUE_NODATA': '0', - 'SPECIAL_VALUE_SATURATED': '6', - 'THIN_CIRRUS_PERCENTAGE': '14.9', - 'UNCLASSIFIED_PERCENTAGE': '5.7', - 'VEGETATION_PERCENTAGE': '14.0', - 'WATER_PERCENTAGE': '18.7', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0', - 'WVP_QUANTIFICATION_VALUE': '1000.0', - 'WVP_QUANTIFICATION_VALUE_UNIT': 'cm'} + "AOT_QUANTIFICATION_VALUE": "1000.0", + "AOT_QUANTIFICATION_VALUE_UNIT": "none", + "AOT_RETRIEVAL_ACCURACY": "0.0", + "BOA_QUANTIFICATION_VALUE": "10000", + "BOA_QUANTIFICATION_VALUE_UNIT": "none", + "CLOUD_COVERAGE_ASSESSMENT": "54.4", + "CLOUD_SHADOW_PERCENTAGE": "1.5", + "DARK_FEATURES_PERCENTAGE": "1.5", + "DATATAKE_1_DATATAKE_SENSING_START": "2018-08-18T09:40:31.024Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20180818T094031_016478_N02.08", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "36", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0.0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FORMAT_CORRECTNESS": "PASSED", + "GENERAL_QUALITY": "PASSED", + "GENERATION_TIME": "2018-08-18T12:03:45.000000Z", + "GEOMETRIC_QUALITY": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "15.3", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "24.1", + "NODATA_PIXEL_PERCENTAGE": "0.0", + "NOT_VEGETATED_PERCENTAGE": "3.5", + "PREVIEW_GEO_INFO": "Not applicable", + "PREVIEW_IMAGE_URL": "Not applicable", + "PROCESSING_BASELINE": "02.08", + "PROCESSING_LEVEL": "Level-2A", + "PRODUCT_START_TIME": "2018-08-18T09:40:31.024Z", + "PRODUCT_STOP_TIME": "2018-08-18T09:40:31.024Z", + "PRODUCT_TYPE": "S2MSI2A", + "PRODUCT_URI": "S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE", + "RADIATIVE_TRANSFER_ACCURACY": "0.0", + "RADIOMETRIC_QUALITY": "PASSED", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0.0", + "SENSOR_QUALITY": "PASSED", + "SNOW_ICE_PERCENTAGE": "0.4", + "SPECIAL_VALUE_NODATA": "0", + "SPECIAL_VALUE_SATURATED": "6", + "THIN_CIRRUS_PERCENTAGE": "14.9", + "UNCLASSIFIED_PERCENTAGE": "5.7", + "VEGETATION_PERCENTAGE": "14.0", + "WATER_PERCENTAGE": "18.7", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0.0", + "WVP_QUANTIFICATION_VALUE": "1000.0", + "WVP_QUANTIFICATION_VALUE_UNIT": "cm", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 - assert ds.GetProjectionRef().find('32634') >= 0 + assert ds.GetProjectionRef().find("32634") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (600000.0, 60.0, 0.0, 6400020.0, 0.0, -60.0) assert ds.RasterCount == 7 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B01_60m.jp2 1 @@ -1961,221 +2176,225 @@ def test_sentinel2_l2a_5(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B1', - 'BANDWIDTH': '20', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1884.69', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '443', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B1", + "BANDWIDTH": "20", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1884.69", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "443", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 + ############################################################################### # Test opening a L2A MSIL2Ap product def test_sentinel2_l2a_6(): - filename_xml = 'data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml' + filename_xml = "data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml" gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + assert ds is not None and gdal.GetLastErrorMsg() == "" expected_md = { - 'AOT_RETRIEVAL_ACCURACY': '0.0', - 'BARE_SOILS_PERCENTAGE': '0.4', - 'CLOUD_COVERAGE_ASSESSMENT': '86.3', - 'CLOUD_COVERAGE_PERCENTAGE': '84.4', - 'CLOUD_SHADOW_PERCENTAGE': '4.1', - 'DARK_FEATURES_PERCENTAGE': '1.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2017-08-23T09:40:31.026Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20170823T094031_011330_N02.05', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2017-08-25T08:50:10Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '36.1', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '28.9', - 'L1C_TOA_QUANTIFICATION_VALUE': '10000', - 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', - 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_BOA_QUANTIFICATION_VALUE': '10000', - 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', - 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', - 'LOW_PROBA_CLOUDS_PERCENTAGE': '1.6', - 'NODATA_PIXEL_PERCENTAGE': '0.0', - 'PREVIEW_GEO_INFO': 'Not applicable', - 'PREVIEW_IMAGE_URL': 'Not applicable', - 'PROCESSING_BASELINE': '02.05', - 'PROCESSING_LEVEL': 'Level-2Ap', - 'PRODUCT_START_TIME': '2017-08-23T09:40:31.026Z', - 'PRODUCT_STOP_TIME': '2017-08-23T09:40:31.026Z', - 'PRODUCT_TYPE': 'S2MSI2Ap', - 'PRODUCT_URI_1C': 'S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', - 'PRODUCT_URI_2A': 'S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', - 'RADIATIVE_TRANSFER_ACCURAY': '0.0', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0.2', - 'SPECIAL_VALUE_NODATA': '0', - 'SPECIAL_VALUE_SATURATED': '6', - 'THIN_CIRRUS_PERCENTAGE': '19.3', - 'VEGETATION_PERCENTAGE': '5.0', - 'WATER_PERCENTAGE': '2.9', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0'} + "AOT_RETRIEVAL_ACCURACY": "0.0", + "BARE_SOILS_PERCENTAGE": "0.4", + "CLOUD_COVERAGE_ASSESSMENT": "86.3", + "CLOUD_COVERAGE_PERCENTAGE": "84.4", + "CLOUD_SHADOW_PERCENTAGE": "4.1", + "DARK_FEATURES_PERCENTAGE": "1.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2017-08-23T09:40:31.026Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20170823T094031_011330_N02.05", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "36", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2017-08-25T08:50:10Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "36.1", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "28.9", + "L1C_TOA_QUANTIFICATION_VALUE": "10000", + "L1C_TOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_AOT_QUANTIFICATION_VALUE": "1000.0", + "L2A_AOT_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_BOA_QUANTIFICATION_VALUE": "10000", + "L2A_BOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_WVP_QUANTIFICATION_VALUE": "1000.0", + "L2A_WVP_QUANTIFICATION_VALUE_UNIT": "cm", + "LOW_PROBA_CLOUDS_PERCENTAGE": "1.6", + "NODATA_PIXEL_PERCENTAGE": "0.0", + "PREVIEW_GEO_INFO": "Not applicable", + "PREVIEW_IMAGE_URL": "Not applicable", + "PROCESSING_BASELINE": "02.05", + "PROCESSING_LEVEL": "Level-2Ap", + "PRODUCT_START_TIME": "2017-08-23T09:40:31.026Z", + "PRODUCT_STOP_TIME": "2017-08-23T09:40:31.026Z", + "PRODUCT_TYPE": "S2MSI2Ap", + "PRODUCT_URI_1C": "S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE", + "PRODUCT_URI_2A": "S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE", + "RADIATIVE_TRANSFER_ACCURAY": "0.0", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0.0", + "SENSOR_QUALITY_FLAG": "PASSED", + "SNOW_ICE_PERCENTAGE": "0.2", + "SPECIAL_VALUE_NODATA": "0", + "SPECIAL_VALUE_SATURATED": "6", + "THIN_CIRRUS_PERCENTAGE": "19.3", + "VEGETATION_PERCENTAGE": "5.0", + "WATER_PERCENTAGE": "2.9", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0.0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() expected_md = { - 'SUBDATASET_1_DESC': - 'Bands B2, B3, B4, B8 with 10m resolution, UTM 34N', - 'SUBDATASET_1_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634', - 'SUBDATASET_2_DESC': - 'Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N', - 'SUBDATASET_2_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634', - 'SUBDATASET_3_DESC': - 'Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N', - 'SUBDATASET_3_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634', - 'SUBDATASET_4_DESC': - 'True color image, UTM 34N', - 'SUBDATASET_4_NAME': - 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634'} - got_md = ds.GetMetadata('SUBDATASETS') + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution, UTM 34N", + "SUBDATASET_1_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N", + "SUBDATASET_2_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634", + "SUBDATASET_3_DESC": "Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N", + "SUBDATASET_3_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634", + "SUBDATASET_4_DESC": "True color image, UTM 34N", + "SUBDATASET_4_NAME": "SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L2A:', - 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', - 'SENTINEL2_L2A:%s' % filename_xml, - 'SENTINEL2_L2A:%s:' % filename_xml, - 'SENTINEL2_L2A:%s:10m' % filename_xml, - 'SENTINEL2_L2A:%s:10m:' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, - 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, - 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: + for name in [ + "SENTINEL2_L2A:", + "SENTINEL2_L2A:foo.xml:10m:EPSG_32632", + "SENTINEL2_L2A:%s" % filename_xml, + "SENTINEL2_L2A:%s:" % filename_xml, + "SENTINEL2_L2A:%s:10m" % filename_xml, + "SENTINEL2_L2A:%s:10m:" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_" % filename_xml, + "SENTINEL2_L2A:%s:50m:EPSG_32632" % filename_xml, + "SENTINEL2_L2A:%s:10m:EPSG_32633" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name - ############################################################################### # Test opening a L2A MSIL2Ap subdataset on the 60m bands def test_sentinel2_l2a_7(): - filename_xml = 'data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml' + filename_xml = "data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml" gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32634' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' + ds = gdal.Open("SENTINEL2_L2A:%s:60m:EPSG_32634" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" expected_md = { - 'AOT_RETRIEVAL_ACCURACY': '0.0', - 'BARE_SOILS_PERCENTAGE': '0.4', - 'CLOUD_COVERAGE_ASSESSMENT': '86.3', - 'CLOUD_COVERAGE_PERCENTAGE': '84.4', - 'CLOUD_SHADOW_PERCENTAGE': '4.1', - 'DARK_FEATURES_PERCENTAGE': '1.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2017-08-23T09:40:31.026Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20170823T094031_011330_N02.05', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2017-08-25T08:50:10Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'HIGH_PROBA_CLOUDS_PERCENTAGE': '36.1', - 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '28.9', - 'L1C_TOA_QUANTIFICATION_VALUE': '10000', - 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', - 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_BOA_QUANTIFICATION_VALUE': '10000', - 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', - 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', - 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', - 'LOW_PROBA_CLOUDS_PERCENTAGE': '1.6', - 'NODATA_PIXEL_PERCENTAGE': '0.0', - 'PREVIEW_GEO_INFO': 'Not applicable', - 'PREVIEW_IMAGE_URL': 'Not applicable', - 'PROCESSING_BASELINE': '02.05', - 'PROCESSING_LEVEL': 'Level-2Ap', - 'PRODUCT_START_TIME': '2017-08-23T09:40:31.026Z', - 'PRODUCT_STOP_TIME': '2017-08-23T09:40:31.026Z', - 'PRODUCT_TYPE': 'S2MSI2Ap', - 'PRODUCT_URI_1C': 'S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', - 'PRODUCT_URI_2A': 'S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', - 'RADIATIVE_TRANSFER_ACCURAY': '0.0', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SNOW_ICE_PERCENTAGE': '0.2', - 'SPECIAL_VALUE_NODATA': '0', - 'SPECIAL_VALUE_SATURATED': '6', - 'THIN_CIRRUS_PERCENTAGE': '19.3', - 'VEGETATION_PERCENTAGE': '5.0', - 'WATER_PERCENTAGE': '2.9', - 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0'} + "AOT_RETRIEVAL_ACCURACY": "0.0", + "BARE_SOILS_PERCENTAGE": "0.4", + "CLOUD_COVERAGE_ASSESSMENT": "86.3", + "CLOUD_COVERAGE_PERCENTAGE": "84.4", + "CLOUD_SHADOW_PERCENTAGE": "4.1", + "DARK_FEATURES_PERCENTAGE": "1.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2017-08-23T09:40:31.026Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20170823T094031_011330_N02.05", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "36", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2017-08-25T08:50:10Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "HIGH_PROBA_CLOUDS_PERCENTAGE": "36.1", + "MEDIUM_PROBA_CLOUDS_PERCENTAGE": "28.9", + "L1C_TOA_QUANTIFICATION_VALUE": "10000", + "L1C_TOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_AOT_QUANTIFICATION_VALUE": "1000.0", + "L2A_AOT_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_BOA_QUANTIFICATION_VALUE": "10000", + "L2A_BOA_QUANTIFICATION_VALUE_UNIT": "none", + "L2A_WVP_QUANTIFICATION_VALUE": "1000.0", + "L2A_WVP_QUANTIFICATION_VALUE_UNIT": "cm", + "LOW_PROBA_CLOUDS_PERCENTAGE": "1.6", + "NODATA_PIXEL_PERCENTAGE": "0.0", + "PREVIEW_GEO_INFO": "Not applicable", + "PREVIEW_IMAGE_URL": "Not applicable", + "PROCESSING_BASELINE": "02.05", + "PROCESSING_LEVEL": "Level-2Ap", + "PRODUCT_START_TIME": "2017-08-23T09:40:31.026Z", + "PRODUCT_STOP_TIME": "2017-08-23T09:40:31.026Z", + "PRODUCT_TYPE": "S2MSI2Ap", + "PRODUCT_URI_1C": "S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE", + "PRODUCT_URI_2A": "S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE", + "RADIATIVE_TRANSFER_ACCURAY": "0.0", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SATURATED_DEFECTIVE_PIXEL_PERCENTAGE": "0.0", + "SENSOR_QUALITY_FLAG": "PASSED", + "SNOW_ICE_PERCENTAGE": "0.2", + "SPECIAL_VALUE_NODATA": "0", + "SPECIAL_VALUE_SATURATED": "6", + "THIN_CIRRUS_PERCENTAGE": "19.3", + "VEGETATION_PERCENTAGE": "5.0", + "WATER_PERCENTAGE": "2.9", + "WATER_VAPOUR_RETRIEVAL_ACCURACY": "0.0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 - assert ds.GetProjectionRef().find('32634') >= 0 + assert ds.GetProjectionRef().find("32634") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (600000.0, 60.0, 0.0, 6400020.0, 0.0, -60.0) assert ds.RasterCount == 7 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B01_60m.jp2 1 @@ -2184,19 +2403,22 @@ def test_sentinel2_l2a_7(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B1', - 'BANDWIDTH': '20', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1913.57', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '443', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B1", + "BANDWIDTH": "20", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1913.57", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "443", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -2209,76 +2431,87 @@ def test_sentinel2_l2a_7(): def test_sentinel2_l1c_safe_compact_1(): - filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' + filename_xml = ( + "data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml" + ) gdal.ErrorReset() ds = gdal.Open(filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FOOTPRINT": "POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() - expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 32N', - 'SUBDATASET_1_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632', - 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N', - 'SUBDATASET_2_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:20m:EPSG_32632', - 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution, UTM 32N', - 'SUBDATASET_3_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:60m:EPSG_32632', - 'SUBDATASET_4_DESC': 'True color image, UTM 32N', - 'SUBDATASET_4_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:TCI:EPSG_32632'} - got_md = ds.GetMetadata('SUBDATASETS') + expected_md = { + "SUBDATASET_1_DESC": "Bands B2, B3, B4, B8 with 10m resolution, UTM 32N", + "SUBDATASET_1_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632", + "SUBDATASET_2_DESC": "Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N", + "SUBDATASET_2_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:20m:EPSG_32632", + "SUBDATASET_3_DESC": "Bands B1, B9, B10 with 60m resolution, UTM 32N", + "SUBDATASET_3_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:60m:EPSG_32632", + "SUBDATASET_4_DESC": "True color image, UTM 32N", + "SUBDATASET_4_NAME": "SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:TCI:EPSG_32632", + } + got_md = ds.GetMetadata("SUBDATASETS") if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() - ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) - assert ds is not None and gdal.GetLastErrorMsg() == '', \ - got_md['SUBDATASET_%d_NAME' % (i + 1)] + ds = gdal.Open(got_md["SUBDATASET_%d_NAME" % (i + 1)]) + assert ds is not None and gdal.GetLastErrorMsg() == "", got_md[ + "SUBDATASET_%d_NAME" % (i + 1) + ] # Try various invalid subdataset names - for name in ['SENTINEL2_L1C:', - 'SENTINEL2_L1C:foo.xml:10m:EPSG_32632', - 'SENTINEL2_L1C:%s' % filename_xml, - 'SENTINEL2_L1C:%s:' % filename_xml, - 'SENTINEL2_L1C:%s:10m' % filename_xml, - 'SENTINEL2_L1C:%s:10m:' % filename_xml, - 'SENTINEL2_L1C:%s:10m:EPSG_' % filename_xml, - 'SENTINEL2_L1C:%s:50m:EPSG_32632' % filename_xml, - 'SENTINEL2_L1C:%s:10m:EPSG_32633' % filename_xml]: + for name in [ + "SENTINEL2_L1C:", + "SENTINEL2_L1C:foo.xml:10m:EPSG_32632", + "SENTINEL2_L1C:%s" % filename_xml, + "SENTINEL2_L1C:%s:" % filename_xml, + "SENTINEL2_L1C:%s:10m" % filename_xml, + "SENTINEL2_L1C:%s:10m:" % filename_xml, + "SENTINEL2_L1C:%s:10m:EPSG_" % filename_xml, + "SENTINEL2_L1C:%s:50m:EPSG_32632" % filename_xml, + "SENTINEL2_L1C:%s:10m:EPSG_32633" % filename_xml, + ]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name @@ -2290,54 +2523,59 @@ def test_sentinel2_l1c_safe_compact_1(): def test_sentinel2_l1c_safe_compact_2(): - filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' + filename_xml = ( + "data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml" + ) gdal.ErrorReset() - ds = gdal.Open('SENTINEL2_L1C:%s:10m:EPSG_32632' % filename_xml) - assert ds is not None and gdal.GetLastErrorMsg() == '' - - expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', - 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', - 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', - 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', - 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', - 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', - 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', - 'DEGRADED_ANC_DATA_PERCENTAGE': '0', - 'DEGRADED_MSI_DATA_PERCENTAGE': '0', - 'FORMAT_CORRECTNESS_FLAG': 'PASSED', - 'GENERAL_QUALITY_FLAG': 'PASSED', - 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', - 'GEOMETRIC_QUALITY_FLAG': 'PASSED', - 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', - 'PREVIEW_IMAGE_URL': 'http://example.com', - 'PROCESSING_BASELINE': '01.03', - 'PROCESSING_LEVEL': 'Level-1C', - 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', - 'PRODUCT_TYPE': 'S2MSI1C', - 'QUANTIFICATION_VALUE': '1000', - 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', - 'REFERENCE_BAND': 'B1', - 'REFLECTANCE_CONVERSION_U': '0.97', - 'SENSOR_QUALITY_FLAG': 'PASSED', - 'SPECIAL_VALUE_NODATA': '1', - 'SPECIAL_VALUE_SATURATED': '0'} + ds = gdal.Open("SENTINEL2_L1C:%s:10m:EPSG_32632" % filename_xml) + assert ds is not None and gdal.GetLastErrorMsg() == "" + + expected_md = { + "CLOUD_COVERAGE_ASSESSMENT": "0.0", + "DATATAKE_1_DATATAKE_SENSING_START": "2015-12-31T23:59:59.999Z", + "DATATAKE_1_DATATAKE_TYPE": "INS-NOBS", + "DATATAKE_1_ID": "GS2A_20151231T235959_000123_N01.03", + "DATATAKE_1_SENSING_ORBIT_DIRECTION": "DESCENDING", + "DATATAKE_1_SENSING_ORBIT_NUMBER": "22", + "DATATAKE_1_SPACECRAFT_NAME": "Sentinel-2A", + "DEGRADED_ANC_DATA_PERCENTAGE": "0", + "DEGRADED_MSI_DATA_PERCENTAGE": "0", + "FORMAT_CORRECTNESS_FLAG": "PASSED", + "GENERAL_QUALITY_FLAG": "PASSED", + "GENERATION_TIME": "2015-12-31T23:59:59.999Z", + "GEOMETRIC_QUALITY_FLAG": "PASSED", + "PREVIEW_GEO_INFO": "BrowseImageFootprint", + "PREVIEW_IMAGE_URL": "http://example.com", + "PROCESSING_BASELINE": "01.03", + "PROCESSING_LEVEL": "Level-1C", + "PRODUCT_START_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_STOP_TIME": "2015-12-31T23:59:59.999Z", + "PRODUCT_TYPE": "S2MSI1C", + "QUANTIFICATION_VALUE": "1000", + "RADIOMETRIC_QUALITY_FLAG": "PASSED", + "REFERENCE_BAND": "B1", + "REFLECTANCE_CONVERSION_U": "0.97", + "SENSOR_QUALITY_FLAG": "PASSED", + "SPECIAL_VALUE_NODATA": "1", + "SPECIAL_VALUE_SATURATED": "0", + } got_md = ds.GetMetadata() if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 - assert ds.GetProjectionRef().find('32632') >= 0 + assert ds.GetProjectionRef().find("32632") >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B04.jp2 1 @@ -2347,19 +2585,22 @@ def test_sentinel2_l1c_safe_compact_2(): """ assert placement_vrt in vrt - assert ds.GetMetadata('xml:SENTINEL2') is not None + assert ds.GetMetadata("xml:SENTINEL2") is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B4', - 'BANDWIDTH': '30', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1500', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '665', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B4", + "BANDWIDTH": "30", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1500", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "665", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -2367,22 +2608,25 @@ def test_sentinel2_l1c_safe_compact_2(): assert band.DataType == gdal.GDT_UInt16 - assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' + assert band.GetMetadataItem("NBITS", "IMAGE_STRUCTURE") == "12" band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() - expected_md = {'BANDNAME': 'B8', - 'BANDWIDTH': '115', - 'BANDWIDTH_UNIT': 'nm', - 'SOLAR_IRRADIANCE': '1000', - 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', - 'WAVELENGTH': '842', - 'WAVELENGTH_UNIT': 'nm'} + expected_md = { + "BANDNAME": "B8", + "BANDWIDTH": "115", + "BANDWIDTH_UNIT": "nm", + "SOLAR_IRRADIANCE": "1000", + "SOLAR_IRRADIANCE_UNIT": "W/m2/um", + "WAVELENGTH": "842", + "WAVELENGTH_UNIT": "nm", + } if got_md != expected_md: import pprint + pprint.pprint(got_md) pytest.fail() @@ -2393,8 +2637,10 @@ def test_sentinel2_l1c_safe_compact_2(): def test_sentinel2_l1c_safe_compact_3(): - filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' - ds = gdal.OpenEx('SENTINEL2_L1C:%s:TCI:EPSG_32632' % filename_xml) + filename_xml = ( + "data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml" + ) + ds = gdal.OpenEx("SENTINEL2_L1C:%s:TCI:EPSG_32632" % filename_xml) assert ds is not None assert ds.RasterCount == 3 @@ -2403,6 +2649,7 @@ def test_sentinel2_l1c_safe_compact_3(): # main XML + 1 granule XML + 1 jp2 if len(fl) != 1 + 1 + 1: import pprint + pprint.pprint(fl) pytest.fail() @@ -2415,6 +2662,7 @@ def test_sentinel2_l1c_safe_compact_3(): ############################################################################### # Test opening zipped versions of S2 datasets + def test_sentinel2_zipped(): # S2 L1C zipname = str(uuid.uuid4()) + ".zip" @@ -2465,4 +2713,3 @@ def test_sentinel2_zipped(): assert os.path.exists(zipwpath) ds = gdal.Open(zipwpath) assert ds is not None - diff --git a/autotest/gdrivers/sgi.py b/autotest/gdrivers/sgi.py index bddb90b08b3b..6b9416db2fd5 100755 --- a/autotest/gdrivers/sgi.py +++ b/autotest/gdrivers/sgi.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,30 +37,28 @@ def test_sgi_1(): - tst = gdaltest.GDALTest('SGI', 'sgi/byte.sgi', 1, 4672) + tst = gdaltest.GDALTest("SGI", "sgi/byte.sgi", 1, 4672) return tst.testOpen() + ############################################################################### # Write Test grayscale def test_sgi_2(): - tst = gdaltest.GDALTest('SGI', 'byte.tif', 1, 4672) + 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) + tst = gdaltest.GDALTest("SGI", "rgbsmall.tif", 2, 21053) return tst.testCreate() - - - - diff --git a/autotest/gdrivers/sigdem.py b/autotest/gdrivers/sigdem.py index 6c06d198e4e7..fa8acabb6dce 100755 --- a/autotest/gdrivers/sigdem.py +++ b/autotest/gdrivers/sigdem.py @@ -30,7 +30,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -39,34 +38,35 @@ def test_sigdem_copy_check_prj(): - tst = gdaltest.GDALTest('SIGDEM', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("SIGDEM", "byte.tif", 1, 4672) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) + ############################################################################### # Verify writing files with non-square pixels. + def test_sigdem_non_square(): - tst = gdaltest.GDALTest('SIGDEM', 'sigdem/nonsquare_nad27_utm11.vrt', 1, 12481) + tst = gdaltest.GDALTest("SIGDEM", "sigdem/nonsquare_nad27_utm11.vrt", 1, 12481) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) + ############################################################################### # Test creating an in memory copy. + def test_sigdem_in_memory(): - tst = gdaltest.GDALTest('SIGDEM', 'byte.tif', 1, 4672) + tst = gdaltest.GDALTest("SIGDEM", "byte.tif", 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### - - - diff --git a/autotest/gdrivers/snodas.py b/autotest/gdrivers/snodas.py index 15122575d708..a880057073dc 100755 --- a/autotest/gdrivers/snodas.py +++ b/autotest/gdrivers/snodas.py @@ -28,19 +28,25 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest +from osgeo import gdal + ############################################################################### # Test a fake SNODAS dataset def test_snodas_1(): - tst = gdaltest.GDALTest('SNODAS', 'snodas/fake_snodas.hdr', 1, 0) - expected_gt = [-124.733749999995, 0.0083333333333330643, 0.0, 52.874583333331302, 0.0, -0.0083333333333330054] + tst = gdaltest.GDALTest("SNODAS", "snodas/fake_snodas.hdr", 1, 0) + expected_gt = [ + -124.733749999995, + 0.0083333333333330643, + 0.0, + 52.874583333331302, + 0.0, + -0.0083333333333330054, + ] expected_srs = """GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, @@ -54,14 +60,11 @@ def test_snodas_1(): AUTHORITY["EPSG","4326"]]""" ret = tst.testOpen(check_gt=expected_gt, check_prj=expected_srs, skip_checksum=True) - if ret == 'success': - ds = gdal.Open('data/snodas/fake_snodas.hdr') + if ret == "success": + ds = gdal.Open("data/snodas/fake_snodas.hdr") ds.GetFileList() assert ds.GetRasterBand(1).GetNoDataValue() == -9999 assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 429 return ret - - - diff --git a/autotest/gdrivers/srp.py b/autotest/gdrivers/srp.py index 70f623ba3746..58f1bec6eace 100755 --- a/autotest/gdrivers/srp.py +++ b/autotest/gdrivers/srp.py @@ -30,25 +30,26 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import osr - import gdaltest +from osgeo import gdal, osr + ############################################################################### # Read USRP dataset with PCB=0 -def test_srp_1(filename='srp/USRP_PCB0/FKUSRP01.IMG'): +def test_srp_1(filename="srp/USRP_PCB0/FKUSRP01.IMG"): srs = osr.SpatialReference() srs.ImportFromEPSG(32600 + 17) - tst = gdaltest.GDALTest('SRP', filename, 1, 24576) - tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(500000.0, 5.0, 0.0, 5000000.0, 0.0, -5.0)) + tst = gdaltest.GDALTest("SRP", filename, 1, 24576) + tst.testOpen( + check_prj=srs.ExportToWkt(), check_gt=(500000.0, 5.0, 0.0, 5000000.0, 0.0, -5.0) + ) - ds = gdal.Open('data/' + filename) + ds = gdal.Open("data/" + filename) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ct = ds.GetRasterBand(1).GetColorTable() @@ -58,34 +59,38 @@ def test_srp_1(filename='srp/USRP_PCB0/FKUSRP01.IMG'): assert ct.GetColorEntry(1) == (255, 0, 0, 255) - expected_md = ['SRP_CLASSIFICATION=U', - 'SRP_CREATIONDATE=20120505', - 'SRP_EDN=0', - 'SRP_NAM=FKUSRP', - 'SRP_PRODUCT=USRP', - 'SRP_REVISIONDATE=20120505', - 'SRP_SCA=50000', - 'SRP_ZNA=17'] + expected_md = [ + "SRP_CLASSIFICATION=U", + "SRP_CREATIONDATE=20120505", + "SRP_EDN=0", + "SRP_NAM=FKUSRP", + "SRP_PRODUCT=USRP", + "SRP_REVISIONDATE=20120505", + "SRP_SCA=50000", + "SRP_ZNA=17", + ] got_md = ds.GetMetadata() for md in expected_md: - (key, value) = md.split('=') - assert key in got_md and got_md[key] == value, ('did not find %s' % md) + (key, value) = md.split("=") + assert key in got_md and got_md[key] == value, "did not find %s" % md + - ############################################################################### # Read USRP dataset with PCB=4 def test_srp_2(): - return test_srp_1('srp/USRP_PCB4/FKUSRP01.IMG') + return test_srp_1("srp/USRP_PCB4/FKUSRP01.IMG") + ############################################################################### # Read USRP dataset with PCB=8 def test_srp_3(): - return test_srp_1('srp/USRP_PCB8/FKUSRP01.IMG') + return test_srp_1("srp/USRP_PCB8/FKUSRP01.IMG") + ############################################################################### # Read from TRANSH01.THF file. @@ -93,50 +98,67 @@ def test_srp_3(): def test_srp_4(): - tst = gdaltest.GDALTest('SRP', 'srp/USRP_PCB0/TRANSH01.THF', 1, 24576) + tst = gdaltest.GDALTest("SRP", "srp/USRP_PCB0/TRANSH01.THF", 1, 24576) ret = tst.testOpen() return ret + ############################################################################### # Read from TRANSH01.THF file (without "optimization" for single GEN in THF) def test_srp_5(): - gdal.SetConfigOption('SRP_SINGLE_GEN_IN_THF_AS_DATASET', 'FALSE') - ds = gdal.Open('data/srp/USRP_PCB0/TRANSH01.THF') - gdal.SetConfigOption('SRP_SINGLE_GEN_IN_THF_AS_DATASET', None) - subdatasets = ds.GetMetadata('SUBDATASETS') - assert subdatasets['SUBDATASET_1_NAME'].replace('\\', '/') == 'SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG' - assert subdatasets['SUBDATASET_1_DESC'].replace('\\', '/') == 'SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG' - - expected_md = ['SRP_CLASSIFICATION=U', - 'SRP_CREATIONDATE=20120505', - 'SRP_EDN=1', - 'SRP_VOO= '] + gdal.SetConfigOption("SRP_SINGLE_GEN_IN_THF_AS_DATASET", "FALSE") + ds = gdal.Open("data/srp/USRP_PCB0/TRANSH01.THF") + gdal.SetConfigOption("SRP_SINGLE_GEN_IN_THF_AS_DATASET", None) + subdatasets = ds.GetMetadata("SUBDATASETS") + assert ( + subdatasets["SUBDATASET_1_NAME"].replace("\\", "/") + == "SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG" + ) + assert ( + subdatasets["SUBDATASET_1_DESC"].replace("\\", "/") + == "SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG" + ) + + expected_md = [ + "SRP_CLASSIFICATION=U", + "SRP_CREATIONDATE=20120505", + "SRP_EDN=1", + "SRP_VOO= ", + ] got_md = ds.GetMetadata() for md in expected_md: - (key, value) = md.split('=') - assert key in got_md and got_md[key] == value, ('did not find %s' % md) + (key, value) = md.split("=") + assert key in got_md and got_md[key] == value, "did not find %s" % md + - ############################################################################### # Read with subdataset syntax def test_srp_6(): - tst = gdaltest.GDALTest('SRP', 'SRP:data/srp/USRP_PCB4/FKUSRP01.GEN,data/srp/USRP_PCB4/FKUSRP01.IMG', 1, 24576, filename_absolute=1) + tst = gdaltest.GDALTest( + "SRP", + "SRP:data/srp/USRP_PCB4/FKUSRP01.GEN,data/srp/USRP_PCB4/FKUSRP01.IMG", + 1, + 24576, + filename_absolute=1, + ) tst.testOpen() ############################################################################### # Cleanup + def test_srp_cleanup(): # FIXME ? - os.unlink('data/srp/USRP_PCB0/TRANSH01.THF.aux.xml') + os.unlink("data/srp/USRP_PCB0/TRANSH01.THF.aux.xml") + ############################################################################### diff --git a/autotest/gdrivers/srtmhgt.py b/autotest/gdrivers/srtmhgt.py index dd6c76bb07c5..c41cafcad86d 100755 --- a/autotest/gdrivers/srtmhgt.py +++ b/autotest/gdrivers/srtmhgt.py @@ -31,25 +31,36 @@ import os import struct -from osgeo import gdal - import pytest +from osgeo import gdal ############################################################################### # Test a SRTMHGT Level 1 (made from a DTED Level 0) + def test_srtmhgt_1(): - ds = gdal.Open('data/n43.dt0') + ds = gdal.Open("data/n43.dt0") bandSrc = ds.GetRasterBand(1) driver = gdal.GetDriverByName("GTiff") - dsDst = driver.Create('tmp/n43.dt1.tif', 1201, 1201, 1, gdal.GDT_Int16) - dsDst.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]') - dsDst.SetGeoTransform((-80.0004166666666663, 0.0008333333333333, 0, 44.0004166666666670, 0, -0.0008333333333333)) + dsDst = driver.Create("tmp/n43.dt1.tif", 1201, 1201, 1, gdal.GDT_Int16) + dsDst.SetProjection( + 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]' + ) + dsDst.SetGeoTransform( + ( + -80.0004166666666663, + 0.0008333333333333, + 0, + 44.0004166666666670, + 0, + -0.0008333333333333, + ) + ) bandDst = dsDst.GetRasterBand(1) @@ -62,56 +73,58 @@ def test_srtmhgt_1(): ds = None dsDst = None - ds = gdal.Open('tmp/n43.dt1.tif') + ds = gdal.Open("tmp/n43.dt1.tif") driver = gdal.GetDriverByName("SRTMHGT") - dsDst = driver.CreateCopy('tmp/n43w080.hgt', ds) + dsDst = driver.CreateCopy("tmp/n43w080.hgt", ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) + assert chksum == 60918, "Wrong checksum. Checksum found %d" % chksum ############################################################################### # Test creating an in memory copy. + def test_srtmhgt_2(): - ds = gdal.Open('tmp/n43w080.hgt') + ds = gdal.Open("tmp/n43w080.hgt") driver = gdal.GetDriverByName("SRTMHGT") - dsDst = driver.CreateCopy('/vsimem/n43w080.hgt', ds) + dsDst = driver.CreateCopy("/vsimem/n43w080.hgt", ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) + assert chksum == 60918, "Wrong checksum. Checksum found %d" % chksum dsDst = None # Test update support - dsDst = gdal.Open('/vsimem/n43w080.hgt', gdal.GA_Update) - dsDst.WriteRaster(0, 0, dsDst.RasterXSize, dsDst.RasterYSize, - dsDst.ReadRaster()) + dsDst = gdal.Open("/vsimem/n43w080.hgt", gdal.GA_Update) + dsDst.WriteRaster(0, 0, dsDst.RasterXSize, dsDst.RasterYSize, dsDst.ReadRaster()) dsDst.FlushCache() - assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) + assert chksum == 60918, "Wrong checksum. Checksum found %d" % chksum dsDst = None + ############################################################################### # Test reading from a .hgt.zip file def test_srtmhgt_3(): - ds = gdal.Open('tmp/n43w080.hgt') + ds = gdal.Open("tmp/n43w080.hgt") driver = gdal.GetDriverByName("SRTMHGT") - driver.CreateCopy('/vsizip//vsimem/N43W080.SRTMGL1.hgt.zip/N43W080.hgt', ds) + driver.CreateCopy("/vsizip//vsimem/N43W080.SRTMGL1.hgt.zip/N43W080.hgt", ds) - dsDst = gdal.Open('/vsimem/N43W080.SRTMGL1.hgt.zip') + dsDst = gdal.Open("/vsimem/N43W080.SRTMGL1.hgt.zip") band = dsDst.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) + assert chksum == 60918, "Wrong checksum. Checksum found %d" % chksum + ############################################################################### # Test reading from a .SRTMSWBD.raw.zip file (GRASS #3246) @@ -119,19 +132,20 @@ def test_srtmhgt_3(): def test_srtmhgt_4(): - f = gdal.VSIFOpenL('/vsizip//vsimem/N43W080.SRTMSWBD.raw.zip/N43W080.raw', 'wb') + f = gdal.VSIFOpenL("/vsizip//vsimem/N43W080.SRTMSWBD.raw.zip/N43W080.raw", "wb") if f is None: pytest.skip() - gdal.VSIFWriteL(' ' * (3601 * 3601), 1, 3601 * 3601, f) + gdal.VSIFWriteL(" " * (3601 * 3601), 1, 3601 * 3601, f) gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/N43W080.SRTMSWBD.raw.zip') + ds = gdal.Open("/vsimem/N43W080.SRTMSWBD.raw.zip") assert ds is not None cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/N43W080.SRTMSWBD.raw.zip') + gdal.Unlink("/vsimem/N43W080.SRTMSWBD.raw.zip") + + assert cs == 3636, "Wrong checksum. Checksum found %d" % cs - assert cs == 3636, ('Wrong checksum. Checksum found %d' % cs) ############################################################################### # Test reading from a .hgts file (https://github.com/OSGeo/gdal/issues/4239 @@ -139,33 +153,30 @@ def test_srtmhgt_4(): def test_srtmhgt_hgts(): - f = gdal.VSIFOpenL('/vsimem/n00e006.hgts', 'wb') + f = gdal.VSIFOpenL("/vsimem/n00e006.hgts", "wb") if f is None: pytest.skip() - gdal.VSIFWriteL(struct.pack('>f', 1.25) * (3601 * 3601), 4, 3601 * 3601, f) + gdal.VSIFWriteL(struct.pack(">f", 1.25) * (3601 * 3601), 4, 3601 * 3601, f) gdal.VSIFCloseL(f) - ds = gdal.Open('/vsimem/n00e006.hgts') + ds = gdal.Open("/vsimem/n00e006.hgts") assert ds is not None min_, max_ = ds.GetRasterBand(1).ComputeRasterMinMax() - gdal.Unlink('/vsimem/n00e006.hgts') + gdal.Unlink("/vsimem/n00e006.hgts") assert min_ == 1.25 assert max_ == 1.25 + ############################################################################### # Cleanup. def test_srtmhgt_cleanup(): try: - gdal.GetDriverByName("SRTMHGT").Delete('tmp/n43w080.hgt') - gdal.GetDriverByName("SRTMHGT").Delete('/vsimem/n43w080.hgt') - gdal.Unlink('/vsimem/N43W080.SRTMGL1.hgt.zip') - os.remove('tmp/n43.dt1.tif') + gdal.GetDriverByName("SRTMHGT").Delete("tmp/n43w080.hgt") + gdal.GetDriverByName("SRTMHGT").Delete("/vsimem/n43w080.hgt") + gdal.Unlink("/vsimem/N43W080.SRTMGL1.hgt.zip") + os.remove("tmp/n43.dt1.tif") except (RuntimeError, OSError): pass - - - - diff --git a/autotest/gdrivers/stacit.py b/autotest/gdrivers/stacit.py index 2f418a2089af..b4ebef150f7b 100755 --- a/autotest/gdrivers/stacit.py +++ b/autotest/gdrivers/stacit.py @@ -33,21 +33,23 @@ from osgeo import gdal, ogr -pytestmark = pytest.mark.require_driver('STACIT') +pytestmark = pytest.mark.require_driver("STACIT") def test_stacit_basic(): - ds = gdal.Open('data/stacit/test.json') + ds = gdal.Open("data/stacit/test.json") assert ds is not None assert ds.RasterCount == 1 assert ds.RasterXSize == 40 assert ds.RasterYSize == 20 - assert ds.GetSpatialRef().GetName() == 'NAD27 / UTM zone 11N' - assert ds.GetGeoTransform() == pytest.approx([440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8) + assert ds.GetSpatialRef().GetName() == "NAD27 / UTM zone 11N" + assert ds.GetGeoTransform() == pytest.approx( + [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8 + ) assert ds.GetRasterBand(1).GetNoDataValue() is None - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ data/byte.tif 1 @@ -67,7 +69,7 @@ def test_stacit_basic(): def test_stacit_max_items(): - ds = gdal.OpenEx('data/stacit/test.json', open_options=['MAX_ITEMS=1']) + ds = gdal.OpenEx("data/stacit/test.json", open_options=["MAX_ITEMS=1"]) assert ds is not None assert ds.RasterXSize == 20 assert ds.GetRasterBand(1).Checksum() == 4672 @@ -75,64 +77,92 @@ def test_stacit_max_items(): def test_stacit_multiple_assets(): - ds = gdal.Open('data/stacit/test_multiple_assets.json') + ds = gdal.Open("data/stacit/test_multiple_assets.json") assert ds is not None assert ds.RasterCount == 0 subds = ds.GetSubDatasets() assert subds == [ - ('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26711', - 'Collection my_collection, Asset B01 of data/stacit/test_multiple_assets.json in CRS EPSG:26711'), - ('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26712', - 'Collection my_collection, Asset B01 of data/stacit/test_multiple_assets.json in CRS EPSG:26712'), - ('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B02', - 'Collection my_collection, Asset B02 of data/stacit/test_multiple_assets.json'), - ('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection2,asset=B01', - 'Collection my_collection2, Asset B01 of data/stacit/test_multiple_assets.json'), + ( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26711', + "Collection my_collection, Asset B01 of data/stacit/test_multiple_assets.json in CRS EPSG:26711", + ), + ( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26712', + "Collection my_collection, Asset B01 of data/stacit/test_multiple_assets.json in CRS EPSG:26712", + ), + ( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B02', + "Collection my_collection, Asset B02 of data/stacit/test_multiple_assets.json", + ), + ( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection2,asset=B01', + "Collection my_collection2, Asset B01 of data/stacit/test_multiple_assets.json", + ), ] - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26711') + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26711' + ) assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 - assert ds.GetSpatialRef().GetName() == 'NAD27 / UTM zone 11N' - assert ds.GetGeoTransform() == pytest.approx([440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8) - - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26712') + assert ds.GetSpatialRef().GetName() == "NAD27 / UTM zone 11N" + assert ds.GetGeoTransform() == pytest.approx( + [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8 + ) + + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B01,crs=EPSG_26712' + ) assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 - assert ds.GetSpatialRef().GetName() == 'NAD27 / UTM zone 12N' - assert ds.GetGeoTransform() == pytest.approx([440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8) - - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B02') + assert ds.GetSpatialRef().GetName() == "NAD27 / UTM zone 12N" + assert ds.GetGeoTransform() == pytest.approx( + [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8 + ) + + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection,asset=B02' + ) assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 - assert ds.GetSpatialRef().GetName() == 'NAD27 / UTM zone 11N' - assert ds.GetGeoTransform() == pytest.approx([-440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8) - - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection2,asset=B01') + assert ds.GetSpatialRef().GetName() == "NAD27 / UTM zone 11N" + assert ds.GetGeoTransform() == pytest.approx( + [-440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8 + ) + + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=my_collection2,asset=B01' + ) assert ds.RasterXSize == 20 assert ds.RasterYSize == 20 - assert ds.GetSpatialRef().GetName() == 'NAD27 / UTM zone 13N' - assert ds.GetGeoTransform() == pytest.approx([440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8) + assert ds.GetSpatialRef().GetName() == "NAD27 / UTM zone 13N" + assert ds.GetGeoTransform() == pytest.approx( + [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0], rel=1e-8 + ) with gdaltest.error_handler(): - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":collection=i_dont_exist') + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":collection=i_dont_exist' + ) assert ds is None with gdaltest.error_handler(): - ds = gdal.Open('STACIT:"data/stacit/test_multiple_assets.json":asset=i_dont_exist') + ds = gdal.Open( + 'STACIT:"data/stacit/test_multiple_assets.json":asset=i_dont_exist' + ) assert ds is None def test_stacit_overlapping_sources(): if ogr.GetGEOSVersionMajor() == 0: - pytest.skip('GEOS not available') + pytest.skip("GEOS not available") - ds = gdal.Open('data/stacit/overlapping_sources.json') + ds = gdal.Open("data/stacit/overlapping_sources.json") assert ds is not None # Check that the source covered by another one is not listed - vrt = ds.GetMetadata('xml:VRT')[0] + vrt = ds.GetMetadata("xml:VRT")[0] placement_vrt = """ Gray diff --git a/autotest/gdrivers/stacta.py b/autotest/gdrivers/stacta.py index db8edf005e20..430ba2f7ff6c 100755 --- a/autotest/gdrivers/stacta.py +++ b/autotest/gdrivers/stacta.py @@ -28,91 +28,115 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import struct + import gdaltest import pytest -import struct from osgeo import gdal -pytestmark = pytest.mark.require_driver('STACTA') +pytestmark = pytest.mark.require_driver("STACTA") def test_stacta_basic(): - ds = gdal.Open('data/stacta/test.json') + ds = gdal.Open("data/stacta/test.json") assert ds.RasterCount == 3 assert ds.RasterXSize == 2048 assert ds.RasterYSize == 1024 - assert ds.GetSpatialRef().GetName() == 'WGS 84' - assert ds.GetGeoTransform() == pytest.approx([-180.0, 0.17578125, 0.0, 90.0, 0.0, -0.17578125], rel=1e-8) + assert ds.GetSpatialRef().GetName() == "WGS 84" + assert ds.GetGeoTransform() == pytest.approx( + [-180.0, 0.17578125, 0.0, 90.0, 0.0, -0.17578125], rel=1e-8 + ) assert ds.GetRasterBand(1).GetNoDataValue() == 0.0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 assert len(ds.GetSubDatasets()) == 0 # Create a reference dataset, that is externally the same as the STACTA one - vrt_ds = gdal.BuildVRT('', [ 'data/stacta/WorldCRS84Quad/2/0/0.tif', 'data/stacta/WorldCRS84Quad/2/0/1.tif']) - ref_ds = gdal.Translate('', vrt_ds, format = 'MEM') - ref_ds.BuildOverviews('NEAR', [2, 4]) + vrt_ds = gdal.BuildVRT( + "", + [ + "data/stacta/WorldCRS84Quad/2/0/0.tif", + "data/stacta/WorldCRS84Quad/2/0/1.tif", + ], + ) + ref_ds = gdal.Translate("", vrt_ds, format="MEM") + ref_ds.BuildOverviews("NEAR", [2, 4]) # Whole dataset reading assert ds.ReadRaster() == ref_ds.ReadRaster() # Whole band reading - assert ds.GetRasterBand(2).ReadRaster() == \ - ref_ds.GetRasterBand(2).ReadRaster() + assert ds.GetRasterBand(2).ReadRaster() == ref_ds.GetRasterBand(2).ReadRaster() # Subwindow intersecting 2 tiles - assert ds.ReadRaster(1000, 500, 50, 100) == \ - ref_ds.ReadRaster(1000, 500, 50, 100) + assert ds.ReadRaster(1000, 500, 50, 100) == ref_ds.ReadRaster(1000, 500, 50, 100) # Subwindow intersecting 2 tiles with downsampling, but at the same zoom level - assert ds.ReadRaster(1000, 500, 50, 100, 30, 60) == \ - ref_ds.ReadRaster(1000, 500, 50, 100, 30, 60) + assert ds.ReadRaster(1000, 500, 50, 100, 30, 60) == ref_ds.ReadRaster( + 1000, 500, 50, 100, 30, 60 + ) # Subwindow intersecting 2 tiles with downsampling, but at another zoom level - assert ds.ReadRaster(1000, 500, 50, 100, 10, 20) == \ - ref_ds.ReadRaster(1000, 500, 50, 100, 10, 20) + assert ds.ReadRaster(1000, 500, 50, 100, 10, 20) == ref_ds.ReadRaster( + 1000, 500, 50, 100, 10, 20 + ) # Subwindow intersecting 2 tiles with downsampling, but at another zoom level - assert ds.GetRasterBand(1).ReadRaster(1000, 500, 50, 100, 10, 20) == \ - ref_ds.GetRasterBand(1).ReadRaster(1000, 500, 50, 100, 10, 20) + assert ds.GetRasterBand(1).ReadRaster( + 1000, 500, 50, 100, 10, 20 + ) == ref_ds.GetRasterBand(1).ReadRaster(1000, 500, 50, 100, 10, 20) # Same as above but with bilinear resampling - assert ds.ReadRaster(1000, 500, 50, 100, 30, 60, resample_alg=gdal.GRIORA_Bilinear) == \ - ref_ds.ReadRaster(1000, 500, 50, 100, 30, 60, resample_alg=gdal.GRIORA_Bilinear) + assert ds.ReadRaster( + 1000, 500, 50, 100, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) == ref_ds.ReadRaster( + 1000, 500, 50, 100, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) # Downsampling with floating point coordinates, intersecting one tile - assert ds.ReadRaster(0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear) == \ - ref_ds.ReadRaster(0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear) + assert ds.ReadRaster( + 0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) == ref_ds.ReadRaster( + 0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) # Downsampling with floating point coordinates, intersecting two tiles - assert ds.ReadRaster(0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear) == \ - ref_ds.ReadRaster(0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear) + assert ds.ReadRaster( + 0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) == ref_ds.ReadRaster( + 0.5, 500.5, 50.25, 100.25, 30, 60, resample_alg=gdal.GRIORA_Bilinear + ) def test_stacta_east_hemisphere(): # Test a json file with min_tile_col = 1 at zoom level 2 - ds = gdal.OpenEx('data/stacta/test_east_hemisphere.json', open_options = ['WHOLE_METATILE=YES']) + ds = gdal.OpenEx( + "data/stacta/test_east_hemisphere.json", open_options=["WHOLE_METATILE=YES"] + ) assert ds.RasterCount == 3 assert ds.RasterXSize == 1024 assert ds.RasterYSize == 1024 - assert ds.GetSpatialRef().GetName() == 'WGS 84' - assert ds.GetGeoTransform() == pytest.approx([0.0, 0.17578125, 0.0, 90.0, 0.0, -0.17578125], rel=1e-8) + assert ds.GetSpatialRef().GetName() == "WGS 84" + assert ds.GetGeoTransform() == pytest.approx( + [0.0, 0.17578125, 0.0, 90.0, 0.0, -0.17578125], rel=1e-8 + ) assert ds.GetRasterBand(1).GetOverviewCount() == 2 # Create a reference dataset, that is externally the same as the STACTA one - vrt_ds = gdal.BuildVRT('', [ 'data/stacta/WorldCRS84Quad/2/0/1.tif']) - ref_ds = gdal.Translate('', vrt_ds, format = 'MEM') - ref_ds.BuildOverviews('NEAR', [2, 4]) + vrt_ds = gdal.BuildVRT("", ["data/stacta/WorldCRS84Quad/2/0/1.tif"]) + ref_ds = gdal.Translate("", vrt_ds, format="MEM") + ref_ds.BuildOverviews("NEAR", [2, 4]) - assert ds.ReadRaster(600, 500, 50, 100, 10, 20) == \ - ref_ds.ReadRaster(600, 500, 50, 100, 10, 20) + assert ds.ReadRaster(600, 500, 50, 100, 10, 20) == ref_ds.ReadRaster( + 600, 500, 50, 100, 10, 20 + ) def test_stacta_subdatasets(): - ds = gdal.Open('data/stacta/test_multiple_asset_templates.json') + ds = gdal.Open("data/stacta/test_multiple_asset_templates.json") assert len(ds.GetSubDatasets()) == 2 subds1 = gdal.Open(ds.GetSubDatasets()[0][0]) assert subds1 is not None @@ -120,8 +144,7 @@ def test_stacta_subdatasets(): assert subds2 is not None assert subds1.GetRasterBand(1).ReadRaster() != subds2.GetRasterBand(1).ReadRaster() - - ds = gdal.Open('data/stacta/test_multiple_tms.json') + ds = gdal.Open("data/stacta/test_multiple_tms.json") assert len(ds.GetSubDatasets()) == 2 subds1 = gdal.Open(ds.GetSubDatasets()[0][0]) assert subds1 is not None @@ -129,39 +152,53 @@ def test_stacta_subdatasets(): def test_stacta_missing_metatile(): - gdal.FileFromMemBuffer('/vsimem/stacta/test.json', open('data/stacta/test.json', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/stacta/WorldCRS84Quad/0/0/0.tif', open('data/stacta/WorldCRS84Quad/0/0/0.tif', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/stacta/WorldCRS84Quad/1/0/0.tif', open('data/stacta/WorldCRS84Quad/1/0/0.tif', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/stacta/WorldCRS84Quad/2/0/0.tif', open('data/stacta/WorldCRS84Quad/2/0/0.tif', 'rb').read()) - - ds = gdal.Open('/vsimem/stacta/test.json') + gdal.FileFromMemBuffer( + "/vsimem/stacta/test.json", open("data/stacta/test.json", "rb").read() + ) + gdal.FileFromMemBuffer( + "/vsimem/stacta/WorldCRS84Quad/0/0/0.tif", + open("data/stacta/WorldCRS84Quad/0/0/0.tif", "rb").read(), + ) + gdal.FileFromMemBuffer( + "/vsimem/stacta/WorldCRS84Quad/1/0/0.tif", + open("data/stacta/WorldCRS84Quad/1/0/0.tif", "rb").read(), + ) + gdal.FileFromMemBuffer( + "/vsimem/stacta/WorldCRS84Quad/2/0/0.tif", + open("data/stacta/WorldCRS84Quad/2/0/0.tif", "rb").read(), + ) + + ds = gdal.Open("/vsimem/stacta/test.json") with gdaltest.error_handler(): assert ds.ReadRaster() is None # Missing right tile - with gdaltest.config_option('GDAL_STACTA_SKIP_MISSING_METATILE', 'YES'): - ds = gdal.Open('/vsimem/stacta/test.json') + with gdaltest.config_option("GDAL_STACTA_SKIP_MISSING_METATILE", "YES"): + ds = gdal.Open("/vsimem/stacta/test.json") got_data = ds.ReadRaster() assert got_data is not None - got_data = struct.unpack('B' * len(got_data), got_data) + got_data = struct.unpack("B" * len(got_data), got_data) for i in range(3): assert got_data[i * 2048 * 1024 + 2048 * 1000 + 500] != 0 assert got_data[i * 2048 * 1024 + 2048 * 1000 + 1500] == 0 - gdal.Unlink('/vsimem/stacta/WorldCRS84Quad/1/0/0.tif') - gdal.Unlink('/vsimem/stacta/WorldCRS84Quad/2/0/0.tif') - gdal.FileFromMemBuffer('/vsimem/stacta/WorldCRS84Quad/2/0/1.tif', open('data/stacta/WorldCRS84Quad/2/0/1.tif', 'rb').read()) + gdal.Unlink("/vsimem/stacta/WorldCRS84Quad/1/0/0.tif") + gdal.Unlink("/vsimem/stacta/WorldCRS84Quad/2/0/0.tif") + gdal.FileFromMemBuffer( + "/vsimem/stacta/WorldCRS84Quad/2/0/1.tif", + open("data/stacta/WorldCRS84Quad/2/0/1.tif", "rb").read(), + ) # Missing left tile - with gdaltest.config_option('GDAL_STACTA_SKIP_MISSING_METATILE', 'YES'): - ds = gdal.Open('/vsimem/stacta/test.json') + with gdaltest.config_option("GDAL_STACTA_SKIP_MISSING_METATILE", "YES"): + ds = gdal.Open("/vsimem/stacta/test.json") got_data = ds.ReadRaster() assert got_data is not None - got_data = struct.unpack('B' * len(got_data), got_data) + got_data = struct.unpack("B" * len(got_data), got_data) for i in range(3): assert got_data[i * 2048 * 1024 + 2048 * 1000 + 500] == 0 assert got_data[i * 2048 * 1024 + 2048 * 1000 + 1500] != 0 - gdal.Unlink('/vsimem/stacta/test.json') - gdal.Unlink('/vsimem/stacta/WorldCRS84Quad/1/0/0.tif') - gdal.Unlink('/vsimem/stacta/WorldCRS84Quad/2/0/1.tif') + gdal.Unlink("/vsimem/stacta/test.json") + gdal.Unlink("/vsimem/stacta/WorldCRS84Quad/1/0/0.tif") + gdal.Unlink("/vsimem/stacta/WorldCRS84Quad/2/0/1.tif") diff --git a/autotest/gdrivers/terragen.py b/autotest/gdrivers/terragen.py index dcf951acd67c..2154f2c150c9 100755 --- a/autotest/gdrivers/terragen.py +++ b/autotest/gdrivers/terragen.py @@ -28,33 +28,34 @@ ############################################################################### +import gdaltest from osgeo import gdal -import gdaltest ############################################################################### def test_terragen_1(): - tst = gdaltest.GDALTest('terragen', 'terragen/float32.ter', 1, 1128) + tst = gdaltest.GDALTest("terragen", "terragen/float32.ter", 1, 1128) return tst.testOpen() + ############################################################################### # Write def test_terragen_2(): - gdal.Translate('/vsimem/out.ter', 'data/float32.tif', options='-of TERRAGEN -co MINUSERPIXELVALUE=74 -co MAXUSERPIXELVALUE=255') - gdal.Translate('/vsimem/out.tif', '/vsimem/out.ter', options='-unscale') - ds = gdal.Open('/vsimem/out.tif') + gdal.Translate( + "/vsimem/out.ter", + "data/float32.tif", + options="-of TERRAGEN -co MINUSERPIXELVALUE=74 -co MAXUSERPIXELVALUE=255", + ) + gdal.Translate("/vsimem/out.tif", "/vsimem/out.ter", options="-unscale") + ds = gdal.Open("/vsimem/out.tif") assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - gdal.GetDriverByName('TERRAGEN').Delete('/vsimem/out.ter') - gdal.GetDriverByName('TERRAGEN').Delete('/vsimem/out.tif') - - - - + gdal.GetDriverByName("TERRAGEN").Delete("/vsimem/out.ter") + gdal.GetDriverByName("TERRAGEN").Delete("/vsimem/out.tif") diff --git a/autotest/gdrivers/test_validate_jp2.py b/autotest/gdrivers/test_validate_jp2.py index 61b31f9d378c..7668c4818b74 100755 --- a/autotest/gdrivers/test_validate_jp2.py +++ b/autotest/gdrivers/test_validate_jp2.py @@ -31,12 +31,13 @@ import os import sys -from osgeo import gdal -import pytest import gdaltest +import pytest from test_py_scripts import samples_path +from osgeo import gdal + ############################################################################### # Verify we have the JP2OpenJPEG driver. @@ -44,25 +45,26 @@ def test_validate_jp2_1(): gdaltest.has_validate_jp2_and_build_jp2 = False - gdaltest.jp2openjpeg_drv = gdal.GetDriverByName('JP2OpenJPEG') + gdaltest.jp2openjpeg_drv = gdal.GetDriverByName("JP2OpenJPEG") if gdaltest.jp2openjpeg_drv is None: pytest.skip() - path = samples_path if path not in sys.path: sys.path.append(path) try: - import validate_jp2 import build_jp2_from_xml + import validate_jp2 + validate_jp2.validate build_jp2_from_xml.build_file except (ImportError, AttributeError): pytest.skip() gdaltest.has_validate_jp2_and_build_jp2 = True - gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') + gdaltest.deregister_all_jpeg2000_drivers_but("JP2OpenJPEG") + ############################################################################### @@ -70,25 +72,35 @@ def test_validate_jp2_1(): def validate(filename, inspire_tg=True, expected_gmljp2=True, oidoc=None): try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') - ogc_schemas_location = 'tmp/cache/SCHEMAS_OPENGIS_NET' + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET") + ogc_schemas_location = "tmp/cache/SCHEMAS_OPENGIS_NET" except OSError: - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" - if ogc_schemas_location != 'disabled': + if ogc_schemas_location != "disabled": try: import xmlvalidate + xmlvalidate.validate # to make pyflakes happy except (ImportError, AttributeError): - ogc_schemas_location = 'disabled' + ogc_schemas_location = "disabled" path = samples_path if path not in sys.path: sys.path.append(path) import validate_jp2 + error_report = validate_jp2.ErrorReport(collect_internally=True) - return validate_jp2.validate(filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location, error_report=error_report) + return validate_jp2.validate( + filename, + oidoc, + inspire_tg, + expected_gmljp2, + ogc_schemas_location, + error_report=error_report, + ) + ############################################################################### # Highly corrupted file @@ -101,58 +113,66 @@ def test_validate_jp2_2(): import build_jp2_from_xml - build_jp2_from_xml.build_file('data/test_validate_jp2/byte_corrupted.xml', '/vsimem/out.jp2') - error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/byte_oi.xml') - gdal.Unlink('/vsimem/out.jp2') - - expected_errors = ['ERROR[GeoJP2]: 2 GeoTIFF UUID box found', - 'ERROR[GeoJP2]: GeoTIFF should have width of 1 pixel, not 2', - 'ERROR[GeoJP2]: GeoTIFF should have height of 1 pixel, not 2', - 'ERROR[GENERAL]: Inconsistent geotransform between GeoJP2 ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2 ((-440780.0, 60.0, 0.0, -3751260.0, 0.0, -60.0))', - 'ERROR[GENERAL]: Inconsistent SRS between GeoJP2 (wkt=PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]], proj4=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs) and GMLJP2 (wkt=PROJCS["WGS 84 / UTM zone 31N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32631"]], proj4=+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs)', - 'ERROR[GENERAL]: ftyp.BR = "XXXX" instead of "jp2 "', - 'ERROR[GENERAL]: ftyp.MinV = "1" instead of 0', - 'ERROR[INSPIRE_TG]: "jpx " not found in compatibility list of ftyp, but GMLJP2 box present', - 'ERROR[INSPIRE_TG]: "rreq" box does not advertise standard flag 67 whereas GMLJP2 box is present', - 'ERROR[GENERAL]: ihdr.C = 6 instead of 7', - 'ERROR[GENERAL]: ihdr.UnkC = 2 instead of 0 or 1', - 'ERROR[GENERAL]: "ihdr" box expected to be found zero or one time, but present 2 times', - 'ERROR[INSPIRE_TG, Requirement 23, Conformance class A.8.15]: "jp2c" box expected to be found one time, but present 2 times', - 'ERROR[GENERAL]: "ftyp" box expected to be found zero or one time, but present 2 times', - 'ERROR[INSPIRE_TG, Requirement 21]: SIZ.Rsiz=0 found but 2 (Profile 1) expected', - 'ERROR[GENERAL]: ihdr_width(=21) != Xsiz (=20)- XOsiz(=0)', - 'ERROR[GENERAL]: ihdr_height(=19) != Ysiz(=20) - YOsiz(=0)', - 'ERROR[GENERAL]: ihdr_nc(=1) != Csiz (=2)', - 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[0]=6 (unsigned 7 bits), which is not allowed', - 'ERROR[GENERAL]: SIZ.Ssiz[0]=6, whereas bpcc[0]=7', - 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[1]=6 (unsigned 7 bits), which is not allowed', - 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[x] != XOsiz', - 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[y] != YOsiz', - 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[x] != Xsiz - 1', - 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[y] != Ysiz - 1', - 'ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=1) != Csiz(=2) ', - 'ERROR[PROFILE_1, Conformance class A.8.14]: SPcod_xcb_minus_2 = 5, whereas max allowed for Profile 1 is 4'] + build_jp2_from_xml.build_file( + "data/test_validate_jp2/byte_corrupted.xml", "/vsimem/out.jp2" + ) + error_report = validate( + "/vsimem/out.jp2", oidoc="data/test_validate_jp2/byte_oi.xml" + ) + gdal.Unlink("/vsimem/out.jp2") + + expected_errors = [ + "ERROR[GeoJP2]: 2 GeoTIFF UUID box found", + "ERROR[GeoJP2]: GeoTIFF should have width of 1 pixel, not 2", + "ERROR[GeoJP2]: GeoTIFF should have height of 1 pixel, not 2", + "ERROR[GENERAL]: Inconsistent geotransform between GeoJP2 ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2 ((-440780.0, 60.0, 0.0, -3751260.0, 0.0, -60.0))", + 'ERROR[GENERAL]: Inconsistent SRS between GeoJP2 (wkt=PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]], proj4=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs) and GMLJP2 (wkt=PROJCS["WGS 84 / UTM zone 31N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32631"]], proj4=+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs)', + 'ERROR[GENERAL]: ftyp.BR = "XXXX" instead of "jp2 "', + 'ERROR[GENERAL]: ftyp.MinV = "1" instead of 0', + 'ERROR[INSPIRE_TG]: "jpx " not found in compatibility list of ftyp, but GMLJP2 box present', + 'ERROR[INSPIRE_TG]: "rreq" box does not advertise standard flag 67 whereas GMLJP2 box is present', + "ERROR[GENERAL]: ihdr.C = 6 instead of 7", + "ERROR[GENERAL]: ihdr.UnkC = 2 instead of 0 or 1", + 'ERROR[GENERAL]: "ihdr" box expected to be found zero or one time, but present 2 times', + 'ERROR[INSPIRE_TG, Requirement 23, Conformance class A.8.15]: "jp2c" box expected to be found one time, but present 2 times', + 'ERROR[GENERAL]: "ftyp" box expected to be found zero or one time, but present 2 times', + "ERROR[INSPIRE_TG, Requirement 21]: SIZ.Rsiz=0 found but 2 (Profile 1) expected", + "ERROR[GENERAL]: ihdr_width(=21) != Xsiz (=20)- XOsiz(=0)", + "ERROR[GENERAL]: ihdr_height(=19) != Ysiz(=20) - YOsiz(=0)", + "ERROR[GENERAL]: ihdr_nc(=1) != Csiz (=2)", + "ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[0]=6 (unsigned 7 bits), which is not allowed", + "ERROR[GENERAL]: SIZ.Ssiz[0]=6, whereas bpcc[0]=7", + "ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[1]=6 (unsigned 7 bits), which is not allowed", + "ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[x] != XOsiz", + "ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[y] != YOsiz", + "ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[x] != Xsiz - 1", + "ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[y] != Ysiz - 1", + "ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=1) != Csiz(=2) ", + "ERROR[PROFILE_1, Conformance class A.8.14]: SPcod_xcb_minus_2 = 5, whereas max allowed for Profile 1 is 4", + ] if set(error_report.error_array) != set(expected_errors): import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") expected_warnings = [ - 'WARNING[GENERAL]: Unknown value 1 for colr.PREC', - 'WARNING[GENERAL]: Unknown value 1 for colr.APPROX', - 'WARNING[GENERAL]: Unknown value 1 for colr.EnumCS', - 'WARNING[GENERAL]: ihdr.ipr = 1 but no jp2i box found', + "WARNING[GENERAL]: Unknown value 1 for colr.PREC", + "WARNING[GENERAL]: Unknown value 1 for colr.APPROX", + "WARNING[GENERAL]: Unknown value 1 for colr.EnumCS", + "WARNING[GENERAL]: ihdr.ipr = 1 but no jp2i box found", 'WARNING[INSPIRE_TG]: "asoc" box not at expected index', 'WARNING[INSPIRE_TG]: "uuid" box not at expected index', - 'WARNING[INSPIRE_TG, Recommendation 39]: No user-defined precincts 0 defined' + "WARNING[INSPIRE_TG, Recommendation 39]: No user-defined precincts 0 defined", ] if set(error_report.warning_array) != set(expected_warnings): import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -166,47 +186,55 @@ def test_validate_jp2_3(): import build_jp2_from_xml - build_jp2_from_xml.build_file('data/test_validate_jp2/stefan_full_rgba_corrupted.xml', '/vsimem/out.jp2') + build_jp2_from_xml.build_file( + "data/test_validate_jp2/stefan_full_rgba_corrupted.xml", "/vsimem/out.jp2" + ) gdal.PushErrorHandler() - error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/stefan_full_rgba_oi.xml') + error_report = validate( + "/vsimem/out.jp2", oidoc="data/test_validate_jp2/stefan_full_rgba_oi.xml" + ) gdal.PopErrorHandler() - gdal.Unlink('/vsimem/out.jp2') - - expected_errors = ['ERROR[GMLJP2]: No GMLJP2 box found whereas it was expected', - 'ERROR[GENERAL]: cdef.N = 5 whereas ihdr.nc = 4', - 'ERROR[GENERAL]: cdef.cn[2] = 4 is invalid', - 'ERROR[GENERAL]: cdef.cn[4] = 3 is invalid since already used', - 'ERROR[GENERAL]: cdef.typ[4] = 1 is invalid since another alpha channel has already been defined', - 'ERROR[GENERAL]: cdef.asoc[4] = 0 is invalid since another band has already been associated to whole image', - 'ERROR[PROFILE_1, Conformance class A.8.14]: Xsiz = 2200000162, whereas only 31 bits are allowed for Profile 1', - 'ERROR[PROFILE_1, Conformance class A.8.14]: Ysiz = 2200000150, whereas only 31 bits are allowed for Profile 1', - 'ERROR[PROFILE_1, Conformance class A.8.14]: XOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1', - 'ERROR[PROFILE_1, Conformance class A.8.14]: YOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1', - 'ERROR[GENERAL]: ihdr_nc(=4) != Csiz (=5)', - 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[3]=2 (unsigned 3 bits), which is not allowed', - 'ERROR[GENERAL]: SIZ.Ssiz[3]=2, whereas bpcc[3]=7', - 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[4]=2 (unsigned 3 bits), which is not allowed', - 'ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz / min_XYRSiz = 2200000062.000000 > 1024', - 'ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz (=2200000062) != YTsiz (=2200000050)', - 'ERROR[INSPIRE_TG]: Cannot find RectifiedGrid in OrthoImageryCoverage', - 'ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=4) != Csiz(=5) ', - 'ERROR[PROFILE_1, Conformance class A.8.14]: Not enough decomposition levels = 0 (max_dim=162, 128 * 2**SPcod_NumDecompositions=128)'] + gdal.Unlink("/vsimem/out.jp2") + + expected_errors = [ + "ERROR[GMLJP2]: No GMLJP2 box found whereas it was expected", + "ERROR[GENERAL]: cdef.N = 5 whereas ihdr.nc = 4", + "ERROR[GENERAL]: cdef.cn[2] = 4 is invalid", + "ERROR[GENERAL]: cdef.cn[4] = 3 is invalid since already used", + "ERROR[GENERAL]: cdef.typ[4] = 1 is invalid since another alpha channel has already been defined", + "ERROR[GENERAL]: cdef.asoc[4] = 0 is invalid since another band has already been associated to whole image", + "ERROR[PROFILE_1, Conformance class A.8.14]: Xsiz = 2200000162, whereas only 31 bits are allowed for Profile 1", + "ERROR[PROFILE_1, Conformance class A.8.14]: Ysiz = 2200000150, whereas only 31 bits are allowed for Profile 1", + "ERROR[PROFILE_1, Conformance class A.8.14]: XOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1", + "ERROR[PROFILE_1, Conformance class A.8.14]: YOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1", + "ERROR[GENERAL]: ihdr_nc(=4) != Csiz (=5)", + "ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[3]=2 (unsigned 3 bits), which is not allowed", + "ERROR[GENERAL]: SIZ.Ssiz[3]=2, whereas bpcc[3]=7", + "ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[4]=2 (unsigned 3 bits), which is not allowed", + "ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz / min_XYRSiz = 2200000062.000000 > 1024", + "ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz (=2200000062) != YTsiz (=2200000050)", + "ERROR[INSPIRE_TG]: Cannot find RectifiedGrid in OrthoImageryCoverage", + "ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=4) != Csiz(=5) ", + "ERROR[PROFILE_1, Conformance class A.8.14]: Not enough decomposition levels = 0 (max_dim=162, 128 * 2**SPcod_NumDecompositions=128)", + ] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") expected_warnings = [ - 'WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7', - 'WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7' + "WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7", + "WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7", ] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -220,34 +248,38 @@ def test_validate_jp2_4(): import build_jp2_from_xml - build_jp2_from_xml.build_file('data/test_validate_jp2/almost_nojp2box.xml', '/vsimem/out.jp2') + build_jp2_from_xml.build_file( + "data/test_validate_jp2/almost_nojp2box.xml", "/vsimem/out.jp2" + ) gdal.PushErrorHandler() - error_report = validate('/vsimem/out.jp2', expected_gmljp2=False) + error_report = validate("/vsimem/out.jp2", expected_gmljp2=False) gdal.PopErrorHandler() - gdal.Unlink('/vsimem/out.jp2') + gdal.Unlink("/vsimem/out.jp2") expected_errors = [ 'ERROR[GENERAL]: "ftyp" box not found', 'ERROR[GENERAL]: "jp2h" box not found', - 'ERROR[GENERAL]: No SIZ marker found', - 'ERROR[GENERAL]: No COD marker found', - 'ERROR[GENERAL]: No QCD marker found', - 'ERROR[GENERAL]: No SOT marker found', - 'ERROR[GENERAL]: No EOC marker found'] + "ERROR[GENERAL]: No SIZ marker found", + "ERROR[GENERAL]: No COD marker found", + "ERROR[GENERAL]: No QCD marker found", + "ERROR[GENERAL]: No SOT marker found", + "ERROR[GENERAL]: No EOC marker found", + ] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") - expected_warnings = [ - ] + expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -262,37 +294,43 @@ def test_validate_jp2_5(): import build_jp2_from_xml - build_jp2_from_xml.build_file('data/test_validate_jp2/utmsmall_pct_corrupted.xml', '/vsimem/out.jp2') + build_jp2_from_xml.build_file( + "data/test_validate_jp2/utmsmall_pct_corrupted.xml", "/vsimem/out.jp2" + ) gdal.PushErrorHandler() - error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/utmsmall_pct_oi.xml') + error_report = validate( + "/vsimem/out.jp2", oidoc="data/test_validate_jp2/utmsmall_pct_oi.xml" + ) gdal.PopErrorHandler() - gdal.Unlink('/vsimem/out.jp2') + gdal.Unlink("/vsimem/out.jp2") expected_errors = [ 'ERROR[INSPIRE_TG]: "jpx " not found in compatibility list of ftyp, but GMLJP2 box present', 'ERROR[INSPIRE_TG]: "rreq" box not found, but GMLJP2 box present', - 'ERROR[INSPIRE_TG]: pclr box found but ihdr.nc = 2', - 'ERROR[INSPIRE_TG, Conformance class A.8.6]: pclr.NPC(=4) != 3 (for color table)', - 'ERROR[INSPIRE_TG]: cmap.MTYP[1] = 0 is invalid', - 'ERROR[GENERAL]: cmap.CMP[2] = 2 is invalid', - 'ERROR[GENERAL]: cmap.PCOL[2] = 0 is invalid since already used', - 'ERROR[GENERAL]: ihdr_nc(=2) != Csiz (=1)', - 'ERROR[INSPIRE_TG, Conformance class A.8.8]: Inconsistent geotransform between OrthoImagery ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2/GeoJP2 ((40720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0))', - 'ERROR[INSPIRE_TG, Requirement 26, Conformance class A.8.16]: RGN marker found, which is not allowed'] + "ERROR[INSPIRE_TG]: pclr box found but ihdr.nc = 2", + "ERROR[INSPIRE_TG, Conformance class A.8.6]: pclr.NPC(=4) != 3 (for color table)", + "ERROR[INSPIRE_TG]: cmap.MTYP[1] = 0 is invalid", + "ERROR[GENERAL]: cmap.CMP[2] = 2 is invalid", + "ERROR[GENERAL]: cmap.PCOL[2] = 0 is invalid since already used", + "ERROR[GENERAL]: ihdr_nc(=2) != Csiz (=1)", + "ERROR[INSPIRE_TG, Conformance class A.8.8]: Inconsistent geotransform between OrthoImagery ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2/GeoJP2 ((40720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0))", + "ERROR[INSPIRE_TG, Requirement 26, Conformance class A.8.16]: RGN marker found, which is not allowed", + ] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") - expected_warnings = [ - ] + expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -304,22 +342,26 @@ def test_validate_jp2_6(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() - error_report = validate('data/test_validate_jp2/byte.jp2', oidoc='data/test_validate_jp2/byte_oi.xml') - gdal.Unlink('/vsimem/out.jp2') + error_report = validate( + "data/test_validate_jp2/byte.jp2", oidoc="data/test_validate_jp2/byte_oi.xml" + ) + gdal.Unlink("/vsimem/out.jp2") expected_errors = [] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -331,22 +373,28 @@ def test_validate_jp2_7(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() - error_report = validate('data/test_validate_jp2/stefan_full_rgba.jp2', oidoc='data/test_validate_jp2/stefan_full_rgba_oi.xml', expected_gmljp2=False) - gdal.Unlink('/vsimem/out.jp2') + error_report = validate( + "data/test_validate_jp2/stefan_full_rgba.jp2", + oidoc="data/test_validate_jp2/stefan_full_rgba_oi.xml", + expected_gmljp2=False, + ) + gdal.Unlink("/vsimem/out.jp2") expected_errors = [] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -358,22 +406,27 @@ def test_validate_jp2_8(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() - error_report = validate('data/test_validate_jp2/utmsmall_pct.jp2', oidoc='data/test_validate_jp2/utmsmall_pct_oi.xml') - gdal.Unlink('/vsimem/out.jp2') + error_report = validate( + "data/test_validate_jp2/utmsmall_pct.jp2", + oidoc="data/test_validate_jp2/utmsmall_pct_oi.xml", + ) + gdal.Unlink("/vsimem/out.jp2") expected_errors = [] if error_report.error_array != expected_errors: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint + pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) - pytest.fail('did not get expected errors') + pytest.fail("did not get expected errors") ############################################################################### @@ -383,7 +436,3 @@ def test_validate_jp2_cleanup(): if gdaltest.has_validate_jp2_and_build_jp2: gdaltest.reregister_all_jpeg2000_drivers() - - - - diff --git a/autotest/gdrivers/tga.py b/autotest/gdrivers/tga.py index 9fd8ec1f917b..ec841ca06c95 100644 --- a/autotest/gdrivers/tga.py +++ b/autotest/gdrivers/tga.py @@ -33,29 +33,35 @@ from osgeo import gdal -pytestmark = pytest.mark.require_driver('TGA') +pytestmark = pytest.mark.require_driver("TGA") def test_tga_read_rle_grey_level(): - ds = gdal.Open('data/tga/ref_test_suite/cbw8.tga') + ds = gdal.Open("data/tga/ref_test_suite/cbw8.tga") assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 - assert ds.GetMetadataItem('AUTHOR_NAME') == 'Ricky True' - assert ds.GetMetadataItem('COMMENTS') == 'Sample 8 bit run length compressed black and white image' - assert ds.GetMetadataItem('IMAGE_ID') == 'Truevision(R) Sample Image' + assert ds.GetMetadataItem("AUTHOR_NAME") == "Ricky True" + assert ( + ds.GetMetadataItem("COMMENTS") + == "Sample 8 bit run length compressed black and white image" + ) + assert ds.GetMetadataItem("IMAGE_ID") == "Truevision(R) Sample Image" assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).Checksum() == 43089 def test_tga_read_rle_color_table(): - ds = gdal.Open('data/tga/ref_test_suite/ccm8.tga') + ds = gdal.Open("data/tga/ref_test_suite/ccm8.tga") assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 - assert ds.GetMetadataItem('AUTHOR_NAME') == 'Ricky True' - assert ds.GetMetadataItem('COMMENTS') == 'Sample 8 bit run length compressed color mapped image' + assert ds.GetMetadataItem("AUTHOR_NAME") == "Ricky True" + assert ( + ds.GetMetadataItem("COMMENTS") + == "Sample 8 bit run length compressed color mapped image" + ) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ct = ds.GetRasterBand(1).GetColorTable() assert ct is not None @@ -67,7 +73,7 @@ def test_tga_read_rle_color_table(): def test_tga_read_rle_24bit(): - ds = gdal.Open('data/tga/ref_test_suite/ctc24.tga') + ds = gdal.Open("data/tga/ref_test_suite/ctc24.tga") assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -81,7 +87,7 @@ def test_tga_read_rle_24bit(): def test_tga_read_uncompressed_grey_level(): - ds = gdal.Open('data/tga/ref_test_suite/ubw8.tga') + ds = gdal.Open("data/tga/ref_test_suite/ubw8.tga") assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -91,7 +97,7 @@ def test_tga_read_uncompressed_grey_level(): def test_tga_read_uncompressed_color_table(): - ds = gdal.Open('data/tga/ref_test_suite/ucm8.tga') + ds = gdal.Open("data/tga/ref_test_suite/ucm8.tga") assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -105,7 +111,7 @@ def test_tga_read_uncompressed_color_table(): def test_tga_read_uncompressed_16bit(): - ds = gdal.Open('data/tga/ref_test_suite/utc16.tga') + ds = gdal.Open("data/tga/ref_test_suite/utc16.tga") assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -119,7 +125,7 @@ def test_tga_read_uncompressed_16bit(): def test_tga_read_uncompressed_24bit(): - ds = gdal.Open('data/tga/ref_test_suite/utc24.tga') + ds = gdal.Open("data/tga/ref_test_suite/utc24.tga") assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -133,7 +139,7 @@ def test_tga_read_uncompressed_24bit(): def test_tga_read_uncompressed_32bit(): - ds = gdal.Open('data/tga/ref_test_suite/utc32.tga') + ds = gdal.Open("data/tga/ref_test_suite/utc32.tga") assert ds.RasterCount == 4 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 @@ -149,7 +155,7 @@ def test_tga_read_uncompressed_32bit(): def test_tga_read_uncompressed_32bit_alpha(): - ds = gdal.Open('data/tga/stefan_full_rgba.tga') + ds = gdal.Open("data/tga/stefan_full_rgba.tga") assert ds.RasterCount == 4 assert ds.RasterXSize == 162 assert ds.RasterYSize == 150 @@ -165,13 +171,12 @@ def test_tga_read_uncompressed_32bit_alpha(): def test_tga_read_single_band_runs_crossing_scanlines(): - ds = gdal.Open('data/tga/from_ffmpeg_samples/test1g.tga') + ds = gdal.Open("data/tga/from_ffmpeg_samples/test1g.tga") assert ds.GetRasterBand(1).Checksum() == 13077 def test_tga_read_three_bands_runs_crossing_scanlines(): - ds = gdal.Open('data/tga/from_ffmpeg_samples/TEST24rle.tga') + ds = gdal.Open("data/tga/from_ffmpeg_samples/TEST24rle.tga") assert ds.GetRasterBand(1).Checksum() == 39607 assert ds.GetRasterBand(2).Checksum() == 6458 assert ds.GetRasterBand(3).Checksum() == 44534 - diff --git a/autotest/gdrivers/tiff_profile.py b/autotest/gdrivers/tiff_profile.py index 4060bd95b63d..5be3ef47aa88 100755 --- a/autotest/gdrivers/tiff_profile.py +++ b/autotest/gdrivers/tiff_profile.py @@ -33,60 +33,58 @@ import base64 import os - -from osgeo import gdal import pytest +from osgeo import gdal ############################################################################### # Test writing and reading of ICC profile in Create() options + def test_tiff_write_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from Create() md = ds.GetMetadata("COLOR_PROFILE") ds = None with pytest.raises(OSError): - os.stat('tmp/icc_test.tiff.aux.xml') - + os.stat("tmp/icc_test.tiff.aux.xml") - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") md = ds.GetMetadata("COLOR_PROFILE") ds = None with pytest.raises(OSError): - os.stat('tmp/icc_test.tiff.aux.xml') - + os.stat("tmp/icc_test.tiff.aux.xml") - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with GetMetadataItem() - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") source_icc_profile = ds.GetMetadataItem("SOURCE_ICC_PROFILE", "COLOR_PROFILE") ds = None with pytest.raises(OSError): - os.stat('tmp/icc_test.tiff.aux.xml') - + os.stat("tmp/icc_test.tiff.aux.xml") assert source_icc_profile == icc - driver.Delete('tmp/icc_test.tiff') + driver.Delete("tmp/icc_test.tiff") + ############################################################################### # Test writing and reading of ICC profile in CreateCopy() @@ -94,35 +92,36 @@ def test_tiff_write_icc(): def test_tiff_copy_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) - ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds) + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) + ds2 = driver.CreateCopy("tmp/icc_test2.tiff", ds) # Check with dataset from CreateCopy() md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test2.tiff') + ds2 = gdal.Open("tmp/icc_test2.tiff") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc + + driver.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test2.tiff") - driver.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test2.tiff') ############################################################################### # Test writing and reading of ICC profile in CreateCopy() options @@ -130,39 +129,40 @@ def test_tiff_copy_icc(): def test_tiff_copy_options_icc(): - f = open('data/sRGB.icc', 'rb') + f = open("data/sRGB.icc", "rb") data = f.read() - icc = base64.b64encode(data).decode('ascii') + icc = base64.b64encode(data).decode("ascii") f.close() # Create dummy file - options = ['SOURCE_ICC_PROFILE=' + icc] + options = ["SOURCE_ICC_PROFILE=" + icc] - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) - ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds, options=options) + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) + ds2 = driver.CreateCopy("tmp/icc_test2.tiff", ds, options=options) # Check with dataset from CreateCopy() md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test2.tiff') + ds2 = gdal.Open("tmp/icc_test2.tiff") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc - driver.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test2.tiff') + driver.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test2.tiff") def cvtTuple2String(t): - return str(t).lstrip('([').rstrip(')]') + return str(t).lstrip("([").rstrip(")]") + ############################################################################### # Test writing and reading of ICC colorimetric data from options @@ -172,76 +172,91 @@ def test_tiff_copy_options_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) - tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) - - options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), - 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), - 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), - 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), - 'TIFFTAG_TRANSFERFUNCTION_RED=' + cvtTuple2String(tifftag_transferfunction[0]), - 'TIFFTAG_TRANSFERFUNCTION_GREEN=' + cvtTuple2String(tifftag_transferfunction[1]), - 'TIFFTAG_TRANSFERFUNCTION_BLUE=' + cvtTuple2String(tifftag_transferfunction[2]) - ] - - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + tifftag_transferfunction = ( + list(range(1, 256 * 4, 4)), + list(range(2, 256 * 4 + 1, 4)), + list(range(3, 256 * 4 + 2, 4)), + ) + + options = [ + "SOURCE_PRIMARIES_RED=" + cvtTuple2String(source_primaries[0]), + "SOURCE_PRIMARIES_GREEN=" + cvtTuple2String(source_primaries[1]), + "SOURCE_PRIMARIES_BLUE=" + cvtTuple2String(source_primaries[2]), + "SOURCE_WHITEPOINT=" + cvtTuple2String(source_whitepoint), + "TIFFTAG_TRANSFERFUNCTION_RED=" + cvtTuple2String(tifftag_transferfunction[0]), + "TIFFTAG_TRANSFERFUNCTION_GREEN=" + + cvtTuple2String(tifftag_transferfunction[1]), + "TIFFTAG_TRANSFERFUNCTION_BLUE=" + cvtTuple2String(tifftag_transferfunction[2]), + ] + + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds, options=options) + ds2 = driver.CreateCopy("tmp/icc_test2.tiff", ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test2.tiff') + ds2 = gdal.Open("tmp/icc_test2.tiff") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction - driver.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test2.tiff') + driver.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test2.tiff") + ############################################################################### # Test writing and reading of ICC colorimetric data in the file @@ -251,78 +266,93 @@ def test_tiff_copy_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) - tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) - - options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), - 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), - 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), - 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), - 'TIFFTAG_TRANSFERFUNCTION_RED=' + cvtTuple2String(tifftag_transferfunction[0]), - 'TIFFTAG_TRANSFERFUNCTION_GREEN=' + cvtTuple2String(tifftag_transferfunction[1]), - 'TIFFTAG_TRANSFERFUNCTION_BLUE=' + cvtTuple2String(tifftag_transferfunction[2]) - ] - - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) + tifftag_transferfunction = ( + list(range(1, 256 * 4, 4)), + list(range(2, 256 * 4 + 1, 4)), + list(range(3, 256 * 4 + 2, 4)), + ) + + options = [ + "SOURCE_PRIMARIES_RED=" + cvtTuple2String(source_primaries[0]), + "SOURCE_PRIMARIES_GREEN=" + cvtTuple2String(source_primaries[1]), + "SOURCE_PRIMARIES_BLUE=" + cvtTuple2String(source_primaries[2]), + "SOURCE_WHITEPOINT=" + cvtTuple2String(source_whitepoint), + "TIFFTAG_TRANSFERFUNCTION_RED=" + cvtTuple2String(tifftag_transferfunction[0]), + "TIFFTAG_TRANSFERFUNCTION_GREEN=" + + cvtTuple2String(tifftag_transferfunction[1]), + "TIFFTAG_TRANSFERFUNCTION_BLUE=" + cvtTuple2String(tifftag_transferfunction[2]), + ] + + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte, options) ds = None - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") # Check with dataset from CreateCopy() - ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds) + ds2 = driver.CreateCopy("tmp/icc_test2.tiff", ds) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction # Check again with dataset from Open() - ds2 = gdal.Open('tmp/icc_test2.tiff') + ds2 = gdal.Open("tmp/icc_test2.tiff") md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction - driver.Delete('tmp/icc_test.tiff') - driver.Delete('tmp/icc_test2.tiff') + driver.Delete("tmp/icc_test.tiff") + driver.Delete("tmp/icc_test2.tiff") + ############################################################################### # Test updating ICC profile @@ -330,30 +360,31 @@ def test_tiff_copy_colorimetric_data(): def test_tiff_update_icc(): - with open('data/sRGB.icc', 'rb') as f: - icc = base64.b64encode(f.read()).decode('ascii') + with open("data/sRGB.icc", "rb") as f: + icc = base64.b64encode(f.read()).decode("ascii") # Create dummy file - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) ds = None - ds = gdal.Open('tmp/icc_test.tiff', gdal.GA_Update) + ds = gdal.Open("tmp/icc_test.tiff", gdal.GA_Update) - ds.SetMetadataItem('SOURCE_ICC_PROFILE', icc, 'COLOR_PROFILE') + ds.SetMetadataItem("SOURCE_ICC_PROFILE", icc, "COLOR_PROFILE") md = ds.GetMetadata("COLOR_PROFILE") ds = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc # Reopen the file to verify it was written. - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") md = ds.GetMetadata("COLOR_PROFILE") ds = None - assert md['SOURCE_ICC_PROFILE'] == icc + assert md["SOURCE_ICC_PROFILE"] == icc + + driver.Delete("tmp/icc_test.tiff") - driver.Delete('tmp/icc_test.tiff') ############################################################################### # Test updating colorimetric options @@ -362,75 +393,105 @@ def test_tiff_update_icc(): def test_tiff_update_colorimetric(): source_primaries = [(0.234, 0.555, 1.0), (0.2, 0, 1), (2, 3.5, 1)] source_whitepoint = (0.31271, 0.32902, 1.0) - tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) + tifftag_transferfunction = ( + list(range(1, 256 * 4, 4)), + list(range(2, 256 * 4 + 1, 4)), + list(range(3, 256 * 4 + 2, 4)), + ) # Create dummy file - driver = gdal.GetDriverByName('GTiff') - ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) + driver = gdal.GetDriverByName("GTiff") + ds = driver.Create("tmp/icc_test.tiff", 64, 64, 3, gdal.GDT_Byte) ds = None - ds = gdal.Open('tmp/icc_test.tiff', gdal.GA_Update) - - ds.SetMetadataItem('SOURCE_PRIMARIES_RED', cvtTuple2String(source_primaries[0]), 'COLOR_PROFILE') - ds.SetMetadataItem('SOURCE_PRIMARIES_GREEN', cvtTuple2String(source_primaries[1]), 'COLOR_PROFILE') - ds.SetMetadataItem('SOURCE_PRIMARIES_BLUE', cvtTuple2String(source_primaries[2]), 'COLOR_PROFILE') - ds.SetMetadataItem('SOURCE_WHITEPOINT', cvtTuple2String(source_whitepoint), 'COLOR_PROFILE') - ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_RED', cvtTuple2String(tifftag_transferfunction[0]), 'COLOR_PROFILE') - ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_GREEN', cvtTuple2String(tifftag_transferfunction[1]), 'COLOR_PROFILE') - ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_BLUE', cvtTuple2String(tifftag_transferfunction[2]), 'COLOR_PROFILE') + ds = gdal.Open("tmp/icc_test.tiff", gdal.GA_Update) + + ds.SetMetadataItem( + "SOURCE_PRIMARIES_RED", cvtTuple2String(source_primaries[0]), "COLOR_PROFILE" + ) + ds.SetMetadataItem( + "SOURCE_PRIMARIES_GREEN", cvtTuple2String(source_primaries[1]), "COLOR_PROFILE" + ) + ds.SetMetadataItem( + "SOURCE_PRIMARIES_BLUE", cvtTuple2String(source_primaries[2]), "COLOR_PROFILE" + ) + ds.SetMetadataItem( + "SOURCE_WHITEPOINT", cvtTuple2String(source_whitepoint), "COLOR_PROFILE" + ) + ds.SetMetadataItem( + "TIFFTAG_TRANSFERFUNCTION_RED", + cvtTuple2String(tifftag_transferfunction[0]), + "COLOR_PROFILE", + ) + ds.SetMetadataItem( + "TIFFTAG_TRANSFERFUNCTION_GREEN", + cvtTuple2String(tifftag_transferfunction[1]), + "COLOR_PROFILE", + ) + ds.SetMetadataItem( + "TIFFTAG_TRANSFERFUNCTION_BLUE", + cvtTuple2String(tifftag_transferfunction[2]), + "COLOR_PROFILE", + ) md = ds.GetMetadata("COLOR_PROFILE") ds = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction # Reopen the file to verify it was written. - ds = gdal.Open('tmp/icc_test.tiff') + ds = gdal.Open("tmp/icc_test.tiff") md = ds.GetMetadata("COLOR_PROFILE") ds = None - source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') + source_whitepoint2 = eval("(" + md["SOURCE_WHITEPOINT"] + ")") for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ - eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), - eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] + eval("(" + md["SOURCE_PRIMARIES_RED"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_GREEN"] + ")"), + eval("(" + md["SOURCE_PRIMARIES_BLUE"] + ")"), + ] for j in range(0, 3): for i in range(0, 3): - assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) + assert source_primaries2[j][i] == pytest.approx( + source_primaries[j][i], abs=0.0001 + ) tifftag_transferfunction2 = ( - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), - eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_RED"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_GREEN"] + "]"), + eval("[" + md["TIFFTAG_TRANSFERFUNCTION_BLUE"] + "]"), + ) assert tifftag_transferfunction2 == tifftag_transferfunction - driver.Delete('tmp/icc_test.tiff') - -############################################################################ - + driver.Delete("tmp/icc_test.tiff") +############################################################################ diff --git a/autotest/gdrivers/til.py b/autotest/gdrivers/til.py index 6d53c6f83d49..a098874ecc03 100755 --- a/autotest/gdrivers/til.py +++ b/autotest/gdrivers/til.py @@ -30,8 +30,8 @@ import os - import gdaltest + from osgeo import gdal ############################################################################### @@ -40,49 +40,51 @@ def test_til_1(): - tst = gdaltest.GDALTest('TIL', 'til/testtil.til', 1, 4672) + tst = gdaltest.GDALTest("TIL", "til/testtil.til", 1, 4672) return tst.testOpen() + ############################################################################### # Check GetFileList() result (#4018) & IMD def test_til_2(): - ds = gdal.Open('data/til/testtil.til') + ds = gdal.Open("data/til/testtil.til") filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." - md = ds.GetMetadata('IMAGERY') - assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' - assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' - assert 'ACQUISITIONDATETIME' in md, \ - 'ACQUISITIONDATETIME not present in IMAGERY Domain' + md = ds.GetMetadata("IMAGERY") + assert "SATELLITEID" in md, "SATELLITEID not present in IMAGERY Domain" + assert "CLOUDCOVER" in md, "CLOUDCOVER not present in IMAGERY Domain" + assert ( + "ACQUISITIONDATETIME" in md + ), "ACQUISITIONDATETIME not present in IMAGERY Domain" ds = None - assert not os.path.exists('data/til/testtil.til.aux.xml') - + assert not os.path.exists("data/til/testtil.til.aux.xml") + + ############################################################################### # Check GetFileList() & XML def test_til_3(): - ds = gdal.Open('data/til/testtil2.til') + ds = gdal.Open("data/til/testtil2.til") filelist = ds.GetFileList() - assert len(filelist) == 3, 'did not get expected file list.' + assert len(filelist) == 3, "did not get expected file list." - md = ds.GetMetadata('IMAGERY') - assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' - assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' - assert 'ACQUISITIONDATETIME' in md, \ - 'ACQUISITIONDATETIME not present in IMAGERY Domain' + md = ds.GetMetadata("IMAGERY") + assert "SATELLITEID" in md, "SATELLITEID not present in IMAGERY Domain" + assert "CLOUDCOVER" in md, "CLOUDCOVER not present in IMAGERY Domain" + assert ( + "ACQUISITIONDATETIME" in md + ), "ACQUISITIONDATETIME not present in IMAGERY Domain" ds = None - assert not os.path.exists('data/til/testtil.til.aux.xml') - - + assert not os.path.exists("data/til/testtil.til.aux.xml") diff --git a/autotest/gdrivers/tiledb_read.py b/autotest/gdrivers/tiledb_read.py index f96dc2f9ed14..64724a87d8d9 100755 --- a/autotest/gdrivers/tiledb_read.py +++ b/autotest/gdrivers/tiledb_read.py @@ -29,11 +29,11 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import gdaltest import pytest -import gdaltest -@pytest.mark.require_driver('TileDB') +@pytest.mark.require_driver("TileDB") def test_tiledb_open(): - ut = gdaltest.GDALTest('TileDB', 'tiledb_array', 1, 4857) + ut = gdaltest.GDALTest("TileDB", "tiledb_array", 1, 4857) ut.testOpen() diff --git a/autotest/gdrivers/tiledb_write.py b/autotest/gdrivers/tiledb_write.py index 1b6546ba25b6..d7f8dedd7653 100755 --- a/autotest/gdrivers/tiledb_write.py +++ b/autotest/gdrivers/tiledb_write.py @@ -29,160 +29,161 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal +import gdaltest import pytest -import gdaltest +from osgeo import gdal + -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL', 'ATTRIBUTES'] -) +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL", "ATTRIBUTES"]) def test_tiledb_write_complex(mode): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('../gcore/data/cfloat64.tif') + src_ds = gdal.Open("../gcore/data/cfloat64.tif") - options = [ - 'INTERLEAVE=%s' % (mode) - ] + options = ["INTERLEAVE=%s" % (mode)] - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_complex64', src_ds, options=options) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + new_ds = gdaltest.tiledb_drv.CreateCopy( + "tmp/tiledb_complex64", src_ds, options=options + ) + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" bnd = new_ds.GetRasterBand(1) - assert bnd.Checksum() == 5028, 'Did not get expected checksum on still-open file' + assert bnd.Checksum() == 5028, "Did not get expected checksum on still-open file" bnd = None new_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_complex64') + gdaltest.tiledb_drv.Delete("tmp/tiledb_complex64") + -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL', 'ATTRIBUTES'] -) +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL", "ATTRIBUTES"]) def test_tiledb_write_custom_blocksize(mode): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('../gcore/data/utmsmall.tif') + src_ds = gdal.Open("../gcore/data/utmsmall.tif") - options = ['BLOCKXSIZE=32', 'BLOCKYSIZE=32', 'INTERLEAVE=%s' % (mode)] + options = ["BLOCKXSIZE=32", "BLOCKYSIZE=32", "INTERLEAVE=%s" % (mode)] - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_custom', src_ds, - options=options) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + new_ds = gdaltest.tiledb_drv.CreateCopy( + "tmp/tiledb_custom", src_ds, options=options + ) + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" bnd = new_ds.GetRasterBand(1) - assert bnd.Checksum() == 50054, 'Did not get expected checksum on still-open file' + assert bnd.Checksum() == 50054, "Did not get expected checksum on still-open file" assert bnd.GetBlockSize() == [32, 32] bnd = None new_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_custom') + gdaltest.tiledb_drv.Delete("tmp/tiledb_custom") + -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL'] -) +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL"]) def test_tiledb_write_update(mode): - np = pytest.importorskip('numpy') + np = pytest.importorskip("numpy") - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - options = [ - 'INTERLEAVE=%s' % (mode) - ] + options = ["INTERLEAVE=%s" % (mode)] - new_ds = gdaltest.tiledb_drv.Create('tmp/tiledb_update', 20, 20, 1, gdal.GDT_Byte, options=options) + new_ds = gdaltest.tiledb_drv.Create( + "tmp/tiledb_update", 20, 20, 1, gdal.GDT_Byte, options=options + ) new_ds.GetRasterBand(1).WriteArray(np.zeros((20, 20))) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" del new_ds - update_ds = gdal.Open('tmp/tiledb_update', gdal.GA_Update) + update_ds = gdal.Open("tmp/tiledb_update", gdal.GA_Update) update_bnd = update_ds.GetRasterBand(1) # make a partial block write update_bnd.WriteArray(np.ones((10, 10)) * 255) update_bnd = None update_ds = None - test_ds = gdal.Open('tmp/tiledb_update') - assert test_ds.GetRasterBand(1).Checksum() == 1217, 'Did not get expected checksum on file update' + test_ds = gdal.Open("tmp/tiledb_update") + assert ( + test_ds.GetRasterBand(1).Checksum() == 1217 + ), "Did not get expected checksum on file update" test_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_update') + gdaltest.tiledb_drv.Delete("tmp/tiledb_update") -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL', 'ATTRIBUTES'] -) + +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL", "ATTRIBUTES"]) def test_tiledb_write_rgb(mode): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('../gcore/data/rgbsmall.tif') + src_ds = gdal.Open("../gcore/data/rgbsmall.tif") - options = [ - 'INTERLEAVE=%s' % (mode) - ] - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_rgb', src_ds, options=options) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' - assert new_ds.RasterCount == 3, 'Did not get expected band count' + options = ["INTERLEAVE=%s" % (mode)] + new_ds = gdaltest.tiledb_drv.CreateCopy("tmp/tiledb_rgb", src_ds, options=options) + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" + assert new_ds.RasterCount == 3, "Did not get expected band count" bnd = new_ds.GetRasterBand(2) - assert bnd.Checksum() == 21053, 'Did not get expected checksum on still-open file' + assert bnd.Checksum() == 21053, "Did not get expected checksum on still-open file" new_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_rgb') + gdaltest.tiledb_drv.Delete("tmp/tiledb_rgb") -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL'] -) + +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL"]) def test_tiledb_write_attributes(mode): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('../gcore/data/rgbsmall.tif') + src_ds = gdal.Open("../gcore/data/rgbsmall.tif") w, h, num_bands = src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount # build attribute data in memory - gdal.GetDriverByName('GTiff').Create('/vsimem/temp1.tif', w, h, num_bands, gdal.GDT_Int32) - gdal.GetDriverByName('GTiff').Create('/vsimem/temp2.tif', w, h, num_bands, gdal.GDT_Float32) + gdal.GetDriverByName("GTiff").Create( + "/vsimem/temp1.tif", w, h, num_bands, gdal.GDT_Int32 + ) + gdal.GetDriverByName("GTiff").Create( + "/vsimem/temp2.tif", w, h, num_bands, gdal.GDT_Float32 + ) options = [ - 'TILEDB_ATTRIBUTE=%s' % ('/vsimem/temp1.tif'), - 'TILEDB_ATTRIBUTE=%s' % ('/vsimem/temp2.tif'), - 'INTERLEAVE=%s' % (mode) + "TILEDB_ATTRIBUTE=%s" % ("/vsimem/temp1.tif"), + "TILEDB_ATTRIBUTE=%s" % ("/vsimem/temp2.tif"), + "INTERLEAVE=%s" % (mode), ] - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_rgb_atts', src_ds, options=options) + new_ds = gdaltest.tiledb_drv.CreateCopy( + "tmp/tiledb_rgb_atts", src_ds, options=options + ) assert new_ds is not None assert new_ds.RasterXSize == src_ds.RasterXSize assert new_ds.RasterYSize == src_ds.RasterYSize assert new_ds.RasterCount == src_ds.RasterCount - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" new_ds = None # check we can open the attributes with the band as well as the pixel values - att1_ds = gdal.OpenEx('tmp/tiledb_rgb_atts', open_options=['TILEDB_ATTRIBUTE=temp1']) - att2_ds = gdal.OpenEx('tmp/tiledb_rgb_atts', open_options=['TILEDB_ATTRIBUTE=temp2']) - val_ds = gdal.Open('tmp/tiledb_rgb_atts') - - meta = val_ds.GetMetadata('IMAGE_STRUCTURE') - assert 'TILEDB_ATTRIBUTE_1' in meta - assert meta['TILEDB_ATTRIBUTE_1'] == 'temp1' - assert 'TILEDB_ATTRIBUTE_2' in meta - assert meta['TILEDB_ATTRIBUTE_2'] == 'temp2' + att1_ds = gdal.OpenEx( + "tmp/tiledb_rgb_atts", open_options=["TILEDB_ATTRIBUTE=temp1"] + ) + att2_ds = gdal.OpenEx( + "tmp/tiledb_rgb_atts", open_options=["TILEDB_ATTRIBUTE=temp2"] + ) + val_ds = gdal.Open("tmp/tiledb_rgb_atts") + + meta = val_ds.GetMetadata("IMAGE_STRUCTURE") + assert "TILEDB_ATTRIBUTE_1" in meta + assert meta["TILEDB_ATTRIBUTE_1"] == "temp1" + assert "TILEDB_ATTRIBUTE_2" in meta + assert meta["TILEDB_ATTRIBUTE_2"] == "temp2" assert att1_ds is not None assert att2_ds is not None @@ -197,22 +198,23 @@ def test_tiledb_write_attributes(mode): att2_ds = None val_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_rgb_atts') + gdaltest.tiledb_drv.Delete("tmp/tiledb_rgb_atts") src_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/temp1.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/temp2.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/temp1.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/temp2.tif") -@pytest.mark.require_driver('TileDB') -@pytest.mark.require_driver('HDF5') +@pytest.mark.require_driver("TileDB") +@pytest.mark.require_driver("HDF5") def test_tiledb_write_subdatasets(): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('data/tiledb_input/DeepBlue-SeaWiFS-1.0_L3_20100101_v004-20130604T131317Z.h5') + src_ds = gdal.Open( + "data/tiledb_input/DeepBlue-SeaWiFS-1.0_L3_20100101_v004-20130604T131317Z.h5" + ) - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/test_sds_array', src_ds, - False) + new_ds = gdaltest.tiledb_drv.CreateCopy("tmp/test_sds_array", src_ds, False) assert new_ds is not None new_ds = None @@ -225,91 +227,86 @@ def test_tiledb_write_subdatasets(): src_ds = gdal.Open('TILEDB:"tmp/test_sds_array":i_dont_exist') assert not src_ds - gdaltest.tiledb_drv.Delete('tmp/test_sds_array') + gdaltest.tiledb_drv.Delete("tmp/test_sds_array") + -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL', 'ATTRIBUTES'] -) +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL", "ATTRIBUTES"]) def test_tiledb_write_band_meta(mode): - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - src_ds = gdal.Open('../gcore/data/rgbsmall.tif') + src_ds = gdal.Open("../gcore/data/rgbsmall.tif") - options = [ - 'INTERLEAVE=%s' % (mode) - ] + options = ["INTERLEAVE=%s" % (mode)] - new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_meta', src_ds, options=options) + new_ds = gdaltest.tiledb_drv.CreateCopy("tmp/tiledb_meta", src_ds, options=options) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" bnd = new_ds.GetRasterBand(1) - bnd.SetMetadataItem('Item', 'Value') + bnd.SetMetadataItem("Item", "Value") bnd = None new_ds = None - new_ds = gdal.Open('tmp/tiledb_meta') - assert new_ds.GetRasterBand(1).GetMetadataItem('Item') == 'Value' + new_ds = gdal.Open("tmp/tiledb_meta") + assert new_ds.GetRasterBand(1).GetMetadataItem("Item") == "Value" new_ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_meta') + gdaltest.tiledb_drv.Delete("tmp/tiledb_meta") src_ds = None -@pytest.mark.require_driver('TileDB') -@pytest.mark.parametrize( - 'mode', - ['BAND', 'PIXEL'] -) + +@pytest.mark.require_driver("TileDB") +@pytest.mark.parametrize("mode", ["BAND", "PIXEL"]) def test_tiledb_write_history(mode): - np = pytest.importorskip('numpy') + np = pytest.importorskip("numpy") - options = [ - 'INTERLEAVE=%s' % (mode), - 'TILEDB_TIMESTAMP=1' - ] + options = ["INTERLEAVE=%s" % (mode), "TILEDB_TIMESTAMP=1"] - gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') + gdaltest.tiledb_drv = gdal.GetDriverByName("TileDB") - new_ds = gdaltest.tiledb_drv.Create('tmp/tiledb_versioning', 20, 20, 1, - gdal.GDT_Byte, options=options) + new_ds = gdaltest.tiledb_drv.Create( + "tmp/tiledb_versioning", 20, 20, 1, gdal.GDT_Byte, options=options + ) new_ds.GetRasterBand(1).WriteArray(np.zeros((20, 20))) - meta = new_ds.GetMetadata('IMAGE_STRUCTURE') - assert meta['INTERLEAVE'] == mode, 'Did not get expected mode' + meta = new_ds.GetMetadata("IMAGE_STRUCTURE") + assert meta["INTERLEAVE"] == mode, "Did not get expected mode" del new_ds ts = [2, 3, 4, 5] for t in ts: - update_ds = gdal.OpenEx('tmp/tiledb_versioning', gdal.GA_Update, - open_options=['TILEDB_TIMESTAMP=%i' % (t)]) + update_ds = gdal.OpenEx( + "tmp/tiledb_versioning", + gdal.GA_Update, + open_options=["TILEDB_TIMESTAMP=%i" % (t)], + ) update_bnd = update_ds.GetRasterBand(1) - update_bnd.SetMetadataItem('TILEDB_TIMESTAMP', str(t)) + update_bnd.SetMetadataItem("TILEDB_TIMESTAMP", str(t)) data = np.ones((20, 20)) * t update_bnd.WriteArray(data) update_bnd = None update_ds = None for t in ts: - ds = gdal.OpenEx('tmp/tiledb_versioning', - open_options=['TILEDB_TIMESTAMP=%i' % (t)]) + ds = gdal.OpenEx( + "tmp/tiledb_versioning", open_options=["TILEDB_TIMESTAMP=%i" % (t)] + ) bnd = ds.GetRasterBand(1) - assert int(bnd.GetMetadataItem('TILEDB_TIMESTAMP')) == t + assert int(bnd.GetMetadataItem("TILEDB_TIMESTAMP")) == t assert bnd.Checksum() == 20 * 20 * t bnd = None ds = None # open at a later non-existent timestamp - ds = gdal.OpenEx('tmp/tiledb_versioning', - open_options=['TILEDB_TIMESTAMP=6']) + ds = gdal.OpenEx("tmp/tiledb_versioning", open_options=["TILEDB_TIMESTAMP=6"]) bnd = ds.GetRasterBand(1) - assert int(bnd.GetMetadataItem('TILEDB_TIMESTAMP')) == 5 + assert int(bnd.GetMetadataItem("TILEDB_TIMESTAMP")) == 5 bnd = None ds = None - gdaltest.tiledb_drv.Delete('tmp/tiledb_versioning') + gdaltest.tiledb_drv.Delete("tmp/tiledb_versioning") diff --git a/autotest/gdrivers/usgsdem.py b/autotest/gdrivers/usgsdem.py index 723475d9dcb3..6ebe92ec736b 100755 --- a/autotest/gdrivers/usgsdem.py +++ b/autotest/gdrivers/usgsdem.py @@ -29,24 +29,26 @@ ############################################################################### import os -from osgeo import gdal -from osgeo import osr - import gdaltest import pytest +from osgeo import gdal, osr + ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/022gdeme def test_usgsdem_1(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/022gdeme_truncated', 1, 1583) + tst = gdaltest.GDALTest("USGSDEM", "usgsdem/022gdeme_truncated", 1, 1583) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD27') - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) + srs.SetWellKnownGeogCS("NAD27") + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333), + ) + ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/114p01_0100_deme.dem @@ -54,11 +56,23 @@ def test_usgsdem_1(): def test_usgsdem_2(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/114p01_0100_deme_truncated.dem', 1, 53864) + tst = gdaltest.GDALTest( + "USGSDEM", "usgsdem/114p01_0100_deme_truncated.dem", 1, 53864 + ) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD27') - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(-136.25010416667, 0.000208333, 0.0, 59.25010416667, 0.0, -0.000208333)) + srs.SetWellKnownGeogCS("NAD27") + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=( + -136.25010416667, + 0.000208333, + 0.0, + 59.25010416667, + 0.0, + -0.000208333, + ), + ) + ############################################################################### # Test truncated version of file that triggered bug #2348 @@ -66,12 +80,15 @@ def test_usgsdem_2(): def test_usgsdem_3(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39079G6_truncated.dem', 1, 61424) + tst = gdaltest.GDALTest("USGSDEM", "usgsdem/39079G6_truncated.dem", 1, 61424) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('WGS72') + srs.SetWellKnownGeogCS("WGS72") srs.SetUTM(17) - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(606855.0, 30.0, 0.0, 4414605.0, 0.0, -30.0)) + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(606855.0, 30.0, 0.0, 4414605.0, 0.0, -30.0), + ) + ############################################################################### # Test CreateCopy() @@ -79,42 +96,50 @@ def test_usgsdem_3(): def test_usgsdem_4(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39079G6_truncated.dem', 1, 61424, - options=['RESAMPLE=Nearest']) + tst = gdaltest.GDALTest( + "USGSDEM", + "usgsdem/39079G6_truncated.dem", + 1, + 61424, + options=["RESAMPLE=Nearest"], + ) return tst.testCreateCopy(check_gt=1, check_srs=1, vsimem=1) ############################################################################### # Test CreateCopy() without any creation options + def test_usgsdem_5(): - ds = gdal.Open('data/n43.dt0') - ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/n43.dem', ds, - options=['RESAMPLE=Nearest']) + ds = gdal.Open("data/n43.dt0") + ds2 = gdal.GetDriverByName("USGSDEM").CreateCopy( + "tmp/n43.dem", ds, options=["RESAMPLE=Nearest"] + ) if ds.GetRasterBand(1).Checksum() != ds2.GetRasterBand(1).Checksum(): print(ds2.GetRasterBand(1).Checksum()) print(ds.GetRasterBand(1).Checksum()) ds2 = None - print(open('tmp/n43.dem', 'rb').read()) - pytest.fail('Bad checksum.') + print(open("tmp/n43.dem", "rb").read()) + pytest.fail("Bad checksum.") gt1 = ds.GetGeoTransform() gt2 = ds2.GetGeoTransform() for i in range(6): if gt1[i] != pytest.approx(gt2[i], abs=1e-5): - print('') - print('old = ', gt1) - print('new = ', gt2) - pytest.fail('Geotransform differs.') + print("") + print("old = ", gt1) + print("new = ", gt2) + pytest.fail("Geotransform differs.") srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('WGS84') - assert ds2.GetProjectionRef() == srs.ExportToWkt(), 'Bad SRS.' + srs.SetWellKnownGeogCS("WGS84") + assert ds2.GetProjectionRef() == srs.ExportToWkt(), "Bad SRS." ds2 = None + ############################################################################### # Test CreateCopy() without a few creation options. Then create a new copy with TEMPLATE # creation option and check that both files are binary identical. @@ -122,19 +147,27 @@ def test_usgsdem_5(): def test_usgsdem_6(): - ds = gdal.Open('data/n43.dt0') - ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/file_1.dem', ds, - options=['PRODUCER=GDAL', 'OriginCode=GDAL', 'ProcessCode=A', - 'RESAMPLE=Nearest']) - - ds3 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/file_2.dem', ds2, - options=['TEMPLATE=tmp/file_1.dem', 'RESAMPLE=Nearest']) + ds = gdal.Open("data/n43.dt0") + ds2 = gdal.GetDriverByName("USGSDEM").CreateCopy( + "tmp/file_1.dem", + ds, + options=[ + "PRODUCER=GDAL", + "OriginCode=GDAL", + "ProcessCode=A", + "RESAMPLE=Nearest", + ], + ) + + ds3 = gdal.GetDriverByName("USGSDEM").CreateCopy( + "tmp/file_2.dem", ds2, options=["TEMPLATE=tmp/file_1.dem", "RESAMPLE=Nearest"] + ) del ds2 del ds3 - f1 = open('tmp/file_1.dem', 'rb') - f2 = open('tmp/file_2.dem', 'rb') + f1 = open("tmp/file_1.dem", "rb") + f2 = open("tmp/file_2.dem", "rb") # Skip the 40 first bytes because the dataset name will differ f1.seek(40, 0) @@ -148,37 +181,55 @@ def test_usgsdem_6(): f1.close() f2.close() + ############################################################################### # Test CreateCopy() with CDED50K profile def test_usgsdem_7(): - ds = gdal.Open('data/n43.dt0') + ds = gdal.Open("data/n43.dt0") # To avoid warning about 'Unable to find NTS mapsheet lookup file: NTS-50kindex.csv' - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/000a00DEMz', ds, - options=['PRODUCT=CDED50K', 'TOPLEFT=80w,44n', 'RESAMPLE=Nearest', 'ZRESOLUTION=1.1', 'INTERNALNAME=GDAL']) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds2 = gdal.GetDriverByName("USGSDEM").CreateCopy( + "tmp/000a00DEMz", + ds, + options=[ + "PRODUCT=CDED50K", + "TOPLEFT=80w,44n", + "RESAMPLE=Nearest", + "ZRESOLUTION=1.1", + "INTERNALNAME=GDAL", + ], + ) gdal.PopErrorHandler() - assert ds2.RasterXSize == 1201 and ds2.RasterYSize == 1201, 'Bad image dimensions.' + assert ds2.RasterXSize == 1201 and ds2.RasterYSize == 1201, "Bad image dimensions." - expected_gt = (-80.000104166666674, 0.000208333333333, 0, 44.000104166666667, 0, -0.000208333333333) + expected_gt = ( + -80.000104166666674, + 0.000208333333333, + 0, + 44.000104166666667, + 0, + -0.000208333333333, + ) got_gt = ds2.GetGeoTransform() for i in range(6): if expected_gt[i] != pytest.approx(got_gt[i], abs=1e-5): - print('') - print('expected = ', expected_gt) - print('got = ', got_gt) - pytest.fail('Geotransform differs.') + print("") + print("expected = ", expected_gt) + print("got = ", got_gt) + pytest.fail("Geotransform differs.") srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD83') - assert ds2.GetProjectionRef() == srs.ExportToWkt(), 'Bad SRS.' + srs.SetWellKnownGeogCS("NAD83") + assert ds2.GetProjectionRef() == srs.ExportToWkt(), "Bad SRS." ds2 = None + ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/various.zip/39109h1.dem # Undocumented format @@ -186,12 +237,15 @@ def test_usgsdem_7(): def test_usgsdem_8(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39109h1_truncated.dem', 1, 39443) + tst = gdaltest.GDALTest("USGSDEM", "usgsdem/39109h1_truncated.dem", 1, 39443) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD27') + srs.SetWellKnownGeogCS("NAD27") srs.SetUTM(12) - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(660055.0, 10.0, 0.0, 4429465.0, 0.0, -10.0)) + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(660055.0, 10.0, 0.0, 4429465.0, 0.0, -10.0), + ) + ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/various.zip/4619old.dem @@ -200,11 +254,14 @@ def test_usgsdem_8(): def test_usgsdem_9(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/4619old_truncated.dem', 1, 10659) + tst = gdaltest.GDALTest("USGSDEM", "usgsdem/4619old_truncated.dem", 1, 10659) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD27') - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(18.99958333, 0.0008333, 0.0, 47.000416667, 0.0, -0.0008333)) + srs.SetWellKnownGeogCS("NAD27") + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(18.99958333, 0.0008333, 0.0, 47.000416667, 0.0, -0.0008333), + ) + ############################################################################### # https://github.com/OSGeo/gdal/issues/583 @@ -212,18 +269,24 @@ def test_usgsdem_9(): def test_usgsdem_with_extra_values_at_end_of_profile(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/usgsdem_with_extra_values_at_end_of_profile.dem', 1, 56679) + tst = gdaltest.GDALTest( + "USGSDEM", "usgsdem/usgsdem_with_extra_values_at_end_of_profile.dem", 1, 56679 + ) return tst.testOpen() + ############################################################################### # Like Novato.dem of https://trac.osgeo.org/gdal/ticket/4901 def test_usgsdem_with_spaces_after_byte_864(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/usgsdem_with_spaces_after_byte_864.dem', 1, 61078) + tst = gdaltest.GDALTest( + "USGSDEM", "usgsdem/usgsdem_with_spaces_after_byte_864.dem", 1, 61078 + ) return tst.testOpen() + ############################################################################### # Test truncated version of https://s3.amazonaws.com/data.tnris.org/8ea19b45-7a66-4e95-9833-f9e89611d106/resources/fema06-140cm-coastal_2995441_dem.zip # downloaded from https://data.tnris.org/collection/8ea19b45-7a66-4e95-9833-f9e89611d106 @@ -231,13 +294,18 @@ def test_usgsdem_with_spaces_after_byte_864(): def test_usgsdem_with_header_of_918_bytes(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/fema06-140cm_2995441b_truncated.dem', 1, 0) + tst = gdaltest.GDALTest( + "USGSDEM", "usgsdem/fema06-140cm_2995441b_truncated.dem", 1, 0 + ) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('NAD83') + srs.SetWellKnownGeogCS("NAD83") srs.SetUTM(15) with gdaltest.error_handler(): - return tst.testOpen(check_prj=srs.ExportToWkt(), - check_gt=(248500.0, 1.4, 0.0, 3252508.7, 0.0, -1.4)) + return tst.testOpen( + check_prj=srs.ExportToWkt(), + check_gt=(248500.0, 1.4, 0.0, 3252508.7, 0.0, -1.4), + ) + ############################################################################### # Test dataset with 1025 byte records ending with linefeed (#5007 @@ -245,9 +313,12 @@ def test_usgsdem_with_header_of_918_bytes(): def test_usgsdem_record_1025_bytes_ending_with_linefeed(): - tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/record_1025_ending_with_linefeed.dem', 1, 14172) + tst = gdaltest.GDALTest( + "USGSDEM", "usgsdem/record_1025_ending_with_linefeed.dem", 1, 14172 + ) return tst.testOpen() + ############################################################################### # Cleanup @@ -255,19 +326,15 @@ def test_usgsdem_record_1025_bytes_ending_with_linefeed(): def test_usgsdem_cleanup(): try: - os.remove('tmp/n43.dem') - os.remove('tmp/n43.dem.aux.xml') + os.remove("tmp/n43.dem") + os.remove("tmp/n43.dem.aux.xml") - os.remove('tmp/file_1.dem') - os.remove('tmp/file_1.dem.aux.xml') - os.remove('tmp/file_2.dem') - os.remove('tmp/file_2.dem.aux.xml') + os.remove("tmp/file_1.dem") + os.remove("tmp/file_1.dem.aux.xml") + os.remove("tmp/file_2.dem") + os.remove("tmp/file_2.dem.aux.xml") - os.remove('tmp/000a00DEMz') - os.remove('tmp/000a00DEMz.aux.xml') + os.remove("tmp/000a00DEMz") + os.remove("tmp/000a00DEMz.aux.xml") except OSError: pass - - - - diff --git a/autotest/gdrivers/vicar.py b/autotest/gdrivers/vicar.py index 0c5ddd7f4d6b..209672145085 100755 --- a/autotest/gdrivers/vicar.py +++ b/autotest/gdrivers/vicar.py @@ -29,21 +29,21 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import ogr import json import struct import gdaltest import pytest +from osgeo import gdal, ogr + ############################################################################### # Read truncated VICAR file def test_vicar_1(): - tst = gdaltest.GDALTest('VICAR', 'vicar/test_vicar_truncated.bin', 1, 0) + tst = gdaltest.GDALTest("VICAR", "vicar/test_vicar_truncated.bin", 1, 0) expected_prj = """PROJCS["SINUSOIDAL MARS", GEOGCS["GCS_MARS", DATUM["D_MARS", @@ -57,7 +57,7 @@ def test_vicar_1(): UNIT["meter",1]]]""" tst.testOpen(check_prj=expected_prj, skip_checksum=True) - ds = gdal.Open('data/vicar/test_vicar_truncated.bin') + ds = gdal.Open("data/vicar/test_vicar_truncated.bin") expected_gt = (-53985.0, 25.0, 0.0, -200805.0, 0.0, -25.0) got_gt = ds.GetGeoTransform() for i in range(6): @@ -67,7 +67,28 @@ def test_vicar_1(): assert ds.GetRasterBand(1).GetScale() == pytest.approx(2.34, abs=1e-5) assert ds.GetRasterBand(1).GetOffset() == pytest.approx(4.56, abs=1e-5) - expected_md = {'DLRTO8.REFLECTANCE_OFFSET': '4.56', 'PRODUCT_TYPE': 'IMAGE', 'M94_ORBIT.STOP_TIME': 'stop_time', 'FILE.EVENT_TYPE': 'EVENT_TYPE', 'M94_CAMERAS.MACROPIXEL_SIZE': '1', 'M94_INSTRUMENT.DETECTOR_ID': 'MEX_HRSC_NADIR', 'HRORTHO.SPICE_FILE_NAME': 'SPICE_FILE_NAME', 'DLRTO8.RADIANCE_SCALING_FACTOR': '1.23', 'HRORTHO.GEOMETRIC_CALIB_FILE_NAME': 'calib_file_name', 'HRORTHO.EXTORI_FILE_NAME': "extori'_file_name", 'M94_INSTRUMENT.MISSION_PHASE_NAME': 'MISSION_PHASE_NAME', 'HRCONVER.MISSING_FRAMES': '0', 'DLRTO8.RADIANCE_OFFSET': '1.23', 'HRCONVER.OVERFLOW_FRAMES': '0', 'SPACECRAFT_NAME': 'MARS EXPRESS', 'HRFOOT.BEST_GROUND_SAMPLING_DISTANCE': '1.23', 'M94_ORBIT.START_TIME': 'start_time', 'HRORTHO.DTM_NAME': 'dtm_name', 'DLRTO8.REFLECTANCE_SCALING_FACTOR': '2.34', 'HRCONVER.ERROR_FRAMES': '1'} + expected_md = { + "DLRTO8.REFLECTANCE_OFFSET": "4.56", + "PRODUCT_TYPE": "IMAGE", + "M94_ORBIT.STOP_TIME": "stop_time", + "FILE.EVENT_TYPE": "EVENT_TYPE", + "M94_CAMERAS.MACROPIXEL_SIZE": "1", + "M94_INSTRUMENT.DETECTOR_ID": "MEX_HRSC_NADIR", + "HRORTHO.SPICE_FILE_NAME": "SPICE_FILE_NAME", + "DLRTO8.RADIANCE_SCALING_FACTOR": "1.23", + "HRORTHO.GEOMETRIC_CALIB_FILE_NAME": "calib_file_name", + "HRORTHO.EXTORI_FILE_NAME": "extori'_file_name", + "M94_INSTRUMENT.MISSION_PHASE_NAME": "MISSION_PHASE_NAME", + "HRCONVER.MISSING_FRAMES": "0", + "DLRTO8.RADIANCE_OFFSET": "1.23", + "HRCONVER.OVERFLOW_FRAMES": "0", + "SPACECRAFT_NAME": "MARS EXPRESS", + "HRFOOT.BEST_GROUND_SAMPLING_DISTANCE": "1.23", + "M94_ORBIT.START_TIME": "start_time", + "HRORTHO.DTM_NAME": "dtm_name", + "DLRTO8.REFLECTANCE_SCALING_FACTOR": "2.34", + "HRCONVER.ERROR_FRAMES": "1", + } md = ds.GetMetadata() if len(md) != len(expected_md): print(sorted(md.keys())) @@ -75,40 +96,42 @@ def test_vicar_1(): for key in expected_md: assert md[key] == expected_md[key] - assert ds.GetMetadataDomainList() == ['', 'json:VICAR'] - lbl = ds.GetMetadata_List('json:VICAR')[0] + assert ds.GetMetadataDomainList() == ["", "json:VICAR"] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['LBLSIZE'] == 9680 - assert lbl['FORMAT'] == 'BYTE' - assert lbl['PROPERTY']['M94_ORBIT']['ASCENDING_NODE_LONGITUDE'] == 118.46 - assert lbl['PROPERTY']['M94_ORBIT']['SPACECRAFT_ORIENTATION'] == [0.0, -1.0, 0.0] - assert lbl['TASK']['HRCONVER']['SPICE_FILE_NAME'] == ['foo'] - assert lbl['TASK']['HRORTHO']['EXTORI_FILE_NAME'] == "extori'_file_name" + assert lbl["LBLSIZE"] == 9680 + assert lbl["FORMAT"] == "BYTE" + assert lbl["PROPERTY"]["M94_ORBIT"]["ASCENDING_NODE_LONGITUDE"] == 118.46 + assert lbl["PROPERTY"]["M94_ORBIT"]["SPACECRAFT_ORIENTATION"] == [0.0, -1.0, 0.0] + assert lbl["TASK"]["HRCONVER"]["SPICE_FILE_NAME"] == ["foo"] + assert lbl["TASK"]["HRORTHO"]["EXTORI_FILE_NAME"] == "extori'_file_name" + read_datatypes_lists = [ - ('vicar_byte', gdal.GDT_Byte, 129), - ('vicar_int16', gdal.GDT_Int16, 129), - ('vicar_bigendian_int16', gdal.GDT_Int16, 129), - ('vicar_int32', gdal.GDT_Int32, 129), - ('vicar_float32_bsq', gdal.GDT_Float32, 123), - ('vicar_float32_bil', gdal.GDT_Float32, 123), - ('vicar_float32_bip', gdal.GDT_Float32, 123), - ('vicar_bigendian_float32', gdal.GDT_Float32, 129), - ('vicar_float64', gdal.GDT_Float64, 129), - ('vicar_cfloat32', gdal.GDT_CFloat32, 148), - ('vicar_vax_float32', gdal.GDT_Float32, 129), - ('vicar_vax_float64', gdal.GDT_Float64, 129), - ('vicar_vax_cfloat32', gdal.GDT_CFloat32, 226), + ("vicar_byte", gdal.GDT_Byte, 129), + ("vicar_int16", gdal.GDT_Int16, 129), + ("vicar_bigendian_int16", gdal.GDT_Int16, 129), + ("vicar_int32", gdal.GDT_Int32, 129), + ("vicar_float32_bsq", gdal.GDT_Float32, 123), + ("vicar_float32_bil", gdal.GDT_Float32, 123), + ("vicar_float32_bip", gdal.GDT_Float32, 123), + ("vicar_bigendian_float32", gdal.GDT_Float32, 129), + ("vicar_float64", gdal.GDT_Float64, 129), + ("vicar_cfloat32", gdal.GDT_CFloat32, 148), + ("vicar_vax_float32", gdal.GDT_Float32, 129), + ("vicar_vax_float64", gdal.GDT_Float64, 129), + ("vicar_vax_cfloat32", gdal.GDT_CFloat32, 226), ] + @pytest.mark.parametrize( - 'filename,dt,checksum', + "filename,dt,checksum", read_datatypes_lists, ids=[tup[0] for tup in read_datatypes_lists], ) def test_vicar_read_datatypes(filename, dt, checksum): - ds = gdal.Open('data/vicar/%s.vic' % filename) + ds = gdal.Open("data/vicar/%s.vic" % filename) assert ds.GetLayerCount() == 0 assert not ds.GetLayer(0) b = ds.GetRasterBand(1) @@ -117,179 +140,209 @@ def test_vicar_read_datatypes(filename, dt, checksum): b = None ds = None - gdal.FileFromMemBuffer('/vsimem/test.vic', open('data/vicar/%s.vic' % filename, 'rb').read()) - ds = gdal.Open('/vsimem/test.vic', gdal.GA_Update) + gdal.FileFromMemBuffer( + "/vsimem/test.vic", open("data/vicar/%s.vic" % filename, "rb").read() + ) + ds = gdal.Open("/vsimem/test.vic", gdal.GA_Update) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ds.ReadRaster()) ds = None - ds = gdal.Open('/vsimem/test.vic') + ds = gdal.Open("/vsimem/test.vic") assert ds.GetRasterBand(1).Checksum() == checksum ds = None - gdal.Unlink('/vsimem/test.vic') + gdal.Unlink("/vsimem/test.vic") def test_vicar_read_binary_prefix(): - ds = gdal.OpenEx('data/vicar/vicar_binary_prefix.vic') + ds = gdal.OpenEx("data/vicar/vicar_binary_prefix.vic") assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr - assert not lyr.TestCapability('') + assert not lyr.TestCapability("") f = lyr.GetNextFeature() assert f - assert json.loads(f.ExportToJson()) == {"geometry": None, "type": "Feature", "properties": {"short": -32768, "int": -2147483648, "unsigned_char": 255, "float": 1.25, "double": 3.25, "unsigned_int": 4294967295, "unsigned_short": 65535}, "id": 0} + assert json.loads(f.ExportToJson()) == { + "geometry": None, + "type": "Feature", + "properties": { + "short": -32768, + "int": -2147483648, + "unsigned_char": 255, + "float": 1.25, + "double": 3.25, + "unsigned_int": 4294967295, + "unsigned_short": 65535, + }, + "id": 0, + } assert not lyr.GetNextFeature() lyr.ResetReading() assert lyr.GetNextFeature() ds = None - assert ogr.Open('data/vicar/vicar_binary_prefix.vic') - assert not ogr.Open('data/vicar/vicar_byte.vic') + assert ogr.Open("data/vicar/vicar_binary_prefix.vic") + assert not ogr.Open("data/vicar/vicar_byte.vic") def test_vicar_create(): - filename = '/vsimem/test.vic' + filename = "/vsimem/test.vic" md = { - 'LBLSIZE': 1234, - 'BLTYPE': 'foo', - 'PROPERTY': - { - 'MYPROP': - { - 'INT': 1, - 'INT64': 1234567890123, - 'REAL': 1.25, - 'ARRAY_INT': [1,2], - 'ARRAY_STRING': ['a','b'], - 'STRING': "eh'eh" + "LBLSIZE": 1234, + "BLTYPE": "foo", + "PROPERTY": { + "MYPROP": { + "INT": 1, + "INT64": 1234567890123, + "REAL": 1.25, + "ARRAY_INT": [1, 2], + "ARRAY_STRING": ["a", "b"], + "STRING": "eh'eh", + }, + "APPROX": { + "NULL": None, + "BOOL_TRUE": True, + "BOOL_FALSE": False, + "OBJ": {"a": "b"}, }, - 'APPROX': - { - 'NULL': None, - 'BOOL_TRUE': True, - 'BOOL_FALSE': False, - 'OBJ': {"a": "b"} - } }, - 'TASK': - { - 'GEN': - { - 'USER': 'even', - 'DAT_TIM': 'Thu Sep 24 17:31:50 1992', - 'OTHER_PROP': 'foo' + "TASK": { + "GEN": { + "USER": "even", + "DAT_TIM": "Thu Sep 24 17:31:50 1992", + "OTHER_PROP": "foo", } - } + }, } - src_ds = gdal.Open('data/rgbsmall.tif') - ds = gdal.GetDriverByName('VICAR').Create( - filename, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, gdal.GDT_Byte) + src_ds = gdal.Open("data/rgbsmall.tif") + ds = gdal.GetDriverByName("VICAR").Create( + filename, + src_ds.RasterXSize, + src_ds.RasterYSize, + src_ds.RasterCount, + gdal.GDT_Byte, + ) ds.SetMetadata([json.dumps(md)], "json:VICAR") ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.ReadRaster()) ds = None - assert not gdal.VSIStatL(filename + '.aux.xml') + assert not gdal.VSIStatL(filename + ".aux.xml") ds = gdal.Open(filename) - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == \ - [src_ds.GetRasterBand(i+1).Checksum() for i in range(src_ds.RasterCount)] - lbl = ds.GetMetadata_List('json:VICAR')[0] + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + src_ds.GetRasterBand(i + 1).Checksum() for i in range(src_ds.RasterCount) + ] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['LBLSIZE'] == 600 - assert lbl['BLTYPE'] == 'foo' - assert lbl['PROPERTY']['MYPROP'] == md['PROPERTY']['MYPROP'] - assert lbl['PROPERTY']['APPROX'] == { 'NULL': 'NULL', 'BOOL_TRUE': 1, 'BOOL_FALSE': 0, 'OBJ': '{"a":"b"}' } - assert lbl['TASK'] == md['TASK'] - - filename2 = '/vsimem/test2.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename2, ds) - assert not gdal.VSIStatL(filename2 + '.aux.xml') + assert lbl["LBLSIZE"] == 600 + assert lbl["BLTYPE"] == "foo" + assert lbl["PROPERTY"]["MYPROP"] == md["PROPERTY"]["MYPROP"] + assert lbl["PROPERTY"]["APPROX"] == { + "NULL": "NULL", + "BOOL_TRUE": 1, + "BOOL_FALSE": 0, + "OBJ": '{"a":"b"}', + } + assert lbl["TASK"] == md["TASK"] + + filename2 = "/vsimem/test2.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy(filename2, ds) + assert not gdal.VSIStatL(filename2 + ".aux.xml") ds = None ds = gdal.Open(filename2) - assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == \ - [src_ds.GetRasterBand(i+1).Checksum() for i in range(src_ds.RasterCount)] - lbl = ds.GetMetadata_List('json:VICAR')[0] + assert [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] == [ + src_ds.GetRasterBand(i + 1).Checksum() for i in range(src_ds.RasterCount) + ] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['LBLSIZE'] == 600 - assert lbl['BLTYPE'] == 'foo' - assert lbl['PROPERTY']['MYPROP'] == md['PROPERTY']['MYPROP'] - assert lbl['PROPERTY']['APPROX'] == { 'NULL': 'NULL', 'BOOL_TRUE': 1, 'BOOL_FALSE': 0, 'OBJ': '{"a":"b"}' } - assert lbl['TASK'] == md['TASK'] + assert lbl["LBLSIZE"] == 600 + assert lbl["BLTYPE"] == "foo" + assert lbl["PROPERTY"]["MYPROP"] == md["PROPERTY"]["MYPROP"] + assert lbl["PROPERTY"]["APPROX"] == { + "NULL": "NULL", + "BOOL_TRUE": 1, + "BOOL_FALSE": 0, + "OBJ": '{"a":"b"}', + } + assert lbl["TASK"] == md["TASK"] ds = None - gdal.GetDriverByName('VICAR').Delete(filename) - gdal.GetDriverByName('VICAR').Delete(filename2) + gdal.GetDriverByName("VICAR").Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename2) + create_datatypes_lists = [ - 'vicar_byte', - 'vicar_int16', - 'vicar_bigendian_float32', - 'vicar_float64', - 'vicar_cfloat32', + "vicar_byte", + "vicar_int16", + "vicar_bigendian_float32", + "vicar_float64", + "vicar_cfloat32", ] -@pytest.mark.parametrize( - 'filename', - create_datatypes_lists -) + +@pytest.mark.parametrize("filename", create_datatypes_lists) def test_vicar_create_all_data_types(filename): - dstfilename = '/vsimem/test.vic' - src_ds = gdal.Open('data/vicar/' + filename + '.vic') - assert gdal.GetDriverByName('VICAR').CreateCopy(dstfilename, src_ds) + dstfilename = "/vsimem/test.vic" + src_ds = gdal.Open("data/vicar/" + filename + ".vic") + assert gdal.GetDriverByName("VICAR").CreateCopy(dstfilename, src_ds) ds = gdal.Open(dstfilename) assert ds.GetRasterBand(1).DataType == src_ds.GetRasterBand(1).DataType assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('VICAR').Delete(dstfilename) + gdal.GetDriverByName("VICAR").Delete(dstfilename) def test_vicar_create_label_option_as_inline_value(): - filename = '/vsimem/test.vic' - assert gdal.GetDriverByName('VICAR').Create( - filename, 1, 1, 1, gdal.GDT_Byte, options = ['LABEL={"BLTYPE":"foo"}']) + filename = "/vsimem/test.vic" + assert gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, gdal.GDT_Byte, options=['LABEL={"BLTYPE":"foo"}'] + ) ds = gdal.Open(filename) - lbl = ds.GetMetadata_List('json:VICAR')[0] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['BLTYPE'] == 'foo' + assert lbl["BLTYPE"] == "foo" ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_create_label_option_as_inline_value_error(): - filename = '/vsimem/test.vic' + filename = "/vsimem/test.vic" with gdaltest.error_handler(): - assert not gdal.GetDriverByName('VICAR').Create( - filename, 1, 1, 1, gdal.GDT_Byte, options = ['LABEL={error']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, gdal.GDT_Byte, options=["LABEL={error"] + ) gdal.Unlink(filename) def test_vicar_create_label_option_as_filename(): - filename = '/vsimem/test.vic' - json_filename = '/vsimem/test.json' + filename = "/vsimem/test.vic" + json_filename = "/vsimem/test.json" gdal.FileFromMemBuffer(json_filename, '{"BLTYPE":"foo"}') - assert gdal.GetDriverByName('VICAR').Create( - filename, 1, 1, 1, gdal.GDT_Byte, options = ['LABEL=' + json_filename]) + assert gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, gdal.GDT_Byte, options=["LABEL=" + json_filename] + ) gdal.Unlink(json_filename) ds = gdal.Open(filename) - lbl = ds.GetMetadata_List('json:VICAR')[0] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['BLTYPE'] == 'foo' + assert lbl["BLTYPE"] == "foo" ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_create_label_option_as_filename_error(): - filename = '/vsimem/test.vic' - json_filename = '/vsimem/test.json' - gdal.FileFromMemBuffer(json_filename, 'error') + filename = "/vsimem/test.vic" + json_filename = "/vsimem/test.json" + gdal.FileFromMemBuffer(json_filename, "error") with gdaltest.error_handler(): - assert not gdal.GetDriverByName('VICAR').Create( - filename, 1, 1, 1, gdal.GDT_Byte, options = ['LABEL=' + json_filename]) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, gdal.GDT_Byte, options=["LABEL=" + json_filename] + ) gdal.Unlink(json_filename) gdal.Unlink(filename) @@ -297,10 +350,14 @@ def test_vicar_create_label_option_as_filename_error(): @pytest.mark.parametrize("georef_format", ["MIPL", "GEOTIFF"]) def test_vicar_create_georeferencing(georef_format): - src_ds = gdal.Open('data/vicar/test_vicar_truncated.bin') - filename = '/vsimem/test.vic' - ds = gdal.GetDriverByName('VICAR').Create(filename, src_ds.RasterXSize, src_ds.RasterYSize, - options = ['GEOREF_FORMAT=' + georef_format]) + src_ds = gdal.Open("data/vicar/test_vicar_truncated.bin") + filename = "/vsimem/test.vic" + ds = gdal.GetDriverByName("VICAR").Create( + filename, + src_ds.RasterXSize, + src_ds.RasterYSize, + options=["GEOREF_FORMAT=" + georef_format], + ) ds.SetGeoTransform(src_ds.GetGeoTransform()) ds.SetSpatialRef(src_ds.GetSpatialRef()) ds = None @@ -308,52 +365,54 @@ def test_vicar_create_georeferencing(georef_format): ds = gdal.Open(filename) assert ds.GetGeoTransform() == src_ds.GetGeoTransform() assert ds.GetSpatialRef().IsSame(src_ds.GetSpatialRef()) - lbl = ds.GetMetadata_List('json:VICAR')[0] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - if georef_format == 'MIPL': - assert 'MAP' in lbl['PROPERTY'] - assert 'GEOTIFF' not in lbl['PROPERTY'] + if georef_format == "MIPL": + assert "MAP" in lbl["PROPERTY"] + assert "GEOTIFF" not in lbl["PROPERTY"] else: - assert 'GEOTIFF' in lbl['PROPERTY'] - assert 'MAP' not in lbl['PROPERTY'] + assert "GEOTIFF" in lbl["PROPERTY"] + assert "MAP" not in lbl["PROPERTY"] - filename2 = '/vsimem/test2.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename2, ds, - options = ['GEOREF_FORMAT=' + georef_format]) + filename2 = "/vsimem/test2.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy( + filename2, ds, options=["GEOREF_FORMAT=" + georef_format] + ) ds = None ds = gdal.Open(filename2) assert ds.GetGeoTransform() == src_ds.GetGeoTransform() assert ds.GetSpatialRef().IsSame(src_ds.GetSpatialRef()) - lbl = ds.GetMetadata_List('json:VICAR')[0] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - if georef_format == 'MIPL': - assert 'MAP' in lbl['PROPERTY'] - assert 'GEOTIFF' not in lbl['PROPERTY'] + if georef_format == "MIPL": + assert "MAP" in lbl["PROPERTY"] + assert "GEOTIFF" not in lbl["PROPERTY"] else: - assert 'GEOTIFF' in lbl['PROPERTY'] - assert 'MAP' not in lbl['PROPERTY'] + assert "GEOTIFF" in lbl["PROPERTY"] + assert "MAP" not in lbl["PROPERTY"] ds = None - gdal.GetDriverByName('VICAR').Delete(filename) - gdal.GetDriverByName('VICAR').Delete(filename2) + gdal.GetDriverByName("VICAR").Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename2) compressed_datasets_lists = [ - ('vicar_byte_basic', gdal.GDT_Byte, 4672), # BASIC compression - ('vicar_byte_basic2', gdal.GDT_Byte, 4672), # BASIC2 compression - ('vicar_int16_basic2', gdal.GDT_Int16, 4672), # BASIC2 compression - ('vicar_all_ones_basic2', gdal.GDT_Byte, 34464), # BASIC2 compression + ("vicar_byte_basic", gdal.GDT_Byte, 4672), # BASIC compression + ("vicar_byte_basic2", gdal.GDT_Byte, 4672), # BASIC2 compression + ("vicar_int16_basic2", gdal.GDT_Int16, 4672), # BASIC2 compression + ("vicar_all_ones_basic2", gdal.GDT_Byte, 34464), # BASIC2 compression ] + @pytest.mark.parametrize( - 'filename,dt,checksum', + "filename,dt,checksum", compressed_datasets_lists, ids=[tup[0] for tup in compressed_datasets_lists], ) def test_vicar_read_compressed_datasets(filename, dt, checksum): - ds = gdal.Open('data/vicar/%s.vic' % filename) + ds = gdal.Open("data/vicar/%s.vic" % filename) assert ds.GetLayerCount() == 0 assert not ds.GetLayer(0) b = ds.GetRasterBand(1) @@ -363,88 +422,109 @@ def test_vicar_read_compressed_datasets(filename, dt, checksum): def test_vicar_write_basic(): - src_ds = gdal.Open('data/vicar/vicar_byte_basic.vic') + src_ds = gdal.Open("data/vicar/vicar_byte_basic.vic") - filename= '/vsimem/test.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename, src_ds, options = ['COMPRESS=BASIC']) + filename = "/vsimem/test.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy( + filename, src_ds, options=["COMPRESS=BASIC"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESS', 'IMAGE_STRUCTURE') == 'BASIC' + assert ds.GetMetadataItem("COMPRESS", "IMAGE_STRUCTURE") == "BASIC" assert ds.GetRasterBand(1).Checksum() == 4672 - lbl = ds.GetMetadata_List('json:VICAR')[0] + lbl = ds.GetMetadata_List("json:VICAR")[0] lbl = json.loads(lbl) - assert lbl['EOCI1'] == 1040 - assert lbl['EOCI2'] == 0 + assert lbl["EOCI1"] == 1040 + assert lbl["EOCI2"] == 0 ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_write_basic2(): - src_ds = gdal.Open('data/vicar/vicar_byte_basic.vic') + src_ds = gdal.Open("data/vicar/vicar_byte_basic.vic") - filename= '/vsimem/test.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename, src_ds, options = ['COMPRESS=BASIC2']) + filename = "/vsimem/test.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy( + filename, src_ds, options=["COMPRESS=BASIC2"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESS', 'IMAGE_STRUCTURE') == 'BASIC2' + assert ds.GetMetadataItem("COMPRESS", "IMAGE_STRUCTURE") == "BASIC2" assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_write_basic2_int16(): - src_ds = gdal.Open('data/vicar/vicar_int16_basic2.vic') + src_ds = gdal.Open("data/vicar/vicar_int16_basic2.vic") - filename= '/vsimem/test.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename, src_ds, options = ['COMPRESS=BASIC2']) + filename = "/vsimem/test.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy( + filename, src_ds, options=["COMPRESS=BASIC2"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESS', 'IMAGE_STRUCTURE') == 'BASIC2' + assert ds.GetMetadataItem("COMPRESS", "IMAGE_STRUCTURE") == "BASIC2" assert ds.GetRasterBand(1).Checksum() == 4672 ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_write_basic2_all_ones(): - src_ds = gdal.Open('data/vicar/vicar_all_ones_basic2.vic') + src_ds = gdal.Open("data/vicar/vicar_all_ones_basic2.vic") - filename= '/vsimem/test.vic' - assert gdal.GetDriverByName('VICAR').CreateCopy(filename, src_ds, options = ['COMPRESS=BASIC2']) + filename = "/vsimem/test.vic" + assert gdal.GetDriverByName("VICAR").CreateCopy( + filename, src_ds, options=["COMPRESS=BASIC2"] + ) ds = gdal.Open(filename) - assert ds.GetMetadataItem('COMPRESS', 'IMAGE_STRUCTURE') == 'BASIC2' + assert ds.GetMetadataItem("COMPRESS", "IMAGE_STRUCTURE") == "BASIC2" assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('VICAR').Delete(filename) + gdal.GetDriverByName("VICAR").Delete(filename) def test_vicar_write_compression_errors(): - filename= '/vsimem/test.vic' + filename = "/vsimem/test.vic" with gdaltest.error_handler(): # Only single-band supported - assert not gdal.GetDriverByName('VICAR').Create(filename, 1, 1, 2, options = ['COMPRESS=BASIC']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 2, options=["COMPRESS=BASIC"] + ) # Unknown compression method - assert not gdal.GetDriverByName('VICAR').Create(filename, 1, 1, 1, options = ['COMPRESS=UNKNOWN']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, options=["COMPRESS=UNKNOWN"] + ) # Only integer data types supported - assert not gdal.GetDriverByName('VICAR').Create(filename, 1, 1, 1, gdal.GDT_Float32, options = ['COMPRESS=BASIC']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1, 1, gdal.GDT_Float32, options=["COMPRESS=BASIC"] + ) # Too many lines - assert not gdal.GetDriverByName('VICAR').Create(filename, 1, 1000*1000*1000, 1, options = ['COMPRESS=BASIC']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 1, 1000 * 1000 * 1000, 1, options=["COMPRESS=BASIC"] + ) # Too many columns - assert not gdal.GetDriverByName('VICAR').Create(filename, 2000*1000*1000, 1, 1, options = ['COMPRESS=BASIC']) + assert not gdal.GetDriverByName("VICAR").Create( + filename, 2000 * 1000 * 1000, 1, 1, options=["COMPRESS=BASIC"] + ) - ds = gdal.GetDriverByName('VICAR').Create(filename, 1, 2, 1, options = ['COMPRESS=BASIC']) + ds = gdal.GetDriverByName("VICAR").Create( + filename, 1, 2, 1, options=["COMPRESS=BASIC"] + ) # Non sequential writing of lines - ds.WriteRaster(0, 1, 1, 1, 'x') + ds.WriteRaster(0, 1, 1, 1, "x") with gdaltest.error_handler(): ds.FlushCache() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ds = None gdal.Unlink(filename) def test_vicar_open_from_pds3(): - gdal.FileFromMemBuffer('/vsimem/test', - """PDS_VERSION_ID = "PDS3" + gdal.FileFromMemBuffer( + "/vsimem/test", + """PDS_VERSION_ID = "PDS3" RECORD_BYTES = 1 ^IMAGE_HEADER = 489 ^IMAGE = 757 @@ -458,15 +538,16 @@ def test_vicar_open_from_pds3(): END LBLSIZE=268 FORMAT='BYTE' TYPE='IMAGE' BUFSIZ=20480 DIM=3 EOL=0 RECSIZE=1 ORG='BSQ' NL=1 NS=1 NB=1 N1=1 N2=1 N3=1 N4=0 NBB=0 NLB=0 HOST='X86-64-LINX' INTFMT='LOW' REALFMT='RIEEE' BHOST='VAX-VMS' BINTFMT='LOW' BREALFMT='VAX' BLTYPE='' x -""") +""", + ) - ds = gdal.Open('/vsimem/test') + ds = gdal.Open("/vsimem/test") assert ds - assert ds.GetDriver().ShortName == 'PDS' - assert struct.unpack('B', ds.GetRasterBand(1).ReadRaster())[0] == ord('x') + assert ds.GetDriver().ShortName == "PDS" + assert struct.unpack("B", ds.GetRasterBand(1).ReadRaster())[0] == ord("x") - with gdaltest.config_option('GDAL_TRY_PDS3_WITH_VICAR', 'YES'): - ds = gdal.Open('/vsimem/test') + with gdaltest.config_option("GDAL_TRY_PDS3_WITH_VICAR", "YES"): + ds = gdal.Open("/vsimem/test") assert ds - assert ds.GetDriver().ShortName == 'VICAR' - assert struct.unpack('B', ds.GetRasterBand(1).ReadRaster())[0] == ord('x') + assert ds.GetDriver().ShortName == "VICAR" + assert struct.unpack("B", ds.GetRasterBand(1).ReadRaster())[0] == ord("x") diff --git a/autotest/gdrivers/vrtderived.py b/autotest/gdrivers/vrtderived.py index f56f69036ae7..3cdfcc776b53 100755 --- a/autotest/gdrivers/vrtderived.py +++ b/autotest/gdrivers/vrtderived.py @@ -31,87 +31,90 @@ import os import threading -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + def _xmlsearch(root, nodetype, name): for node in root[2:]: if node[0] == nodetype and node[1] == name: return node + ############################################################################### # Verify raster band subClass def test_vrtderived_1(): - filename = 'tmp/derived.vrt' - vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) + filename = "tmp/derived.vrt" + vrt_ds = gdal.GetDriverByName("VRT").Create(filename, 50, 50, 0) options = [ - 'subClass=VRTDerivedRasterBand', + "subClass=VRTDerivedRasterBand", ] vrt_ds.AddBand(gdal.GDT_Byte, options) - simpleSourceXML = ''' + simpleSourceXML = """ data/byte.tif 1 - ''' + """ md = {} - md['source_0'] = simpleSourceXML + md["source_0"] = simpleSourceXML - vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') - md_read = vrt_ds.GetRasterBand(1).GetMetadata('vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadata(md, "vrt_sources") + md_read = vrt_ds.GetRasterBand(1).GetMetadata("vrt_sources") vrt_ds = None expected_md_read = ( - '\n' + "\n" ' data/byte.tif\n' - ' 1\n') - assert expected_md_read in md_read['source_0'] + " 1\n" + ) + assert expected_md_read in md_read["source_0"] xmlstring = open(filename).read() gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) - node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') - node = _xmlsearch(node, gdal.CXT_Attribute, 'subClass') - node = _xmlsearch(node, gdal.CXT_Text, 'VRTDerivedRasterBand') - assert node is not None, 'invalid subclass' + node = _xmlsearch(node, gdal.CXT_Element, "VRTRasterBand") + node = _xmlsearch(node, gdal.CXT_Attribute, "subClass") + node = _xmlsearch(node, gdal.CXT_Text, "VRTDerivedRasterBand") + assert node is not None, "invalid subclass" + ############################################################################### # Verify derived raster band pixel function type def test_vrtderived_2(): - filename = 'tmp/derived.vrt' - vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) + filename = "tmp/derived.vrt" + vrt_ds = gdal.GetDriverByName("VRT").Create(filename, 50, 50, 0) options = [ - 'subClass=VRTDerivedRasterBand', - 'PixelFunctionType=dummy', - 'PixelFunctionLanguage=Python', + "subClass=VRTDerivedRasterBand", + "PixelFunctionType=dummy", + "PixelFunctionLanguage=Python", ] vrt_ds.AddBand(gdal.GDT_Byte, options) - simpleSourceXML = ''' + simpleSourceXML = """ data/byte.tif 1 - ''' + """ md = {} - md['source_0'] = simpleSourceXML + md["source_0"] = simpleSourceXML - vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadata(md, "vrt_sources") with gdaltest.error_handler(): cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 0 with gdaltest.error_handler(): - ret = vrt_ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, ' ') + ret = vrt_ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, " ") assert ret != 0 vrt_ds = None @@ -119,66 +122,69 @@ def test_vrtderived_2(): gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) - node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') - pixelfunctiontype = _xmlsearch(node, gdal.CXT_Element, 'PixelFunctionType') - pixelfunctiontype = _xmlsearch(pixelfunctiontype, gdal.CXT_Text, 'dummy') - assert pixelfunctiontype is not None, 'incorrect PixelFunctionType value' - pixelfunctionlanguage = _xmlsearch(node, gdal.CXT_Element, 'PixelFunctionLanguage') - pixelfunctionlanguage = _xmlsearch(pixelfunctionlanguage, gdal.CXT_Text, 'Python') - assert pixelfunctionlanguage is not None, 'incorrect PixelFunctionLanguage value' + node = _xmlsearch(node, gdal.CXT_Element, "VRTRasterBand") + pixelfunctiontype = _xmlsearch(node, gdal.CXT_Element, "PixelFunctionType") + pixelfunctiontype = _xmlsearch(pixelfunctiontype, gdal.CXT_Text, "dummy") + assert pixelfunctiontype is not None, "incorrect PixelFunctionType value" + pixelfunctionlanguage = _xmlsearch(node, gdal.CXT_Element, "PixelFunctionLanguage") + pixelfunctionlanguage = _xmlsearch(pixelfunctionlanguage, gdal.CXT_Text, "Python") + assert pixelfunctionlanguage is not None, "incorrect PixelFunctionLanguage value" + ############################################################################### # Verify derived raster band transfer type def test_vrtderived_3(): - filename = 'tmp/derived.vrt' - vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) + filename = "tmp/derived.vrt" + vrt_ds = gdal.GetDriverByName("VRT").Create(filename, 50, 50, 0) options = [ - 'subClass=VRTDerivedRasterBand', - 'PixelFunctionType=dummy', - 'SourceTransferType=Byte', + "subClass=VRTDerivedRasterBand", + "PixelFunctionType=dummy", + "SourceTransferType=Byte", ] vrt_ds.AddBand(gdal.GDT_Byte, options) - simpleSourceXML = ''' + simpleSourceXML = """ data/byte.tif 1 - ''' + """ md = {} - md['source_0'] = simpleSourceXML + md["source_0"] = simpleSourceXML - vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadata(md, "vrt_sources") vrt_ds = None xmlstring = open(filename).read() gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) - node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') - node = _xmlsearch(node, gdal.CXT_Element, 'SourceTransferType') - node = _xmlsearch(node, gdal.CXT_Text, 'Byte') - assert node is not None, 'incorrect SourceTransferType value' + node = _xmlsearch(node, gdal.CXT_Element, "VRTRasterBand") + node = _xmlsearch(node, gdal.CXT_Element, "SourceTransferType") + node = _xmlsearch(node, gdal.CXT_Text, "Byte") + assert node is not None, "incorrect SourceTransferType value" + ############################################################################### # Check handling of invalid derived raster band transfer type def test_vrtderived_4(): - filename = 'tmp/derived.vrt' - vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) + filename = "tmp/derived.vrt" + vrt_ds = gdal.GetDriverByName("VRT").Create(filename, 50, 50, 0) options = [ - 'subClass=VRTDerivedRasterBand', - 'PixelFunctionType=dummy', - 'SourceTransferType=Invalid', + "subClass=VRTDerivedRasterBand", + "PixelFunctionType=dummy", + "SourceTransferType=Invalid", ] - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = vrt_ds.AddBand(gdal.GDT_Byte, options) gdal.PopErrorHandler() - assert ret != 0, 'invalid SourceTransferType value not detected' + assert ret != 0, "invalid SourceTransferType value not detected" + ############################################################################### # Check Python derived function with BufferRadius=1 @@ -188,15 +194,17 @@ def test_vrtderived_5(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') - ds = gdal.Open('data/vrt/n43_hillshade.vrt') + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") + ds = gdal.Open("data/vrt/n43_hillshade.vrt") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) - assert cs == 50577, 'invalid checksum' + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) + assert cs == 50577, "invalid checksum" + ############################################################################### # Check Python derived function with BufferRadius=0 and no source @@ -206,15 +214,17 @@ def test_vrtderived_6(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') - ds = gdal.Open('data/vrt/python_ones.vrt') + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") + ds = gdal.Open("data/vrt/python_ones.vrt") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) - assert cs == 10000, 'invalid checksum' + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) + assert cs == 10000, "invalid checksum" + ############################################################################### # Check Python derived function with no started Python interpreter @@ -223,52 +233,69 @@ def test_vrtderived_6(): def test_vrtderived_7(): import test_cli_utilities + if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES') - if gdal.GetConfigOption('CPL_DEBUG') is not None: + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + " -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES" + ) + if gdal.GetConfigOption("CPL_DEBUG") is not None: print(err) # Either we cannot find a Python library, either it works - if 'Checksum=0' in ret: - print('Did not manage to find a Python library') - elif 'Checksum=50577' not in ret: + if "Checksum=0" in ret: + print("Did not manage to find a Python library") + elif "Checksum=50577" not in ret: print(err) pytest.fail(ret) - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_PATH NO') - if gdal.GetConfigOption('CPL_DEBUG') is not None: + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + " -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_PATH NO" + ) + if gdal.GetConfigOption("CPL_DEBUG") is not None: print(err) -# Either we cannot find a Python library, either it works - if 'Checksum=0' in ret: - print('Did not manage to find a Python library') - elif 'Checksum=50577' not in ret: + # Either we cannot find a Python library, either it works + if "Checksum=0" in ret: + print("Did not manage to find a Python library") + elif "Checksum=50577" not in ret: print(err) pytest.fail(ret) - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_SYMLINK NO') - if gdal.GetConfigOption('CPL_DEBUG') is not None: + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + " -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_SYMLINK NO" + ) + if gdal.GetConfigOption("CPL_DEBUG") is not None: print(err) -# Either we cannot find a Python library, either it works - if 'Checksum=0' in ret: - print('Did not manage to find a Python library') - elif 'Checksum=50577' not in ret: + # Either we cannot find a Python library, either it works + if "Checksum=0" in ret: + print("Did not manage to find a Python library") + elif "Checksum=50577" not in ret: print(err) pytest.fail(ret) # Invalid shared object name - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO foo') - if gdal.GetConfigOption('CPL_DEBUG') is not None: + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + " -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO foo" + ) + if gdal.GetConfigOption("CPL_DEBUG") is not None: print(err) - assert 'Checksum=0' in ret, err + assert "Checksum=0" in ret, err # Valid shared object name, but without Python symbols - libgdal_so = gdaltest.find_lib('gdal') + libgdal_so = gdaltest.find_lib("gdal") if libgdal_so is not None: - ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO "%s"' % libgdal_so) - if gdal.GetConfigOption('CPL_DEBUG') is not None: + ret, err = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdalinfo_path() + + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO "%s"' + % libgdal_so + ) + if gdal.GetConfigOption("CPL_DEBUG") is not None: print(err) - assert 'Checksum=0' in ret, err + assert "Checksum=0" in ret, err ############################################################################### @@ -279,21 +306,23 @@ def test_vrtderived_8(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'NO') - ds = gdal.Open('data/vrt/n43_hillshade.vrt') + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "NO") + ds = gdal.Open("data/vrt/n43_hillshade.vrt") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) - assert cs == 0, 'invalid checksum' + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) + assert cs == 0, "invalid checksum" - ds = gdal.Open('data/vrt/n43_hillshade.vrt') + ds = gdal.Open("data/vrt/n43_hillshade.vrt") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - assert cs == 0, 'invalid checksum' + assert cs == 0, "invalid checksum" + ############################################################################### # Check various failure modes with Python functions @@ -303,34 +332,40 @@ def test_vrtderived_9(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() # Missing PixelFunctionType with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ Python -""") +""" + ) assert ds is None # Unsupported PixelFunctionLanguage with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ identity foo -""") +""" + ) assert ds is None # PixelFunctionCode can only be used with Python with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ identity -""") +""" + ) assert ds is None # BufferRadius can only be used with Python with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ identity 1 -""") +""" + ) assert ds is None # Invalid BufferRadius with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ identity Python -1 -""") +""" + ) assert ds is None # Error at Python code compilation (indentation error) - ds = gdal.Open(""" + ds = gdal.Open( + """ identity Python @@ -378,17 +419,19 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # Error at run time (in global code) - ds = gdal.Open(""" + ds = gdal.Open( + """ identity Python @@ -400,17 +443,19 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # Error at run time (in pixel function) - ds = gdal.Open(""" + ds = gdal.Open( + """ identity Python @@ -421,17 +466,19 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # User exception - ds = gdal.Open(""" + ds = gdal.Open( + """ identity Python @@ -442,17 +489,19 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # unknown_function - ds = gdal.Open(""" + ds = gdal.Open( + """ unknown_function Python @@ -463,17 +512,19 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # uncallable object - ds = gdal.Open(""" + ds = gdal.Open( + """ uncallable_object Python @@ -483,37 +534,40 @@ def identity(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize -""") - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') +""" + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # unknown_module - ds = gdal.Open(""" + ds = gdal.Open( + """ unknown_module.unknown_function Python -""") +""" + ) with gdaltest.error_handler(): - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') - + pytest.fail("invalid checksum") def vrtderived_code_that_only_makes_sense_with_GDAL_VRT_ENABLE_PYTHON_equal_IF_SAFE_but_that_is_now_disabled(): # untrusted import - ds = gdal.Open(""" + ds = gdal.Open( + """ my_func Python @@ -524,15 +578,17 @@ def my_func(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, -""") +""" + ) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # untrusted function - ds = gdal.Open(""" + ds = gdal.Open( + """ my_func Python @@ -543,33 +599,38 @@ def my_func(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, -""") +""" + ) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # GDAL_VRT_ENABLE_PYTHON not set to YES - ds = gdal.Open(""" + ds = gdal.Open( + """ vrtderived.one_pix_func Python -""") +""" + ) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") ############################################################################### # Check Python function in another module -def one_pix_func(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, r, gt, **kwargs): +def one_pix_func( + in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, r, gt, **kwargs +): # pylint: disable=unused-argument out_ar.fill(1) @@ -578,6 +639,7 @@ def test_vrtderived_10(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() @@ -592,12 +654,12 @@ def test_vrtderived_10(): """ ds = gdal.Open(content) - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 100: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # GDAL_VRT_TRUSTED_MODULES not defined ds = gdal.Open(content) @@ -605,36 +667,39 @@ def test_vrtderived_10(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # GDAL_VRT_PYTHON_TRUSTED_MODULES *NOT* matching our module - for val in ['vrtderive', - 'vrtderivedX', - 'vrtderivedX*', - 'vrtderive.*' - 'vrtderivedX.*']: + for val in [ + "vrtderive", + "vrtderivedX", + "vrtderivedX*", + "vrtderive.*" "vrtderivedX.*", + ]: ds = gdal.Open(content) - gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', val) + gdal.SetConfigOption("GDAL_VRT_PYTHON_TRUSTED_MODULES", val) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', None) + gdal.SetConfigOption("GDAL_VRT_PYTHON_TRUSTED_MODULES", None) if cs != 0: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # GDAL_VRT_PYTHON_TRUSTED_MODULES matching our module - for val in ['foo,vrtderived,bar', - '*', - 'foo,vrtderived*,bar', - 'foo,vrtderived.*,bar', - 'foo,vrtderi*,bar']: + for val in [ + "foo,vrtderived,bar", + "*", + "foo,vrtderived*,bar", + "foo,vrtderived.*,bar", + "foo,vrtderi*,bar", + ]: ds = gdal.Open(content) - gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', val) + gdal.SetConfigOption("GDAL_VRT_PYTHON_TRUSTED_MODULES", val) cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', None) + gdal.SetConfigOption("GDAL_VRT_PYTHON_TRUSTED_MODULES", None) if cs != 100: print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") ############################################################################### @@ -645,25 +710,34 @@ def test_vrtderived_11(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.FileFromMemBuffer('/vsimem/n43_hillshade.vrt', open('data/vrt/n43_hillshade.vrt', 'rb').read().decode('UTF-8').replace('../', '').encode('UTF-8')) - gdal.FileFromMemBuffer('/vsimem/n43.dt0', open('data/n43.dt0', 'rb').read()) - ds = gdal.Open('/vsimem/n43_hillshade.vrt', gdal.GA_Update) - ds.SetMetadataItem('foo', 'bar') + gdal.FileFromMemBuffer( + "/vsimem/n43_hillshade.vrt", + open("data/vrt/n43_hillshade.vrt", "rb") + .read() + .decode("UTF-8") + .replace("../", "") + .encode("UTF-8"), + ) + gdal.FileFromMemBuffer("/vsimem/n43.dt0", open("data/n43.dt0", "rb").read()) + ds = gdal.Open("/vsimem/n43_hillshade.vrt", gdal.GA_Update) + ds.SetMetadataItem("foo", "bar") ds = None - ds = gdal.Open('/vsimem/n43_hillshade.vrt') - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') + ds = gdal.Open("/vsimem/n43_hillshade.vrt") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) ds = None - gdal.Unlink('/vsimem/n43_hillshade.vrt') - gdal.Unlink('/vsimem/n43.dt0') + gdal.Unlink("/vsimem/n43_hillshade.vrt") + gdal.Unlink("/vsimem/n43.dt0") + + assert cs == 50577, "invalid checksum" - assert cs == 50577, 'invalid checksum' ############################################################################### # Test all data types with python code @@ -673,54 +747,71 @@ def test_vrtderived_12(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - for dt in ["Byte", "UInt16", "Int16", "UInt32", "Int32", - "Float32", "Float64", - "CInt16", "CInt32", "CFloat32", "CFloat64"]: - ds = gdal.Open(""" + for dt in [ + "Byte", + "UInt16", + "Int16", + "UInt32", + "Int32", + "Float32", + "Float64", + "CInt16", + "CInt32", + "CFloat32", + "CFloat64", + ]: + ds = gdal.Open( + """ Gray vrtderived.one_pix_func Python -""" % dt) +""" + % dt + ) - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) # CInt16/CInt32 do not map to native numpy types - if dt == 'CInt16' or dt == 'CInt32': + if dt == "CInt16" or dt == "CInt32": expected_cs = 0 # error else: expected_cs = 100 if cs != expected_cs: print(dt) print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") # Same for SourceTransferType for dt in ["CInt16", "CInt32"]: - ds = gdal.Open(""" + ds = gdal.Open( + """ Byte Gray vrtderived.one_pix_func Python -""" % dt) +""" + % dt + ) - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) if cs != 0: print(dt) print(gdal.GetLastErrorMsg()) - pytest.fail('invalid checksum') + pytest.fail("invalid checksum") ############################################################################### @@ -731,19 +822,23 @@ def test_vrtderived_13(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") # Will test the VRTDerivedRasterBand::IGetDataCoverageStatus() interface - ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrtderived_13.tif', gdal.Open('data/vrt/python_ones.vrt')) - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + ds = gdal.GetDriverByName("GTiff").CreateCopy( + "/vsimem/vrtderived_13.tif", gdal.Open("data/vrt/python_ones.vrt") + ) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/vrtderived_13.tif') + gdal.Unlink("/vsimem/vrtderived_13.tif") + + assert cs == 10000, "invalid checksum" - assert cs == 10000, 'invalid checksum' ############################################################################### # Test statistics functions @@ -753,26 +848,34 @@ def test_vrtderived_14(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") - ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtderived_14.vrt', gdal.Open('data/vrt/python_ones.vrt')) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") + ds = gdal.GetDriverByName("VRT").CreateCopy( + "/vsimem/vrtderived_14.vrt", gdal.Open("data/vrt/python_ones.vrt") + ) (my_min, my_max) = ds.GetRasterBand(1).ComputeRasterMinMax() (my_min2, my_max2, mean, stddev) = ds.GetRasterBand(1).ComputeStatistics(False) hist = ds.GetRasterBand(1).GetHistogram() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) - assert (my_min, my_max) == (1.0, 1.0), 'invalid ComputeRasterMinMax' + assert (my_min, my_max) == (1.0, 1.0), "invalid ComputeRasterMinMax" - assert (my_min2, my_max2, mean, stddev) == (1.0, 1.0, 1.0, 0.0), \ - 'invalid ComputeStatistics' + assert (my_min2, my_max2, mean, stddev) == ( + 1.0, + 1.0, + 1.0, + 0.0, + ), "invalid ComputeStatistics" - assert hist[1] == 10000, 'invalid GetHistogram' + assert hist[1] == 10000, "invalid GetHistogram" ds = None - gdal.GetDriverByName('VRT').Delete('/vsimem/vrtderived_14.vrt') + gdal.GetDriverByName("VRT").Delete("/vsimem/vrtderived_14.vrt") + ############################################################################### # Test threading @@ -793,7 +896,7 @@ def vrtderived_15_worker(args_dict): cs = ds.GetRasterBand(1).Checksum() if cs != 2304: print(cs) - args_dict['ret'] = False + args_dict["ret"] = False ds.FlushCache() @@ -801,28 +904,29 @@ def test_vrtderived_15(): try: import numpy + numpy.ones except (ImportError, AttributeError): pytest.skip() - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", "YES") threads = [] args_array = [] for i in range(4): - args_dict = {'ret': True} + args_dict = {"ret": True} t = threading.Thread(target=vrtderived_15_worker, args=(args_dict,)) args_array.append(args_dict) threads.append(t) t.start() - ret = 'success' + ret = "success" for i in range(4): threads[i].join() if not args_array[i]: - ret = 'fail' + ret = "fail" - gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) + gdal.SetConfigOption("GDAL_VRT_ENABLE_PYTHON", None) return ret @@ -830,11 +934,9 @@ def test_vrtderived_15(): ############################################################################### # Cleanup. + def test_vrtderived_cleanup(): try: - os.remove('tmp/derived.vrt') + os.remove("tmp/derived.vrt") except OSError: pass - - - diff --git a/autotest/gdrivers/vrtfilt.py b/autotest/gdrivers/vrtfilt.py index a98a71752b49..ac04174c5437 100755 --- a/autotest/gdrivers/vrtfilt.py +++ b/autotest/gdrivers/vrtfilt.py @@ -29,36 +29,37 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Verify simple 3x3 averaging filter. def test_vrtfilt_1(): - tst = gdaltest.GDALTest('VRT', 'vrt/avfilt.vrt', 1, 21890) + tst = gdaltest.GDALTest("VRT", "vrt/avfilt.vrt", 1, 21890) return tst.testOpen() + ############################################################################### # Verify simple 3x3 averaging filter (normalized) on a dataset with nodata def test_vrtfilt_2(): - ds = gdal.Open('data/vrt/test_vrt_filter_nodata.tif') + ds = gdal.Open("data/vrt/test_vrt_filter_nodata.tif") checksum = ds.GetRasterBand(1).Checksum() ds = None # This is a black&white checkboard, where black = nodata # Thus averaging it and taking nodata into account will not change it - tst = gdaltest.GDALTest('VRT', 'vrt/avfilt_nodata.vrt', 1, checksum) + tst = gdaltest.GDALTest("VRT", "vrt/avfilt_nodata.vrt", 1, checksum) return tst.testOpen() + ############################################################################### # Try SetMetadataItem('source_0', xml, 'vrt_sources') (fix for #3052). # Same result expected as for vrtfilt_1 @@ -66,8 +67,8 @@ def test_vrtfilt_2(): def test_vrtfilt_3(): - ds = gdal.OpenShared('data/rgbsmall.tif') - vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) + ds = gdal.OpenShared("data/rgbsmall.tif") + vrt_ds = gdal.GetDriverByName("VRT").CreateCopy("", ds) ds = None filterSourceXML = """ @@ -86,16 +87,17 @@ def test_vrtfilt_3(): except: pytest.skip() - vrt_ds.GetRasterBand(1).SetMetadataItem('source_0', filterSourceXML, 'vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadataItem("source_0", filterSourceXML, "vrt_sources") assert vrt_ds.GetRasterBand(1).Checksum() == 21890 + ############################################################################### # Variant for SetMetadataItem('source_0', xml, 'vrt_sources') def test_vrtfilt_4(): - vrt_ds = gdal.GetDriverByName('VRT').Create('', 50, 50, 1) + vrt_ds = gdal.GetDriverByName("VRT").Create("", 50, 50, 1) filterSourceXML = """ data/rgbsmall.tif @@ -113,16 +115,19 @@ def test_vrtfilt_4(): except: pytest.skip() - vrt_ds.GetRasterBand(1).SetMetadataItem('source_0', filterSourceXML, 'new_vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadataItem( + "source_0", filterSourceXML, "new_vrt_sources" + ) assert vrt_ds.GetRasterBand(1).Checksum() == 21890 + ############################################################################### # Variant for SetMetadata(md, 'vrt_sources') def test_vrtfilt_5(): - vrt_ds = gdal.GetDriverByName('VRT').Create('', 50, 50, 1) + vrt_ds = gdal.GetDriverByName("VRT").Create("", 50, 50, 1) filterSourceXML = """ data/rgbsmall.tif @@ -136,29 +141,33 @@ def test_vrtfilt_5(): """ md = {} - md['source_0'] = filterSourceXML + md["source_0"] = filterSourceXML - vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadata(md, "vrt_sources") assert vrt_ds.GetRasterBand(1).Checksum() == 21890 + ############################################################################### # Verify separable Gaussian blur filter. def test_vrtfilt_6(): - tst = gdaltest.GDALTest('VRT', 'vrt/avfilt_1d.vrt', 1, 22377) + tst = gdaltest.GDALTest("VRT", "vrt/avfilt_1d.vrt", 1, 22377) return tst.testOpen() + ############################################################################### # Test block access def test_vrtfilt_7(): - gdal.Translate('/vsimem/src.tif', 'data/rgbsmall.tif', options='-outsize 500 500 -r bilinear') + gdal.Translate( + "/vsimem/src.tif", "data/rgbsmall.tif", options="-outsize 500 500 -r bilinear" + ) - vrt_ds = gdal.GetDriverByName('VRT').Create('/vsimem/src.vrt', 500, 500, 1) + vrt_ds = gdal.GetDriverByName("VRT").Create("/vsimem/src.vrt", 500, 500, 1) filterSourceXML = """ /vsimem/src.tif @@ -172,21 +181,22 @@ def test_vrtfilt_7(): """ md = {} - md['source_0'] = filterSourceXML + md["source_0"] = filterSourceXML - vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') + vrt_ds.GetRasterBand(1).SetMetadata(md, "vrt_sources") ref_checksum = vrt_ds.GetRasterBand(1).Checksum() vrt_ds = None # Wrap our above VRT in a VRT that will use 128x128 blocks # (use of -mo FOO=BAR forces a non trivial copy to be made) - out_ds = gdal.Translate('', '/vsimem/src.vrt', options='-of VRT -mo FOO=BAR') + out_ds = gdal.Translate("", "/vsimem/src.vrt", options="-of VRT -mo FOO=BAR") assert ref_checksum == out_ds.GetRasterBand(1).Checksum() out_ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/src.tif') - gdal.GetDriverByName('VRT').Delete('/vsimem/src.vrt') + gdal.GetDriverByName("GTiff").Delete("/vsimem/src.tif") + gdal.GetDriverByName("VRT").Delete("/vsimem/src.vrt") + ############################################################################### # Cleanup. @@ -194,5 +204,3 @@ def test_vrtfilt_7(): def test_vrtfilt_cleanup(): pass - - diff --git a/autotest/gdrivers/vrtlut.py b/autotest/gdrivers/vrtlut.py index e7c2577baf68..5153feded643 100755 --- a/autotest/gdrivers/vrtlut.py +++ b/autotest/gdrivers/vrtlut.py @@ -29,7 +29,6 @@ ############################################################################### - import gdaltest ############################################################################### @@ -38,5 +37,5 @@ def test_vrtlut_1(): - tst = gdaltest.GDALTest('VRT', 'vrt/byte_lut.vrt', 1, 4655) + tst = gdaltest.GDALTest("VRT", "vrt/byte_lut.vrt", 1, 4655) return tst.testOpen() diff --git a/autotest/gdrivers/vrtmask.py b/autotest/gdrivers/vrtmask.py index 4f6394381d20..cd75e5b846a3 100755 --- a/autotest/gdrivers/vrtmask.py +++ b/autotest/gdrivers/vrtmask.py @@ -30,12 +30,12 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test with a global dataset mask band @@ -67,11 +67,12 @@ def test_vrtmask_1(): """ ds = gdal.Open(vrt_string) - assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ - 'did not get expected mask flags' + assert ( + ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET + ), "did not get expected mask flags" cs = ds.GetRasterBand(1).GetMaskBand().Checksum() - assert cs == 4672, 'did not get expected mask band checksum' + assert cs == 4672, "did not get expected mask band checksum" ds = None @@ -79,6 +80,7 @@ def test_vrtmask_1(): ############################################################################### # Test with a per band mask band + def test_vrtmask_2(): vrt_string = """ @@ -106,41 +108,43 @@ def test_vrtmask_2(): """ ds = gdal.Open(vrt_string) - assert ds.GetRasterBand(1).GetMaskFlags() == 0, 'did not get expected mask flags' + assert ds.GetRasterBand(1).GetMaskFlags() == 0, "did not get expected mask flags" cs = ds.GetRasterBand(1).GetMaskBand().Checksum() - assert cs == 4873, 'did not get expected mask band checksum' + assert cs == 4873, "did not get expected mask band checksum" ds = None + ############################################################################### # Translate a RGB dataset with a mask into a VRT def test_vrtmask_3(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') - ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/vrtmask_3.vrt', src_ds) + src_ds = gdal.Open("../gcore/data/ycbcr_with_mask.tif") + ds = gdal.GetDriverByName("VRT").CreateCopy("tmp/vrtmask_3.vrt", src_ds) ds = None expected_msk_cs = src_ds.GetRasterBand(1).GetMaskBand().Checksum() src_ds = None - ds = gdal.Open('tmp/vrtmask_3.vrt', gdal.GA_Update) - ds.GetRasterBand(1).SetDescription('foo') + ds = gdal.Open("tmp/vrtmask_3.vrt", gdal.GA_Update) + ds.GetRasterBand(1).SetDescription("foo") ds = None - ds = gdal.Open('tmp/vrtmask_3.vrt') + ds = gdal.Open("tmp/vrtmask_3.vrt") msk_cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None - os.remove('tmp/vrtmask_3.vrt') + os.remove("tmp/vrtmask_3.vrt") + + assert msk_cs == expected_msk_cs, "did not get expected mask band checksum" - assert msk_cs == expected_msk_cs, 'did not get expected mask band checksum' ############################################################################### # Same with gdalbuildvrt @@ -148,23 +152,24 @@ def test_vrtmask_3(): def test_vrtmask_4(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') - gdal.BuildVRT('tmp/vrtmask_4.vrt', [src_ds]) + src_ds = gdal.Open("../gcore/data/ycbcr_with_mask.tif") + gdal.BuildVRT("tmp/vrtmask_4.vrt", [src_ds]) expected_msk_cs = src_ds.GetRasterBand(1).GetMaskBand().Checksum() src_ds = None - ds = gdal.Open('tmp/vrtmask_4.vrt') + ds = gdal.Open("tmp/vrtmask_4.vrt") msk_cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None - os.remove('tmp/vrtmask_4.vrt') + os.remove("tmp/vrtmask_4.vrt") + + assert msk_cs == expected_msk_cs, "did not get expected mask band checksum" - assert msk_cs == expected_msk_cs, 'did not get expected mask band checksum' ############################################################################### # Same with gdal_translate @@ -172,24 +177,29 @@ def test_vrtmask_4(): def test_vrtmask_5(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.Translate('tmp/vrtmask_5.vrt', '../gcore/data/ycbcr_with_mask.tif', options='-of VRT -outsize 100% 100%') + gdal.Translate( + "tmp/vrtmask_5.vrt", + "../gcore/data/ycbcr_with_mask.tif", + options="-of VRT -outsize 100% 100%", + ) - src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') + src_ds = gdal.Open("../gcore/data/ycbcr_with_mask.tif") expected_msk_cs = src_ds.GetRasterBand(1).GetMaskBand().Checksum() src_ds = None - ds = gdal.Open('tmp/vrtmask_5.vrt') + ds = gdal.Open("tmp/vrtmask_5.vrt") msk_cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None - os.remove('tmp/vrtmask_5.vrt') + os.remove("tmp/vrtmask_5.vrt") + + assert msk_cs == expected_msk_cs, "did not get expected mask band checksum" - assert msk_cs == expected_msk_cs, 'did not get expected mask band checksum' ############################################################################### # Same with gdal_translate with explicit -b and -mask arguments @@ -197,25 +207,29 @@ def test_vrtmask_5(): def test_vrtmask_6(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.Translate('tmp/vrtmask_6.vrt', '../gcore/data/ycbcr_with_mask.tif', - options='-of VRT -b 1 -b 2 -b 3 -mask mask,1') + gdal.Translate( + "tmp/vrtmask_6.vrt", + "../gcore/data/ycbcr_with_mask.tif", + options="-of VRT -b 1 -b 2 -b 3 -mask mask,1", + ) - src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') + src_ds = gdal.Open("../gcore/data/ycbcr_with_mask.tif") expected_msk_cs = src_ds.GetRasterBand(1).GetMaskBand().Checksum() src_ds = None - ds = gdal.Open('tmp/vrtmask_6.vrt') + ds = gdal.Open("tmp/vrtmask_6.vrt") msk_cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None - os.remove('tmp/vrtmask_6.vrt') + os.remove("tmp/vrtmask_6.vrt") + + assert msk_cs == expected_msk_cs, "did not get expected mask band checksum" - assert msk_cs == expected_msk_cs, 'did not get expected mask band checksum' ############################################################################### # gdal_translate with RGBmask -> RGBA and then RGBA->RGBmask @@ -223,44 +237,50 @@ def test_vrtmask_6(): def test_vrtmask_7(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() try: - os.remove('tmp/vrtmask_7_rgba.tif.msk') + os.remove("tmp/vrtmask_7_rgba.tif.msk") except OSError: pass - gdal.Translate('tmp/vrtmask_7_rgba.tif', - '../gcore/data/ycbcr_with_mask.tif', - options='-b 1 -b 2 -b 3 -b mask') + gdal.Translate( + "tmp/vrtmask_7_rgba.tif", + "../gcore/data/ycbcr_with_mask.tif", + options="-b 1 -b 2 -b 3 -b mask", + ) - src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') + src_ds = gdal.Open("../gcore/data/ycbcr_with_mask.tif") expected_msk_cs = src_ds.GetRasterBand(1).GetMaskBand().Checksum() src_ds = None - ds = gdal.Open('tmp/vrtmask_7_rgba.tif') + ds = gdal.Open("tmp/vrtmask_7_rgba.tif") alpha_cs = ds.GetRasterBand(4).Checksum() ds = None - gdal.Translate('tmp/vrtmask_7_rgbmask.vrt', 'tmp/vrtmask_7_rgba.tif', - options='-of VRT -b 1 -b 2 -b 3 -mask 4') + gdal.Translate( + "tmp/vrtmask_7_rgbmask.vrt", + "tmp/vrtmask_7_rgba.tif", + options="-of VRT -b 1 -b 2 -b 3 -mask 4", + ) - ds = gdal.Open('tmp/vrtmask_7_rgbmask.vrt') + ds = gdal.Open("tmp/vrtmask_7_rgbmask.vrt") msk_cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None - os.remove('tmp/vrtmask_7_rgba.tif') + os.remove("tmp/vrtmask_7_rgba.tif") with pytest.raises(OSError): - os.remove('tmp/vrtmask_7_rgba.tif.msk') - pytest.fail('did not expect tmp/vrtmask_7_rgba.tif.msk') + os.remove("tmp/vrtmask_7_rgba.tif.msk") + pytest.fail("did not expect tmp/vrtmask_7_rgba.tif.msk") - os.remove('tmp/vrtmask_7_rgbmask.vrt') + os.remove("tmp/vrtmask_7_rgbmask.vrt") - assert alpha_cs == expected_msk_cs, 'did not get expected alpha band checksum' + assert alpha_cs == expected_msk_cs, "did not get expected alpha band checksum" + + assert msk_cs == expected_msk_cs, "did not get expected mask band checksum" - assert msk_cs == expected_msk_cs, 'did not get expected mask band checksum' ############################################################################### # gdal_translate with RGBmask -> RGB @@ -268,106 +288,131 @@ def test_vrtmask_7(): def test_vrtmask_8(): - gtiff_drv = gdal.GetDriverByName('GTiff') + gtiff_drv = gdal.GetDriverByName("GTiff") md = gtiff_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("JPEG") == -1: pytest.skip() - gdal.Translate('tmp/vrtmask_8.vrt', '../gcore/data/ycbcr_with_mask.tif', - options='-of VRT -mask none') + gdal.Translate( + "tmp/vrtmask_8.vrt", + "../gcore/data/ycbcr_with_mask.tif", + options="-of VRT -mask none", + ) - ds = gdal.Open('tmp/vrtmask_8.vrt') + ds = gdal.Open("tmp/vrtmask_8.vrt") flags = ds.GetRasterBand(1).GetMaskFlags() ds = None - os.remove('tmp/vrtmask_8.vrt') + os.remove("tmp/vrtmask_8.vrt") assert flags == gdal.GMF_ALL_VALID + ############################################################################### # gdal_translate with RGBA -> RGB def test_vrtmask_9(): import test_cli_utilities + if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() - src_ds = gdal.GetDriverByName('GTiff').Create('tmp/vrtmask_9_src.tif', 10, 10, 4) + src_ds = gdal.GetDriverByName("GTiff").Create("tmp/vrtmask_9_src.tif", 10, 10, 4) del src_ds - (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' tmp/vrtmask_9_src.tif tmp/vrtmask_9_dst.tif -b 1 -b 2 -b 3') + (_, err) = gdaltest.runexternal_out_and_err( + test_cli_utilities.get_gdal_translate_path() + + " tmp/vrtmask_9_src.tif tmp/vrtmask_9_dst.tif -b 1 -b 2 -b 3" + ) - ds = gdal.Open('tmp/vrtmask_9_dst.tif') + ds = gdal.Open("tmp/vrtmask_9_dst.tif") flags = ds.GetRasterBand(1).GetMaskFlags() ds = None - os.remove('tmp/vrtmask_9_src.tif') - os.remove('tmp/vrtmask_9_dst.tif') - assert err == '', 'unexpected output on standard err' + os.remove("tmp/vrtmask_9_src.tif") + os.remove("tmp/vrtmask_9_dst.tif") + assert err == "", "unexpected output on standard err" assert flags == gdal.GMF_ALL_VALID + ############################################################################### # Test fix for #5120 (VRTSourcedRasterBand::AddMaskBandSource() ignores specified window) def test_vrtmask_10(): - gdal.Translate('tmp/vrtmask_10_ref.tif', '../gcore/data/stefan_full_rgba.tif', options='-srcwin 40 40 100 100') - gdal.Translate('tmp/vrtmask_10.vrt', '../gcore/data/stefan_full_rgba.tif', options='-of VRT -b 1 -b 2 -b 3 -mask 4 -srcwin 30 30 120 120') - gdal.Translate('tmp/vrtmask_10_2.vrt', 'tmp/vrtmask_10.vrt', options='-of VRT -srcwin 5 5 110 110') - gdal.Translate('tmp/vrtmask_10_3.tif', 'tmp/vrtmask_10_2.vrt', options='-b 1 -b 2 -b 3 -b mask -srcwin 5 5 100 100') - - ds = gdal.Open('tmp/vrtmask_10_ref.tif') + gdal.Translate( + "tmp/vrtmask_10_ref.tif", + "../gcore/data/stefan_full_rgba.tif", + options="-srcwin 40 40 100 100", + ) + gdal.Translate( + "tmp/vrtmask_10.vrt", + "../gcore/data/stefan_full_rgba.tif", + options="-of VRT -b 1 -b 2 -b 3 -mask 4 -srcwin 30 30 120 120", + ) + gdal.Translate( + "tmp/vrtmask_10_2.vrt", + "tmp/vrtmask_10.vrt", + options="-of VRT -srcwin 5 5 110 110", + ) + gdal.Translate( + "tmp/vrtmask_10_3.tif", + "tmp/vrtmask_10_2.vrt", + options="-b 1 -b 2 -b 3 -b mask -srcwin 5 5 100 100", + ) + + ds = gdal.Open("tmp/vrtmask_10_ref.tif") cs_ref = ds.GetRasterBand(4).Checksum() ds = None - ds = gdal.Open('tmp/vrtmask_10_3.tif') + ds = gdal.Open("tmp/vrtmask_10_3.tif") cs_got = ds.GetRasterBand(4).Checksum() ds = None - os.remove('tmp/vrtmask_10_ref.tif') - os.remove('tmp/vrtmask_10.vrt') - os.remove('tmp/vrtmask_10_2.vrt') - os.remove('tmp/vrtmask_10_3.tif') + os.remove("tmp/vrtmask_10_ref.tif") + os.remove("tmp/vrtmask_10.vrt") + os.remove("tmp/vrtmask_10_2.vrt") + os.remove("tmp/vrtmask_10_3.tif") assert cs_ref == cs_got + ############################################################################### def test_vrtmask_11(): # Cannot create mask band at raster band level when a dataset mask band already exists - ds = gdal.Translate('', 'data/byte.tif', format='VRT') + ds = gdal.Translate("", "data/byte.tif", format="VRT") ds.CreateMaskBand(gdal.GMF_PER_DATASET) with gdaltest.error_handler(): ret = ds.GetRasterBand(1).CreateMaskBand(0) - assert ret != 0, 'expected an error, but got success' + assert ret != 0, "expected an error, but got success" # This VRT dataset has already a mask band - ds = gdal.Translate('', 'data/byte.tif', format='VRT') + ds = gdal.Translate("", "data/byte.tif", format="VRT") ds.CreateMaskBand(gdal.GMF_PER_DATASET) with gdaltest.error_handler(): ret = ds.CreateMaskBand(gdal.GMF_PER_DATASET) - assert ret != 0, 'expected an error, but got success' + assert ret != 0, "expected an error, but got success" # This VRT band has already a mask band - ds = gdal.Translate('', 'data/byte.tif', format='VRT') + ds = gdal.Translate("", "data/byte.tif", format="VRT") ds.GetRasterBand(1).CreateMaskBand(0) with gdaltest.error_handler(): ret = ds.GetRasterBand(1).CreateMaskBand(0) - assert ret != 0, 'expected an error, but got success' + assert ret != 0, "expected an error, but got success" - ds = gdal.Translate('', 'data/byte.tif', format='VRT') + ds = gdal.Translate("", "data/byte.tif", format="VRT") ret = ds.GetRasterBand(1).CreateMaskBand(gdal.GMF_PER_DATASET) assert ret == 0 + ############################################################################### # Cleanup. def test_vrtmask_cleanup(): pass - - diff --git a/autotest/gdrivers/vrtmultidim.py b/autotest/gdrivers/vrtmultidim.py index 6a2696a404b9..2bf577b10d32 100755 --- a/autotest/gdrivers/vrtmultidim.py +++ b/autotest/gdrivers/vrtmultidim.py @@ -28,74 +28,91 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import osr -import gdaltest import math import struct +import gdaltest + +from osgeo import gdal, osr + def test_vrtmultidim_dimension(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' + assert rg.GetName() == "/" dims = rg.GetDimensions() assert len(dims) == 2 dim_0 = dims[0] - assert dim_0.GetName() == 'X' + assert dim_0.GetName() == "X" assert dim_0.GetSize() == 2 - assert dim_0.GetType() == 'foo' - assert dim_0.GetDirection() == 'bar' + assert dim_0.GetType() == "foo" + assert dim_0.GetDirection() == "bar" with gdaltest.error_handler(): gdal.ErrorReset() assert not dim_0.GetIndexingVariable() - assert gdal.GetLastErrorMsg() == 'Cannot find variable X' + assert gdal.GetLastErrorMsg() == "Cannot find variable X" dim_1 = dims[1] - assert dim_1.GetName() == 'Y' + assert dim_1.GetName() == "Y" assert dim_1.GetSize() == 1234567890123 with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_attribute(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ String @@ -117,72 +134,83 @@ def test_vrtmultidim_attribute(): -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() attrs = rg.GetAttributes() assert len(attrs) == 3 - foo = next((x for x in attrs if x.GetName() == 'foo'), None) + foo = next((x for x in attrs if x.GetName() == "foo"), None) assert foo assert foo.GetDataType().GetClass() == gdal.GEDTC_STRING - assert foo.Read() == ['bar', 'baz'] + assert foo.Read() == ["bar", "baz"] - bar = next((x for x in attrs if x.GetName() == 'bar'), None) + bar = next((x for x in attrs if x.GetName() == "bar"), None) assert bar assert bar.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert bar.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert bar.Read() == 1.25125 - empty = next((x for x in attrs if x.GetName() == 'empty'), None) + empty = next((x for x in attrs if x.GetName() == "empty"), None) assert empty assert empty.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert empty.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert empty.Read() == 0.0 - ar = rg.OpenMDArray('ar') + ar = rg.OpenMDArray("ar") assert ar attrs = ar.GetAttributes() assert len(attrs) == 1 - with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ String bar - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ String bar - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ INVALID bar - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_subgroup_and_cross_references(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -207,133 +235,160 @@ def test_vrtmultidim_subgroup_and_cross_references(): -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - assert rg.GetGroupNames() == [ 'subgroup' ] - subgroup = rg.OpenGroup('subgroup') + assert rg.GetGroupNames() == ["subgroup"] + subgroup = rg.OpenGroup("subgroup") assert subgroup dims = subgroup.GetDimensions() assert len(dims) == 2 dim_0 = dims[0] - assert dim_0.GetName() == 'X' + assert dim_0.GetName() == "X" assert dim_0.GetSize() == 2 indexing_var = dim_0.GetIndexingVariable() assert indexing_var - assert indexing_var.GetName() == 'X' + assert indexing_var.GetName() == "X" assert indexing_var.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert indexing_var.GetDimensionCount() == 1 assert indexing_var.GetDimensions()[0].GetSize() == 2 dim_1 = dims[1] - assert dim_1.GetName() == 'Y' + assert dim_1.GetName() == "Y" assert dim_1.GetSize() == 3 indexing_var = dim_1.GetIndexingVariable() assert indexing_var - assert indexing_var.GetName() == 'Y' + assert indexing_var.GetName() == "Y" assert indexing_var.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert indexing_var.GetDimensionCount() == 1 assert indexing_var.GetDimensions()[0].GetSize() == 3 - assert rg.GetMDArrayNames() == ['X', 'Y'] - X = rg.OpenMDArray('X') + assert rg.GetMDArrayNames() == ["X", "Y"] + X = rg.OpenMDArray("X") assert X assert X.GetDataType().GetNumericDataType() == gdal.GDT_Float32 assert X.GetDimensionCount() == 1 assert X.GetDimensions()[0].GetSize() == 20 - Y = rg.OpenMDArray('Y') + Y = rg.OpenMDArray("Y") assert Y assert Y.GetDataType().GetNumericDataType() == gdal.GDT_Float32 assert Y.GetDimensionCount() == 1 assert Y.GetDimensions()[0].GetSize() == 30 with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ invalid - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_srs(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -345,22 +400,25 @@ def test_vrtmultidim_srs(): EPSG:32632 -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - X = rg.OpenMDArray('X') + X = rg.OpenMDArray("X") srs = X.GetSpatialRef() assert srs - Y = rg.OpenMDArray('Y') + Y = rg.OpenMDArray("Y") srs = Y.GetSpatialRef() assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] def test_vrtmultidim_nodata_unit_offset_scale(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ Float64 @@ -377,31 +435,34 @@ def test_vrtmultidim_nodata_unit_offset_scale(): Float64 -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('ar1') + ar = rg.OpenMDArray("ar1") assert ar.GetNoDataValueAsDouble() == 1.25125 - assert struct.unpack('d', ar.Read()) == (1.25125,) - assert ar.GetUnit() == 'foo' + assert struct.unpack("d", ar.Read()) == (1.25125,) + assert ar.GetUnit() == "foo" assert ar.GetOffset() == 1.5 assert ar.GetScale() == 2.5 - ar = rg.OpenMDArray('ar2') + ar = rg.OpenMDArray("ar2") assert math.isnan(ar.GetNoDataValueAsDouble()) - assert math.isnan(struct.unpack('d', ar.Read())[0]) + assert math.isnan(struct.unpack("d", ar.Read())[0]) assert ar.GetOffset() is None assert ar.GetScale() is None - ar = rg.OpenMDArray('ar3') + ar = rg.OpenMDArray("ar3") assert ar.GetNoDataValueAsDouble() is None - assert struct.unpack('d', ar.Read()) == (0,) + assert struct.unpack("d", ar.Read()) == (0,) def test_vrtmultidim_RegularlySpacedValues(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -410,15 +471,20 @@ def test_vrtmultidim_RegularlySpacedValues(): -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - X = rg.OpenMDArray('X') - assert struct.unpack('d' * 4, X.Read()) == (0.5, 11.0, 21.5, 32.0) - assert struct.unpack('d' * 2, X.Read(array_start_idx = [1], count = [2], array_step = [2] )) == (11.0, 32.0) + X = rg.OpenMDArray("X") + assert struct.unpack("d" * 4, X.Read()) == (0.5, 11.0, 21.5, 32.0) + assert struct.unpack( + "d" * 2, X.Read(array_start_idx=[1], count=[2], array_step=[2]) + ) == (11.0, 32.0) with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -427,11 +493,14 @@ def test_vrtmultidim_RegularlySpacedValues(): - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -440,13 +509,16 @@ def test_vrtmultidim_RegularlySpacedValues(): - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_ConstantValue(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -463,22 +535,27 @@ def test_vrtmultidim_ConstantValue(): 50 -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('ar') - got = struct.unpack('d' * 12, ar.Read()) - assert got == (5, 5, 5, - 5, 10, 100, - 5, 10, 100, - 5, 10, 10) - assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2] )) == (10,100,10,10) - - ar = rg.OpenMDArray('no_dim') - assert struct.unpack('d', ar.Read()) == (50,) + ar = rg.OpenMDArray("ar") + got = struct.unpack("d" * 12, ar.Read()) + assert got == (5, 5, 5, 5, 10, 100, 5, 10, 100, 5, 10, 10) + assert struct.unpack("d" * 4, ar.Read(array_start_idx=[2, 1], count=[2, 2])) == ( + 10, + 100, + 10, + 10, + ) + + ar = rg.OpenMDArray("no_dim") + assert struct.unpack("d", ar.Read()) == (50,) with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -490,11 +567,14 @@ def test_vrtmultidim_ConstantValue(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -506,11 +586,14 @@ def test_vrtmultidim_ConstantValue(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -522,11 +605,14 @@ def test_vrtmultidim_ConstantValue(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -538,11 +624,14 @@ def test_vrtmultidim_ConstantValue(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -554,13 +643,16 @@ def test_vrtmultidim_ConstantValue(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_InlineValues(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -585,24 +677,31 @@ def test_vrtmultidim_InlineValues(): 50 -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('ar') - got = struct.unpack('d' * 12, ar.Read()) - assert got == (0.0, 1.0, 2.0, - 3.0, -4.0, 100.0, - 6.0, -7.0, 101.0, - 9.0, -10.0, -11.0) - assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2] )) == (-7, 101, -10, -11) - assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2], array_step=[-1,-1] )) == (-7, 6, -4, 3) - - ar = rg.OpenMDArray('no_dim') - assert struct.unpack('d', ar.Read()) == (50,) + ar = rg.OpenMDArray("ar") + got = struct.unpack("d" * 12, ar.Read()) + assert got == (0.0, 1.0, 2.0, 3.0, -4.0, 100.0, 6.0, -7.0, 101.0, 9.0, -10.0, -11.0) + assert struct.unpack("d" * 4, ar.Read(array_start_idx=[2, 1], count=[2, 2])) == ( + -7, + 101, + -10, + -11, + ) + assert struct.unpack( + "d" * 4, ar.Read(array_start_idx=[2, 1], count=[2, 2], array_step=[-1, -1]) + ) == (-7, 6, -4, 3) + + ar = rg.OpenMDArray("no_dim") + assert struct.unpack("d", ar.Read()) == (50,) with gdaltest.error_handler(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -614,15 +713,18 @@ def test_vrtmultidim_InlineValues(): 10 - """, gdal.OF_MULTIDIM_RASTER) + """, + gdal.OF_MULTIDIM_RASTER, + ) assert not ds def test_vrtmultidim_Source(): + def f(): - def f(): - - gdal.FileFromMemBuffer('/vsimem/src.vrt',""" + gdal.FileFromMemBuffer( + "/vsimem/src.vrt", + """ @@ -638,9 +740,11 @@ def f(): -""") +""", + ) - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -767,85 +871,88 @@ def f(): -""", gdal.OF_MULTIDIM_RASTER) - assert ds - rg = ds.GetRootGroup() - - ar = rg.OpenMDArray('ar') - assert ar - got = struct.unpack('d' * 12, ar.Read()) - assert got == (0, 1, 2, - 3, 4, 5, - 6, 7, 8, - 9, 10, 11) - - ar_with_offset = rg.OpenMDArray('ar_with_offset') - assert ar_with_offset - got = struct.unpack('d' * 12, ar_with_offset.Read()) - assert got == (0, 0, 0, - 0, 0, 0, - 0, 4, 5, - 0, 10, 11) - assert struct.unpack('d' * 2, ar_with_offset.Read(array_start_idx = [2, 0], count = [1, 2])) == (0, 4) - assert struct.unpack('d' * 2, ar_with_offset.Read(array_start_idx = [3, 1], count = [1, 2])) == (10, 11) - assert struct.unpack('d' * 4, ar_with_offset.Read(array_start_idx = [2, 1], count = [2, 2], array_step=[-1,-1] )) == (4, 0, 0, 0) - - ar_transposed = rg.OpenMDArray('ar_transposed') - assert ar_transposed - got = struct.unpack('d' * 12, ar_transposed.Read()) - assert got == (0, 3, 6, 9, - 1, 4, 7, 10, - 2, 5, 8, 11) - - ar_view = rg.OpenMDArray('ar_view') - assert ar_view - got = struct.unpack('d' * 12, ar_view.Read()) - assert got == (9, 10, 11, - 6, 7, 8, - 3, 4, 5, - 0, 1, 2) - - # Source does not exist, but we don't request an area where it is active - # so we should not try to open it - ar = rg.OpenMDArray('ar_non_existing_source_with_offset') - assert ar - assert struct.unpack('d' * 2, ar.Read(array_start_idx = [0, 0], count = [1, 2])) == (0, 0) - - ar = rg.OpenMDArray('ar_non_existing_source') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - ar = rg.OpenMDArray('ar_invalid_source_slab_offset') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - ar = rg.OpenMDArray('ar_invalid_number_of_dimensions') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - ar = rg.OpenMDArray('ar_non_existing_array_source') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - ar = rg.OpenMDArray('ar_view_invalid') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - ar = rg.OpenMDArray('ar_transposed_invalid') - assert ar - with gdaltest.error_handler(): - assert not ar.Read() - - gdal.Unlink('/vsimem/src.vrt') - - # Check that the cache is correctly working by opening a second - # dataset after having remove the source - ds2 = gdal.OpenEx(""" +""", + gdal.OF_MULTIDIM_RASTER, + ) + assert ds + rg = ds.GetRootGroup() + + ar = rg.OpenMDArray("ar") + assert ar + got = struct.unpack("d" * 12, ar.Read()) + assert got == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) + + ar_with_offset = rg.OpenMDArray("ar_with_offset") + assert ar_with_offset + got = struct.unpack("d" * 12, ar_with_offset.Read()) + assert got == (0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 10, 11) + assert struct.unpack( + "d" * 2, ar_with_offset.Read(array_start_idx=[2, 0], count=[1, 2]) + ) == (0, 4) + assert struct.unpack( + "d" * 2, ar_with_offset.Read(array_start_idx=[3, 1], count=[1, 2]) + ) == (10, 11) + assert struct.unpack( + "d" * 4, + ar_with_offset.Read( + array_start_idx=[2, 1], count=[2, 2], array_step=[-1, -1] + ), + ) == (4, 0, 0, 0) + + ar_transposed = rg.OpenMDArray("ar_transposed") + assert ar_transposed + got = struct.unpack("d" * 12, ar_transposed.Read()) + assert got == (0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11) + + ar_view = rg.OpenMDArray("ar_view") + assert ar_view + got = struct.unpack("d" * 12, ar_view.Read()) + assert got == (9, 10, 11, 6, 7, 8, 3, 4, 5, 0, 1, 2) + + # Source does not exist, but we don't request an area where it is active + # so we should not try to open it + ar = rg.OpenMDArray("ar_non_existing_source_with_offset") + assert ar + assert struct.unpack( + "d" * 2, ar.Read(array_start_idx=[0, 0], count=[1, 2]) + ) == (0, 0) + + ar = rg.OpenMDArray("ar_non_existing_source") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + ar = rg.OpenMDArray("ar_invalid_source_slab_offset") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + ar = rg.OpenMDArray("ar_invalid_number_of_dimensions") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + ar = rg.OpenMDArray("ar_non_existing_array_source") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + ar = rg.OpenMDArray("ar_view_invalid") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + ar = rg.OpenMDArray("ar_transposed_invalid") + assert ar + with gdaltest.error_handler(): + assert not ar.Read() + + gdal.Unlink("/vsimem/src.vrt") + + # Check that the cache is correctly working by opening a second + # dataset after having remove the source + ds2 = gdal.OpenEx( + """ @@ -860,21 +967,21 @@ def f(): -""", gdal.OF_MULTIDIM_RASTER) - assert ds2 - rg2 = ds2.GetRootGroup() - ar2 = rg2.OpenMDArray('ar') - got = struct.unpack('d' * 12, ar2.Read()) - assert got == (0, 1, 2, - 3, 4, 5, - 6, 7, 8, - 9, 10, 11) - - f() - - # Check that the cache is correctly working: we should get an error - # now that all referencing arrays have been cleaned up - ds2 = gdal.OpenEx(""" +""", + gdal.OF_MULTIDIM_RASTER, + ) + assert ds2 + rg2 = ds2.GetRootGroup() + ar2 = rg2.OpenMDArray("ar") + got = struct.unpack("d" * 12, ar2.Read()) + assert got == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) + + f() + + # Check that the cache is correctly working: we should get an error + # now that all referencing arrays have been cleaned up + ds2 = gdal.OpenEx( + """ @@ -889,17 +996,20 @@ def f(): -""", gdal.OF_MULTIDIM_RASTER) - assert ds2 - rg2 = ds2.GetRootGroup() - ar2 = rg2.OpenMDArray('ar') - with gdaltest.error_handler(): - assert not ar2.Read() +""", + gdal.OF_MULTIDIM_RASTER, + ) + assert ds2 + rg2 = ds2.GetRootGroup() + ar2 = rg2.OpenMDArray("ar") + with gdaltest.error_handler(): + assert not ar2.Read() def test_vrtmultidim_Source_classic_dataset(): - ds = gdal.OpenEx(""" + ds = gdal.OpenEx( + """ @@ -926,19 +1036,18 @@ def test_vrtmultidim_Source_classic_dataset(): -""", gdal.OF_MULTIDIM_RASTER) +""", + gdal.OF_MULTIDIM_RASTER, + ) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('ar') + ar = rg.OpenMDArray("ar") assert ar - got = struct.unpack('d' * 12, ar.Read()) - assert got == (0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, - 0.0, 132.0, 140.0, - 0.0, 156.0, 132.0) + got = struct.unpack("d" * 12, ar.Read()) + assert got == (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 132.0, 140.0, 0.0, 156.0, 132.0) - ar_wrong_band = rg.OpenMDArray('ar_wrong_band') + ar_wrong_band = rg.OpenMDArray("ar_wrong_band") assert ar_wrong_band with gdaltest.error_handler(): assert not ar_wrong_band.Read() @@ -953,9 +1062,9 @@ def _validate(content): doc = etree.XML(content) try: - schema_content = open('../../gdal/data/gdalvrt.xsd', 'rb').read() + schema_content = open("../../gdal/data/gdalvrt.xsd", "rb").read() except IOError: - print('Cannot read gdalvrt.xsd schema') + print("Cannot read gdalvrt.xsd schema") return schema = etree.XMLSchema(etree.XML(schema_content)) schema.assertValid(doc) @@ -963,8 +1072,10 @@ def _validate(content): def test_vrtmultidim_serialize(): - tmpfile = '/vsimem/test.vrt' - gdal.FileFromMemBuffer(tmpfile, """ + tmpfile = "/vsimem/test.vrt" + gdal.FileFromMemBuffer( + tmpfile, + """ @@ -1025,21 +1136,24 @@ def test_vrtmultidim_serialize(): -""") +""", + ) ds = gdal.OpenEx(tmpfile, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) rg = ds.GetRootGroup() ds = None - attr = rg.CreateAttribute('foo', [], gdal.ExtendedDataType.CreateString()) - attr.Write('bar') + attr = rg.CreateAttribute("foo", [], gdal.ExtendedDataType.CreateString()) + attr.Write("bar") attr = None rg = None - f = gdal.VSIFOpenL(tmpfile, 'rb') - got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + f = gdal.VSIFOpenL(tmpfile, "rb") + got_data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - #print(got_data) + # print(got_data) - assert got_data == """ + assert ( + got_data + == """ @@ -1103,6 +1217,7 @@ def test_vrtmultidim_serialize(): """ + ) _validate(got_data) @@ -1111,35 +1226,41 @@ def test_vrtmultidim_serialize(): def test_vrtmultidim_createcopy(): - src_ds = gdal.GetDriverByName('MEM').CreateMultiDimensional('myds') + src_ds = gdal.GetDriverByName("MEM").CreateMultiDimensional("myds") src_rg = src_ds.GetRootGroup() - src_dim = src_rg.CreateDimension('dim', '', '', 3) - src_ar = src_rg.CreateMDArray('array', [src_dim], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) - src_ar.Write(struct.pack('d' * 3, 1.5, 2.5, 3.5)) + src_dim = src_rg.CreateDimension("dim", "", "", 3) + src_ar = src_rg.CreateMDArray( + "array", [src_dim], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) + src_ar.Write(struct.pack("d" * 3, 1.5, 2.5, 3.5)) src_ar.SetNoDataValueDouble(1.5) - src_ar.SetUnit('foo') + src_ar.SetUnit("foo") src_ar.SetOffset(2.5) src_ar.SetScale(3.5) sr = osr.SpatialReference() - sr.SetFromUserInput('ENGCRS["FOO",EDATUM["BAR"],CS[vertical,1],AXIS["foo",up,LENGTHUNIT["m",1]]]') + sr.SetFromUserInput( + 'ENGCRS["FOO",EDATUM["BAR"],CS[vertical,1],AXIS["foo",up,LENGTHUNIT["m",1]]]' + ) sr.SetDataAxisToSRSAxisMapping([2, 1]) src_ar.SetSpatialRef(sr) - attr = src_ar.CreateAttribute('foo', [], gdal.ExtendedDataType.CreateString()) - attr.Write('bar') + attr = src_ar.CreateAttribute("foo", [], gdal.ExtendedDataType.CreateString()) + attr.Write("bar") attr = None with gdaltest.error_handler(): - gdal.GetDriverByName('VRT').CreateCopy('/i_do/not_exist', src_ds) + gdal.GetDriverByName("VRT").CreateCopy("/i_do/not_exist", src_ds) - tmpfile = '/vsimem/test.vrt' - assert gdal.GetDriverByName('VRT').CreateCopy(tmpfile, src_ds) + tmpfile = "/vsimem/test.vrt" + assert gdal.GetDriverByName("VRT").CreateCopy(tmpfile, src_ds) - f = gdal.VSIFOpenL(tmpfile, 'rb') - got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + f = gdal.VSIFOpenL(tmpfile, "rb") + got_data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - #print(got_data) + # print(got_data) - assert got_data == """ + assert ( + got_data + == """ @@ -1159,6 +1280,7 @@ def test_vrtmultidim_createcopy(): """ + ) _validate(got_data) @@ -1167,52 +1289,64 @@ def test_vrtmultidim_createcopy(): def test_vrtmultidim_createmultidimensional(): - tmpfile = '/vsimem/test.vrt' - ds = gdal.GetDriverByName('VRT').CreateMultiDimensional(tmpfile) + tmpfile = "/vsimem/test.vrt" + ds = gdal.GetDriverByName("VRT").CreateMultiDimensional(tmpfile) rg = ds.GetRootGroup() - ds_other = gdal.GetDriverByName('VRT').CreateMultiDimensional('') - dim_other = ds_other.GetRootGroup().CreateDimension('dim', '', '', 4) + ds_other = gdal.GetDriverByName("VRT").CreateMultiDimensional("") + dim_other = ds_other.GetRootGroup().CreateDimension("dim", "", "", 4) - dim = rg.CreateDimension('dim', '', '', 3) + dim = rg.CreateDimension("dim", "", "", 3) assert dim with gdaltest.error_handler(): - assert not rg.CreateDimension('', '', '', 1) - assert not rg.CreateDimension('dim', '', '', 1) + assert not rg.CreateDimension("", "", "", 1) + assert not rg.CreateDimension("dim", "", "", 1) - assert rg.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) + assert rg.CreateAttribute("attr", [1], gdal.ExtendedDataType.CreateString()) with gdaltest.error_handler(): - assert not rg.CreateAttribute('', [1], gdal.ExtendedDataType.CreateString()) - assert not rg.CreateAttribute('attr_2dim', [1,2], gdal.ExtendedDataType.CreateString()) - assert not rg.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) - assert not rg.CreateAttribute('attr_too_big', [4000 * 1000 * 1000], gdal.ExtendedDataType.CreateString()) - - ar = rg.CreateMDArray('ar', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) + assert not rg.CreateAttribute("", [1], gdal.ExtendedDataType.CreateString()) + assert not rg.CreateAttribute( + "attr_2dim", [1, 2], gdal.ExtendedDataType.CreateString() + ) + assert not rg.CreateAttribute("attr", [1], gdal.ExtendedDataType.CreateString()) + assert not rg.CreateAttribute( + "attr_too_big", [4000 * 1000 * 1000], gdal.ExtendedDataType.CreateString() + ) + + ar = rg.CreateMDArray("ar", [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert ar[0] with gdaltest.error_handler(): - assert not rg.CreateMDArray('', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) - assert not rg.CreateMDArray('ar', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) - assert not rg.CreateMDArray('ar2', [dim_other], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) - - assert ar.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) + assert not rg.CreateMDArray( + "", [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32) + ) + assert not rg.CreateMDArray( + "ar", [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32) + ) + assert not rg.CreateMDArray( + "ar2", [dim_other], gdal.ExtendedDataType.Create(gdal.GDT_Float32) + ) + + assert ar.CreateAttribute("attr", [1], gdal.ExtendedDataType.CreateString()) with gdaltest.error_handler(): - assert not ar.CreateAttribute('', [1], gdal.ExtendedDataType.CreateString()) - assert not ar.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) + assert not ar.CreateAttribute("", [1], gdal.ExtendedDataType.CreateString()) + assert not ar.CreateAttribute("attr", [1], gdal.ExtendedDataType.CreateString()) - subg = rg.CreateGroup('subgroup') + subg = rg.CreateGroup("subgroup") assert subg with gdaltest.error_handler(): - assert not rg.CreateGroup('subgroup') - assert not rg.CreateGroup('') + assert not rg.CreateGroup("subgroup") + assert not rg.CreateGroup("") ds.FlushCache() - f = gdal.VSIFOpenL(tmpfile, 'rb') - got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + f = gdal.VSIFOpenL(tmpfile, "rb") + got_data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - #print(got_data) + # print(got_data) - assert got_data == """ + assert ( + got_data + == """ @@ -1229,6 +1363,7 @@ def test_vrtmultidim_createmultidimensional(): """ + ) _validate(got_data) gdal.Unlink(tmpfile) diff --git a/autotest/gdrivers/vrtovr.py b/autotest/gdrivers/vrtovr.py index ae65c40799a1..bd558ab13d5b 100755 --- a/autotest/gdrivers/vrtovr.py +++ b/autotest/gdrivers/vrtovr.py @@ -28,11 +28,12 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal import struct import gdaltest +from osgeo import gdal + ############################################################################### # Simple test @@ -57,17 +58,19 @@ def test_vrtovr_1(): """ ds = gdal.Open(vrt_string) - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get expected overview count" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 4672, 'did not get expected overview checksum' + assert cs == 4672, "did not get expected overview checksum" fl = ds.GetFileList() - assert fl == ['data/byte.tif', 'data/int16.tif'], 'did not get expected file list' + assert fl == ["data/byte.tif", "data/int16.tif"], "did not get expected file list" ds = None + ############################################################################### # Test serialization @@ -96,20 +99,22 @@ def test_vrtovr_2(): gdal.VSIFCloseL(f) ds = gdal.Open("/vsimem/vrtovr_2.vrt", gdal.GA_Update) - ds.GetRasterBand(1).SetDescription('foo') + ds.GetRasterBand(1).SetDescription("foo") ds = None ds = gdal.Open("/vsimem/vrtovr_2.vrt") - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get expected overview count" cs = ds.GetRasterBand(1).GetOverview(0).Checksum() - assert cs == 4672, 'did not get expected overview checksum' + assert cs == 4672, "did not get expected overview checksum" ds = None gdal.Unlink("/vsimem/vrtovr_2.vrt") + ############################################################################### # @@ -130,11 +135,13 @@ def test_vrtovr_none(): """ ds = gdal.Open(vrt_string) - assert ds.GetRasterBand(1).GetOverviewCount() == 0, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 0 + ), "did not get expected overview count" assert not ds.GetRasterBand(1).GetOverview(0) + ############################################################################### # @@ -159,8 +166,9 @@ def test_vrtovr_errors(): """ ds = gdal.Open(vrt_string) - assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ - 'did not get expected overview count' + assert ( + ds.GetRasterBand(1).GetOverviewCount() == 1 + ), "did not get expected overview count" assert not ds.GetRasterBand(1).GetOverview(-1) @@ -176,9 +184,9 @@ def test_vrtovr_errors(): def test_vrtovr_virtual(): - tif_tmpfilename = '/vsimem/temp.tif' - src_ds = gdal.GetDriverByName('GTiff').Create(tif_tmpfilename, 20, 20, 3) - src_ds.BuildOverviews('NEAR', [2, 4]) + tif_tmpfilename = "/vsimem/temp.tif" + src_ds = gdal.GetDriverByName("GTiff").Create(tif_tmpfilename, 20, 20, 3) + src_ds.BuildOverviews("NEAR", [2, 4]) src_ds.GetRasterBand(1).Fill(200) src_ds.GetRasterBand(2).Fill(100) src_ds.GetRasterBand(1).GetOverview(0).Fill(100) @@ -186,43 +194,79 @@ def test_vrtovr_virtual(): src_ds = None src_ds = gdal.Open(tif_tmpfilename) - tmpfilename = '/vsimem/temp.vrt' - vrt_ds = gdal.Translate(tmpfilename, src_ds, format='VRT') - assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 0 # we normally don't create implicit overviews on that small datasets + tmpfilename = "/vsimem/temp.vrt" + vrt_ds = gdal.Translate(tmpfilename, src_ds, format="VRT") + assert ( + vrt_ds.GetRasterBand(1).GetOverviewCount() == 0 + ) # we normally don't create implicit overviews on that small datasets - with gdaltest.config_option('VRT_VIRTUAL_OVERVIEWS', 'YES'): - vrt_ds.BuildOverviews('NEAR', [2, 4, 5, 50]) # level 50 is too big - assert gdal.VSIStatL(tmpfilename + '.ovr') is None + with gdaltest.config_option("VRT_VIRTUAL_OVERVIEWS", "YES"): + vrt_ds.BuildOverviews("NEAR", [2, 4, 5, 50]) # level 50 is too big + assert gdal.VSIStatL(tmpfilename + ".ovr") is None assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 3 # Clean overviews - with gdaltest.config_option('VRT_VIRTUAL_OVERVIEWS', 'YES'): - vrt_ds.BuildOverviews('NONE', []) + with gdaltest.config_option("VRT_VIRTUAL_OVERVIEWS", "YES"): + vrt_ds.BuildOverviews("NONE", []) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 0 # Add in two steps - with gdaltest.config_option('VRT_VIRTUAL_OVERVIEWS', 'YES'): - vrt_ds.BuildOverviews('NEAR', [2, 4]) - vrt_ds.BuildOverviews('NEAR', [5]) + with gdaltest.config_option("VRT_VIRTUAL_OVERVIEWS", "YES"): + vrt_ds.BuildOverviews("NEAR", [2, 4]) + vrt_ds.BuildOverviews("NEAR", [5]) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 3 - assert vrt_ds.GetRasterBand(1).GetOverview(0).Checksum() == src_ds.GetRasterBand(1).GetOverview(0).Checksum() - assert vrt_ds.GetRasterBand(1).GetOverview(1).Checksum() == src_ds.GetRasterBand(1).GetOverview(1).Checksum() - assert vrt_ds.ReadRaster(0,0,20,20,10,10) == src_ds.ReadRaster(0,0,20,20,10,10) - assert vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) == src_ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) - assert vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,5,5) == src_ds.GetRasterBand(1).ReadRaster(0,0,20,20,5,5) - assert struct.unpack('B' * 4 * 4,vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,4,4))[0] == 50 + assert ( + vrt_ds.GetRasterBand(1).GetOverview(0).Checksum() + == src_ds.GetRasterBand(1).GetOverview(0).Checksum() + ) + assert ( + vrt_ds.GetRasterBand(1).GetOverview(1).Checksum() + == src_ds.GetRasterBand(1).GetOverview(1).Checksum() + ) + assert vrt_ds.ReadRaster(0, 0, 20, 20, 10, 10) == src_ds.ReadRaster( + 0, 0, 20, 20, 10, 10 + ) + assert vrt_ds.GetRasterBand(1).ReadRaster( + 0, 0, 20, 20, 10, 10 + ) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) + assert vrt_ds.GetRasterBand(1).ReadRaster( + 0, 0, 20, 20, 5, 5 + ) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 5, 5) + assert ( + struct.unpack( + "B" * 4 * 4, vrt_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 4, 4) + )[0] + == 50 + ) vrt_ds = None # Re-open VRT and re-run checks vrt_ds = gdal.Open(tmpfilename) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 3 - assert vrt_ds.GetRasterBand(1).GetOverview(0).Checksum() == src_ds.GetRasterBand(1).GetOverview(0).Checksum() - assert vrt_ds.GetRasterBand(1).GetOverview(1).Checksum() == src_ds.GetRasterBand(1).GetOverview(1).Checksum() - assert vrt_ds.ReadRaster(0,0,20,20,10,10) == src_ds.ReadRaster(0,0,20,20,10,10) - assert vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) == src_ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) - assert vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,5,5) == src_ds.GetRasterBand(1).ReadRaster(0,0,20,20,5,5) - assert struct.unpack('B' * 4 * 4,vrt_ds.GetRasterBand(1).ReadRaster(0,0,20,20,4,4))[0] == 50 + assert ( + vrt_ds.GetRasterBand(1).GetOverview(0).Checksum() + == src_ds.GetRasterBand(1).GetOverview(0).Checksum() + ) + assert ( + vrt_ds.GetRasterBand(1).GetOverview(1).Checksum() + == src_ds.GetRasterBand(1).GetOverview(1).Checksum() + ) + assert vrt_ds.ReadRaster(0, 0, 20, 20, 10, 10) == src_ds.ReadRaster( + 0, 0, 20, 20, 10, 10 + ) + assert vrt_ds.GetRasterBand(1).ReadRaster( + 0, 0, 20, 20, 10, 10 + ) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 10, 10) + assert vrt_ds.GetRasterBand(1).ReadRaster( + 0, 0, 20, 20, 5, 5 + ) == src_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 5, 5) + assert ( + struct.unpack( + "B" * 4 * 4, vrt_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, 4, 4) + )[0] + == 50 + ) gdal.Unlink(tmpfilename) gdal.Unlink(tif_tmpfilename) @@ -235,20 +279,19 @@ def test_vrtovr_virtual(): def test_vrtovr_virtual_with_preexisting_implicit_ovr(): - src_ds = gdal.GetDriverByName('MEM').Create('', 1000, 1000) - src_ds.BuildOverviews('NEAR', [2]) - vrt_ds = gdal.Translate('', src_ds, format='VRT') + src_ds = gdal.GetDriverByName("MEM").Create("", 1000, 1000) + src_ds.BuildOverviews("NEAR", [2]) + vrt_ds = gdal.Translate("", src_ds, format="VRT") assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 - with gdaltest.config_option('VRT_VIRTUAL_OVERVIEWS', 'YES'): - vrt_ds.BuildOverviews('NEAR', [2, 4]) + with gdaltest.config_option("VRT_VIRTUAL_OVERVIEWS", "YES"): + vrt_ds.BuildOverviews("NEAR", [2, 4]) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 2 ############################################################################### # Cleanup. + def test_vrtovr_cleanup(): pass - - diff --git a/autotest/gdrivers/vrtpansharpen.py b/autotest/gdrivers/vrtpansharpen.py index 8af370007edb..0b6d32e65bcd 100755 --- a/autotest/gdrivers/vrtpansharpen.py +++ b/autotest/gdrivers/vrtpansharpen.py @@ -29,23 +29,23 @@ ############################################################################### import shutil -from osgeo import gdal - import pytest +from osgeo import gdal + ############################################################################### # Error cases def test_vrtpansharpen_1(): - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") src_data = src_ds.GetRasterBand(1).ReadRaster() gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None - pan_ds = gdal.GetDriverByName('GTiff').Create('tmp/small_world_pan.tif', 800, 400) + 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 @@ -56,7 +56,8 @@ def test_vrtpansharpen_1(): # Missing PansharpeningOptions gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -66,13 +67,15 @@ def test_vrtpansharpen_1(): Blue -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # PanchroBand missing gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -103,13 +106,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # PanchroBand.SourceFilename missing gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -142,13 +147,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Invalid dataset name gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -183,13 +190,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Inconsistent declared VRT dimensions with panchro dataset. gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -224,13 +233,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # VRTRasterBand of unrecognized subclass 'blabla' gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -265,13 +276,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Algorithm unsupported_alg unsupported gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -306,13 +319,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # 10 invalid band of tmp/small_world_pan.tif gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -347,13 +362,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.dstBand = '-1' invalid gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -388,13 +405,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.SourceFilename missing gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -428,13 +447,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Invalid dataset name gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -469,13 +490,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # 10 invalid band of data/small_world.tif gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -510,13 +533,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Another spectral band is already mapped to output band 1 gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -551,13 +576,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # No spectral band defined gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -580,13 +607,15 @@ def test_vrtpansharpen_1(): 1 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Hole in SpectralBand.dstBand numbering gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ WeightedBrovey @@ -612,13 +641,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Band 4 of type VRTPansharpenedRasterBand, but no corresponding SpectralBand gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -655,13 +686,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.dstBand = '3' invalid gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -693,13 +726,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # 2 weights defined, but 3 input spectral bands gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ Red @@ -734,13 +769,15 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None # Dimensions of input spectral band 1 different from first spectral band gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ tmp/small_world_pan.tif @@ -755,7 +792,8 @@ def test_vrtpansharpen_1(): 1 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is None @@ -765,7 +803,8 @@ def test_vrtpansharpen_1(): # Georeferencing of bottom-right corner of pan dataset and data/byte.tif do not match gdal.ErrorReset() gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ None @@ -777,17 +816,19 @@ def test_vrtpansharpen_1(): 1 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" # Just warnings # No spectral band is mapped to an output band # No output pansharpened band defined gdal.ErrorReset() gdal.PushErrorHandler() - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ WeightedBrovey @@ -813,10 +854,11 @@ def test_vrtpansharpen_1(): 3 -""") +""" + ) gdal.PopErrorHandler() assert vrt_ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" # Unsupported gdal.PushErrorHandler() @@ -824,16 +866,18 @@ def test_vrtpansharpen_1(): gdal.PopErrorHandler() assert ret != 0 + ############################################################################### # Nominal cases def test_vrtpansharpen_2(): - shutil.copy('data/small_world.tif', 'tmp/small_world.tif') + shutil.copy("data/small_world.tif", "tmp/small_world.tif") # Super verbose case - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 @@ -870,10 +914,11 @@ def test_vrtpansharpen_2(): 3 -""") +""" + ) assert vrt_ds is not None - assert vrt_ds.GetFileList() == ['tmp/small_world_pan.tif', 'data/small_world.tif'] - assert vrt_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None + assert vrt_ds.GetFileList() == ["tmp/small_world_pan.tif", "data/small_world.tif"] + assert vrt_ds.GetRasterBand(1).GetMetadataItem("NBITS", "IMAGE_STRUCTURE") is None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 0 @@ -882,7 +927,7 @@ def test_vrtpansharpen_2(): # Check VRTPansharpenedDataset::IRasterIO() in non-resampling case data = vrt_ds.ReadRaster() - tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 3) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 800, 400, 3) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(tmp_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) @@ -893,7 +938,8 @@ def test_vrtpansharpen_2(): assert data == ref_data # Compact case - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ tmp/small_world_pan.tif @@ -912,13 +958,15 @@ def test_vrtpansharpen_2(): 3 -""") +""" + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) # Expose pan band too - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 @@ -961,7 +1009,8 @@ def test_vrtpansharpen_2(): 3 -""") +""" + ) assert vrt_ds is not None # gdal.GetDriverByName('GTiff').CreateCopy('out1.tif', vrt_ds) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] @@ -969,7 +1018,8 @@ def test_vrtpansharpen_2(): # Same, but everything scrambled, and with spectral bands not in # the same dataset - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 @@ -1012,20 +1062,22 @@ def test_vrtpansharpen_2(): 3 -""") +""" + ) assert vrt_ds is not None # gdal.GetDriverByName('GTiff').CreateCopy('out2.tif', vrt_ds) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([50261, 4735, 10000, 9742], [50261, 4727, 9998, 9732]) + ############################################################################### # Test with overviews def test_vrtpansharpen_3(): - ds = gdal.Open('tmp/small_world_pan.tif') - ds.BuildOverviews('CUBIC', [2]) + ds = gdal.Open("tmp/small_world_pan.tif") + ds.BuildOverviews("CUBIC", [2]) ds = None xml = """ @@ -1053,7 +1105,10 @@ def test_vrtpansharpen_3(): vrt_ds = gdal.Open(xml) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrt_ds.GetRasterBand(1).GetOverview(0) is not None - cs = [vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(vrt_ds.RasterCount)] + cs = [ + vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() + for i in range(vrt_ds.RasterCount) + ] assert cs in ([7123, 7445, 5025], [7120, 7440, 5025]) # Check VRTPansharpenedDataset::IRasterIO() in resampling case with overviews @@ -1065,26 +1120,30 @@ def test_vrtpansharpen_3(): assert data == data2 - tmp_ds = gdal.GetDriverByName('MEM').Create('', 400, 200, 3) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 400, 200, 3) tmp_ds.WriteRaster(0, 0, 400, 200, data) cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(tmp_ds.RasterCount)] assert cs in ([7123, 7445, 5025], [7120, 7440, 5025]) vrt_ds = None - ds = gdal.Open('tmp/small_world.tif') - ds.BuildOverviews('CUBIC', [2]) + ds = gdal.Open("tmp/small_world.tif") + ds.BuildOverviews("CUBIC", [2]) ds = None # Test when both Pan and spectral bands have overviews vrt_ds = gdal.Open(xml) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrt_ds.GetRasterBand(1).GetOverview(0) is not None - cs = [vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(vrt_ds.RasterCount)] + cs = [ + vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() + for i in range(vrt_ds.RasterCount) + ] assert cs in ([18033, 18395, 16824], [18033, 18395, 16822]) vrt_ds = None + ############################################################################### # Test RasterIO() with various buffer datatypes @@ -1113,9 +1172,17 @@ def test_vrtpansharpen_4(): """ vrt_ds = gdal.Open(xml) - for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat64]: + for dt in [ + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + gdal.GDT_CFloat64, + ]: data = vrt_ds.GetRasterBand(1).ReadRaster(buf_type=dt) - tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 1, dt) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 800, 400, 1, dt) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = tmp_ds.GetRasterBand(1).Checksum() if dt == gdal.GDT_CFloat64: @@ -1131,7 +1198,15 @@ def test_vrtpansharpen_4(): def test_vrtpansharpen_5(): - for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat64]: + for dt in [ + gdal.GDT_Int16, + gdal.GDT_UInt16, + gdal.GDT_Int32, + gdal.GDT_UInt32, + gdal.GDT_Float32, + gdal.GDT_Float64, + gdal.GDT_CFloat64, + ]: spectral_xml = """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] @@ -1157,7 +1232,11 @@ def test_vrtpansharpen_5(): 3 -""" % (gdal.GetDataTypeName(dt), gdal.GetDataTypeName(dt), gdal.GetDataTypeName(dt)) +""" % ( + gdal.GetDataTypeName(dt), + gdal.GetDataTypeName(dt), + gdal.GetDataTypeName(dt), + ) xml = """ @@ -1187,11 +1266,16 @@ def test_vrtpansharpen_5(): 3 -""" % (gdal.GetDataTypeName(dt), spectral_xml, spectral_xml, spectral_xml) +""" % ( + gdal.GetDataTypeName(dt), + spectral_xml, + spectral_xml, + spectral_xml, + ) vrt_ds = gdal.Open(xml) data = vrt_ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Byte) - tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 1) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 800, 400, 1) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = tmp_ds.GetRasterBand(1).Checksum() if dt == gdal.GDT_UInt16: @@ -1223,10 +1307,12 @@ def test_vrtpansharpen_6(): nbits = 17 for i in range(3): if i > 0: - options = ['NBITS=%d' % nbits] + options = ["NBITS=%d" % nbits] else: options = [] - mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ms.tif', 4, 1, 1, dt, options=options) + mem_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/ms.tif", 4, 1, 1, dt, options=options + ) ar = numpy.array([[80, 125, 125, 80]]) if dt == gdal.GDT_UInt16: ar = ar << (12 - 7) @@ -1235,9 +1321,15 @@ def test_vrtpansharpen_6(): mem_ds.GetRasterBand(1).WriteArray(ar) mem_ds = None - mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pan.tif', 8, 2, 1, dt, options=options) - ar = numpy.array([[76, 89, 115, 127, 127, 115, 89, 76], - [76, 89, 115, 127, 127, 115, 89, 76]]) + mem_ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/pan.tif", 8, 2, 1, dt, options=options + ) + ar = numpy.array( + [ + [76, 89, 115, 127, 127, 115, 89, 76], + [76, 89, 115, 127, 127, 115, 89, 76], + ] + ) if dt == gdal.GDT_UInt16: ar = ar << (12 - 7) elif dt == gdal.GDT_UInt32: @@ -1262,7 +1354,9 @@ def test_vrtpansharpen_6(): """ vrt_ds = gdal.Open(xml) - assert vrt_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == str(nbits) + assert vrt_ds.GetRasterBand(1).GetMetadataItem( + "NBITS", "IMAGE_STRUCTURE" + ) == str(nbits) ar = vrt_ds.GetRasterBand(1).ReadAsArray() if dt == gdal.GDT_Byte: @@ -1270,15 +1364,24 @@ def test_vrtpansharpen_6(): elif dt == gdal.GDT_UInt16: expected_ar = [3040, 3560, 4095, 4095, 4095, 4095, 3560, 3040] else: - expected_ar = [97280, 113920, 131071, 131071, 131071, 131071, 113920, 97280] + expected_ar = [ + 97280, + 113920, + 131071, + 131071, + 131071, + 131071, + 113920, + 97280, + ] if list(ar[0]) != expected_ar: print(gdal.GetDataTypeName(dt)) pytest.fail(i) vrt_ds = None - gdal.Unlink('/vsimem/ms.tif') - gdal.Unlink('/vsimem/pan.tif') + gdal.Unlink("/vsimem/ms.tif") + gdal.Unlink("/vsimem/pan.tif") ############################################################################### @@ -1287,11 +1390,11 @@ def test_vrtpansharpen_6(): def test_vrtpansharpen_7(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_pan.tif', 20, 40) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/vrtpansharpen_7_pan.tif", 20, 40) ds.SetGeoTransform([120, 1, 0, 80, 0, -1]) ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_ms.tif', 15, 30) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/vrtpansharpen_7_ms.tif", 15, 30) ds.SetGeoTransform([100, 2, 0, 100, 0, -2]) ds = None @@ -1306,7 +1409,11 @@ def test_vrtpansharpen_7(): """ ds = gdal.Open(xml) - assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 + assert ( + ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) + and ds.RasterXSize == 40 + and ds.RasterYSize == 60 + ) ds = None xml = """ @@ -1321,7 +1428,11 @@ def test_vrtpansharpen_7(): """ ds = gdal.Open(xml) - assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 + assert ( + ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) + and ds.RasterXSize == 40 + and ds.RasterYSize == 60 + ) ds = None xml = """ @@ -1339,8 +1450,12 @@ def test_vrtpansharpen_7(): gdal.PushErrorHandler() ds = gdal.Open(xml) gdal.PopErrorHandler() - assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 - assert gdal.GetLastErrorMsg() == '' + assert ( + ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) + and ds.RasterXSize == 40 + and ds.RasterYSize == 60 + ) + assert gdal.GetLastErrorMsg() == "" ds = None xml = """ @@ -1355,7 +1470,11 @@ def test_vrtpansharpen_7(): """ ds = gdal.Open(xml) - assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 10 and ds.RasterYSize == 40 + assert ( + ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) + and ds.RasterXSize == 10 + and ds.RasterYSize == 40 + ) ds = None xml = """ @@ -1373,8 +1492,12 @@ def test_vrtpansharpen_7(): gdal.PushErrorHandler() ds = gdal.Open(xml) gdal.PopErrorHandler() - assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 20 and ds.RasterYSize == 40 - assert gdal.GetLastErrorMsg() != '' + assert ( + ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) + and ds.RasterXSize == 20 + and ds.RasterYSize == 40 + ) + assert gdal.GetLastErrorMsg() != "" ds = None xml = """ @@ -1390,12 +1513,16 @@ def test_vrtpansharpen_7(): """ gdal.ErrorReset() ds = gdal.Open(xml) - assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 20 and ds.RasterYSize == 40 - assert gdal.GetLastErrorMsg() == '' + assert ( + ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) + and ds.RasterXSize == 20 + and ds.RasterYSize == 40 + ) + assert gdal.GetLastErrorMsg() == "" ds = None # Empty intersection - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_ms.tif', 15, 30) + ds = gdal.GetDriverByName("GTiff").Create("/vsimem/vrtpansharpen_7_ms.tif", 15, 30) ds.SetGeoTransform([-100, 2, 0, -100, 0, -2]) ds = None @@ -1416,8 +1543,9 @@ def test_vrtpansharpen_7(): assert ds is None ds = None - gdal.GetDriverByName('GTiff').Delete('/vsimem/vrtpansharpen_7_pan.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/vrtpansharpen_7_ms.tif') + gdal.GetDriverByName("GTiff").Delete("/vsimem/vrtpansharpen_7_pan.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/vrtpansharpen_7_ms.tif") + ############################################################################### # Test SerializeToXML() @@ -1446,9 +1574,9 @@ def test_vrtpansharpen_8(): """ - open('tmp/vrtpansharpen_8.vrt', 'wt').write(xml) + open("tmp/vrtpansharpen_8.vrt", "wt").write(xml) - ds = gdal.Open('tmp/vrtpansharpen_8.vrt', gdal.GA_Update) + ds = gdal.Open("tmp/vrtpansharpen_8.vrt", gdal.GA_Update) expected_cs1 = ds.GetRasterBand(1).Checksum() expected_cs2 = ds.GetRasterBand(2).Checksum() expected_cs3 = ds.GetRasterBand(3).Checksum() @@ -1456,16 +1584,17 @@ def test_vrtpansharpen_8(): ds.SetMetadata(ds.GetMetadata()) ds = None - ds = gdal.Open('tmp/vrtpansharpen_8.vrt') + ds = gdal.Open("tmp/vrtpansharpen_8.vrt") cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() ds = None - gdal.Unlink('tmp/vrtpansharpen_8.vrt') + gdal.Unlink("tmp/vrtpansharpen_8.vrt") assert cs1 == expected_cs1 and cs2 == expected_cs2 and cs3 == expected_cs3 + ############################################################################### # Test NoData support @@ -1473,7 +1602,8 @@ def test_vrtpansharpen_8(): def test_vrtpansharpen_9(): # Explicit nodata - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ 0 @@ -1493,29 +1623,36 @@ def test_vrtpansharpen_9(): 3 -""") +""" + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] - expected_cs_list = ([7056, 11779, 9026], - [7052, 11770, 9018], # s390x - [7067, 11745, 8992], # Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 - ) + expected_cs_list = ( + [7056, 11779, 9026], + [7052, 11770, 9018], # s390x + [7067, 11745, 8992], # Intel(R) oneAPI DPC++/C++ Compiler 2022.1.0 + ) assert cs in expected_cs_list # Implicit nodata - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/small_world_pan_nodata.tif', 800, 400) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/small_world_pan_nodata.tif", 800, 400 + ) ds.GetRasterBand(1).SetNoDataValue(0) - ds.WriteRaster(0, 0, 800, 400, gdal.Open('tmp/small_world_pan.tif').ReadRaster()) + ds.WriteRaster(0, 0, 800, 400, gdal.Open("tmp/small_world_pan.tif").ReadRaster()) ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/small_world_nodata.tif', 400, 200, 3) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/small_world_nodata.tif", 400, 200, 3 + ) ds.GetRasterBand(1).SetNoDataValue(0) ds.GetRasterBand(2).SetNoDataValue(0) ds.GetRasterBand(3).SetNoDataValue(0) - ds.WriteRaster(0, 0, 400, 200, gdal.Open('data/small_world.tif').ReadRaster()) + ds.WriteRaster(0, 0, 400, 200, gdal.Open("data/small_world.tif").ReadRaster()) ds = None - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ /vsimem/small_world_pan_nodata.tif @@ -1534,13 +1671,15 @@ def test_vrtpansharpen_9(): 3 -""") +""" + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in expected_cs_list - gdal.Unlink('/vsimem/small_world_pan_nodata.tif') - gdal.Unlink('/vsimem/small_world_nodata.tif') + gdal.Unlink("/vsimem/small_world_pan_nodata.tif") + gdal.Unlink("/vsimem/small_world_nodata.tif") + ############################################################################### # Test UInt16 optimizations @@ -1548,16 +1687,21 @@ def test_vrtpansharpen_9(): def test_vrtpansharpen_10(): - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pan.tif', 1023, 1023, 1, gdal.GDT_UInt16) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/pan.tif", 1023, 1023, 1, gdal.GDT_UInt16 + ) ds.GetRasterBand(1).Fill(1000) ds = None - ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ms.tif', 256, 256, 4, gdal.GDT_UInt16) + ds = gdal.GetDriverByName("GTiff").Create( + "/vsimem/ms.tif", 256, 256, 4, gdal.GDT_UInt16 + ) for i in range(4): ds.GetRasterBand(i + 1).Fill(1000) ds = None # 4 bands - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ ALL_CPUS @@ -1581,7 +1725,8 @@ def test_vrtpansharpen_10(): 4 - """) + """ + ) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009, 62009] @@ -1589,13 +1734,16 @@ def test_vrtpansharpen_10(): data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) - tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) + tmp_ds = gdal.GetDriverByName("MEM").Create( + "", vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32 + ) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data # 4 bands -> 3 bands - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ ALL_CPUS @@ -1619,7 +1767,8 @@ def test_vrtpansharpen_10(): 4 - """) + """ + ) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009] @@ -1627,13 +1776,16 @@ def test_vrtpansharpen_10(): data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) - tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) + tmp_ds = gdal.GetDriverByName("MEM").Create( + "", vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32 + ) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data # 3 bands - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ ALL_CPUS @@ -1653,7 +1805,8 @@ def test_vrtpansharpen_10(): 3 - """) + """ + ) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009] @@ -1661,21 +1814,25 @@ def test_vrtpansharpen_10(): data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) - tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) + tmp_ds = gdal.GetDriverByName("MEM").Create( + "", vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32 + ) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data + ############################################################################### # Test gdal.CreatePansharpenedVRT() def test_vrtpansharpen_11(): - pan_ds = gdal.Open('tmp/small_world_pan.tif') - ms_ds = gdal.Open('data/small_world.tif') + pan_ds = gdal.Open("tmp/small_world_pan.tif") + ms_ds = gdal.Open("data/small_world.tif") - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ @@ -1684,18 +1841,22 @@ def test_vrtpansharpen_11(): - """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(i + 1) for i in range(3)]) + """, + pan_ds.GetRasterBand(1), + [ms_ds.GetRasterBand(i + 1) for i in range(3)], + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) # Also test with completely anonymous datasets - pan_mem_ds = gdal.GetDriverByName('MEM').CreateCopy('', pan_ds) - ms_mem_ds = gdal.GetDriverByName('MEM').CreateCopy('', ms_ds) + pan_mem_ds = gdal.GetDriverByName("MEM").CreateCopy("", pan_ds) + ms_mem_ds = gdal.GetDriverByName("MEM").CreateCopy("", ms_ds) pan_ds = None ms_ds = None - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ @@ -1704,19 +1865,23 @@ def test_vrtpansharpen_11(): - """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) + """, + pan_mem_ds.GetRasterBand(1), + [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)], + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) vrt_ds = None # Check that wrapping with VRT works (when gt are not compatible) - pan_mem_ds = gdal.GetDriverByName('MEM').Create('', 20, 40, 1) - ms_mem_ds = gdal.GetDriverByName('MEM').Create('', 15, 30, 3) + pan_mem_ds = gdal.GetDriverByName("MEM").Create("", 20, 40, 1) + ms_mem_ds = gdal.GetDriverByName("MEM").Create("", 15, 30, 3) pan_mem_ds.SetGeoTransform([120, 1, 0, 80, 0, -1]) ms_mem_ds.SetGeoTransform([100, 2, 0, 100, 0, -2]) - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ @@ -1725,32 +1890,48 @@ def test_vrtpansharpen_11(): - """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) - assert vrt_ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and vrt_ds.RasterXSize == 40 and vrt_ds.RasterYSize == 60 + """, + pan_mem_ds.GetRasterBand(1), + [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)], + ) + assert ( + vrt_ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) + and vrt_ds.RasterXSize == 40 + and vrt_ds.RasterYSize == 60 + ) vrt_ds = None # Test error cases as well gdal.PushErrorHandler() - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ - """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) + """, + pan_mem_ds.GetRasterBand(1), + [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)], + ) gdal.PopErrorHandler() assert vrt_ds is None # Too many bands gdal.PushErrorHandler() - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ @@ -1761,20 +1942,25 @@ def test_vrtpansharpen_11(): - """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) + """, + pan_mem_ds.GetRasterBand(1), + [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)], + ) gdal.PopErrorHandler() assert vrt_ds is None + ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/2328 def test_vrtpansharpen_nodata_multiple_spectral_bands(): - gdal.Translate('/vsimem/b1.tif', 'data/small_world.tif') - gdal.Translate('/vsimem/b2.tif', 'data/small_world.tif') + gdal.Translate("/vsimem/b1.tif", "data/small_world.tif") + gdal.Translate("/vsimem/b2.tif", "data/small_world.tif") - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ 0 @@ -1790,11 +1976,13 @@ def test_vrtpansharpen_nodata_multiple_spectral_bands(): 1 -""") +""" + ) assert vrt_ds - gdal.Unlink('/vsimem/b1.tif') - gdal.Unlink('/vsimem/b2.tif') + gdal.Unlink("/vsimem/b1.tif") + gdal.Unlink("/vsimem/b2.tif") + ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/3189 @@ -1802,17 +1990,19 @@ def test_vrtpansharpen_nodata_multiple_spectral_bands(): # declared in PansharpeningOptions, and when the VRTPansharpenedDataset # exposes overviews + def test_vrtpansharpen_nodata_overviews(): - ds = gdal.Translate('/vsimem/pan.tif', 'data/byte.tif') - ds.BuildOverviews('NEAR', [2]) + ds = gdal.Translate("/vsimem/pan.tif", "data/byte.tif") + ds.BuildOverviews("NEAR", [2]) ds = None - ds = gdal.Translate('/vsimem/ms.tif', 'data/byte.tif') - ds.BuildOverviews('NEAR', [2]) + ds = gdal.Translate("/vsimem/ms.tif", "data/byte.tif") + ds.BuildOverviews("NEAR", [2]) ds = None - vrt_ds = gdal.Open(""" + vrt_ds = gdal.Open( + """ 0 @@ -1824,25 +2014,28 @@ def test_vrtpansharpen_nodata_overviews(): 1 -""") +""" + ) assert vrt_ds assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 vrt_ds = None - gdal.Unlink('/vsimem/pan.tif') - gdal.Unlink('/vsimem/ms.tif') + gdal.Unlink("/vsimem/pan.tif") + gdal.Unlink("/vsimem/ms.tif") + ############################################################################### # Test input multispectral bands not in order 1,2,... and NoData as PansharpeningOptions + def test_vrtpansharpen_out_of_order_input_bands_and_nodata(): - src_ds = gdal.Open('data/small_world.tif') + src_ds = gdal.Open("data/small_world.tif") src_data = src_ds.GetRasterBand(1).ReadRaster() gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None - pan_ds = gdal.GetDriverByName('MEM').Create('', 800, 400) + pan_ds = gdal.GetDriverByName("MEM").Create("", 800, 400) gt = [gt[i] for i in range(len(gt))] gt[1] *= 0.5 gt[5] *= 0.5 @@ -1850,9 +2043,10 @@ def test_vrtpansharpen_out_of_order_input_bands_and_nodata(): pan_ds.SetProjection(wkt) pan_ds.GetRasterBand(1).WriteRaster(0, 0, 800, 400, src_data, 400, 200) - ms_ds = gdal.Open('data/small_world.tif') + ms_ds = gdal.Open("data/small_world.tif") - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ 0.5,0.5 @@ -1863,12 +2057,16 @@ def test_vrtpansharpen_out_of_order_input_bands_and_nodata(): - """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(i + 1) for i in range(2)]) + """, + pan_ds.GetRasterBand(1), + [ms_ds.GetRasterBand(i + 1) for i in range(2)], + ) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] # Switches the input multispectral bands - vrt_ds = gdal.CreatePansharpenedVRT(""" + vrt_ds = gdal.CreatePansharpenedVRT( + """ 0.5,0.5 @@ -1879,19 +2077,23 @@ def test_vrtpansharpen_out_of_order_input_bands_and_nodata(): - """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(2 - i) for i in range(2)]) + """, + pan_ds.GetRasterBand(1), + [ms_ds.GetRasterBand(2 - i) for i in range(2)], + ) assert vrt_ds is not None cs2 = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs2 == cs[::-1] + ############################################################################### # Cleanup def test_vrtpansharpen_cleanup(): - gdal.GetDriverByName('GTiff').Delete('tmp/small_world_pan.tif') - gdal.GetDriverByName('GTiff').Delete('tmp/small_world.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/pan.tif') - gdal.GetDriverByName('GTiff').Delete('/vsimem/ms.tif') + gdal.GetDriverByName("GTiff").Delete("tmp/small_world_pan.tif") + gdal.GetDriverByName("GTiff").Delete("tmp/small_world.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/pan.tif") + gdal.GetDriverByName("GTiff").Delete("/vsimem/ms.tif") diff --git a/autotest/gdrivers/vrtrawlink.py b/autotest/gdrivers/vrtrawlink.py index dc35e231ab0b..c5cef94a5034 100755 --- a/autotest/gdrivers/vrtrawlink.py +++ b/autotest/gdrivers/vrtrawlink.py @@ -31,26 +31,28 @@ ############################################################################### import os -from osgeo import gdal - import gdaltest +from osgeo import gdal + def _xmlsearch(root, nodetype, name): for node in root[2:]: if node[0] == nodetype and node[1] == name: return node + ############################################################################### # Verify reading from simple existing raw definition. def test_vrtrawlink_1(): - tst = gdaltest.GDALTest('VRT', 'small.vrt', 2, 12816) + tst = gdaltest.GDALTest("VRT", "small.vrt", 2, 12816) return tst.testOpen() + ############################################################################### # Create a new VRT raw link via the AddBand() method. @@ -58,38 +60,37 @@ def test_vrtrawlink_1(): def test_vrtrawlink_2(): driver = gdal.GetDriverByName("VRT") - ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) + ds = driver.Create("tmp/rawlink.vrt", 31, 35, 0) - options = [ - 'subClass=VRTRawRasterBand', - 'SourceFilename=data/small.raw' - ] + options = ["subClass=VRTRawRasterBand", "SourceFilename=data/small.raw"] result = ds.AddBand(gdal.GDT_Byte, options) - assert result == gdal.CE_None, 'AddBand() returned error code' + assert result == gdal.CE_None, "AddBand() returned error code" band = ds.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 12481, 'Wrong checksum' + assert chksum == 12481, "Wrong checksum" # Force it to be written to disk. ds = None + ############################################################################### # Confirm that the newly written file is was saved properly def test_vrtrawlink_3(): - gdaltest.rawlink_ds = gdal.Open('tmp/rawlink.vrt', gdal.GA_Update) + gdaltest.rawlink_ds = gdal.Open("tmp/rawlink.vrt", gdal.GA_Update) filelist = gdaltest.rawlink_ds.GetFileList() band = gdaltest.rawlink_ds.GetRasterBand(1) chksum = band.Checksum() - assert chksum == 12481, 'Wrong checksum' + assert chksum == 12481, "Wrong checksum" + + assert len(filelist) == 2, "Wrong filelist" - assert len(filelist) == 2, 'Wrong filelist' ############################################################################### # Add a new band, and we will test if we can write to it. @@ -98,21 +99,21 @@ def test_vrtrawlink_3(): def test_vrtrawlink_4(): # force creation of the file. - open('tmp/rawlink.dat', 'w').write(chr(0)) + open("tmp/rawlink.dat", "w").write(chr(0)) # Add a new band pointing to this bogus file. options = [ - 'subClass=VRTRawRasterBand', - 'SourceFilename=tmp/rawlink.dat', - 'relativeToVRT=0', - 'ImageOffset= 100', - 'PixelOffset=3', - 'LineOffset=93', - 'ByteOrder=MSB' + "subClass=VRTRawRasterBand", + "SourceFilename=tmp/rawlink.dat", + "relativeToVRT=0", + "ImageOffset= 100", + "PixelOffset=3", + "LineOffset=93", + "ByteOrder=MSB", ] result = gdaltest.rawlink_ds.AddBand(gdal.GDT_UInt16, options) - assert result == gdal.CE_None, 'AddBand() returned error code' + assert result == gdal.CE_None, "AddBand() returned error code" # write out some simple data. band_1 = gdaltest.rawlink_ds.GetRasterBand(1) @@ -126,23 +127,24 @@ def test_vrtrawlink_4(): # Verify it seems to be right. chksum = band.Checksum() - assert chksum == 12481, 'Wrong checksum' + assert chksum == 12481, "Wrong checksum" band_1 = None band = None # Close and reopen to ensure we are getting data from disk. gdaltest.rawlink_ds = None - gdaltest.rawlink_ds = gdal.Open('tmp/rawlink.vrt', gdal.GA_Update) + gdaltest.rawlink_ds = gdal.Open("tmp/rawlink.vrt", gdal.GA_Update) band = gdaltest.rawlink_ds.GetRasterBand(2) chksum = band.Checksum() - assert chksum == 12481, 'Wrong checksum' + assert chksum == 12481, "Wrong checksum" # verify file length. - statinfo = os.stat('tmp/rawlink.dat') - assert statinfo.st_size == 3354, 'data file is wrong size' + statinfo = os.stat("tmp/rawlink.dat") + assert statinfo.st_size == 3354, "data file is wrong size" + ############################################################################### # Add a new band, and check the relativeToVRT property. @@ -151,38 +153,41 @@ def test_vrtrawlink_4(): def test_vrtrawlink_5(): driver = gdal.GetDriverByName("VRT") - ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) + ds = driver.Create("tmp/rawlink.vrt", 31, 35, 0) # Add a new band pointing to this bogus file. options = [ - 'subClass=VRTRawRasterBand', - 'SourceFilename=rawlink5.dat', - 'relativeToVRT=1', - 'ImageOffset=100', - 'PixelOffset=3', - 'LineOffset=93', - 'ByteOrder=MSB' + "subClass=VRTRawRasterBand", + "SourceFilename=rawlink5.dat", + "relativeToVRT=1", + "ImageOffset=100", + "PixelOffset=3", + "LineOffset=93", + "ByteOrder=MSB", ] result = ds.AddBand(gdal.GDT_UInt16, options) - assert result == gdal.CE_None, 'AddBand() returned error code' + assert result == gdal.CE_None, "AddBand() returned error code" gdaltest.rawlink_ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None - xmlstring = open('tmp/rawlink.vrt').read() + xmlstring = open("tmp/rawlink.vrt").read() root = gdal.ParseXMLString(xmlstring) - node = _xmlsearch(root, gdal.CXT_Element, 'VRTRasterBand') - node = _xmlsearch(node, gdal.CXT_Element, 'SourceFilename') - node = _xmlsearch(node, gdal.CXT_Attribute, 'relativeToVRT') + node = _xmlsearch(root, gdal.CXT_Element, "VRTRasterBand") + node = _xmlsearch(node, gdal.CXT_Element, "SourceFilename") + node = _xmlsearch(node, gdal.CXT_Attribute, "relativeToVRT") + + assert node is not None and node[2][1] == "1", "incorrect relativeToVRT value" - assert node is not None and node[2][1] == "1", 'incorrect relativeToVRT value' + assert ( + "100" in xmlstring + and "3" in xmlstring + and "93" in xmlstring + ) - assert ('100' in xmlstring and \ - '3' in xmlstring and \ - '93' in xmlstring) ############################################################################### # Add a new band with relativeToVRT=1, and re-open the dataset. @@ -191,35 +196,37 @@ def test_vrtrawlink_5(): def test_vrtrawlink_6(): driver = gdal.GetDriverByName("VRT") - ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) + ds = driver.Create("tmp/rawlink.vrt", 31, 35, 0) # Add a new band pointing to this bogus file. options = [ - 'subClass=VRTRawRasterBand', - 'SourceFilename=rawlink6.dat', - 'relativeToVRT=1', - 'ImageOffset=100', - 'PixelOffset=3', - 'LineOffset=93', - 'ByteOrder=MSB' + "subClass=VRTRawRasterBand", + "SourceFilename=rawlink6.dat", + "relativeToVRT=1", + "ImageOffset=100", + "PixelOffset=3", + "LineOffset=93", + "ByteOrder=MSB", ] result = ds.AddBand(gdal.GDT_UInt16, options) - assert result == gdal.CE_None, 'AddBand() returned error code' + assert result == gdal.CE_None, "AddBand() returned error code" ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None - ds = gdal.Open('tmp/rawlink.vrt') + ds = gdal.Open("tmp/rawlink.vrt") assert ds is not None, 'unable to open the dataset: "tmp/rawlink.vrt"' b = ds.GetRasterBand(1) - assert b is not None, 'unable to open the raster band #1' + assert b is not None, "unable to open the raster band #1" + + assert os.path.exists( + "tmp/rawlink6.dat" + ), 'tha raw file is not in the expected location ("tmp/rawlink6.dat")' - assert os.path.exists('tmp/rawlink6.dat'), \ - 'tha raw file is not in the expected location ("tmp/rawlink6.dat")' ############################################################################### # Add a new band with relativeToVRT=1, change directory and re-open the dataset. @@ -228,38 +235,38 @@ def test_vrtrawlink_6(): def test_vrtrawlink_7(): driver = gdal.GetDriverByName("VRT") - ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) + ds = driver.Create("tmp/rawlink.vrt", 31, 35, 0) # Add a new band pointing to this bogus file. options = [ - 'subClass=VRTRawRasterBand', - 'SourceFilename=rawlink7.dat', - 'relativeToVRT=1', - 'ImageOffset=100', - 'PixelOffset=3', - 'LineOffset=93', - 'ByteOrder=MSB' + "subClass=VRTRawRasterBand", + "SourceFilename=rawlink7.dat", + "relativeToVRT=1", + "ImageOffset=100", + "PixelOffset=3", + "LineOffset=93", + "ByteOrder=MSB", ] result = ds.AddBand(gdal.GDT_UInt16, options) - assert result == gdal.CE_None, 'AddBand() returned error code' + assert result == gdal.CE_None, "AddBand() returned error code" ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None - os.chdir('tmp') + os.chdir("tmp") try: - ds = gdal.Open('rawlink.vrt') + ds = gdal.Open("rawlink.vrt") assert ds is not None, 'unable to open the dataset: "rawlink.vrt"' b = ds.GetRasterBand(1) - assert b is not None, 'unable to open the raster band #1' + assert b is not None, "unable to open the raster band #1" finally: - os.chdir('..') + os.chdir("..") + - ############################################################################### # Test error case (too much memory allocation) @@ -268,7 +275,8 @@ def test_vrtrawlink_8(): for _ in range(2): with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ data/small.raw 0 @@ -276,10 +284,11 @@ def test_vrtrawlink_8(): 1 LSB - """) - assert not (ds or gdal.GetLastErrorMsg().find('Image file is too small') < 0) + """ + ) + assert not (ds or gdal.GetLastErrorMsg().find("Image file is too small") < 0) + - ############################################################################### # Test error case (inexisting file) @@ -287,12 +296,15 @@ def test_vrtrawlink_8(): def test_vrtrawlink_9(): with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ i/do/not/exist - """) - assert not (ds or gdal.GetLastErrorMsg().find('Unable to open') < 0) + """ + ) + assert not (ds or gdal.GetLastErrorMsg().find("Unable to open") < 0) + ############################################################################### # Test error case (invalid byte order) @@ -301,13 +313,15 @@ def test_vrtrawlink_9(): def test_vrtrawlink_10(): with gdaltest.error_handler(): - ds = gdal.Open(""" + ds = gdal.Open( + """ data/small.raw invalid - """) - assert not (ds or gdal.GetLastErrorMsg().find('ByteOrder') < 0) + """ + ) + assert not (ds or gdal.GetLastErrorMsg().find("ByteOrder") < 0) ############################################################################### @@ -316,7 +330,8 @@ def test_vrtrawlink_10(): def test_vrtrawlink_vax_order(): - ds = gdal.Open(""" + ds = gdal.Open( + """ data/vicar/vicar_vax_float32.vic 368 @@ -324,9 +339,11 @@ def test_vrtrawlink_vax_order(): 16 VAX - """) + """ + ) assert ds.GetRasterBand(1).Checksum() == 129 + ############################################################################### # Cleanup. @@ -335,13 +352,10 @@ def test_vrtrawlink_cleanup(): gdaltest.rawlink_ds = None try: - os.remove('tmp/rawlink.vrt') - os.remove('tmp/rawlink.dat') - os.remove('tmp/rawlink5.dat') - os.remove('tmp/rawlink6.dat') - os.remove('tmp/rawlink7.dat') + os.remove("tmp/rawlink.vrt") + os.remove("tmp/rawlink.dat") + os.remove("tmp/rawlink5.dat") + os.remove("tmp/rawlink6.dat") + os.remove("tmp/rawlink7.dat") except OSError: pass - - - diff --git a/autotest/gdrivers/vrtwarp.py b/autotest/gdrivers/vrtwarp.py index 1a6d5dc02487..c1ec903a8e68 100755 --- a/autotest/gdrivers/vrtwarp.py +++ b/autotest/gdrivers/vrtwarp.py @@ -31,21 +31,22 @@ import os import shutil import sys -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Verify reading from simple existing warp definition. def test_vrtwarp_1(): - tst = gdaltest.GDALTest('VRT', 'vrt/rgb_warp.vrt', 2, 21504) + tst = gdaltest.GDALTest("VRT", "vrt/rgb_warp.vrt", 2, 21504) return tst.testOpen(check_filelist=False) + ############################################################################### # Create a new VRT warp in the temp directory. @@ -53,11 +54,11 @@ def test_vrtwarp_1(): def test_vrtwarp_2(): try: - os.remove('tmp/warp.vrt') + os.remove("tmp/warp.vrt") except OSError: pass - gcp_ds = gdal.OpenShared('data/rgb_gcp.vrt', gdal.GA_ReadOnly) + gcp_ds = gdal.OpenShared("data/rgb_gcp.vrt", gdal.GA_ReadOnly) gdaltest.vrtwarp_ds = gdal.AutoCreateWarpedVRT(gcp_ds) @@ -65,8 +66,11 @@ def test_vrtwarp_2(): checksum = gdaltest.vrtwarp_ds.GetRasterBand(2).Checksum() expected = 21504 - assert checksum == expected, ('Got checksum of %d instead of expected %d.' - % (checksum, expected)) + 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 @@ -75,19 +79,22 @@ def test_vrtwarp_2(): def test_vrtwarp_3(): - gdaltest.vrtwarp_ds.SetDescription('tmp/warp.vrt') + gdaltest.vrtwarp_ds.SetDescription("tmp/warp.vrt") gdaltest.vrtwarp_ds = None - gdaltest.vrtwarp_ds = gdal.Open('tmp/warp.vrt', gdal.GA_ReadOnly) + 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') + gdal.GetDriverByName("VRT").Delete("tmp/warp.vrt") + + assert checksum == expected, "Got checksum of %d instead of expected %d." % ( + checksum, + expected, + ) - assert checksum == expected, ('Got checksum of %d instead of expected %d.' - % (checksum, expected)) ############################################################################### # Test implicit overviews with default source overview level strategy (AUTO) @@ -95,10 +102,10 @@ def test_vrtwarp_3(): def test_vrtwarp_4(): - src_ds = gdal.Open('../gcore/data/byte.tif') - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_4.tif', src_ds) + 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.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) @@ -113,27 +120,27 @@ def test_vrtwarp_4(): 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.SetDescription("tmp/vrtwarp_4.vrt") vrtwarp_ds = None - vrtwarp_ds = gdal.Open('tmp/vrtwarp_4.vrt') + vrtwarp_ds = gdal.Open("tmp/vrtwarp_4.vrt") elif i == 1: vrtwarp_ds = None - tmp_ds = gdal.Open('tmp/vrtwarp_4.tif') + 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') + 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.BuildOverviews("NEAR", overviewlist=[2, 4, 8]) vrtwarp_ds = None - ds = gdal.GetDriverByName('MEM').Create('', 3, 3, 1) + 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') + 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 @@ -141,8 +148,9 @@ def test_vrtwarp_4(): 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') + gdal.Unlink("tmp/vrtwarp_4.vrt") + gdal.Unlink("tmp/vrtwarp_4.tif") + ############################################################################### # Test implicit overviews with selection of the upper source overview level @@ -150,28 +158,30 @@ def test_vrtwarp_4(): def test_vrtwarp_5(): - src_ds = gdal.Open('../gcore/data/byte.tif') - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_5.tif', src_ds) + 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.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') + 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 = 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') + tmp_ds = gdal.Open("tmp/vrtwarp_5.tif") vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) - vrtwarp_ds.SetMetadataItem('SrcOvrLevel', 'AUTO-1') + vrtwarp_ds.SetMetadataItem("SrcOvrLevel", "AUTO-1") tmp_ds = None assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main @@ -179,7 +189,8 @@ def test_vrtwarp_5(): assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == expected_cs_ov1 vrtwarp_ds = None - gdal.Unlink('tmp/vrtwarp_5.tif') + gdal.Unlink("tmp/vrtwarp_5.tif") + ############################################################################### # Test implicit overviews with GCP @@ -187,8 +198,8 @@ def test_vrtwarp_5(): def test_vrtwarp_6(): - src_ds = gdal.Open('../gcore/data/byte.tif') - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_6.tif', src_ds) + 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() @@ -208,24 +219,25 @@ def test_vrtwarp_6(): gcp3.GCPY = 3751320.000 src_gcps = (gcp1, gcp2, gcp3) tmp_ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) - tmp_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + 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.SetDescription("tmp/vrtwarp_6.vrt") vrtwarp_ds = None tmp_ds = None - vrtwarp_ds = gdal.Open('tmp/vrtwarp_6.vrt') + 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') + gdal.Unlink("tmp/vrtwarp_6.vrt") + gdal.Unlink("tmp/vrtwarp_6.tif") + ############################################################################### # Test implicit overviews with GCP (TPS) @@ -233,8 +245,8 @@ def test_vrtwarp_6(): def test_vrtwarp_7(): - src_ds = gdal.Open('../gcore/data/byte.tif') - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_7.tif', src_ds) + 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() @@ -254,20 +266,23 @@ def test_vrtwarp_7(): gcp3.GCPY = 3751320.000 src_gcps = (gcp1, gcp2, gcp3) tmp_ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) - tmp_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) + 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') + 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') + gdal.Unlink("tmp/vrtwarp_7.vrt") + gdal.Unlink("tmp/vrtwarp_7.tif") + ############################################################################### # Test implicit overviews with RPC @@ -275,17 +290,19 @@ def test_vrtwarp_7(): 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]) + 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') + 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') + 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: @@ -293,9 +310,10 @@ def test_vrtwarp_8(): 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') + gdal.Unlink("tmp/vrtwarp_8.vrt") + gdal.Unlink("tmp/vrtwarp_8.tif") + gdal.Unlink("tmp/vrtwarp_8_rpc.txt") + ############################################################################### # Test implicit overviews with GEOLOCATION @@ -303,10 +321,11 @@ def test_vrtwarp_8(): def test_vrtwarp_9(): - shutil.copy('../gcore/data/sstgeo.tif', 'tmp/sstgeo.tif') + shutil.copy("../gcore/data/sstgeo.tif", "tmp/sstgeo.tif") - f = open('tmp/sstgeo.vrt', 'wb') - f.write(''' + 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 @@ -329,27 +348,35 @@ def test_vrtwarp_9(): -'''.encode('ascii')) +""".encode( + "ascii" + ) + ) f.close() - ds = gdal.Open('tmp/sstgeo.vrt', gdal.GA_Update) - ds.BuildOverviews('NEAR', overviewlist=[2]) + 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') + 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') + 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 - assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == 62489, \ - (vrtwarp_ds.GetRasterBand(1).GetOverview(0).XSize, vrtwarp_ds.GetRasterBand(1).GetOverview(0).YSize) + assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == 62489, ( + vrtwarp_ds.GetRasterBand(1).GetOverview(0).XSize, + 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') + 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 @@ -357,27 +384,27 @@ def test_vrtwarp_9(): def test_vrtwarp_10(): - src_ds = gdal.Open('../gcore/data/byte.tif') - tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_10.tif', src_ds) + 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.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') + 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') + 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') + tmp_ds = gdal.Open("tmp/vrtwarp_10.tif") vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) - vrtwarp_ds.SetMetadataItem('SrcOvrLevel', 'NONE') + vrtwarp_ds.SetMetadataItem("SrcOvrLevel", "NONE") tmp_ds = None assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main @@ -385,7 +412,8 @@ def test_vrtwarp_10(): assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == expected_cs_ov1 vrtwarp_ds = None - gdal.Unlink('tmp/vrtwarp_10.tif') + gdal.Unlink("tmp/vrtwarp_10.tif") + ############################################################################### # Test implicit overviews with dest alpha band (#6081) @@ -393,7 +421,7 @@ def test_vrtwarp_10(): def test_vrtwarp_11(): - ds = gdal.Open('data/vrt/bug6581.vrt') + ds = gdal.Open("data/vrt/bug6581.vrt") cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() @@ -401,16 +429,18 @@ def test_vrtwarp_11(): assert cs1 == 22122 and cs2 == 56685 and cs3 == 22122 + ############################################################################### # Test reading a regular VRT whose source is a warped VRT inlined def test_vrtwarp_read_vrt_of_warped_vrt(): - ds = gdal.Open('data/vrt/vrt_of_warped_vrt.vrt') + ds = gdal.Open("data/vrt/vrt_of_warped_vrt.vrt") cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 + ############################################################################### # Test reading a warped VRT with blocks > 2 gigapixels @@ -420,20 +450,24 @@ 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') + pytest.skip("Test not available on 32 bit") import psutil + if psutil.virtual_memory().available < 2 * 50000 * 50000: pytest.skip("Not enough virtual memory available") - ds = gdal.Open('data/vrt/test_deflate_2GB.vrt') + ds = gdal.Open("data/vrt/test_deflate_2GB.vrt") - data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) + 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 = 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 space. # https://github.com/OSGeo/gdal/issues/1985 @@ -441,23 +475,32 @@ def test_vrtwarp_read_blocks_larger_than_2_gigapixels(): def test_vrtwarp_read_blocks_in_space(): - ds = gdal.Open('data/vrt/geos_vrtwarp.vrt') + ds = gdal.Open("data/vrt/geos_vrtwarp.vrt") assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) + ############################################################################### # Test reading a warped VRT that has inconsistent block size at band and # dataset level -@pytest.mark.parametrize("filename", ["data/vrt/warp_inconsistent_blockxsize.vrt", - "data/vrt/warp_inconsistent_blockysize.vrt"]) +@pytest.mark.parametrize( + "filename", + [ + "data/vrt/warp_inconsistent_blockxsize.vrt", + "data/vrt/warp_inconsistent_blockysize.vrt", + ], +) def test_vrtwarp_read_inconsistent_blocksize(filename): gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None - assert gdal.GetLastErrorMsg() == 'Block size specified on band 1 not consistent with dataset block size' + assert ( + gdal.GetLastErrorMsg() + == "Block size specified on band 1 not consistent with dataset block size" + ) ############################################################################### @@ -465,27 +508,28 @@ def test_vrtwarp_read_inconsistent_blocksize(filename): def test_vrtwarp_write_no_duplicated_blocksize(): - tmpfilename = '/vsimem/tmp.vrt' - gdal.Warp(tmpfilename, 'data/byte.tif', format='VRT', width=1024, height=1024) - fp = gdal.VSIFOpenL(tmpfilename, 'rb') + tmpfilename = "/vsimem/tmp.vrt" + gdal.Warp(tmpfilename, "data/byte.tif", format="VRT", width=1024, height=1024) + fp = gdal.VSIFOpenL(tmpfilename, "rb") assert fp - data = gdal.VSIFReadL(1, 10000, fp).decode('utf-8') + data = gdal.VSIFReadL(1, 10000, fp).decode("utf-8") gdal.VSIFCloseL(fp) gdal.Unlink(tmpfilename) - assert '' in data - assert '' in data - assert ' blockXSize=' not in data - assert ' blockYSize=' not in data + assert "" in data + assert "" in data + assert " blockXSize=" not in data + assert " blockYSize=" not in data ############################################################################### # Test reading blocks without source pixels from a warped VRT with an alpha band # (#4997) + def test_vrtwarp_alpha_band_and_block_without_source_pixel(): - tmpfilename = '/vsimem/tmp.tif' - gdal.Translate(tmpfilename, 'data/vrt/bug4997.vrt') + tmpfilename = "/vsimem/tmp.tif" + gdal.Translate(tmpfilename, "data/vrt/bug4997.vrt") ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(4).Checksum() == 0 ds = None @@ -495,76 +539,92 @@ def test_vrtwarp_alpha_band_and_block_without_source_pixel(): ############################################################################### # Test the relativeToVRT attribute of SourceDataset + def test_vrtwarp_sourcedataset_all_relatives(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join('tmp', 'byte.tif')) + src_ds = gdal.Open(os.path.join("tmp", "byte.tif")) ds = gdal.AutoCreateWarpedVRT(src_ds) - ds.SetDescription(os.path.join('tmp', 'byte.vrt')) + ds.SetDescription(os.path.join("tmp", "byte.vrt")) ds = None - assert 'byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + 'byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceDataset + def test_vrtwarp_sourcedataset_source_relative_dest_absolute(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join('tmp', 'byte.tif')) + src_ds = gdal.Open(os.path.join("tmp", "byte.tif")) ds = gdal.AutoCreateWarpedVRT(src_ds) - path = os.path.join(os.getcwd(), 'tmp', 'byte.vrt') - if sys.platform == 'win32': - path = path.replace('/', '\\') + path = os.path.join(os.getcwd(), "tmp", "byte.vrt") + if sys.platform == "win32": + path = path.replace("/", "\\") ds.SetDescription(path) ds = None - assert 'byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + 'byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceDataset + def test_vrtwarp_sourcedataset_source_absolute_dest_absolute(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - src_ds = gdal.Open(os.path.join(os.getcwd(), 'tmp', 'byte.tif')) + src_ds = gdal.Open(os.path.join(os.getcwd(), "tmp", "byte.tif")) ds = gdal.AutoCreateWarpedVRT(src_ds) - ds.SetDescription(os.path.join(os.getcwd(), 'tmp', 'byte.vrt')) + ds.SetDescription(os.path.join(os.getcwd(), "tmp", "byte.vrt")) ds = None - assert 'byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + 'byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") ############################################################################### # Test the relativeToVRT attribute of SourceDataset + def test_vrtwarp_sourcedataset_source_absolute_dest_relative(): - shutil.copy('data/byte.tif', 'tmp') + shutil.copy("data/byte.tif", "tmp") try: - path = os.path.join(os.getcwd(), 'tmp', 'byte.tif') - if sys.platform == 'win32': - path = path.replace('/', '\\') + path = os.path.join(os.getcwd(), "tmp", "byte.tif") + if sys.platform == "win32": + path = path.replace("/", "\\") src_ds = gdal.Open(path) ds = gdal.AutoCreateWarpedVRT(src_ds) - ds.SetDescription(os.path.join('tmp', 'byte.vrt')) + ds.SetDescription(os.path.join("tmp", "byte.vrt")) ds = None - assert 'byte.tif<' in open('tmp/byte.vrt', 'rt').read() + assert ( + 'byte.tif<' + in open("tmp/byte.vrt", "rt").read() + ) finally: - gdal.Unlink('tmp/byte.tif') - gdal.Unlink('tmp/byte.vrt') + gdal.Unlink("tmp/byte.tif") + gdal.Unlink("tmp/byte.vrt") diff --git a/autotest/gdrivers/wcs.py b/autotest/gdrivers/wcs.py index c65502e02beb..6d0ce87a1f4b 100755 --- a/autotest/gdrivers/wcs.py +++ b/autotest/gdrivers/wcs.py @@ -30,18 +30,18 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from http.server import BaseHTTPRequestHandler -import os import numbers +import os import re import shutil import urllib.parse +from http.server import BaseHTTPRequestHandler +import gdaltest import pytest +import webserver from osgeo import gdal -import webserver -import gdaltest ############################################################################### # Verify we have the driver. @@ -50,12 +50,12 @@ def test_wcs_1(): # Disable wcs tests till we have a more reliable test server. - gdaltest.wcs_drv = gdal.GetDriverByName('WCS') + gdaltest.wcs_drv = gdal.GetDriverByName("WCS") # NOTE - mloskot: # This is a dirty hack checking if remote WCS service is online. # Nothing genuine but helps to keep the buildbot waterfall green. - srv = 'http://demo.opengeo.org/geoserver/wcs?' + srv = "http://demo.opengeo.org/geoserver/wcs?" if gdaltest.gdalurlopen(srv) is None: gdaltest.wcs_drv = None @@ -63,6 +63,7 @@ def test_wcs_1(): if gdaltest.wcs_drv is None: pytest.skip() + ############################################################################### # Open the GeoServer WCS service. @@ -73,14 +74,15 @@ def wcs_2(): pytest.skip() # first, copy to tmp directory. - open('tmp/geoserver.wcs', 'w').write(open('data/geoserver.wcs').read()) + open("tmp/geoserver.wcs", "w").write(open("data/geoserver.wcs").read()) gdaltest.wcs_ds = None - gdaltest.wcs_ds = gdal.Open('tmp/geoserver.wcs') + gdaltest.wcs_ds = gdal.Open("tmp/geoserver.wcs") if gdaltest.wcs_ds is not None: return - pytest.fail('open failed.') + pytest.fail("open failed.") + ############################################################################### # Check various things about the configuration. @@ -91,21 +93,33 @@ def test_wcs_3(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() - assert gdaltest.wcs_ds.RasterXSize == 983 and gdaltest.wcs_ds.RasterYSize == 598 and gdaltest.wcs_ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + gdaltest.wcs_ds.RasterXSize == 983 + and gdaltest.wcs_ds.RasterYSize == 598 + and gdaltest.wcs_ds.RasterCount == 3 + ), "wrong size or bands" wkt = gdaltest.wcs_ds.GetProjectionRef() - assert wkt[:14] == 'GEOGCS["WGS 84', ('Got wrong SRS: ' + wkt) + assert wkt[:14] == 'GEOGCS["WGS 84', "Got wrong SRS: " + wkt gt = gdaltest.wcs_ds.GetGeoTransform() - expected_gt = (-130.85167999999999, 0.070036907426246159, 0.0, 54.114100000000001, 0.0, -0.055867725752508368) + expected_gt = ( + -130.85167999999999, + 0.070036907426246159, + 0.0, + 54.114100000000001, + 0.0, + -0.055867725752508368, + ) for i in range(6): - assert gt[i] == pytest.approx(expected_gt[i], abs=0.00001), 'wrong geotransform' + assert gt[i] == pytest.approx(expected_gt[i], abs=0.00001), "wrong geotransform" - assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' + assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, "no overviews!" + + assert ( + gdaltest.wcs_ds.GetRasterBand(1).DataType == gdal.GDT_Byte + ), "wrong band data type" - assert gdaltest.wcs_ds.GetRasterBand(1).DataType == gdal.GDT_Byte, \ - 'wrong band data type' ############################################################################### # Check checksum @@ -117,7 +131,8 @@ def test_wcs_4(): pytest.skip() cs = gdaltest.wcs_ds.GetRasterBand(1).Checksum() - assert cs == 58765, ('Wrong checksum: ' + str(cs)) + assert cs == 58765, "Wrong checksum: " + str(cs) + ############################################################################### # Open the service using XML as filename. @@ -136,12 +151,15 @@ def wcs_5(): ds = gdal.Open(fn) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 983 and ds.RasterYSize == 598 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 983 and ds.RasterYSize == 598 and ds.RasterCount == 3 + ), "wrong size or bands" ds = None + + ############################################################################### # Open the srtm plus service. @@ -152,14 +170,15 @@ def old_wcs_2(): pytest.skip() # first, copy to tmp directory. - open('tmp/srtmplus.wcs', 'w').write(open('data/srtmplus.wcs').read()) + open("tmp/srtmplus.wcs", "w").write(open("data/srtmplus.wcs").read()) gdaltest.wcs_ds = None - gdaltest.wcs_ds = gdal.Open('tmp/srtmplus.wcs') + gdaltest.wcs_ds = gdal.Open("tmp/srtmplus.wcs") if gdaltest.wcs_ds is not None: return - pytest.fail('open failed.') + pytest.fail("open failed.") + ############################################################################### # Check various things about the configuration. @@ -170,20 +189,31 @@ def old_wcs_3(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() - assert gdaltest.wcs_ds.RasterXSize == 43200 and gdaltest.wcs_ds.RasterYSize == 21600 and gdaltest.wcs_ds.RasterCount == 1, \ - 'wrong size or bands' + assert ( + gdaltest.wcs_ds.RasterXSize == 43200 + and gdaltest.wcs_ds.RasterYSize == 21600 + and gdaltest.wcs_ds.RasterCount == 1 + ), "wrong size or bands" wkt = gdaltest.wcs_ds.GetProjectionRef() - assert wkt[:12] == 'GEOGCS["NAD8', ('Got wrong SRS: ' + wkt) + assert wkt[:12] == 'GEOGCS["NAD8', "Got wrong SRS: " + wkt gt = gdaltest.wcs_ds.GetGeoTransform() - assert gt[0] == pytest.approx(-180.0041667, abs=0.00001) and gt[3] == pytest.approx(90.004167, abs=0.00001) and gt[1] == pytest.approx(0.00833333, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and gt[5] == pytest.approx(-0.00833333, abs=0.00001) and gt[4] == pytest.approx(0, abs=0.00001), \ - 'wrong geotransform' + assert ( + gt[0] == pytest.approx(-180.0041667, abs=0.00001) + and gt[3] == pytest.approx(90.004167, abs=0.00001) + and gt[1] == pytest.approx(0.00833333, abs=0.00001) + and gt[2] == pytest.approx(0, abs=0.00001) + and gt[5] == pytest.approx(-0.00833333, abs=0.00001) + and gt[4] == pytest.approx(0, abs=0.00001) + ), "wrong geotransform" + + assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, "no overviews!" - assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' + assert ( + gdaltest.wcs_ds.GetRasterBand(1).DataType >= gdal.GDT_Int16 + ), "wrong band data type" - assert gdaltest.wcs_ds.GetRasterBand(1).DataType >= gdal.GDT_Int16, \ - 'wrong band data type' ############################################################################### # Check checksum for a small region. @@ -195,7 +225,8 @@ def old_wcs_4(): pytest.skip() cs = gdaltest.wcs_ds.GetRasterBand(1).Checksum(0, 0, 100, 100) - assert cs == 10469, ('Wrong checksum: ' + str(cs)) + assert cs == 10469, "Wrong checksum: " + str(cs) + ############################################################################### # Open the srtm plus service using XML as filename. @@ -206,17 +237,19 @@ def old_wcs_5(): if gdaltest.wcs_drv is None: pytest.skip() - fn = 'http://geodata.telascience.org/cgi-bin/mapserv_dem?srtmplus_raw75' + fn = "http://geodata.telascience.org/cgi-bin/mapserv_dem?srtmplus_raw75" ds = gdal.Open(fn) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 43200 and ds.RasterYSize == 21600 and ds.RasterCount == 1, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 43200 and ds.RasterYSize == 21600 and ds.RasterCount == 1 + ), "wrong size or bands" ds = None + ############################################################################### # utilities @@ -224,13 +257,13 @@ def old_wcs_5(): def read_urls(): retval = {} - fname = 'data/wcs/urls' - f = open(fname, 'rb') - text = f.read().decode('utf-8') + fname = "data/wcs/urls" + f = open(fname, "rb") + text = f.read().decode("utf-8") f.close() for line in text.splitlines(): items = line.split() - if items[1].endswith('2'): + if items[1].endswith("2"): items[1] = items[1][:-1] if not items[0] in retval: retval[items[0]] = {} @@ -243,30 +276,29 @@ def read_urls(): def compare_urls(a, b): - """Compare two WCS URLs taking into account that some items are floats - """ - a_list = a.split('&') - b_list = b.split('&') + """Compare two WCS URLs taking into account that some items are floats""" + a_list = a.split("&") + b_list = b.split("&") n = len(a_list) if n != len(b_list): return False - for i in (range(n)): - if not re.match('SUBSET=', a_list[i]): + for i in range(n): + if not re.match("SUBSET=", a_list[i]): if a_list[i] != b_list[i]: - print(a_list[i], '!=', b_list[i]) + print(a_list[i], "!=", b_list[i]) return False continue x = a_list[i] y = b_list[i] - for c in ('SUBSET=[a-zA-Z]+', '%28', '%29'): - x = re.sub(c, '', x) - y = re.sub(c, '', y) - x_list = x.split(',') - y_list = y.split(',') + for c in ("SUBSET=[a-zA-Z]+", "%28", "%29"): + x = re.sub(c, "", x) + y = re.sub(c, "", y) + x_list = x.split(",") + y_list = y.split(",") m = len(x_list) if m != len(y_list): return False - for j in (range(m)): + for j in range(m): try: c1 = float(x_list[j]) c2 = float(y_list[j]) @@ -275,193 +307,201 @@ def compare_urls(a, b): return False if c1 == c2: continue - if abs((c1-c2)/c1) > 0.001: + if abs((c1 - c2) / c1) > 0.001: return False return True class WCSHTTPHandler(BaseHTTPRequestHandler): - - def log_request(self, code=',', size=','): + def log_request(self, code=",", size=","): # pylint: disable=unused-argument pass def Headers(self, typ): self.send_response(200) - self.send_header('Content-Type', typ) + self.send_header("Content-Type", typ) self.end_headers() def Respond(self, request, brand, version, test): try: - fname = 'data/wcs/' - if request == 'GetCapabilities': + fname = "data/wcs/" + if request == "GetCapabilities": # *2 and Simple* are different coverages from same server - brand = brand.replace('2', '') - brand = brand.replace('Simple', '') - if request == 'GetCoverage' and test == "scaled": - suffix = '.tiff' - self.Headers('image/tiff') - fname += brand + '-' + version + '-scaled' + suffix - elif request == 'GetCoverage' and test == "non_scaled": - suffix = '.tiff' - self.Headers('image/tiff') - fname += brand + '-' + version + '-non_scaled' + suffix - elif request == 'GetCoverage': - suffix = '.tiff' - self.Headers('image/tiff') - fname += brand + '-' + version + suffix + brand = brand.replace("2", "") + brand = brand.replace("Simple", "") + if request == "GetCoverage" and test == "scaled": + suffix = ".tiff" + self.Headers("image/tiff") + fname += brand + "-" + version + "-scaled" + suffix + elif request == "GetCoverage" and test == "non_scaled": + suffix = ".tiff" + self.Headers("image/tiff") + fname += brand + "-" + version + "-non_scaled" + suffix + elif request == "GetCoverage": + suffix = ".tiff" + self.Headers("image/tiff") + fname += brand + "-" + version + suffix else: - suffix = '.xml' - self.Headers('application/xml') - fname += request + '-' + brand + '-' + version + suffix - f = open(fname, 'rb') + suffix = ".xml" + self.Headers("application/xml") + fname += request + "-" + brand + "-" + version + suffix + f = open(fname, "rb") content = f.read() f.close() self.wfile.write(content) except IOError: - self.send_error(404, 'File Not Found: ' + request + ' ' + brand + ' ' + version) + self.send_error( + 404, "File Not Found: " + request + " " + brand + " " + version + ) global wcs_6_ok wcs_6_ok = False def do_GET(self): if do_log: - f = open('/tmp/log.txt', 'a') - f.write('GET %s\n' % self.path) + f = open("/tmp/log.txt", "a") + f.write("GET %s\n" % self.path) f.close() split = urllib.parse.urlparse(self.path) query = urllib.parse.parse_qs(split.query) query2 = {} for key in query: query2[key.lower()] = query[key] - server = query2['server'][0] - version = query2['version'][0] - request = query2['request'][0] - test = '' - if 'test' in query2: - test = query2['test'][0] - - key = server + '-' + version + server = query2["server"][0] + version = query2["version"][0] + request = query2["request"][0] + test = "" + if "test" in query2: + test = query2["test"][0] + + key = server + "-" + version if key in urls and test in urls[key]: - _, got = self.path.split('SERVICE=WCS') - got = re.sub(r'\&test=.*', '', got) - _, have = urls[key][test].split('SERVICE=WCS') - have += '&server=' + server + _, got = self.path.split("SERVICE=WCS") + got = re.sub(r"\&test=.*", "", got) + _, have = urls[key][test].split("SERVICE=WCS") + have += "&server=" + server if compare_urls(got, have): - ok = 'ok' + ok = "ok" else: ok = "not ok\ngot: " + got + "\nhave: " + have global wcs_6_ok wcs_6_ok = False - print('test ' + server + ' ' + test + ' WCS ' + version + ' ' + ok) + print("test " + server + " " + test + " WCS " + version + " " + ok) self.Respond(request, server, version, test) def setupFct(): return { - 'SimpleGeoServer': { - 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', - 'Options': [ - "", - "-oo OuterExtents", - "-oo OuterExtents", - "" + "SimpleGeoServer": { + "URL": "https://msp.smartsea.fmi.fi/geoserver/wcs", + "Options": ["", "-oo OuterExtents", "-oo OuterExtents", ""], + "Projwin": "-projwin 145300 6737500 209680 6688700", + "Outsize": "-outsize $size 0", + "Coverage": [ + "smartsea:eusm2016", + "smartsea:eusm2016", + "smartsea:eusm2016", + "smartsea__eusm2016", ], - 'Projwin': "-projwin 145300 6737500 209680 6688700", - 'Outsize': "-outsize $size 0", - 'Coverage': [ - 'smartsea:eusm2016', 'smartsea:eusm2016', - 'smartsea:eusm2016', 'smartsea__eusm2016'], - 'Versions': [100, 110, 111, 201], + "Versions": [100, 110, 111, 201], }, - 'GeoServer2': { - 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', - 'Options': [ + "GeoServer2": { + "URL": "https://msp.smartsea.fmi.fi/geoserver/wcs", + "Options": [ "", "-oo OuterExtents -oo NoGridAxisSwap", "-oo OuterExtents -oo NoGridAxisSwap", - "-oo NoGridAxisSwap -oo SubsetAxisSwap" + "-oo NoGridAxisSwap -oo SubsetAxisSwap", + ], + "Projwin": "-projwin 145300 6737500 209680 6688700", + "Outsize": "-outsize $size 0", + "Coverage": [ + "smartsea:south", + "smartsea:south", + "smartsea:south", + "smartsea__south", ], - 'Projwin': "-projwin 145300 6737500 209680 6688700", - 'Outsize': "-outsize $size 0", - 'Coverage': ['smartsea:south', 'smartsea:south', 'smartsea:south', 'smartsea__south'], - 'Versions': [100, 110, 111, 201], - 'Range': ['GREEN_BAND', 'BLUE_BAND'] + "Versions": [100, 110, 111, 201], + "Range": ["GREEN_BAND", "BLUE_BAND"], }, - 'GeoServer': { - 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', - 'Options': [ + "GeoServer": { + "URL": "https://msp.smartsea.fmi.fi/geoserver/wcs", + "Options": [ "", "-oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo NoGridAxisSwap -oo SubsetAxisSwap", ], - 'Projwin': "-projwin 3200000 6670000 3280000 6620000", - 'Outsize': "-outsize $size 0", - 'Coverage': [ - 'smartsea:eusm2016-EPSG2393', 'smartsea:eusm2016-EPSG2393', - 'smartsea:eusm2016-EPSG2393', 'smartsea__eusm2016-EPSG2393'], - 'Versions': [100, 110, 111, 201] + "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': [ + "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] + "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] + "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\")" + "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': [ + "ArcGIS": { + "URL": "http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer", + "Options": [ "", "-oo NrOffsets=2", "-oo NrOffsets=2", "-oo NrOffsets=2", - "-oo UseScaleFactor" + "-oo UseScaleFactor", ], - 'Projwin': "-projwin 181000 7005000 200000 6980000", - 'Outsize': "-outsize $size 0", - 'Coverage': [2, 2, 2, 2, 'Coverage2'], - 'Versions': [100, 110, 111, 112, 201] - } + "Projwin": "-projwin 181000 7005000 200000 6980000", + "Outsize": "-outsize $size 0", + "Coverage": [2, 2, 2, 2, "Coverage2"], + "Versions": [100, 110, 111, 112, 201], + }, } + ############################################################################### def test_wcs_6(): - driver = gdal.GetDriverByName('WCS') + driver = gdal.GetDriverByName("WCS") if driver is None: pytest.skip() # Generating various URLs from the driver and comparing them to ones # that have worked. first_call = True size = 60 - cache = 'CACHE=wcs_cache' + cache = "CACHE=wcs_cache" global urls urls = read_urls() (process, port) = webserver.launch(handler=WCSHTTPHandler) @@ -471,51 +511,56 @@ def test_wcs_6(): for server in setup: servers.append(server) for server in sorted(servers): - for i, v in enumerate(setup[server]['Versions']): - version = str(int(v / 100)) + '.' + str(int(v % 100 / 10)) + '.' + str((v % 10)) - if not server + '-' + version in urls: - print("Error: " + server + '-' + version + " not in urls") + for i, v in enumerate(setup[server]["Versions"]): + version = ( + str(int(v / 100)) + "." + str(int(v % 100 / 10)) + "." + str((v % 10)) + ) + if not server + "-" + version in urls: + print("Error: " + server + "-" + version + " not in urls") global wcs_6_ok wcs_6_ok = False continue options = [cache] if first_call: - options.append('CLEAR_CACHE') + options.append("CLEAR_CACHE") first_call = False - query = 'server=' + server + '&version=' + version - ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, - open_options=options) + query = "server=" + server + "&version=" + version + ds = gdal.OpenEx( + utf8_path="WCS:" + url + "/?" + query, open_options=options + ) - coverage = setup[server]['Coverage'] + coverage = setup[server]["Coverage"] if isinstance(coverage, list): coverage = coverage[i] if isinstance(coverage, numbers.Number): coverage = str(coverage) - query += '&coverage=' + coverage + query += "&coverage=" + coverage options = [cache] - if isinstance(setup[server]['Options'], list): - oo = setup[server]['Options'][i] + if isinstance(setup[server]["Options"], list): + oo = setup[server]["Options"][i] else: - oo = setup[server]['Options'] + oo = setup[server]["Options"] oo = oo.split() for o in oo: - if o != '-oo': + if o != "-oo": options.append(o) - options.append('GetCoverageExtra=test=none') - ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, - open_options=options) + options.append("GetCoverageExtra=test=none") + ds = gdal.OpenEx( + utf8_path="WCS:" + url + "/?" + query, open_options=options + ) ds = 0 options = [cache] - options.append('GetCoverageExtra=test=scaled') - options.append('INTERLEAVE=PIXEL') - ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, - open_options=options) + options.append("GetCoverageExtra=test=scaled") + options.append("INTERLEAVE=PIXEL") + ds = gdal.OpenEx( + utf8_path="WCS:" + url + "/?" + query, open_options=options + ) if not ds: print("OpenEx failed: WCS:" + url + "/?" + query) wcs_6_ok = False break - projwin = setup[server]['Projwin'].replace('-projwin ', '').split() + projwin = setup[server]["Projwin"].replace("-projwin ", "").split() for i, c in enumerate(projwin): projwin[i] = int(c) options = [cache] @@ -523,12 +568,15 @@ def test_wcs_6(): gdal.Translate(tmpfile, ds, projWin=projwin, width=size, options=options) os.remove(tmpfile) - if os.path.isfile('data/wcs/' + server + '-' + version + '-non_scaled.tiff'): + if os.path.isfile( + "data/wcs/" + server + "-" + version + "-non_scaled.tiff" + ): options = [cache] - options.append('GetCoverageExtra=test=non_scaled') - options.append('INTERLEAVE=PIXEL') - ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, - open_options=options) + options.append("GetCoverageExtra=test=non_scaled") + options.append("INTERLEAVE=PIXEL") + ds = gdal.OpenEx( + utf8_path="WCS:" + url + "/?" + query, open_options=options + ) if not ds: print("OpenEx failed: WCS:" + url + "/?" + query) wcs_6_ok = False @@ -537,11 +585,12 @@ def test_wcs_6(): gdal.Translate(tmpfile, ds, srcWin=[0, 0, 2, 2], options=options) os.remove(tmpfile) else: - print(server + ' ' + version + ' non_scaled skipped (no response file)') + print(server + " " + version + " non_scaled skipped (no response file)") webserver.server_stop(process, port) assert wcs_6_ok + ############################################################################### # todo tests: @@ -558,16 +607,11 @@ def test_wcs_cleanup(): gdaltest.wcs_ds = None try: - os.remove('tmp/geoserver.wcs') + os.remove("tmp/geoserver.wcs") except OSError: pass try: - shutil.rmtree('wcs_cache') + shutil.rmtree("wcs_cache") except OSError: pass - - - - - diff --git a/autotest/gdrivers/webp.py b/autotest/gdrivers/webp.py index 772adc97c0d0..f30e6ce90514 100755 --- a/autotest/gdrivers/webp.py +++ b/autotest/gdrivers/webp.py @@ -29,23 +29,22 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal - - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test if WEBP driver is present def test_webp_1(): - gdaltest.webp_drv = gdal.GetDriverByName('WEBP') + gdaltest.webp_drv = gdal.GetDriverByName("WEBP") if gdaltest.webp_drv is None: pytest.skip() - + ############################################################################### # Open() test @@ -55,10 +54,12 @@ def test_webp_2(): if gdaltest.webp_drv is None: pytest.skip() - ds = gdal.Open('data/webp/rgbsmall.webp') + ds = gdal.Open("data/webp/rgbsmall.webp") cs = ds.GetRasterBand(1).Checksum() - assert cs == 21464 or cs == 21450 or cs == 21459, \ - 'did not get expected checksum on band 1' + assert ( + cs == 21464 or cs == 21450 or cs == 21459 + ), "did not get expected checksum on band 1" + ############################################################################### # CreateCopy() test @@ -69,18 +70,21 @@ def test_webp_3(): if gdaltest.webp_drv is None: pytest.skip() - src_ds = gdal.Open('data/rgbsmall.tif') - out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_3.webp', src_ds, options=['QUALITY=80']) + src_ds = gdal.Open("data/rgbsmall.tif") + out_ds = gdaltest.webp_drv.CreateCopy( + "/vsimem/webp_3.webp", src_ds, options=["QUALITY=80"] + ) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() out_ds = None - gdal.Unlink('/vsimem/webp_3.webp') - gdal.Unlink('/vsimem/webp_3.webp.aux.xml') + gdal.Unlink("/vsimem/webp_3.webp") + gdal.Unlink("/vsimem/webp_3.webp.aux.xml") # 21502 is for libwebp 0.3.0 # 21787 is for libwebp 1.0.3 assert cs1 in (21464, 21502, 21695, 21700, 21787) + ############################################################################### # CreateCopy() on RGBA @@ -91,23 +95,31 @@ def test_webp_4(): pytest.skip() md = gdaltest.webp_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LOSSLESS") == -1: pytest.skip() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_4.webp', src_ds) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.webp_drv.CreateCopy("/vsimem/webp_4.webp", src_ds) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() cs4 = out_ds.GetRasterBand(4).Checksum() out_ds = None - gdal.Unlink('/vsimem/webp_4.webp') + gdal.Unlink("/vsimem/webp_4.webp") # 22849 is for libwebp 0.3.0 # 29229 is for libwebp 1.0.3 - assert cs1 in (22001, 22849, 34422, 36652, 36658, 45319, 29229), \ - 'did not get expected checksum on band 1' + assert cs1 in ( + 22001, + 22849, + 34422, + 36652, + 36658, + 45319, + 29229, + ), "did not get expected checksum on band 1" + + assert cs4 == 10807, "did not get expected checksum on band 4" - assert cs4 == 10807, 'did not get expected checksum on band 4' ############################################################################### # CreateCopy() on RGBA with lossless compression @@ -119,21 +131,24 @@ def test_webp_5(): pytest.skip() md = gdaltest.webp_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') == -1: + if md["DMD_CREATIONOPTIONLIST"].find("LOSSLESS") == -1: pytest.skip() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_5.webp', src_ds, options=['LOSSLESS=YES']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.webp_drv.CreateCopy( + "/vsimem/webp_5.webp", src_ds, options=["LOSSLESS=YES"] + ) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() cs4 = out_ds.GetRasterBand(4).Checksum() out_ds = None - gdal.Unlink('/vsimem/webp_5.webp') + gdal.Unlink("/vsimem/webp_5.webp") - assert cs1 == 12603 or cs1 == 18536 or cs1 == 14800, \ - 'did not get expected checksum on band 1' + assert ( + cs1 == 12603 or cs1 == 18536 or cs1 == 14800 + ), "did not get expected checksum on band 1" - assert cs4 == 10807, 'did not get expected checksum on band 4' + assert cs4 == 10807, "did not get expected checksum on band 4" ############################################################################### @@ -146,17 +161,22 @@ def test_webp_6(): pytest.skip() md = gdaltest.webp_drv.GetMetadata() - if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') == -1 or md['DMD_CREATIONOPTIONLIST'].find('EXACT') == -1: + if ( + md["DMD_CREATIONOPTIONLIST"].find("LOSSLESS") == -1 + or md["DMD_CREATIONOPTIONLIST"].find("EXACT") == -1 + ): pytest.skip() - src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') - out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_6.webp', src_ds, options=['LOSSLESS=YES', 'EXACT=1']) + src_ds = gdal.Open("../gcore/data/stefan_full_rgba.tif") + out_ds = gdaltest.webp_drv.CreateCopy( + "/vsimem/webp_6.webp", src_ds, options=["LOSSLESS=YES", "EXACT=1"] + ) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() cs4 = out_ds.GetRasterBand(4).Checksum() out_ds = None - gdal.Unlink('/vsimem/webp_6.webp') + gdal.Unlink("/vsimem/webp_6.webp") - assert cs1 == 12603, 'did not get expected checksum on band 1' + assert cs1 == 12603, "did not get expected checksum on band 1" - assert cs4 == 10807, 'did not get expected checksum on band 4' + assert cs4 == 10807, "did not get expected checksum on band 4" diff --git a/autotest/gdrivers/wms.py b/autotest/gdrivers/wms.py index 13c759258436..38d175d40357 100755 --- a/autotest/gdrivers/wms.py +++ b/autotest/gdrivers/wms.py @@ -30,40 +30,43 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import base64 +import hashlib import os import shutil from time import sleep -import hashlib -import base64 -from osgeo import gdal + import gdaltest import pytest -pytestmark = pytest.mark.require_driver('WMS') +from osgeo import gdal + +pytestmark = pytest.mark.require_driver("WMS") ############################################################################### # Open the WMS dataset def wms_2(): - #Set the driver so we don't have to search it by name again - gdaltest.wms_drv = gdal.GetDriverByName('WMS') + # Set the driver so we don't have to search it by name again + gdaltest.wms_drv = gdal.GetDriverByName("WMS") # NOTE - mloskot: # This is a dirty hack checking if remote WMS service is online. # Nothing genuine but helps to keep the buildbot waterfall green. - srv = 'http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3?' + srv = "http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3?" gdaltest.wms_srv1_ok = gdaltest.gdalurlopen(srv) is not None gdaltest.wms_ds = None if not gdaltest.wms_srv1_ok: pytest.skip() - gdaltest.wms_ds = gdal.Open('data/wms/pop_wms.xml') + gdaltest.wms_ds = gdal.Open("data/wms/pop_wms.xml") if gdaltest.wms_ds is None: - pytest.fail('open failed.') + pytest.fail("open failed.") + ############################################################################### # Check various things about the configuration. @@ -74,20 +77,31 @@ def wms_3(): if gdaltest.wms_ds is None or not gdaltest.wms_srv1_ok: pytest.skip() - assert gdaltest.wms_ds.RasterXSize == 36000 and gdaltest.wms_ds.RasterYSize == 14500 and gdaltest.wms_ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + gdaltest.wms_ds.RasterXSize == 36000 + and gdaltest.wms_ds.RasterYSize == 14500 + and gdaltest.wms_ds.RasterCount == 3 + ), "wrong size or bands" wkt = gdaltest.wms_ds.GetProjectionRef() - assert wkt[:14] == 'GEOGCS["WGS 84', ('Got wrong SRS: ' + wkt) + assert wkt[:14] == 'GEOGCS["WGS 84', "Got wrong SRS: " + wkt gt = gdaltest.wms_ds.GetGeoTransform() - assert gt[0] == pytest.approx(-180, abs=0.00001) and gt[3] == pytest.approx(85, abs=0.00001) and gt[1] == pytest.approx(0.01, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and gt[5] == pytest.approx(-0.01, abs=0.00001) and gt[4] == pytest.approx(0, abs=0.00001), \ - 'wrong geotransform' + assert ( + gt[0] == pytest.approx(-180, abs=0.00001) + and gt[3] == pytest.approx(85, abs=0.00001) + and gt[1] == pytest.approx(0.01, abs=0.00001) + and gt[2] == pytest.approx(0, abs=0.00001) + and gt[5] == pytest.approx(-0.01, abs=0.00001) + and gt[4] == pytest.approx(0, abs=0.00001) + ), "wrong geotransform" + + assert gdaltest.wms_ds.GetRasterBand(1).GetOverviewCount() >= 1, "no overviews!" - assert gdaltest.wms_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' + assert ( + gdaltest.wms_ds.GetRasterBand(1).DataType >= gdal.GDT_Byte + ), "wrong band data type" - assert gdaltest.wms_ds.GetRasterBand(1).DataType >= gdal.GDT_Byte, \ - 'wrong band data type' ############################################################################### # Check checksum for a small region. @@ -98,20 +112,21 @@ def wms_4(): if gdaltest.wms_ds is None or not gdaltest.wms_srv1_ok: pytest.skip() - gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "ON") + gdal.PushErrorHandler("CPLQuietErrorHandler") cs = gdaltest.wms_ds.GetRasterBand(1).Checksum(0, 0, 100, 100) gdal.PopErrorHandler() - gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') + gdal.SetConfigOption("CPL_ACCUM_ERROR_MSG", "OFF") msg = gdal.GetLastErrorMsg() gdal.ErrorReset() - if msg is not None and msg.find('Service denied due to system overload') != -1: + if msg is not None and msg.find("Service denied due to system overload") != -1: pytest.skip(msg) - assert cs == 57182, ('Wrong checksum: ' + str(cs)) + assert cs == 57182, "Wrong checksum: " + str(cs) + ############################################################################### # Open the WMS service using XML as filename. @@ -124,13 +139,15 @@ def test_wms_5(): fn = '1.1.1http://onearth.jpl.nasa.gov/wms.cgi?EPSG:4326image/jpegmodis,global_mosaic-180.090.0180.0-90.026666661333333EPSG:43263' ds = gdal.Open(fn) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 2666666 and ds.RasterYSize == 1333333 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 2666666 and ds.RasterYSize == 1333333 and ds.RasterCount == 3 + ), "wrong size or bands" ds = None + ############################################################################### # Test TileService @@ -143,20 +160,24 @@ def test_wms_6(): fn = '1http://s0.tileservice.worldwindcentral.com/getTile?za.johannesburg_2006_20cm-180.090.0180.0-90.026843545613421772819EPSG:4326165125123' ds = gdal.Open(fn) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 268435456 and ds.RasterYSize == 134217728 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 268435456 + and ds.RasterYSize == 134217728 + and ds.RasterCount == 3 + ), "wrong size or bands" ds = None + ############################################################################### # Test TMS def test_wms_7(): - srv = 'http://tilecache.osgeo.org/wms-c/Basic.py' + srv = "http://tilecache.osgeo.org/wms-c/Basic.py" gdaltest.metacarta_tms = False if gdaltest.gdalurlopen(srv) is None: pytest.skip() @@ -185,12 +206,18 @@ def test_wms_7(): ds = gdal.Open(tms) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 268435456 and ds.RasterYSize == 134217728 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 268435456 + and ds.RasterYSize == 134217728 + and ds.RasterCount == 3 + ), "wrong size or bands" - assert ds.GetRasterBand(1).GetOverview(18).XSize == 512 and ds.GetRasterBand(1).GetOverview(18).YSize == 256 + assert ( + ds.GetRasterBand(1).GetOverview(18).XSize == 512 + and ds.GetRasterBand(1).GetOverview(18).YSize == 256 + ) ds.GetRasterBand(1).GetOverview(18).ReadRaster(0, 0, 512, 256) @@ -200,6 +227,7 @@ def test_wms_7(): ############################################################################### # Test TMS with cache + def test_wms_8(): # server_url = 'http://tilecache.osgeo.org/wms-c/Basic.py' @@ -207,56 +235,57 @@ def test_wms_8(): # zero_tile = wmstms_version + '/0/0/0.png' # server_url_mask = server_url # ovr_upper_level = 18 -# tms = """ -# -# %s -# basic -# png -# -# -# -180.0 -# 90.0 -# 180.0 -# -90.0 -# 19 -# 2 -# 1 -# -# EPSG:4326 -# 256 -# 256 -# 3 -# ./tmp/gdalwmscache -# """ % server_url_mask - -# tms_nocache = """ -# -# %s -# basic -# png -# -# -# -180.0 -# 90.0 -# 180.0 -# -90.0 -# 19 -# 2 -# 1 -# -# EPSG:4326 -# 256 -# 256 -# 3 -# -# """ % server_url_mask - - server_url = 'http://tile.openstreetmap.org' - wmstms_version = '' - zero_tile = '/0/0/0.png' - server_url_mask = server_url + '/${z}/${x}/${y}.png' + # tms = """ + # + # %s + # basic + # png + # + # + # -180.0 + # 90.0 + # 180.0 + # -90.0 + # 19 + # 2 + # 1 + # + # EPSG:4326 + # 256 + # 256 + # 3 + # ./tmp/gdalwmscache + # """ % server_url_mask + + # tms_nocache = """ + # + # %s + # basic + # png + # + # + # -180.0 + # 90.0 + # 180.0 + # -90.0 + # 19 + # 2 + # 1 + # + # EPSG:4326 + # 256 + # 256 + # 3 + # + # """ % server_url_mask + + server_url = "http://tile.openstreetmap.org" + wmstms_version = "" + zero_tile = "/0/0/0.png" + server_url_mask = server_url + "/${z}/${x}/${y}.png" ovr_upper_level = 16 - tms = """ + tms = ( + """ %s @@ -275,9 +304,12 @@ def test_wms_8(): 256 3 ./tmp/gdalwmscache -""" % server_url_mask +""" + % server_url_mask + ) - tms_nocache = """ + tms_nocache = ( + """ %s @@ -296,60 +328,74 @@ def test_wms_8(): 256 3 -""" % server_url_mask +""" + % server_url_mask + ) if gdaltest.gdalurlopen(server_url) is None: pytest.skip() try: - shutil.rmtree('tmp/gdalwmscache') + shutil.rmtree("tmp/gdalwmscache") except OSError: pass ds = gdal.Open(tms) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." # Check cache metadata item cache_path = ds.GetMetadataItem("CACHE_PATH") - assert cache_path, 'did not get expected cache path metadata item' + assert cache_path, "did not get expected cache path metadata item" - cache_subfolder = hashlib.md5(server_url_mask.encode('utf-8')).hexdigest() + cache_subfolder = hashlib.md5(server_url_mask.encode("utf-8")).hexdigest() gdal.ErrorReset() data = ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) - if gdal.GetLastErrorMsg() != '': + if gdal.GetLastErrorMsg() != "": if gdaltest.gdalurlopen(server_url + zero_tile) is None: pytest.skip() ds = None - file1 = hashlib.md5((server_url + wmstms_version + '/1/0/0.png').encode('utf-8')).hexdigest() - file2 = hashlib.md5((server_url + wmstms_version + '/1/1/0.png').encode('utf-8')).hexdigest() - file3 = hashlib.md5((server_url + wmstms_version + '/1/0/1.png').encode('utf-8')).hexdigest() - file4 = hashlib.md5((server_url + wmstms_version + '/1/1/1.png').encode('utf-8')).hexdigest() - - expected_files = ['tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file1[0], file1[1], file1), - 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file2[0], file2[1], file2), - 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file3[0], file3[1], file3), - 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file4[0], file4[1], file4)] + file1 = hashlib.md5( + (server_url + wmstms_version + "/1/0/0.png").encode("utf-8") + ).hexdigest() + file2 = hashlib.md5( + (server_url + wmstms_version + "/1/1/0.png").encode("utf-8") + ).hexdigest() + file3 = hashlib.md5( + (server_url + wmstms_version + "/1/0/1.png").encode("utf-8") + ).hexdigest() + file4 = hashlib.md5( + (server_url + wmstms_version + "/1/1/1.png").encode("utf-8") + ).hexdigest() + + expected_files = [ + "tmp/gdalwmscache/%s/%s/%s/%s" % (cache_subfolder, file1[0], file1[1], file1), + "tmp/gdalwmscache/%s/%s/%s/%s" % (cache_subfolder, file2[0], file2[1], file2), + "tmp/gdalwmscache/%s/%s/%s/%s" % (cache_subfolder, file3[0], file3[1], file3), + "tmp/gdalwmscache/%s/%s/%s/%s" % (cache_subfolder, file4[0], file4[1], file4), + ] for expected_file in expected_files: try: os.stat(expected_file) except OSError: - pytest.fail('%s should exist' % expected_file) + pytest.fail("%s should exist" % expected_file) # Now, we should read from the cache ds = gdal.Open(tms) - cached_data = ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) + cached_data = ( + ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) + ) ds = None - assert data == cached_data, 'data != cached_data' + assert data == cached_data, "data != cached_data" # Replace the cache with fake data for expected_file in expected_files: - ds = gdal.GetDriverByName('GTiff').Create(expected_file, 256, 256, 4) + ds = gdal.GetDriverByName("GTiff").Create(expected_file, 256, 256, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) @@ -360,7 +406,7 @@ def test_wms_8(): ds = gdal.Open(tms) cs = ds.GetRasterBand(1).GetOverview(ovr_upper_level).Checksum() ds = None - assert cs == 0, 'cs != 0' + assert cs == 0, "cs != 0" # Test with GDAL_DEFAULT_WMS_CACHE_PATH # Now, we should read from the cache @@ -368,7 +414,7 @@ def test_wms_8(): ds = gdal.Open(tms_nocache) cs = ds.GetRasterBand(1).GetOverview(ovr_upper_level).Checksum() ds = None - assert cs == 0, 'cs != 0' + assert cs == 0, "cs != 0" # Test with GDAL_ENABLE_WMS_CACHE=NO # Now, we should not read from the cache anymore @@ -376,10 +422,11 @@ def test_wms_8(): ds = gdal.Open(tms_nocache) cs = ds.GetRasterBand(1).GetOverview(ovr_upper_level).Checksum() ds = None - assert cs != 0, 'cs == 0' + assert cs != 0, "cs == 0" # Check maxsize and expired tags - tms_expires = """ + tms_expires = ( + """ %s @@ -398,7 +445,9 @@ def test_wms_8(): 256 3 ./tmp/gdalwmscache1 -""" % server_url_mask +""" + % server_url_mask + ) mod_time = 0 for expected_file in expected_files: @@ -431,21 +480,23 @@ def wms_9(): ds = gdal.Open(tms) if ds is None: - srv = 'http://onearth.jpl.nasa.gov/wms.cgi?' + srv = "http://onearth.jpl.nasa.gov/wms.cgi?" if gdaltest.gdalurlopen(srv) is None: pytest.skip() - pytest.fail('open failed.') + pytest.fail("open failed.") expected_cs = 5478 cs = ds.GetRasterBand(1).GetOverview(9).Checksum() - assert cs == expected_cs, 'Did not get expected SRTM checksum.' + assert cs == expected_cs, "Did not get expected SRTM checksum." ds = None + ############################################################################### # Test getting subdatasets from GetCapabilities + def wms_10(): if not gdaltest.wms_srv1_ok: @@ -453,19 +504,20 @@ def wms_10(): name = "WMS:http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3?" ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name subdatasets = ds.GetMetadata("SUBDATASETS") - assert subdatasets, 'did not get expected subdataset count' + assert subdatasets, "did not get expected subdataset count" ds = None - name = subdatasets['SUBDATASET_1_NAME'] + name = subdatasets["SUBDATASET_1_NAME"] ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name ds = None + ############################################################################### # Test getting subdatasets from GetTileService @@ -476,25 +528,26 @@ def wms_11(): if gdaltest.skip_on_travis(): pytest.skip() - srv = 'http://onearth.jpl.nasa.gov/wms.cgi' + srv = "http://onearth.jpl.nasa.gov/wms.cgi" if gdaltest.gdalurlopen(srv) is None: pytest.skip() name = "WMS:http://onearth.jpl.nasa.gov/wms.cgi?request=GetTileService" ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name subdatasets = ds.GetMetadata("SUBDATASETS") - assert subdatasets, 'did not get expected subdataset count' + assert subdatasets, "did not get expected subdataset count" ds = None - name = subdatasets['SUBDATASET_1_NAME'] + name = subdatasets["SUBDATASET_1_NAME"] ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name ds = None + ############################################################################### # Test getting subdatasets from a TMS server @@ -507,24 +560,34 @@ def test_wms_12(): name = "http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/" ds = gdal.Open(name) if ds is None: - if gdaltest.gdalurlopen('http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png') is None: + if ( + gdaltest.gdalurlopen( + "http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png" + ) + is None + ): pytest.skip() - pytest.fail('open of %s failed.' % name) + pytest.fail("open of %s failed." % name) subdatasets = ds.GetMetadata("SUBDATASETS") - assert subdatasets, 'did not get expected subdataset count' + assert subdatasets, "did not get expected subdataset count" ds = None for i in range(len(subdatasets) // 2): - desc = subdatasets['SUBDATASET_%d_DESC' % (i + 1)] - if desc == 'basic': - name = subdatasets['SUBDATASET_%d_NAME' % (i + 1)] + desc = subdatasets["SUBDATASET_%d_DESC" % (i + 1)] + if desc == "basic": + name = subdatasets["SUBDATASET_%d_NAME" % (i + 1)] ds = gdal.Open(name) if ds is None: - if gdaltest.gdalurlopen('http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png') is None: + if ( + gdaltest.gdalurlopen( + "http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png" + ) + is None + ): pytest.skip() - pytest.fail('open of %s failed.' % name) + pytest.fail("open of %s failed." % name) ds = None @@ -536,7 +599,7 @@ def test_wms_13(): ds = gdal.Open("data/wms/DNEC_250K.vrt") if ds.ReadRaster(0, 0, 1024, 682) is None: - srv = 'http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GeCapabilities' + srv = "http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GeCapabilities" if gdaltest.gdalurlopen(srv) is None: pytest.skip() pytest.fail() @@ -546,33 +609,56 @@ def test_wms_13(): ############################################################################### # Test reading Virtual Earth layer + def test_wms_14(): - ds = gdal.Open(""" + ds = gdal.Open( + """ http://a${server_num}.ortho.tiles.virtualearth.net/tiles/a${quadkey}.jpeg?g=90 -""") +""" + ) if ds is None: - return 'fail' + return "fail" - assert ds.RasterXSize == 536870912 and ds.RasterYSize == 536870912 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 536870912 + and ds.RasterYSize == 536870912 + and ds.RasterCount == 3 + ), "wrong size or bands" wkt = ds.GetProjectionRef() - assert 'EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"]' in wkt, \ - ('Got wrong SRS: ' + wkt) + assert ( + 'EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"]' + in wkt + ), ("Got wrong SRS: " + wkt) gt = ds.GetGeoTransform() - assert abs(gt[0] - -20037508.34278924,) <= 0.00001 and abs(gt[3] - 20037508.34278924,) <= 0.00001 and gt[1] == pytest.approx(0.07464553543474242, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and abs(gt[5] - -0.07464553543474242,) <= 0.00001 and gt[4] == pytest.approx(0, abs=0.00001), \ - 'wrong geotransform' - - assert ds.GetRasterBand(1).GetOverviewCount() == 20, 'bad overview count' + assert ( + abs( + gt[0] - -20037508.34278924, + ) + <= 0.00001 + and abs( + gt[3] - 20037508.34278924, + ) + <= 0.00001 + and gt[1] == pytest.approx(0.07464553543474242, abs=0.00001) + and gt[2] == pytest.approx(0, abs=0.00001) + and abs( + gt[5] - -0.07464553543474242, + ) + <= 0.00001 + and gt[4] == pytest.approx(0, abs=0.00001) + ), "wrong geotransform" + + assert ds.GetRasterBand(1).GetOverviewCount() == 20, "bad overview count" (block_xsize, block_ysize) = ds.GetRasterBand(1).GetBlockSize() if block_xsize != 256 or block_ysize != 256: print("(%d, %d)" % (block_xsize, block_ysize)) - pytest.fail('bad block size') + pytest.fail("bad block size") ############################################################################### @@ -581,7 +667,7 @@ def test_wms_14(): def test_wms_15(): - srv = 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer?f=json&pretty=true' + srv = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer?f=json&pretty=true" src_ds = gdal.Open(srv) if src_ds is None: if gdaltest.gdalurlopen(srv) is None: @@ -589,24 +675,30 @@ def test_wms_15(): pytest.fail() ds = gdal.GetDriverByName("WMS").CreateCopy("/vsimem/wms.xml", src_ds) src_ds = None - assert ds, 'failed to copy' + assert ds, "failed to copy" - assert ds.RasterXSize == 1073741824 and ds.RasterYSize == 1073741824 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 1073741824 + and ds.RasterYSize == 1073741824 + and ds.RasterCount == 3 + ), "wrong size or bands" wkt = ds.GetProjectionRef() - assert wkt.startswith('PROJCS["WGS 84 / Pseudo-Mercator"'), ('Got wrong SRS: ' + wkt) + assert wkt.startswith('PROJCS["WGS 84 / Pseudo-Mercator"'), "Got wrong SRS: " + wkt corner = 20037508.342787001 res = 0.037322767717361482 - assert ds.GetGeoTransform() == pytest.approx([-corner, res, 0, corner, 0, -res], abs = 0.00001), 'wrong geotransform' + assert ds.GetGeoTransform() == pytest.approx( + [-corner, res, 0, corner, 0, -res], abs=0.00001 + ), "wrong geotransform" - assert ds.GetRasterBand(1).GetOverviewCount() == 22, 'bad overview count' + assert ds.GetRasterBand(1).GetOverviewCount() == 22, "bad overview count" assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] ds = None gdal.Unlink("/vsimem/wms.xml") + ############################################################################### # Test getting subdatasets from WMS-C Capabilities @@ -620,31 +712,31 @@ def test_wms_16(): name = "WMS:http://demo.opengeo.org/geoserver/gwc/service/wms?tiled=TRUE" ds = gdal.Open(name) if ds is None: - srv = 'http://demo.opengeo.org/geoserver/gwc/service/wms?' + srv = "http://demo.opengeo.org/geoserver/gwc/service/wms?" if gdaltest.gdalurlopen(srv) is None: pytest.skip() - pytest.fail('open of %s failed.' % name) + pytest.fail("open of %s failed." % name) subdatasets = ds.GetMetadata("SUBDATASETS") - assert subdatasets, 'did not get expected subdataset count' + assert subdatasets, "did not get expected subdataset count" ds = None name = None for key in subdatasets: - if key[-5:] == '_NAME' and subdatasets[key].find('bugsites') != -1: + if key[-5:] == "_NAME" and subdatasets[key].find("bugsites") != -1: name = subdatasets[key] break assert name is not None - name = 'http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&request=GetMap&version=1.1.1&layers=og:bugsites&styles=&srs=EPSG:26713&bbox=599351.50000000,4914096.00000000,608471.00000000,4920512.00000000' + name = "http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&request=GetMap&version=1.1.1&layers=og:bugsites&styles=&srs=EPSG:26713&bbox=599351.50000000,4914096.00000000,608471.00000000,4920512.00000000" ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name # check that the default bbox works for srs != EPSG:4326 - name = 'http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&request=GetMap&version=1.1.1&layers=og:bugsites&styles=&srs=EPSG:26713' + name = "http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&request=GetMap&version=1.1.1&layers=og:bugsites&styles=&srs=EPSG:26713" ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name # Matches feature of "WFS:http://demo.opengeo.org/geoserver/wfs?SRSNAME=EPSG:900913" og:bugsites # OGRFeature(og:bugsites):68846 @@ -657,58 +749,70 @@ def test_wms_16(): val = ds.GetRasterBand(1).GetMetadataItem(pixel, "LocationInfo") # Some bug in GeoServer ? - if val is not None and 'java.lang.NoSuchMethodError: org.geoserver.wms.WMS.pixelToWorld' in val: + if ( + val is not None + and "java.lang.NoSuchMethodError: org.geoserver.wms.WMS.pixelToWorld" in val + ): pytest.skip(val) - if val is not None and ('Gateway Time-out' in val or - 'HTTP error code : 5' in val): + if val is not None and ("Gateway Time-out" in val or "HTTP error code : 5" in val): pytest.skip() - if val is None or val.find('86') == -1: - if 'java.lang.NullPointerException' in val or '504 Gateway Time-out' in val or 'java.lang.OutOfMemoryError' in val: + if val is None or val.find("86") == -1: + if ( + "java.lang.NullPointerException" in val + or "504 Gateway Time-out" in val + or "java.lang.OutOfMemoryError" in val + ): pytest.skip(val) print(val) - pytest.fail('expected a value') + pytest.fail("expected a value") # Ask again. Should be cached val_again = ds.GetRasterBand(1).GetMetadataItem(pixel, "LocationInfo") - assert val_again == val, 'expected a value' + assert val_again == val, "expected a value" # Ask another band. Should be cached val2 = ds.GetRasterBand(2).GetMetadataItem(pixel, "LocationInfo") - assert val2 == val, 'expected a value' + assert val2 == val, "expected a value" # Ask an overview band val2 = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem(pixel, "LocationInfo") if val2 != val: - if 'java.lang.NullPointerException' in val2 or '504 Gateway Time-out' in val2 or 'java.lang.OutOfMemoryError' in val2: + if ( + "java.lang.NullPointerException" in val2 + or "504 Gateway Time-out" in val2 + or "java.lang.OutOfMemoryError" in val2 + ): pytest.skip(val2) print(val2) - pytest.fail('expected a value') + pytest.fail("expected a value") ds = None + ############################################################################### # Test a TiledWMS dataset with a color table (#4613) # Permanently down def wms_17(): - srv = 'http://onmoon.lmmp.nasa.gov/sites/wms.cgi?' + srv = "http://onmoon.lmmp.nasa.gov/sites/wms.cgi?" if gdaltest.gdalurlopen(srv) is None: pytest.skip() name = 'http://onmoon.lmmp.nasa.gov/sites/wms.cgi?King Crater DEM Color Confidence, LMMP' ds = gdal.Open(name) - assert ds is not None, ('open of %s failed.' % name) + assert ds is not None, "open of %s failed." % name band = ds.GetRasterBand(1) assert band.GetColorTable() is not None ds = None + ############################################################################### # Test an ArcGIS Server @@ -722,21 +826,24 @@ def test_wms_18(): ds = gdal.Open(fn) - assert ds is not None, 'open failed.' + assert ds is not None, "open failed." - assert ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3 + ), "wrong size or bands" # todo: add locationinfo test # add getting image test - if not gdaltest.gdalurlopen('http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer'): + if not gdaltest.gdalurlopen( + "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer" + ): ds = None pytest.skip() expected_cs = 12824 cs = ds.GetRasterBand(1).Checksum() - assert cs == expected_cs, 'Did not get expected checksum.' + assert cs == expected_cs, "Did not get expected checksum." ds = None # Alternative url with additional parameters @@ -744,43 +851,59 @@ def test_wms_18(): ds = gdal.Open(fn) - assert ds is not None, 'open failed.' - assert ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ds is not None, "open failed." + assert ( + ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3 + ), "wrong size or bands" cs = ds.GetRasterBand(1).Checksum() - assert cs == expected_cs, 'Did not get expected checksum.' + assert cs == expected_cs, "Did not get expected checksum." ds = None + ############################################################################### # Test a IIP server def test_wms_19(): - ds = gdal.Open('IIP:http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif') + ds = gdal.Open( + "IIP:http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif" + ) if ds is None: - if gdaltest.gdalurlopen('http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif&obj=Basic-Info') is None: + if ( + gdaltest.gdalurlopen( + "http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif&obj=Basic-Info" + ) + is None + ): pytest.skip() - pytest.fail('open failed.') + pytest.fail("open failed.") - assert ds.RasterXSize == 86400 and ds.RasterYSize == 43200 and ds.RasterCount == 3, \ - 'wrong size or bands' + assert ( + ds.RasterXSize == 86400 and ds.RasterYSize == 43200 and ds.RasterCount == 3 + ), "wrong size or bands" # Expected checksum seems to change over time. Hum... - cs = ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1).Checksum() - assert cs != 0, 'Did not get expected checksum.' + cs = ( + ds.GetRasterBand(1) + .GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1) + .Checksum() + ) + assert cs != 0, "Did not get expected checksum." ds = None + ############################################################################### # Test reading data via MRF/LERC + def test_wms_data_via_mrf(): mrfdrv = gdal.GetDriverByName("MRF") - if mrfdrv is None or 'LERC' not in mrfdrv.GetMetadataItem('DMD_CREATIONOPTIONLIST'): + if mrfdrv is None or "LERC" not in mrfdrv.GetMetadataItem("DMD_CREATIONOPTIONLIST"): pytest.skip() url = "http://astro.arcgis.com/arcgis/rest/services/OnMars/HiRISE_DEM/ImageServer/tile/${z}/${y}/${x}" @@ -795,16 +918,19 @@ def test_wms_data_via_mrf(): # The returned no data value can also be set on read, which affects the checksum testlist = [ # Second checksum is on graviton2 - ("Byte", 0, (29585, 9838)), # Same as the default type, NDV not defined - ("Float32", 0, (56047,)), # float, default NDV - ("Float32", 32768.32, (33595,)), # float, Forced NDV + ("Byte", 0, (29585, 9838)), # Same as the default type, NDV not defined + ("Float32", 0, (56047,)), # float, default NDV + ("Float32", 32768.32, (33595,)), # float, Forced NDV ] for dt, ndv, expected_cs in testlist: - ds = gdal.Open(dstemplate.format(url = url, dt = dt, ndv=ndv)) - assert ds.GetRasterBand(1).Checksum() in expected_cs, "datatype {} and ndv {}".format(dt, ndv) + ds = gdal.Open(dstemplate.format(url=url, dt=dt, ndv=ndv)) + assert ( + ds.GetRasterBand(1).Checksum() in expected_cs + ), "datatype {} and ndv {}".format(dt, ndv) ds = None + def test_twms_wmsmetadriver(): gdaltest.gts = """ @@ -863,7 +989,9 @@ def test_twms_wmsmetadriver(): # This test requires the GIBS server to be available def test_twms_GIBS(): - pytest.skip('Failing because of SSL issue. See https://github.com/OSGeo/gdal/issues/3511#issuecomment-840718083') + pytest.skip( + "Failing because of SSL issue. See https://github.com/OSGeo/gdal/issues/3511#issuecomment-840718083" + ) # if not gdaltest.run_slow_tests(): # pytest.skip() @@ -875,14 +1003,14 @@ def test_twms_GIBS(): pytest.skip() # Connects to the server - ds = gdal.Open(subdatasets['SUBDATASET_1_NAME']) + ds = gdal.Open(subdatasets["SUBDATASET_1_NAME"]) if ds is None and gdaltest.gdalurlopen(baseURL + "request=GetTileService"): pytest.fail() ds = None # Connects to the server - options = [ "Change=time:2021-02-10" ] - ds = gdal.OpenEx(subdatasets['SUBDATASET_1_NAME'], open_options = options) + options = ["Change=time:2021-02-10"] + ds = gdal.OpenEx(subdatasets["SUBDATASET_1_NAME"], open_options=options) if ds is None and gdaltest.gdalurlopen(baseURL + "request=GetTileService"): pytest.fail() ds = None @@ -900,7 +1028,8 @@ def test_twms_inline_configuration(): # Try inline base64 configuration wms_base64gts = base64.b64encode(gts.encode()) twms_string = '{}'.format( - baseURL, wms_base64gts.decode()) + baseURL, wms_base64gts.decode() + ) gdal.FileFromMemBuffer("/vsimem/twms.xml", twms_string) # Open fails without a TiledGroupName @@ -909,8 +1038,11 @@ def test_twms_inline_configuration(): tiled_group_name = "MODIS Aqua CorrectedReflectance TrueColor tileset" date = "2021-02-10" - options = [ "TiledGroupName={}".format(tiled_group_name), "Change=time:{}".format(date) ] - ds = gdal.OpenEx("/vsimem/twms.xml", open_options = options ) + options = [ + "TiledGroupName={}".format(tiled_group_name), + "Change=time:{}".format(date), + ] + ds = gdal.OpenEx("/vsimem/twms.xml", open_options=options) assert ds is not None, "Open twms with open options failed" metadata = ds.GetMetadata("") assert metadata["Change"] == "${time}=2021-02-10", "Change parameter not captured" @@ -927,8 +1059,6 @@ def test_wms_cleanup(): gdal.UnlinkBatch(["/vsimem/twms.xml", "/vsimem/twms.xml.aux.xml"]) try: - shutil.rmtree('gdalwmscache') + shutil.rmtree("gdalwmscache") except OSError: pass - - diff --git a/autotest/gdrivers/wmts.py b/autotest/gdrivers/wmts.py index c8e2e45df3d2..e39f40e705a2 100755 --- a/autotest/gdrivers/wmts.py +++ b/autotest/gdrivers/wmts.py @@ -30,13 +30,12 @@ ############################################################################### import shutil - - -from osgeo import gdal +import struct import gdaltest import pytest -import struct + +from osgeo import gdal ############################################################################### # Find WMTS driver @@ -44,20 +43,21 @@ def test_wmts_1(): - gdaltest.wmts_drv = gdal.GetDriverByName('WMTS') + gdaltest.wmts_drv = gdal.GetDriverByName("WMTS") - if gdaltest.wmts_drv is not None and gdal.GetDriverByName('WMS') is None: - print('Missing WMS driver') + if gdaltest.wmts_drv is not None and gdal.GetDriverByName("WMS") is None: + print("Missing WMS driver") gdaltest.wmts_drv = None if gdaltest.wmts_drv is not None: - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') - gdal.SetConfigOption('GDAL_DEFAULT_WMS_CACHE_PATH', '/vsimem/cache') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") + gdal.SetConfigOption("GDAL_DEFAULT_WMS_CACHE_PATH", "/vsimem/cache") return pytest.skip() + ############################################################################### # Error: no URL and invalid GDAL_WMTS service file documents @@ -68,25 +68,26 @@ def test_wmts_2(): pytest.skip() gdal.PushErrorHandler() - ds = gdal.Open('WMTS:') + ds = gdal.Open("WMTS:") gdal.PopErrorHandler() assert ds is None gdal.PushErrorHandler() - ds = gdal.Open('') + ds = gdal.Open("") gdal.PopErrorHandler() assert ds is None gdal.PushErrorHandler() - ds = gdal.Open('') + ds = gdal.Open("") gdal.PopErrorHandler() assert ds is None gdal.PushErrorHandler() - ds = gdal.Open('') + ds = gdal.Open("") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: invalid URL @@ -97,10 +98,11 @@ def test_wmts_3(): pytest.skip() gdal.PushErrorHandler() - ds = gdal.Open('WMTS:https://non_existing') + ds = gdal.Open("WMTS:https://non_existing") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: invalid URL @@ -111,10 +113,11 @@ def test_wmts_4(): pytest.skip() gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/non_existing') + ds = gdal.Open("WMTS:/vsimem/non_existing") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: invalid XML in GetCapabilities response @@ -124,13 +127,14 @@ def test_wmts_5(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/invalid_getcapabilities.xml', '') + gdal.FileFromMemBuffer("/vsimem/invalid_getcapabilities.xml", "") gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/invalid_getcapabilities.xml') + ds = gdal.Open("WMTS:/vsimem/invalid_getcapabilities.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: no layers @@ -156,13 +161,16 @@ def test_wmts_7(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/empty_getcapabilities.xml', '') + gdal.FileFromMemBuffer( + "/vsimem/empty_getcapabilities.xml", "" + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/empty_getcapabilities.xml') + ds = gdal.Open("WMTS:/vsimem/empty_getcapabilities.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: missing TileMatrixSetLink and Style @@ -172,19 +180,23 @@ def test_wmts_8(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/missing.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/missing.xml", + """ -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/missing.xml') + ds = gdal.Open("WMTS:/vsimem/missing.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: missing TileMatrixSet @@ -194,7 +206,9 @@ def test_wmts_9(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/missing_tms.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/missing_tms.xml", + """ @@ -207,13 +221,15 @@ def test_wmts_9(): -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/missing_tms.xml') + ds = gdal.Open("WMTS:/vsimem/missing_tms.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: Missing SupportedCRS @@ -223,7 +239,9 @@ def test_wmts_10(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/missing_SupportedCRS.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/missing_SupportedCRS.xml", + """ @@ -239,13 +257,15 @@ def test_wmts_10(): tms -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/missing_SupportedCRS.xml') + ds = gdal.Open("WMTS:/vsimem/missing_SupportedCRS.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: Cannot find TileMatrix in TileMatrixSet @@ -255,7 +275,9 @@ def test_wmts_11(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/no_tilematrix.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/no_tilematrix.xml", + """ @@ -272,13 +294,15 @@ def test_wmts_11(): urn:ogc:def:crs:EPSG:6.18:3:3857 -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/no_tilematrix.xml') + ds = gdal.Open("WMTS:/vsimem/no_tilematrix.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: Missing required element in TileMatrix element @@ -288,7 +312,9 @@ def test_wmts_12(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/missing_required_element_in_tilematrix.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/missing_required_element_in_tilematrix.xml", + """ @@ -306,13 +332,15 @@ def test_wmts_12(): -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/missing_required_element_in_tilematrix.xml') + ds = gdal.Open("WMTS:/vsimem/missing_required_element_in_tilematrix.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: Missing ResourceURL @@ -322,7 +350,9 @@ def test_wmts_12bis(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_12bis.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_12bis.xml", + """ @@ -347,13 +377,15 @@ def test_wmts_12bis(): -""") +""", + ) gdal.PushErrorHandler() - ds = gdal.Open('WMTS:/vsimem/wmts_12bis.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_12bis.xml") gdal.PopErrorHandler() assert ds is None + ############################################################################### # Error: TileMatrixSetLink points to non-existing TileMatrix @@ -390,10 +422,11 @@ def test_wmts_tilematrixsetlink_to_non_existing_tilematrix(): """ - with gdaltest.tempfile('/vsimem/test_wmts.xml', xml), gdaltest.error_handler(): - ds = gdal.Open('WMTS:/vsimem/test_wmts.xml') + with gdaltest.tempfile("/vsimem/test_wmts.xml", xml), gdaltest.error_handler(): + ds = gdal.Open("WMTS:/vsimem/test_wmts.xml") assert ds is None + ############################################################################### # Minimal @@ -403,7 +436,9 @@ def test_wmts_13(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/minimal.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/minimal.xml", + """ @@ -429,17 +464,25 @@ def test_wmts_13(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/minimal.xml') + ds = gdal.Open("WMTS:/vsimem/minimal.xml") assert ds is not None assert ds.RasterXSize == 256 assert ds.RasterYSize == 256 got_gt = ds.GetGeoTransform() - expected_gt = (-20037508.342799999, 156543.03392811998, 0.0, 20037508.342799999, 0.0, -156543.03392811998) + expected_gt = ( + -20037508.342799999, + 156543.03392811998, + 0.0, + 20037508.342799999, + 0.0, + -156543.03392811998, + ) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('3857') >= 0 + assert ds.GetProjectionRef().find("3857") >= 0 assert ds.RasterCount == 4 for i in range(4): assert ds.GetRasterBand(i + 1).GetColorInterpretation() == gdal.GCI_RedBand + i @@ -450,36 +493,40 @@ def test_wmts_13(): gdal.PopErrorHandler() assert cs == 0 assert ds.GetSubDatasets() == [] - assert ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') is None - assert ds.GetRasterBand(1).GetMetadataItem('foo') is None - - for connection_str in ['WMTS:/vsimem/minimal.xml,layer=', - 'WMTS:/vsimem/minimal.xml,style=', - 'WMTS:/vsimem/minimal.xml,tilematrixset=', - 'WMTS:/vsimem/minimal.xml,tilematrixset=tms', - 'WMTS:/vsimem/minimal.xml,tilematrix=', - 'WMTS:/vsimem/minimal.xml,zoom_level=', - 'WMTS:/vsimem/minimal.xml,layer=,style=,tilematrixset=']: + assert ds.GetRasterBand(1).GetMetadataItem("Pixel_0_0", "LocationInfo") is None + assert ds.GetRasterBand(1).GetMetadataItem("foo") is None + + for connection_str in [ + "WMTS:/vsimem/minimal.xml,layer=", + "WMTS:/vsimem/minimal.xml,style=", + "WMTS:/vsimem/minimal.xml,tilematrixset=", + "WMTS:/vsimem/minimal.xml,tilematrixset=tms", + "WMTS:/vsimem/minimal.xml,tilematrix=", + "WMTS:/vsimem/minimal.xml,zoom_level=", + "WMTS:/vsimem/minimal.xml,layer=,style=,tilematrixset=", + ]: ds = gdal.Open(connection_str) assert ds is not None, connection_str ds = None - for connection_str in ['WMTS:/vsimem/minimal.xml,layer=foo', - 'WMTS:/vsimem/minimal.xml,style=bar', - 'WMTS:/vsimem/minimal.xml,tilematrixset=baz', - 'WMTS:/vsimem/minimal.xml,tilematrix=baw', - 'WMTS:/vsimem/minimal.xml,zoom_level=30']: + for connection_str in [ + "WMTS:/vsimem/minimal.xml,layer=foo", + "WMTS:/vsimem/minimal.xml,style=bar", + "WMTS:/vsimem/minimal.xml,tilematrixset=baz", + "WMTS:/vsimem/minimal.xml,tilematrix=baw", + "WMTS:/vsimem/minimal.xml,zoom_level=30", + ]: gdal.PushErrorHandler() ds = gdal.Open(connection_str) gdal.PopErrorHandler() assert ds is None, connection_str ds = None - ds = gdal.Open('WMTS:/vsimem/minimal.xml') - tmp_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 4) + ds = gdal.Open("WMTS:/vsimem/minimal.xml") + tmp_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 4) for i in range(4): tmp_ds.GetRasterBand(i + 1).Fill((i + 1) * 255 / 4) - tmp_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/0/0/0.png', tmp_ds) + tmp_ds = gdal.GetDriverByName("PNG").CreateCopy("/vsimem/0/0/0.png", tmp_ds) for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == tmp_ds.GetRasterBand(i + 1).Checksum() @@ -489,12 +536,15 @@ def test_wmts_13(): assert ref_data == got_data ref_data = tmp_ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) - got_data = ds.GetRasterBand(1).ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 256, 256) + got_data = ds.GetRasterBand(1).ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, 256, 256 + ) assert ref_data == got_data ds = None wmts_CleanCache() + ############################################################################### # Nominal RESTful @@ -504,7 +554,9 @@ def test_wmts_14(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/nominal.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/nominal.xml", + """ lyr1 @@ -587,36 +639,51 @@ def test_wmts_14(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/nominal.xml') + ds = gdal.Open("WMTS:/vsimem/nominal.xml") assert ds is not None - assert (ds.GetSubDatasets() == [('WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=tms,style="style=auto"', - 'Layer My layer1, tile matrix set tms, style "Default style"'), - ('WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=tms,style=another_style', - 'Layer My layer1, tile matrix set tms, style "Another style"'), - ('WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=another_tms,style="style=auto"', - 'Layer My layer1, tile matrix set another_tms, style "Default style"'), - ('WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=another_tms,style=another_style', - 'Layer My layer1, tile matrix set another_tms, style "Another style"')]) + assert ds.GetSubDatasets() == [ + ( + 'WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=tms,style="style=auto"', + 'Layer My layer1, tile matrix set tms, style "Default style"', + ), + ( + "WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=tms,style=another_style", + 'Layer My layer1, tile matrix set tms, style "Another style"', + ), + ( + 'WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=another_tms,style="style=auto"', + 'Layer My layer1, tile matrix set another_tms, style "Default style"', + ), + ( + "WMTS:/vsimem/nominal.xml,layer=lyr1,tilematrixset=another_tms,style=another_style", + 'Layer My layer1, tile matrix set another_tms, style "Another style"', + ), + ] assert ds.RasterXSize == 67108864 gdal.PushErrorHandler() - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") gdal.PopErrorHandler() - assert res == '' - assert ds.GetMetadata() == {'ABSTRACT': 'My abstract', 'TITLE': 'My layer1'} + assert res == "" + assert ds.GetMetadata() == {"ABSTRACT": "My abstract", "TITLE": "My layer1"} gdal.PushErrorHandler() - gdaltest.wmts_drv.CreateCopy('/vsimem/gdal_nominal.xml', gdal.GetDriverByName('MEM').Create('', 1, 1)) + gdaltest.wmts_drv.CreateCopy( + "/vsimem/gdal_nominal.xml", gdal.GetDriverByName("MEM").Create("", 1, 1) + ) gdal.PopErrorHandler() - gdaltest.wmts_drv.CreateCopy('/vsimem/gdal_nominal.xml', ds) + gdaltest.wmts_drv.CreateCopy("/vsimem/gdal_nominal.xml", ds) ds = None - f = gdal.VSIFOpenL('/vsimem/gdal_nominal.xml', 'rb') - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + f = gdal.VSIFOpenL("/vsimem/gdal_nominal.xml", "rb") + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - assert data == """ + assert ( + data + == """ /vsimem/nominal.xml lyr1 @@ -635,56 +702,71 @@ def test_wmts_14(): true """ - - ds = gdal.Open('/vsimem/gdal_nominal.xml') - gdal.FileFromMemBuffer('/vsimem/2011-10-04/style=auto/tms/tm_18/0/0/2/1.txt', 'foo') - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') - assert res == 'foo' - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') - assert res == 'foo' - - ds = gdal.Open('/vsimem/nominal.xml') + ) + + ds = gdal.Open("/vsimem/gdal_nominal.xml") + gdal.FileFromMemBuffer("/vsimem/2011-10-04/style=auto/tms/tm_18/0/0/2/1.txt", "foo") + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") + assert res == "foo" + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") + assert res == "foo" + + ds = gdal.Open( + "/vsimem/nominal.xml" + ) assert ds is not None - ds = gdal.Open('WMTS:/vsimem/gdal_nominal.xml') + ds = gdal.Open("WMTS:/vsimem/gdal_nominal.xml") assert ds is not None - for open_options in [['URL=/vsimem/nominal.xml'], - ['URL=/vsimem/nominal.xml', 'STYLE=style=auto', 'TILEMATRIXSET=tms']]: - ds = gdal.OpenEx('WMTS:', open_options=open_options) + for open_options in [ + ["URL=/vsimem/nominal.xml"], + ["URL=/vsimem/nominal.xml", "STYLE=style=auto", "TILEMATRIXSET=tms"], + ]: + ds = gdal.OpenEx("WMTS:", open_options=open_options) assert ds is not None - for open_options in [['URL=/vsimem/nominal.xml', 'STYLE=x', 'TILEMATRIXSET=y'], - ['URL=/vsimem/nominal.xml', 'STYLE=style=auto', 'TILEMATRIX=30'], - ['URL=/vsimem/nominal.xml', 'STYLE=style=auto', 'ZOOM_LEVEL=30']]: + for open_options in [ + ["URL=/vsimem/nominal.xml", "STYLE=x", "TILEMATRIXSET=y"], + ["URL=/vsimem/nominal.xml", "STYLE=style=auto", "TILEMATRIX=30"], + ["URL=/vsimem/nominal.xml", "STYLE=style=auto", "ZOOM_LEVEL=30"], + ]: gdal.PushErrorHandler() - ds = gdal.OpenEx('WMTS:', open_options=open_options) + ds = gdal.OpenEx("WMTS:", open_options=open_options) gdal.PopErrorHandler() assert ds is None - ds = gdal.Open('WMTS:/vsimem/nominal.xml') - gdal.FileFromMemBuffer('/vsimem/2011-10-04/style=auto/tms/tm_18/0/0/2/1.txt', '') - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') - assert res == """ + ds = gdal.Open("WMTS:/vsimem/nominal.xml") + gdal.FileFromMemBuffer( + "/vsimem/2011-10-04/style=auto/tms/tm_18/0/0/2/1.txt", + '', + ) + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") + assert ( + res + == """ """ + ) - ds = gdal.Open('WMTS:/vsimem/gdal_nominal.xml,tilematrix=tm_0') + ds = gdal.Open("WMTS:/vsimem/gdal_nominal.xml,tilematrix=tm_0") assert ds is not None assert ds.RasterXSize == 256 - ds = gdal.OpenEx('WMTS:/vsimem/gdal_nominal.xml', open_options=['tilematrix=tm_0']) + ds = gdal.OpenEx("WMTS:/vsimem/gdal_nominal.xml", open_options=["tilematrix=tm_0"]) assert ds is not None assert ds.RasterXSize == 256 - ds = gdal.Open('WMTS:/vsimem/gdal_nominal.xml,zoom_level=0') + ds = gdal.Open("WMTS:/vsimem/gdal_nominal.xml,zoom_level=0") assert ds is not None assert ds.RasterXSize == 256 - ds = gdal.OpenEx('WMTS:/vsimem/gdal_nominal.xml', open_options=['zoom_level=0']) + ds = gdal.OpenEx("WMTS:/vsimem/gdal_nominal.xml", open_options=["zoom_level=0"]) assert ds is not None assert ds.RasterXSize == 256 - gdal.FileFromMemBuffer('/vsimem/gdal_nominal.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/gdal_nominal.xml", + """ /vsimem/nominal.xml lyr1 @@ -701,12 +783,15 @@ def test_wmts_14(): true 204,404 true -""") - ds = gdal.Open('WMTS:/vsimem/gdal_nominal.xml') +""", + ) + ds = gdal.Open("WMTS:/vsimem/gdal_nominal.xml") assert ds is not None assert ds.RasterXSize == 256 - gdal.FileFromMemBuffer('/vsimem/gdal_nominal.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/gdal_nominal.xml", + """ /vsimem/nominal.xml lyr1 @@ -723,11 +808,13 @@ def test_wmts_14(): true 204,404 true -""") - ds = gdal.Open('WMTS:/vsimem/gdal_nominal.xml') +""", + ) + ds = gdal.Open("WMTS:/vsimem/gdal_nominal.xml") assert ds is not None assert ds.RasterXSize == 256 + ############################################################################### # Nominal KVP @@ -737,7 +824,9 @@ def test_wmts_15(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/nominal_kvp.xml?service=WMTS&request=GetCapabilities', """ + gdal.FileFromMemBuffer( + "/vsimem/nominal_kvp.xml?service=WMTS&request=GetCapabilities", + """ @@ -831,30 +920,37 @@ def test_wmts_15(): -""") +""", + ) - ds = gdal.Open('/vsimem/nominal_kvp.xml?service=WMTS&request=GetCapabilities') + ds = gdal.Open("/vsimem/nominal_kvp.xml?service=WMTS&request=GetCapabilities") assert ds is not None assert ds.RasterXSize == 67108864 gdal.PushErrorHandler() - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") gdal.PopErrorHandler() - assert res == '' + assert res == "" - gdaltest.wmts_drv.CreateCopy('/vsimem/gdal_nominal_kvp.xml', ds) + gdaltest.wmts_drv.CreateCopy("/vsimem/gdal_nominal_kvp.xml", ds) ds = None - ds = gdal.Open('/vsimem/gdal_nominal_kvp.xml') - gdal.FileFromMemBuffer('/vsimem/nominal_kvp.xml?service=WMTS&request=GetFeatureInfo&version=1.0.0&layer=lyr1&style=default_style&InfoFormat=text/plain&TileMatrixSet=tms&TileMatrix=18&TileRow=0&TileCol=0&J=2&I=1&time=2011-10-04', 'bar') - res = ds.GetRasterBand(1).GetMetadataItem('Pixel_1_2', 'LocationInfo') - assert res == 'bar' + ds = gdal.Open("/vsimem/gdal_nominal_kvp.xml") + gdal.FileFromMemBuffer( + "/vsimem/nominal_kvp.xml?service=WMTS&request=GetFeatureInfo&version=1.0.0&layer=lyr1&style=default_style&InfoFormat=text/plain&TileMatrixSet=tms&TileMatrix=18&TileRow=0&TileCol=0&J=2&I=1&time=2011-10-04", + "bar", + ) + res = ds.GetRasterBand(1).GetMetadataItem("Pixel_1_2", "LocationInfo") + assert res == "bar" - ds = gdal.Open('WMTS:/vsimem/gdal_nominal_kvp.xml') + ds = gdal.Open("WMTS:/vsimem/gdal_nominal_kvp.xml") assert ds is not None - tmp_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 4) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 4) for i in range(4): tmp_ds.GetRasterBand(i + 1).Fill((i + 1) * 255 / 4) - tmp_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/nominal_kvp.xml?service=WMTS&request=GetTile&version=1.0.0&layer=lyr1&style=default_style&format=image/png&TileMatrixSet=tms&TileMatrix=0&TileRow=0&TileCol=0&time=2011-10-04', tmp_ds) + tmp_ds = gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/nominal_kvp.xml?service=WMTS&request=GetTile&version=1.0.0&layer=lyr1&style=default_style&format=image/png&TileMatrixSet=tms&TileMatrix=0&TileRow=0&TileCol=0&time=2011-10-04", + tmp_ds, + ) for i in range(4): cs = ds.GetRasterBand(i + 1).GetOverview(0).Checksum() assert cs == tmp_ds.GetRasterBand(i + 1).Checksum() @@ -864,12 +960,15 @@ def test_wmts_15(): assert ref_data == got_data ref_data = tmp_ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) - got_data = ds.GetRasterBand(1).ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 256, 256) + got_data = ds.GetRasterBand(1).ReadRaster( + 0, 0, ds.RasterXSize, ds.RasterYSize, 256, 256 + ) assert ref_data == got_data ds = None wmts_CleanCache() + ############################################################################### # AOI from layer WGS84BoundingBox @@ -879,7 +978,9 @@ def test_wmts_16(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_16.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_16.xml", + """ lyr1 @@ -932,9 +1033,10 @@ def test_wmts_16(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_16.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_16.xml") assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -942,9 +1044,10 @@ def test_wmts_16(): expected_gt = (-90, 0.3515625, 0.0, 90.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] + ############################################################################### # AOI from layer BoundingBox @@ -954,7 +1057,9 @@ def test_wmts_17(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_17.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_17.xml", + """ lyr1 @@ -1007,9 +1112,10 @@ def test_wmts_17(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_17.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_17.xml") assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -1017,7 +1123,8 @@ def test_wmts_17(): expected_gt = (-90, 0.3515625, 0.0, 90.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 + ############################################################################### # AOI from TileMatrixSet BoundingBox @@ -1028,7 +1135,9 @@ def test_wmts_18(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_18.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_18.xml", + """ lyr1 @@ -1081,9 +1190,10 @@ def test_wmts_18(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_18.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_18.xml") assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -1091,7 +1201,8 @@ def test_wmts_18(): expected_gt = (-90, 0.3515625, 0.0, 90.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 + ############################################################################### # AOI from TileMatrixSetLimits @@ -1102,7 +1213,9 @@ def test_wmts_19(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_19.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_19.xml", + """ lyr1 @@ -1160,9 +1273,10 @@ def test_wmts_19(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_19.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_19.xml") assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -1170,7 +1284,8 @@ def test_wmts_19(): expected_gt = (-90, 0.3515625, 0.0, 90.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 + ############################################################################### # AOI from layer BoundingBox but restricted with TileMatrixSetLimits @@ -1181,7 +1296,9 @@ def test_wmts_20(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_20.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_20.xml", + """ @@ -1243,10 +1360,13 @@ def test_wmts_20(): -""") +""", + ) - ds = gdal.OpenEx('WMTS:/vsimem/wmts_20.xml', - open_options = ["CLIP_EXTENT_WITH_MOST_PRECISE_TILE_MATRIX_LIMITS=YES"]) + ds = gdal.OpenEx( + "WMTS:/vsimem/wmts_20.xml", + open_options=["CLIP_EXTENT_WITH_MOST_PRECISE_TILE_MATRIX_LIMITS=YES"], + ) assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -1254,7 +1374,8 @@ def test_wmts_20(): expected_gt = (-90, 0.3515625, 0.0, 90.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 + ############################################################################### # Test ExtendBeyondDateLine @@ -1265,7 +1386,9 @@ def test_wmts_21(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_21.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_21.xml", + """ @@ -1323,9 +1446,10 @@ def test_wmts_21(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_21.xml,extendbeyonddateline=yes') + ds = gdal.Open("WMTS:/vsimem/wmts_21.xml,extendbeyonddateline=yes") assert ds is not None assert ds.RasterXSize == 512 assert ds.RasterYSize == 256 @@ -1333,21 +1457,30 @@ def test_wmts_21(): expected_gt = (90, 0.3515625, 0.0, 0.0, 0.0, -0.3515625) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('4326') >= 0 + assert ds.GetProjectionRef().find("4326") >= 0 - tmp_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 4) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 4) for i in range(4): tmp_ds.GetRasterBand(i + 1).Fill(64) - tmp3_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/wmts_21/default_style/tms/GoogleCRS84Quad:2/1/3.png', tmp_ds) + tmp3_ds = gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/wmts_21/default_style/tms/GoogleCRS84Quad:2/1/3.png", tmp_ds + ) - tmp_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 4) + tmp_ds = gdal.GetDriverByName("MEM").Create("", 256, 256, 4) for i in range(4): tmp_ds.GetRasterBand(i + 1).Fill(128) - tmp0_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/wmts_21/default_style/tms/GoogleCRS84Quad:2/1/0.png', tmp_ds) + tmp0_ds = gdal.GetDriverByName("PNG").CreateCopy( + "/vsimem/wmts_21/default_style/tms/GoogleCRS84Quad:2/1/0.png", tmp_ds + ) - assert ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) == tmp3_ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) + assert ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) == tmp3_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 256, 256) + + assert ds.GetRasterBand(1).ReadRaster(256, 0, 256, 256) == tmp0_ds.GetRasterBand( + 1 + ).ReadRaster(0, 0, 256, 256) - assert ds.GetRasterBand(1).ReadRaster(256, 0, 256, 256) == tmp0_ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) ############################################################################### # Test when WGS84BoundingBox is a densified reprojection of the tile matrix bbox @@ -1358,7 +1491,9 @@ def test_wmts_22(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_22.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_22.xml", + """ @@ -1393,9 +1528,10 @@ def test_wmts_22(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_22.xml') + ds = gdal.Open("WMTS:/vsimem/wmts_22.xml") assert ds is not None assert ds.RasterXSize == 2097152 assert ds.RasterYSize == 2097152 @@ -1403,7 +1539,9 @@ def test_wmts_22(): expected_gt = (-548576.0, 1.0000000000004, 0.0, 8388608.0, 0.0, -1.0000000000004) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) - assert ds.GetProjectionRef().find('3067') >= 0 + assert ds.GetProjectionRef().find("3067") >= 0 + + ############################################################################### # @@ -1413,9 +1551,11 @@ def wmts_23(imagetype, expected_cs): if gdaltest.wmts_drv is None: pytest.skip() - inputXml = '/vsimem/' + imagetype + '.xml' - serviceUrl = '/vsimem/wmts_23/' + imagetype - gdal.FileFromMemBuffer(inputXml, """ + inputXml = "/vsimem/" + imagetype + ".xml" + serviceUrl = "/vsimem/wmts_23/" + imagetype + gdal.FileFromMemBuffer( + inputXml, + """ @@ -1425,7 +1565,9 @@ def wmts_23(imagetype, expected_cs): - + tms @@ -1441,15 +1583,16 @@ def wmts_23(imagetype, expected_cs): -""") +""", + ) - tmp_ds = gdal.Open('data/wms/' + imagetype + '.png') - assert tmp_ds is not None, 'fail - cannot open tmp_ds' + tmp_ds = gdal.Open("data/wms/" + imagetype + ".png") + assert tmp_ds is not None, "fail - cannot open tmp_ds" - tile0_ds = gdal.GetDriverByName('PNG').CreateCopy(serviceUrl + '/0/0/0.png', tmp_ds) - assert tile0_ds is not None, 'fail - cannot create tile0' + tile0_ds = gdal.GetDriverByName("PNG").CreateCopy(serviceUrl + "/0/0/0.png", tmp_ds) + assert tile0_ds is not None, "fail - cannot create tile0" - ds = gdal.Open('WMTS:' + inputXml) + ds = gdal.Open("WMTS:" + inputXml) assert ds is not None assert ds.RasterXSize == 128 @@ -1460,25 +1603,24 @@ def wmts_23(imagetype, expected_cs): assert cs == expected_cs[i] - def test_wmts_23_gray(): - return wmts_23('gray', [60137, 60137, 60137, 4428]) + return wmts_23("gray", [60137, 60137, 60137, 4428]) def test_wmts_23_grayalpha(): - return wmts_23('gray+alpha', [39910, 39910, 39910, 63180]) + return wmts_23("gray+alpha", [39910, 39910, 39910, 63180]) def test_wmts_23_pal(): - return wmts_23('pal', [62950, 59100, 63864, 453]) + return wmts_23("pal", [62950, 59100, 63864, 453]) def test_wmts_23_rgb(): - return wmts_23('rgb', [1020, 3665, 6180, 4428]) + return wmts_23("rgb", [1020, 3665, 6180, 4428]) def test_wmts_23_rgba(): - return wmts_23('rgba', [65530, 51449, 1361, 59291]) + return wmts_23("rgba", [65530, 51449, 1361, 59291]) def test_wmts_invalid_global_to_tm_reprojection(): @@ -1486,8 +1628,10 @@ def test_wmts_invalid_global_to_tm_reprojection(): if gdaltest.wmts_drv is None: pytest.skip() - inputXml = '/vsimem/wmts_invalid_global_to_tm_reprojection.xml' - gdal.FileFromMemBuffer(inputXml, """ + inputXml = "/vsimem/wmts_invalid_global_to_tm_reprojection.xml" + gdal.FileFromMemBuffer( + inputXml, + """ @@ -1527,14 +1671,16 @@ def test_wmts_invalid_global_to_tm_reprojection(): -""") +""", + ) - ds = gdal.Open('WMTS:' + inputXml) + ds = gdal.Open("WMTS:" + inputXml) assert ds.RasterXSize == 512 and ds.RasterYSize == 1024 ds = None gdal.Unlink(inputXml) + ############################################################################### # @@ -1544,8 +1690,10 @@ def test_wmts_check_no_overflow_zoom_level(): if gdaltest.wmts_drv is None: pytest.skip() - inputXml = '/vsimem/wmts_check_no_overflow_zoom_level.xml' - gdal.FileFromMemBuffer(inputXml, """ + inputXml = "/vsimem/wmts_check_no_overflow_zoom_level.xml" + gdal.FileFromMemBuffer( + inputXml, + """ @@ -1792,7 +1940,8 @@ def test_wmts_check_no_overflow_zoom_level(): -""") +""", + ) ds = gdal.Open(inputXml) assert ds.RasterXSize == 1073741766 and ds.RasterYSize == 1070224430 @@ -1802,6 +1951,7 @@ def test_wmts_check_no_overflow_zoom_level(): gdal.Unlink(inputXml) + ############################################################################### # Test when local wmts tiles are missing @@ -1811,7 +1961,9 @@ def test_wmts_24(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/wmts_missing_local_tiles.xml', """ + gdal.FileFromMemBuffer( + "/vsimem/wmts_missing_local_tiles.xml", + """ @@ -1846,30 +1998,33 @@ def test_wmts_24(): -""") +""", + ) - ds = gdal.Open('WMTS:/vsimem/wmts_missing_local_tiles.xml') -# Read some data from the image + ds = gdal.Open("WMTS:/vsimem/wmts_missing_local_tiles.xml") + # Read some data from the image band = ds.GetRasterBand(1) assert band is not None - structval=band.ReadRaster(0,0,1,1,buf_type=gdal.GDT_UInt16) + structval = band.ReadRaster(0, 0, 1, 1, buf_type=gdal.GDT_UInt16) assert structval is not None - data = struct.unpack('h' , structval) -# Expect a null value for the pixel data + data = struct.unpack("h", structval) + # Expect a null value for the pixel data assert data[0] == 0 + ############################################################################### # def wmts_CleanCache(): - hexstr = '012346789abcdef' + hexstr = "012346789abcdef" for i in range(len(hexstr)): for j in range(len(hexstr)): - lst = gdal.ReadDir('/vsimem/cache/%s/%s' % (i, j)) + lst = gdal.ReadDir("/vsimem/cache/%s/%s" % (i, j)) if lst is not None: for f in lst: - gdal.Unlink('/vsimem/cache/%s/%s/%s' % (i, j, f)) + gdal.Unlink("/vsimem/cache/%s/%s/%s" % (i, j, f)) + ############################################################################### # @@ -1880,21 +2035,17 @@ def test_wmts_cleanup(): if gdaltest.wmts_drv is None: pytest.skip() - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) - gdal.SetConfigOption('GDAL_DEFAULT_WMS_CACHE_PATH', None) + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", None) + gdal.SetConfigOption("GDAL_DEFAULT_WMS_CACHE_PATH", None) wmts_CleanCache() - lst = gdal.ReadDir('/vsimem/') + lst = gdal.ReadDir("/vsimem/") if lst: for f in lst: - gdal.Unlink('/vsimem/' + f) + gdal.Unlink("/vsimem/" + f) try: - shutil.rmtree('tmp/wmts_cache') + shutil.rmtree("tmp/wmts_cache") except OSError: pass - - - - diff --git a/autotest/gdrivers/xmp.py b/autotest/gdrivers/xmp.py index bea0f256d926..bf5dfd253dd8 100755 --- a/autotest/gdrivers/xmp.py +++ b/autotest/gdrivers/xmp.py @@ -29,13 +29,11 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### +import gdaltest import pytest from osgeo import gdal - -import gdaltest - ############################################################################### # @@ -67,45 +65,47 @@ @pytest.mark.parametrize( - 'drivername,filename,expect_xmp', + "drivername,filename,expect_xmp", lst, ids=[ "xmp_read_%s_%s" % (drivername, str(expect_xmp)) for (drivername, filename, expect_xmp) in lst - ] + ], ) def test_xmp(drivername, filename, expect_xmp): drv = gdal.GetDriverByName(drivername) if drv is None: pytest.skip() - if drivername == 'PDF': + if drivername == "PDF": md = drv.GetMetadata() - if 'HAVE_POPPLER' not in md and 'HAVE_PODOFO' not in md: + if "HAVE_POPPLER" not in md and "HAVE_PODOFO" not in md: pytest.skip() # we set ECW to not resolve projection and datum strings to get 3.x behavior. gdal.SetConfigOption("ECW_DO_NOT_RESOLVE_DATUM_PROJECTION", "YES") - if '.jp2' in filename: + if ".jp2" in filename: gdaltest.deregister_all_jpeg2000_drivers_but(drivername) try: ds = gdal.Open(filename) - if filename == 'data/rgbsmall_with_xmp.webp': + if filename == "data/rgbsmall_with_xmp.webp": if ds is None: pytest.skip("Old libwebp don't support VP8X containers") else: - assert ds is not None, 'open failed' + assert ds is not None, "open failed" - xmp_md = ds.GetMetadata('xml:XMP') + xmp_md = ds.GetMetadata("xml:XMP") - assert ds.GetDriver().ShortName == drivername, 'opened with wrong driver' - assert not (expect_xmp and not xmp_md), 'did not find xml:XMP metadata' - assert not (expect_xmp and 'xml:XMP' not in ds.GetMetadataDomainList()), 'did not find xml:XMP metadata domain' - assert expect_xmp or not xmp_md, 'found unexpected xml:XMP metadata' + assert ds.GetDriver().ShortName == drivername, "opened with wrong driver" + assert not (expect_xmp and not xmp_md), "did not find xml:XMP metadata" + assert not ( + expect_xmp and "xml:XMP" not in ds.GetMetadataDomainList() + ), "did not find xml:XMP metadata domain" + assert expect_xmp or not xmp_md, "found unexpected xml:XMP metadata" ds = None finally: - if '.jp2' in filename: + if ".jp2" in filename: gdaltest.reregister_all_jpeg2000_drivers() diff --git a/autotest/gdrivers/xpm.py b/autotest/gdrivers/xpm.py index 2a3d65dd8b15..ed62f4d0b13e 100755 --- a/autotest/gdrivers/xpm.py +++ b/autotest/gdrivers/xpm.py @@ -29,34 +29,32 @@ ############################################################################### +import gdaltest import pytest from osgeo import gdal -import gdaltest - - -xpm_list = [('http://download.osgeo.org/gdal/data/xpm', 'utm.xpm', 44206, -1)] +xpm_list = [("http://download.osgeo.org/gdal/data/xpm", "utm.xpm", 44206, -1)] @pytest.mark.parametrize( - 'downloadURL,fileName,checksum,download_size', + "downloadURL,fileName,checksum,download_size", xpm_list, ids=[item[1] for item in xpm_list], ) def test_xpm(downloadURL, fileName, checksum, download_size): - if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): + if not gdaltest.download_file( + downloadURL + "/" + fileName, fileName, download_size + ): pytest.skip() - ds = gdal.Open('tmp/cache/' + fileName) + ds = gdal.Open("tmp/cache/" + fileName) - assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) + assert ( + ds.GetRasterBand(1).Checksum() == checksum + ), "Bad checksum. Expected %d, got %d" % (checksum, ds.GetRasterBand(1).Checksum()) def test_xpm_1(): - tst = gdaltest.GDALTest('XPM', 'byte.tif', 1, 4583) + tst = gdaltest.GDALTest("XPM", "byte.tif", 1, 4583) return tst.testCreateCopy(vsimem=1, check_minmax=False) - - - - diff --git a/autotest/gdrivers/xyz.py b/autotest/gdrivers/xyz.py index da09ce07d653..a6097dae3ffc 100755 --- a/autotest/gdrivers/xyz.py +++ b/autotest/gdrivers/xyz.py @@ -30,20 +30,24 @@ ############################################################################### import struct -from osgeo import gdal - import gdaltest import pytest +from osgeo import gdal + ############################################################################### # Test CreateCopy() of byte.tif def test_xyz_1(): - tst = gdaltest.GDALTest('XYZ', 'byte.tif', 1, 4672) - return tst.testCreateCopy(vsimem=1, check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) + tst = gdaltest.GDALTest("XYZ", "byte.tif", 1, 4672) + return tst.testCreateCopy( + vsimem=1, + check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333), + ) + ############################################################################### # Test CreateCopy() of float.img @@ -51,14 +55,17 @@ def test_xyz_1(): def test_xyz_2(): - src_ds = gdal.Open('data/hfa/float.img') - ds = gdal.GetDriverByName('XYZ').CreateCopy('tmp/float.xyz', src_ds, options=['COLUMN_SEPARATOR=,', 'ADD_HEADER_LINE=YES']) + src_ds = gdal.Open("data/hfa/float.img") + ds = gdal.GetDriverByName("XYZ").CreateCopy( + "tmp/float.xyz", src_ds, options=["COLUMN_SEPARATOR=,", "ADD_HEADER_LINE=YES"] + ) got_cs = ds.GetRasterBand(1).Checksum() expected_cs = src_ds.GetRasterBand(1).Checksum() ds = None - gdal.GetDriverByName('XYZ').Delete('tmp/float.xyz') + gdal.GetDriverByName("XYZ").Delete("tmp/float.xyz") assert got_cs == expected_cs or got_cs == 24387 + ############################################################################### # Test random access to lines of imagery @@ -79,27 +86,28 @@ def test_xyz_3(): """ - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) - ds = gdal.Open('/vsimem/grid.xyz') + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) + ds = gdal.Open("/vsimem/grid.xyz") buf = ds.ReadRaster(0, 2, 2, 1) - assert struct.unpack('B' * 2, buf) == (69, 70) + assert struct.unpack("B" * 2, buf) == (69, 70) buf = ds.ReadRaster(0, 1, 2, 1) - assert struct.unpack('B' * 2, buf) == (67, 68) + assert struct.unpack("B" * 2, buf) == (67, 68) buf = ds.ReadRaster(0, 0, 2, 1) - assert struct.unpack('B' * 2, buf) == (65, 66) + assert struct.unpack("B" * 2, buf) == (65, 66) buf = ds.ReadRaster(0, 2, 2, 1) - assert struct.unpack('B' * 2, buf) == (69, 70) + assert struct.unpack("B" * 2, buf) == (69, 70) ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") ############################################################################### # Test regularly spaced XYZ but with missing values at beginning and/or end of lines # and missing value in the middle. And a not so exact spacing + def xyz_4_checkline(ds, i, expected_bytes): buf = ds.ReadRaster(0, i, ds.RasterXSize, 1) - return struct.unpack('B' * ds.RasterXSize, buf) == expected_bytes + return struct.unpack("B" * ds.RasterXSize, buf) == expected_bytes def test_xyz_4(): @@ -113,10 +121,10 @@ def test_xyz_4(): 440870 3751170.001 6 440810 3751050 7""" - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) expected = [(0, 1, 2, 0), (3, 4, 0, 6), (0, 0, 7, 0)] - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") got_gt = ds.GetGeoTransform() expected_gt = (440660.0, 60.0, 0.0, 3751350.0, 0.0, -120.0) @@ -129,12 +137,13 @@ def test_xyz_4(): for i in [0, 1, 2, 1, 0, 2, 0, 2, 0, 1, 2]: assert xyz_4_checkline(ds, i, expected[i]) ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") ############################################################################### # Test XYZ with only integral values and comma field separator + def test_xyz_5(): content = """0,1,100 @@ -144,23 +153,23 @@ def test_xyz_5(): 0.5,2,100 1,2,100 """ - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 2 got_gt = ds.GetGeoTransform() expected_gt = (-0.25, 0.5, 0.0, 0.5, 0.0, 1.0) ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) - ############################################################################### # Test XYZ with comma decimal separator and semi-colon field separator + def test_xyz_6(): content = """0;1;100 @@ -170,23 +179,23 @@ def test_xyz_6(): 0,5;2;100 1;2;100 """ - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 2 got_gt = ds.GetGeoTransform() expected_gt = (-0.25, 0.5, 0.0, 0.5, 0.0, 1.0) ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) - ############################################################################### # Test XYZ with not completely equal stepX and stepY + def test_xyz_7(): content = """y x z @@ -206,21 +215,22 @@ def test_xyz_7(): 51.400000 354.516667 54.625 51.400000 354.550000 54.614 """ - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 5 got_gt = ds.GetGeoTransform() expected_gt = (354.46666625, 0.0333335, 0.0, 51.5125, 0.0, -0.025) cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) assert cs == 146 + ############################################################################### # Test particular case of XYZ file with missed samples (#6934) @@ -233,16 +243,17 @@ def test_xyz_8(): 750 750 200 """ - gdal.FileFromMemBuffer('/vsimem/grid.xyz', content) + gdal.FileFromMemBuffer("/vsimem/grid.xyz", content) - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 4 and ds.RasterYSize == 2 cs = ds.GetRasterBand(1).Checksum() ds = None - gdal.Unlink('/vsimem/grid.xyz') + gdal.Unlink("/vsimem/grid.xyz") assert cs == 35 + ############################################################################### # Test case of XYZ file with header file with 3 columns not named X Y Z, and quoted @@ -256,14 +267,15 @@ def test_xyz_9(): 10 10 200 """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): + with gdaltest.tempfile("/vsimem/grid.xyz", content): with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/grid.xyz') + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 2 and ds.RasterYSize == 2 cs = ds.GetRasterBand(1).Checksum() assert cs == 22 + ############################################################################### # Test case of XYZ file where grid points are organized by columns, ascending Y @@ -280,12 +292,12 @@ def test_xyz_organized_by_columns_int16(): """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): - ds = gdal.Open('/vsimem/grid.xyz') + with gdaltest.tempfile("/vsimem/grid.xyz", content): + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 2 and ds.RasterYSize == 3 assert ds.GetGeoTransform() == (-5.0, 10.0, 0.0, 25.0, 0.0, -10.0) assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 - assert struct.unpack('h' * 6, ds.ReadRaster()) == (150, 300, 100, 250, 50, 200) + assert struct.unpack("h" * 6, ds.ReadRaster()) == (150, 300, 100, 250, 50, 200) ############################################################################### @@ -304,17 +316,25 @@ def test_xyz_organized_by_columns_float32(): """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): - ds = gdal.Open('/vsimem/grid.xyz') + with gdaltest.tempfile("/vsimem/grid.xyz", content): + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 2 and ds.RasterYSize == 3 assert ds.GetGeoTransform() == (-5.0, 10.0, 0.0, 25.0, 0.0, -10.0) assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 - assert struct.unpack('f' * 6, ds.ReadRaster()) == (50.5, 200.0, 100.0, 250.0, 150.0, 300.0) + assert struct.unpack("f" * 6, ds.ReadRaster()) == ( + 50.5, + 200.0, + 100.0, + 250.0, + 150.0, + 300.0, + ) ############################################################################### # Test case "non-exact" floating point step size (0.1), organized by rows, ascending X + def test_xyz_floating_point_step_organized_by_rows_int16(): content = """X Y Z @@ -330,17 +350,28 @@ def test_xyz_floating_point_step_organized_by_rows_int16(): """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): - ds = gdal.Open('/vsimem/grid.xyz') + with gdaltest.tempfile("/vsimem/grid.xyz", content): + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 3 assert ds.GetGeoTransform() == pytest.approx((1.05, 0.1, 0.0, 1.05, 0, 0.1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 - assert struct.unpack('h' * 9, ds.ReadRaster()) == (50, 100, 150, 200, 250, 300, 350, 400, 450) + assert struct.unpack("h" * 9, ds.ReadRaster()) == ( + 50, + 100, + 150, + 200, + 250, + 300, + 350, + 400, + 450, + ) ############################################################################### # Test case "non-exact" floating point step size (0.1), organized by columns, ascending Y + def test_xyz_floating_point_step_organized_by_columns_int16(): content = """X Y Z @@ -356,17 +387,28 @@ def test_xyz_floating_point_step_organized_by_columns_int16(): """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): - ds = gdal.Open('/vsimem/grid.xyz') + with gdaltest.tempfile("/vsimem/grid.xyz", content): + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 3 assert ds.GetGeoTransform() == pytest.approx((1.05, 0.1, 0.0, 1.35, 0, -0.1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 - assert struct.unpack('h' * 9, ds.ReadRaster()) == (150, 300, 450, 100, 250, 400, 50, 200, 350) + assert struct.unpack("h" * 9, ds.ReadRaster()) == ( + 150, + 300, + 450, + 100, + 250, + 400, + 50, + 200, + 350, + ) ############################################################################### # Test case "non-exact" floating point step size (0.1), organized by columns, descending Y + def test_xyz_floating_point_step_organized_by_columns_float32(): content = """X Y Z @@ -382,10 +424,19 @@ def test_xyz_floating_point_step_organized_by_columns_float32(): """ - with gdaltest.tempfile('/vsimem/grid.xyz', content): - ds = gdal.Open('/vsimem/grid.xyz') + with gdaltest.tempfile("/vsimem/grid.xyz", content): + ds = gdal.Open("/vsimem/grid.xyz") assert ds.RasterXSize == 3 and ds.RasterYSize == 3 assert ds.GetGeoTransform() == pytest.approx((1.05, 0.1, 0.0, 1.35, 0, -0.1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 - assert struct.unpack('f' * 9, ds.ReadRaster()) == (50.5, 200.0, 350.0, 100.0, 250.0, 400.0, 150.0, 300.0, 450.0) - + assert struct.unpack("f" * 9, ds.ReadRaster()) == ( + 50.5, + 200.0, + 350.0, + 100.0, + 250.0, + 400.0, + 150.0, + 300.0, + 450.0, + ) diff --git a/autotest/gdrivers/zarr_driver.py b/autotest/gdrivers/zarr_driver.py index 6b311b0d1682..f68ddbfa6e80 100644 --- a/autotest/gdrivers/zarr_driver.py +++ b/autotest/gdrivers/zarr_driver.py @@ -35,91 +35,106 @@ import struct import sys -from osgeo import gdal -from osgeo import osr - import gdaltest import pytest - -@pytest.mark.parametrize("dtype,structtype,gdaltype,fill_value,nodata_value", - [["!b1", 'B', gdal.GDT_Byte, None, None], - ["!i1", 'b', gdal.GDT_Int16, None, None], - ["!i1", 'b', gdal.GDT_Int16, -1, -1], - ["!u1", 'B', gdal.GDT_Byte, None, None], - ["!u1", 'B', gdal.GDT_Byte, "1", 1], # not really legit to have the fill_value as a str - ["i2", 'h', gdal.GDT_Int16, None, None], - ["i4", 'i', gdal.GDT_Int32, None, None], - ["i8", 'q', gdal.GDT_Int64, None, None], - ["u2", 'H', gdal.GDT_UInt16, None, None], - ["u4", 'I', gdal.GDT_UInt32, None, None], - ["u8", 'Q', gdal.GDT_UInt64, None, None], - ["f4", 'f', gdal.GDT_Float32, None, None], - ["f8", 'd', gdal.GDT_Float64, None, None], - ["c8", 'f', gdal.GDT_CFloat32, None, None], - ["c16", 'd', gdal.GDT_CFloat64, None, None]]) +from osgeo import gdal, osr + + +@pytest.mark.parametrize( + "dtype,structtype,gdaltype,fill_value,nodata_value", + [ + ["!b1", "B", gdal.GDT_Byte, None, None], + ["!i1", "b", gdal.GDT_Int16, None, None], + ["!i1", "b", gdal.GDT_Int16, -1, -1], + ["!u1", "B", gdal.GDT_Byte, None, None], + [ + "!u1", + "B", + gdal.GDT_Byte, + "1", + 1, + ], # not really legit to have the fill_value as a str + ["i2", "h", gdal.GDT_Int16, None, None], + ["i4", "i", gdal.GDT_Int32, None, None], + ["i8", "q", gdal.GDT_Int64, None, None], + ["u2", "H", gdal.GDT_UInt16, None, None], + ["u4", "I", gdal.GDT_UInt32, None, None], + ["u8", "Q", gdal.GDT_UInt64, None, None], + ["f4", "f", gdal.GDT_Float32, None, None], + ["f8", "d", gdal.GDT_Float64, None, None], + ["c8", "f", gdal.GDT_CFloat32, None, None], + ["c16", "d", gdal.GDT_CFloat64, None, None], + ], +) @pytest.mark.parametrize("use_optimized_code_paths", [True, False]) -def test_zarr_basic(dtype, structtype, gdaltype, fill_value, nodata_value, use_optimized_code_paths): +def test_zarr_basic( + dtype, structtype, gdaltype, fill_value, nodata_value, use_optimized_code_paths +): j = { - "chunks": [ - 2, - 3 - ], + "chunks": [2, 3], "compressor": None, "dtype": dtype, "fill_value": fill_value, "filters": None, "order": "C", - "shape": [ - 5, - 4 - ], - "zarr_format": 2 + "shape": [5, 4], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) if gdaltype not in (gdal.GDT_CFloat32, gdal.GDT_CFloat64): - tile_0_0_data = struct.pack( - dtype[0] + (structtype * 6), 1, 2, 3, 5, 6, 7) - tile_0_1_data = struct.pack( - dtype[0] + (structtype * 6), 4, 0, 0, 8, 0, 0) + tile_0_0_data = struct.pack(dtype[0] + (structtype * 6), 1, 2, 3, 5, 6, 7) + tile_0_1_data = struct.pack(dtype[0] + (structtype * 6), 4, 0, 0, 8, 0, 0) else: tile_0_0_data = struct.pack( - dtype[0] + (structtype * 12), 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0) + dtype[0] + (structtype * 12), 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0 + ) tile_0_1_data = struct.pack( - dtype[0] + (structtype * 12), 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/0.0', tile_0_0_data) - gdal.FileFromMemBuffer('/vsimem/test.zarr/0.1', tile_0_1_data) - with gdaltest.config_option('GDAL_ZARR_USE_OPTIMIZED_CODE_PATHS', - 'YES' if use_optimized_code_paths else 'NO'): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + dtype[0] + (structtype * 12), 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0 + ) + gdal.FileFromMemBuffer("/vsimem/test.zarr/0.0", tile_0_0_data) + gdal.FileFromMemBuffer("/vsimem/test.zarr/0.1", tile_0_1_data) + with gdaltest.config_option( + "GDAL_ZARR_USE_OPTIMIZED_CODE_PATHS", + "YES" if use_optimized_code_paths else "NO", + ): + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -135,119 +150,223 @@ def test_zarr_basic(dtype, structtype, gdaltype, fill_value, nodata_value, use_o assert ar.GetOffset() is None assert ar.GetScale() is None - assert ar.GetUnit() == '' + assert ar.GetUnit() == "" # Check reading one single value - assert ar[1, 2].Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 1, 7) + assert ar[1, 2].Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) == struct.pack("d" * 1, 7) - if structtype == 'b': - structtype_read = 'h' + if structtype == "b": + structtype_read = "h" else: structtype_read = structtype # Read block 0,0 if gdaltype not in (gdal.GDT_CFloat32, gdal.GDT_CFloat64): - assert ar[0:2, 0:3].Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 6, 1, 2, 3, 5, 6, 7) - assert struct.unpack( - structtype_read * 6, ar[0:2, 0:3].Read()) == (1, 2, 3, 5, 6, 7) + assert ar[0:2, 0:3].Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) == struct.pack("d" * 6, 1, 2, 3, 5, 6, 7) + assert struct.unpack(structtype_read * 6, ar[0:2, 0:3].Read()) == ( + 1, + 2, + 3, + 5, + 6, + 7, + ) else: - assert ar[0:2, 0:3].Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_CFloat64)) == \ - struct.pack('d' * 12, 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0) - assert struct.unpack( - structtype * 12, ar[0:2, 0:3].Read()) == (1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0) + assert ar[0:2, 0:3].Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_CFloat64) + ) == struct.pack("d" * 12, 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0) + assert struct.unpack(structtype * 12, ar[0:2, 0:3].Read()) == ( + 1, + 11, + 2, + 0, + 3, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + ) # Read block 0,1 - assert ar[0:2, 3:4].Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 2, 4, 8) + assert ar[0:2, 3:4].Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) == struct.pack("d" * 2, 4, 8) # Read block 1,1 (missing) nv = nodata_value if nodata_value else 0 - assert ar[2:4, 3:4].Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 2, nv, nv) + assert ar[2:4, 3:4].Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) == struct.pack("d" * 2, nv, nv) # Read whole raster - assert ar.Read(buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 20, - 1, 2, 3, 4, - 5, 6, 7, 8, - nv, nv, nv, nv, - nv, nv, nv, nv, - nv, nv, nv, nv) + assert ar.Read( + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) == struct.pack( + "d" * 20, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + ) if gdaltype not in (gdal.GDT_CFloat32, gdal.GDT_CFloat64): - assert ar.Read() == array.array(structtype_read, [1, 2, 3, 4, - 5, 6, 7, 8, - nv, nv, nv, nv, - nv, nv, nv, nv, - nv, nv, nv, nv]) + assert ar.Read() == array.array( + structtype_read, + [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + nv, + ], + ) else: - assert ar.Read() == array.array(structtype, [1, 11, 2, 0, 3, 0, 4, 0, - 5, 0, 6, 0, 7, 0, 8, 0, - nv, 0, nv, 0, nv, 0, nv, 0, - nv, 0, nv, 0, nv, 0, nv, 0, - nv, 0, nv, 0, nv, 0, nv, 0]) + assert ar.Read() == array.array( + structtype, + [ + 1, + 11, + 2, + 0, + 3, + 0, + 4, + 0, + 5, + 0, + 6, + 0, + 7, + 0, + 8, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + nv, + 0, + ], + ) # Read with negative steps - assert ar.Read(array_start_idx=[2, 1], - count=[2, 2], - array_step=[-1, -1], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 4, nv, nv, 6, 5) + assert ar.Read( + array_start_idx=[2, 1], + count=[2, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 4, nv, nv, 6, 5) # array_step > 2 - assert ar.Read(array_start_idx=[0, 0], - count=[1, 2], - array_step=[0, 2], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 2, 1, 3) - - assert ar.Read(array_start_idx=[0, 0], - count=[3, 1], - array_step=[2, 0], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 3, 1, nv, nv) - - assert ar.Read(array_start_idx=[0, 1], - count=[1, 2], - array_step=[0, 2], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 2, 2, 4) - - assert ar.Read(array_start_idx=[0, 0], - count=[1, 2], - array_step=[0, 3], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == \ - struct.pack('d' * 2, 1, 4) + assert ar.Read( + array_start_idx=[0, 0], + count=[1, 2], + array_step=[0, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 2, 1, 3) + + assert ar.Read( + array_start_idx=[0, 0], + count=[3, 1], + array_step=[2, 0], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 3, 1, nv, nv) + + assert ar.Read( + array_start_idx=[0, 1], + count=[1, 2], + array_step=[0, 2], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 2, 2, 4) + + assert ar.Read( + array_start_idx=[0, 0], + count=[1, 2], + array_step=[0, 3], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 2, 1, 4) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("fill_value,expected_read_data", [[base64.b64encode(b'xyz').decode('utf-8'), ['abc', 'xyz']], - [None, ['abc', None]]]) +@pytest.mark.parametrize( + "fill_value,expected_read_data", + [[base64.b64encode(b"xyz").decode("utf-8"), ["abc", "xyz"]], [None, ["abc", None]]], +) def test_zarr_string(fill_value, expected_read_data): j = { - "chunks": [ - 1 - ], + "chunks": [1], "compressor": None, - "dtype": '|S3', + "dtype": "|S3", "fill_value": fill_value, "filters": [], "order": "C", - "shape": [ - 2 - ], - "zarr_format": 2 + "shape": [2], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) - gdal.FileFromMemBuffer('/vsimem/test.zarr/0', b'abc') - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/0", b"abc") + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -256,132 +375,136 @@ def test_zarr_string(fill_value, expected_read_data): assert ar.Read() == expected_read_data finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") # Check that all required elements are present in .zarray -@pytest.mark.parametrize("member", - [None, 'zarr_format', 'chunks', 'compressor', 'dtype', - 'filters', 'order', 'shape', 'fill_value']) +@pytest.mark.parametrize( + "member", + [ + None, + "zarr_format", + "chunks", + "compressor", + "dtype", + "filters", + "order", + "shape", + "fill_value", + ], +) def test_zarr_invalid_json_remove_member(member): j = { - "chunks": [ - 2, - 3 - ], + "chunks": [2, 3], "compressor": None, - "dtype": '!b1', + "dtype": "!b1", "fill_value": None, "filters": None, "order": "C", - "shape": [ - 5, - 4 - ], - "zarr_format": 2 + "shape": [5, 4], + "zarr_format": 2, } if member: del j[member] try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) - if member == 'fill_value': + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) + if member == "fill_value": assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" elif member is None: assert ds else: assert ds is None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") # Check bad values of members in .zarray -@pytest.mark.parametrize("dict_update", [{"chunks": None}, - {"chunks": "invalid"}, - {"chunks": [2]}, - {"chunks": [2, 0]}, - {"shape": None}, - {"shape": "invalid"}, - {"shape": [5]}, - {"shape": [5, 0]}, - {"chunks": [1 << 40, 1 << 40], - "shape": [1 << 40, 1 << 40]}, - {"shape": [1 << 30, 1 << 30, 1 << 30], - "chunks": [1, 1, 1]}, - {"dtype": None}, - {"dtype": 1}, - {"dtype": ""}, - {"dtype": "!"}, - {"dtype": "!b"}, - {"dtype": " 6 or osr.GetPROJVersionMinor() >= 2) and crs_member == 'projjson': + if ( + not (osr.GetPROJVersionMajor() > 6 or osr.GetPROJVersionMinor() >= 2) + and crs_member == "projjson" + ): assert srs is None else: assert srs is not None - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" assert len(ar.GetAttributes()) == 0 finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") @pytest.mark.parametrize("use_get_names", [True, False]) def test_zarr_read_group(use_get_names): - filename = 'data/zarr/group.zarr' + filename = "data/zarr/group.zarr" ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - assert rg.GetName() == '/' - assert rg.GetFullName() == '/' + assert rg.GetName() == "/" + assert rg.GetFullName() == "/" if use_get_names: - assert rg.GetGroupNames() == ['foo'] + assert rg.GetGroupNames() == ["foo"] assert len(rg.GetAttributes()) == 1 - assert rg.GetAttribute('key') is not None - subgroup = rg.OpenGroup('foo') + assert rg.GetAttribute("key") is not None + subgroup = rg.OpenGroup("foo") assert subgroup is not None - assert rg.OpenGroup('not_existing') is None - assert subgroup.GetName() == 'foo' - assert subgroup.GetFullName() == '/foo' + assert rg.OpenGroup("not_existing") is None + assert subgroup.GetName() == "foo" + assert subgroup.GetFullName() == "/foo" assert rg.GetMDArrayNames() is None if use_get_names: - assert subgroup.GetGroupNames() == ['bar'] + assert subgroup.GetGroupNames() == ["bar"] assert subgroup.GetAttributes() == [] - subsubgroup = subgroup.OpenGroup('bar') - assert subsubgroup.GetName() == 'bar' - assert subsubgroup.GetFullName() == '/foo/bar' + subsubgroup = subgroup.OpenGroup("bar") + assert subsubgroup.GetName() == "bar" + assert subsubgroup.GetFullName() == "/foo/bar" if use_get_names: - assert subsubgroup.GetMDArrayNames() == ['baz'] - ar = subsubgroup.OpenMDArray('baz') + assert subsubgroup.GetMDArrayNames() == ["baz"] + ar = subsubgroup.OpenMDArray("baz") assert ar is not None - assert ar.Read() == array.array('i', [1]) - assert subsubgroup.OpenMDArray('not_existing') is None + assert ar.Read() == array.array("i", [1]) + assert subsubgroup.OpenMDArray("not_existing") is None def test_zarr_read_group_with_zmetadata(): - filename = 'data/zarr/group_with_zmetadata.zarr' + filename = "data/zarr/group_with_zmetadata.zarr" ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - assert rg.GetName() == '/' - assert rg.GetFullName() == '/' - assert rg.GetGroupNames() == ['foo'] + assert rg.GetName() == "/" + assert rg.GetFullName() == "/" + assert rg.GetGroupNames() == ["foo"] assert len(rg.GetAttributes()) == 1 - assert rg.GetAttribute('key') is not None - subgroup = rg.OpenGroup('foo') + assert rg.GetAttribute("key") is not None + subgroup = rg.OpenGroup("foo") assert subgroup is not None - assert rg.OpenGroup('not_existing') is None - assert subgroup.GetName() == 'foo' - assert subgroup.GetFullName() == '/foo' + assert rg.OpenGroup("not_existing") is None + assert subgroup.GetName() == "foo" + assert subgroup.GetFullName() == "/foo" assert rg.GetMDArrayNames() is None - assert subgroup.GetGroupNames() == ['bar'] + assert subgroup.GetGroupNames() == ["bar"] assert subgroup.GetAttributes() == [] - subsubgroup = subgroup.OpenGroup('bar') - assert subsubgroup.GetName() == 'bar' - assert subsubgroup.GetFullName() == '/foo/bar' - assert subsubgroup.GetMDArrayNames() == ['baz'] - assert subsubgroup.GetAttribute('foo') is not None - ar = subsubgroup.OpenMDArray('baz') + subsubgroup = subgroup.OpenGroup("bar") + assert subsubgroup.GetName() == "bar" + assert subsubgroup.GetFullName() == "/foo/bar" + assert subsubgroup.GetMDArrayNames() == ["baz"] + assert subsubgroup.GetAttribute("foo") is not None + ar = subsubgroup.OpenMDArray("baz") assert ar is not None - assert ar.Read() == array.array('i', [1]) - assert ar.GetAttribute('bar') is not None - assert subsubgroup.OpenMDArray('not_existing') is None - - -@pytest.mark.parametrize("use_zmetadata, filename", - [(True, 'data/zarr/array_dimensions.zarr'), - (False, 'data/zarr/array_dimensions.zarr'), - (True, 'data/zarr/array_dimensions_upper_level.zarr'), - (False, 'data/zarr/array_dimensions_upper_level.zarr'), - (False, 'data/zarr/array_dimensions_upper_level.zarr/subgroup/var')]) + assert ar.Read() == array.array("i", [1]) + assert ar.GetAttribute("bar") is not None + assert subsubgroup.OpenMDArray("not_existing") is None + + +@pytest.mark.parametrize( + "use_zmetadata, filename", + [ + (True, "data/zarr/array_dimensions.zarr"), + (False, "data/zarr/array_dimensions.zarr"), + (True, "data/zarr/array_dimensions_upper_level.zarr"), + (False, "data/zarr/array_dimensions_upper_level.zarr"), + (False, "data/zarr/array_dimensions_upper_level.zarr/subgroup/var"), + ], +) def test_zarr_read_ARRAY_DIMENSIONS(use_zmetadata, filename): - ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER, open_options=[ - 'USE_ZMETADATA=' + str(use_zmetadata)]) + ds = gdal.OpenEx( + filename, + gdal.OF_MULTIDIM_RASTER, + open_options=["USE_ZMETADATA=" + str(use_zmetadata)], + ) assert ds is not None rg = ds.GetRootGroup() - if filename != 'data/zarr/array_dimensions_upper_level.zarr': - ar = rg.OpenMDArray('var') + if filename != "data/zarr/array_dimensions_upper_level.zarr": + ar = rg.OpenMDArray("var") else: - ar = rg.OpenGroup('subgroup').OpenMDArray('var') + ar = rg.OpenGroup("subgroup").OpenMDArray("var") assert ar dims = ar.GetDimensions() assert len(dims) == 2 - assert dims[0].GetName() == 'lat' + assert dims[0].GetName() == "lat" assert dims[0].GetIndexingVariable() is not None - assert dims[0].GetIndexingVariable().GetName() == 'lat' + assert dims[0].GetIndexingVariable().GetName() == "lat" assert dims[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y - assert dims[0].GetDirection() == 'NORTH' - assert dims[1].GetName() == 'lon' + assert dims[0].GetDirection() == "NORTH" + assert dims[1].GetName() == "lon" assert dims[1].GetIndexingVariable() is not None - assert dims[1].GetIndexingVariable().GetName() == 'lon' + assert dims[1].GetIndexingVariable().GetName() == "lon" assert dims[1].GetType() == gdal.DIM_TYPE_HORIZONTAL_X - assert dims[1].GetDirection() == 'EAST' + assert dims[1].GetDirection() == "EAST" assert len(rg.GetDimensions()) == 2 - ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER, open_options=[ - 'USE_ZMETADATA=' + str(use_zmetadata)]) + ds = gdal.OpenEx( + filename, + gdal.OF_MULTIDIM_RASTER, + open_options=["USE_ZMETADATA=" + str(use_zmetadata)], + ) assert ds is not None rg = ds.GetRootGroup() - ar = rg.OpenMDArray('lat') + ar = rg.OpenMDArray("lat") assert ar dims = ar.GetDimensions() assert len(dims) == 1 - assert dims[0].GetName() == 'lat' + assert dims[0].GetName() == "lat" assert dims[0].GetIndexingVariable() is not None - assert dims[0].GetIndexingVariable().GetName() == 'lat' + assert dims[0].GetIndexingVariable().GetName() == "lat" assert dims[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y assert len(rg.GetDimensions()) == 2 - ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER, open_options=[ - 'USE_ZMETADATA=' + str(use_zmetadata)]) + ds = gdal.OpenEx( + filename, + gdal.OF_MULTIDIM_RASTER, + open_options=["USE_ZMETADATA=" + str(use_zmetadata)], + ) assert ds is not None rg = ds.GetRootGroup() assert len(rg.GetDimensions()) == 2 @@ -827,70 +959,70 @@ def test_zarr_read_ARRAY_DIMENSIONS(use_zmetadata, filename): @pytest.mark.parametrize("use_get_names", [True, False]) def test_zarr_read_v3(use_get_names): - filename = 'data/zarr/v3/test.zr3' + filename = "data/zarr/v3/test.zr3" ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - assert rg.GetName() == '/' - assert rg.GetFullName() == '/' + assert rg.GetName() == "/" + assert rg.GetFullName() == "/" if use_get_names: - assert rg.GetGroupNames() == ['marvin'] + assert rg.GetGroupNames() == ["marvin"] assert len(rg.GetAttributes()) == 1 - assert rg.GetAttribute('root_foo') is not None - subgroup = rg.OpenGroup('marvin') + assert rg.GetAttribute("root_foo") is not None + subgroup = rg.OpenGroup("marvin") assert subgroup is not None - assert rg.OpenGroup('not_existing') is None - assert subgroup.GetName() == 'marvin' - assert subgroup.GetFullName() == '/marvin' + assert rg.OpenGroup("not_existing") is None + assert subgroup.GetName() == "marvin" + assert subgroup.GetFullName() == "/marvin" if use_get_names: - assert rg.GetMDArrayNames() == ['/', 'ar'] + assert rg.GetMDArrayNames() == ["/", "ar"] - ar = rg.OpenMDArray('/') + ar = rg.OpenMDArray("/") assert ar - assert ar.Read() == array.array('i', [2] + ([1] * (5 * 10 - 1))) + assert ar.Read() == array.array("i", [2] + ([1] * (5 * 10 - 1))) - ar = rg.OpenMDArray('ar') + ar = rg.OpenMDArray("ar") assert ar - assert ar.Read() == array.array('b', [1, 2]) + assert ar.Read() == array.array("b", [1, 2]) if use_get_names: - assert subgroup.GetGroupNames() == ['paranoid'] + assert subgroup.GetGroupNames() == ["paranoid"] assert len(subgroup.GetAttributes()) == 1 - subsubgroup = subgroup.OpenGroup('paranoid') - assert subsubgroup.GetName() == 'paranoid' - assert subsubgroup.GetFullName() == '/marvin/paranoid' + subsubgroup = subgroup.OpenGroup("paranoid") + assert subsubgroup.GetName() == "paranoid" + assert subsubgroup.GetFullName() == "/marvin/paranoid" if use_get_names: - assert subgroup.GetMDArrayNames() == ['android'] - ar = subgroup.OpenMDArray('android') + assert subgroup.GetMDArrayNames() == ["android"] + ar = subgroup.OpenMDArray("android") assert ar is not None - assert ar.Read() == array.array('b', [1] * 4 * 5) - assert subgroup.OpenMDArray('not_existing') is None + assert ar.Read() == array.array("b", [1] * 4 * 5) + assert subgroup.OpenMDArray("not_existing") is None -@pytest.mark.parametrize("endianness", ['le', 'be']) +@pytest.mark.parametrize("endianness", ["le", "be"]) def test_zarr_read_half_float(endianness): - filename = 'data/zarr/f2_' + endianness + '.zarr' + filename = "data/zarr/f2_" + endianness + ".zarr" ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - assert ar.Read() == array.array('f', [1.5, float('nan')]) + assert ar.Read() == array.array("f", [1.5, float("nan")]) def test_zarr_read_classic(): - ds = gdal.Open('data/zarr/zlib.zarr') + ds = gdal.Open("data/zarr/zlib.zarr") assert ds assert not ds.GetSubDatasets() - assert ds.ReadRaster() == array.array('b', [1, 2]) + assert ds.ReadRaster() == array.array("b", [1, 2]) - ds = gdal.Open('ZARR:data/zarr/zlib.zarr') + ds = gdal.Open("ZARR:data/zarr/zlib.zarr") assert ds assert not ds.GetSubDatasets() - assert ds.ReadRaster() == array.array('b', [1, 2]) + assert ds.ReadRaster() == array.array("b", [1, 2]) with gdaltest.error_handler(): assert gdal.Open('ZARR:"data/zarr/not_existing.zarr"') is None @@ -900,63 +1032,69 @@ def test_zarr_read_classic(): ds = gdal.Open('ZARR:"data/zarr/zlib.zarr":/zlib') assert ds assert not ds.GetSubDatasets() - assert ds.ReadRaster() == array.array('b', [1, 2]) + assert ds.ReadRaster() == array.array("b", [1, 2]) - ds = gdal.Open('data/zarr/order_f_u1_3d.zarr') + ds = gdal.Open("data/zarr/order_f_u1_3d.zarr") assert ds subds = ds.GetSubDatasets() assert len(subds) == 2 ds = gdal.Open(subds[0][0]) assert ds - assert ds.ReadRaster() == array.array('b', [i for i in range(12)]) + assert ds.ReadRaster() == array.array("b", [i for i in range(12)]) ds = gdal.Open(subds[1][0]) assert ds - assert ds.ReadRaster() == array.array('b', [12 + i for i in range(12)]) + assert ds.ReadRaster() == array.array("b", [12 + i for i in range(12)]) with gdaltest.error_handler(): - assert gdal.Open( - 'ZARR:data/zarr/order_f_u1_3d.zarr:/order_f_u1_3d') is None - assert gdal.Open( - 'ZARR:data/zarr/order_f_u1_3d.zarr:/order_f_u1_3d:2') is None - assert gdal.Open(subds[0][0] + ':0') is None + assert gdal.Open("ZARR:data/zarr/order_f_u1_3d.zarr:/order_f_u1_3d") is None + assert gdal.Open("ZARR:data/zarr/order_f_u1_3d.zarr:/order_f_u1_3d:2") is None + assert gdal.Open(subds[0][0] + ":0") is None - ds = gdal.Open('data/zarr/v3/test.zr3') + ds = gdal.Open("data/zarr/v3/test.zr3") assert ds subds = ds.GetSubDatasets() - assert set(subds) == set([('ZARR:"data/zarr/v3/test.zr3":/', 'Array /'), - ('ZARR:"data/zarr/v3/test.zr3":/ar', 'Array /ar'), - ('ZARR:"data/zarr/v3/test.zr3":/marvin/android', 'Array /marvin/android')]) + assert set(subds) == set( + [ + ('ZARR:"data/zarr/v3/test.zr3":/', "Array /"), + ('ZARR:"data/zarr/v3/test.zr3":/ar', "Array /ar"), + ('ZARR:"data/zarr/v3/test.zr3":/marvin/android', "Array /marvin/android"), + ] + ) ds = gdal.Open('ZARR:"data/zarr/v3/test.zr3":/') assert ds - assert ds.ReadRaster() == array.array('i', [2] + ([1] * (10 * 5 - 1))) + assert ds.ReadRaster() == array.array("i", [2] + ([1] * (10 * 5 - 1))) ds = gdal.Open('ZARR:"data/zarr/v3/test.zr3":/ar') assert ds - assert ds.ReadRaster() == array.array('b', [1, 2]) + assert ds.ReadRaster() == array.array("b", [1, 2]) def test_zarr_read_classic_2d(): try: - src_ds = gdal.Open('data/byte.tif') - gdal.GetDriverByName('ZARR').CreateCopy('/vsimem/test.zarr', src_ds, strict = False) - ds = gdal.Open('/vsimem/test.zarr') + src_ds = gdal.Open("data/byte.tif") + gdal.GetDriverByName("ZARR").CreateCopy( + "/vsimem/test.zarr", src_ds, strict=False + ) + ds = gdal.Open("/vsimem/test.zarr") assert ds is not None assert len(ds.GetSubDatasets()) == 0 ds = None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_classic_2d_with_unrelated_auxiliary_1D_arrays(): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' + assert rg.GetName() == "/" dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) @@ -967,224 +1105,226 @@ def create(): rg.CreateMDArray("y", [dim1], dt) create() - ds = gdal.Open('/vsimem/test.zarr') + ds = gdal.Open("/vsimem/test.zarr") assert ds is not None assert ds.RasterYSize == 2 assert ds.RasterXSize == 3 - assert set(ds.GetSubDatasets()) == set([('ZARR:"/vsimem/test.zarr":/main_array', 'Array /main_array'), - ('ZARR:"/vsimem/test.zarr":/x', 'Array /x'), - ('ZARR:"/vsimem/test.zarr":/y', 'Array /y')]) + assert set(ds.GetSubDatasets()) == set( + [ + ('ZARR:"/vsimem/test.zarr":/main_array', "Array /main_array"), + ('ZARR:"/vsimem/test.zarr":/x', "Array /x"), + ('ZARR:"/vsimem/test.zarr":/y', "Array /y"), + ] + ) ds = None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_classic_too_many_samples_3d(): j = { - "chunks": [ - 65536, 2, 1 - ], + "chunks": [65536, 2, 1], "compressor": None, - "dtype": '!u1', + "dtype": "!u1", "fill_value": None, "filters": None, "order": "C", - "shape": [ - 65536, 2, 1 - ], - "zarr_format": 2 + "shape": [65536, 2, 1], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.zarr') - assert gdal.GetLastErrorMsg() != '' + ds = gdal.Open("/vsimem/test.zarr") + assert gdal.GetLastErrorMsg() != "" assert len(ds.GetSubDatasets()) == 0 finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_classic_4d(): j = { - "chunks": [ - 3, 2, 1, 1 - ], + "chunks": [3, 2, 1, 1], "compressor": None, - "dtype": '!u1', + "dtype": "!u1", "fill_value": None, "filters": None, "order": "C", - "shape": [ - 3, 2, 1, 1 - ], - "zarr_format": 2 + "shape": [3, 2, 1, 1], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) - ds = gdal.Open('/vsimem/test.zarr') + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) + ds = gdal.Open("/vsimem/test.zarr") subds = ds.GetSubDatasets() assert len(subds) == 6 for i in range(len(subds)): assert gdal.Open(subds[i][0]) is not None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_classic_too_many_samples_4d(): j = { - "chunks": [ - 256, 256, 1, 1 - ], + "chunks": [256, 256, 1, 1], "compressor": None, - "dtype": '!u1', + "dtype": "!u1", "fill_value": None, "filters": None, "order": "C", - "shape": [ - 256, 256, 1, 1 - ], - "zarr_format": 2 + "shape": [256, 256, 1, 1], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdal.Open('/vsimem/test.zarr') - assert gdal.GetLastErrorMsg() != '' + ds = gdal.Open("/vsimem/test.zarr") + assert gdal.GetLastErrorMsg() != "" assert len(ds.GetSubDatasets()) == 0 finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_empty_shape(): - ds = gdal.OpenEx('data/zarr/empty.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("data/zarr/empty.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar - assert ar.Read() == array.array('b', [120]) + assert ar.Read() == array.array("b", [120]) def test_zarr_read_BLOSC_COMPRESSORS(): - if 'blosc' not in gdal.GetDriverByName('Zarr').GetMetadataItem('COMPRESSORS'): - pytest.skip('blosc not available') - assert 'lz4' in gdal.GetDriverByName( - 'Zarr').GetMetadataItem('BLOSC_COMPRESSORS') + if "blosc" not in gdal.GetDriverByName("Zarr").GetMetadataItem("COMPRESSORS"): + pytest.skip("blosc not available") + assert "lz4" in gdal.GetDriverByName("Zarr").GetMetadataItem("BLOSC_COMPRESSORS") -@pytest.mark.parametrize("format,create_z_metadata", [('ZARR_V2', 'YES'), - ('ZARR_V2', 'NO'), - ('ZARR_V3', 'NO')]) -def test_zarr_create_group(format,create_z_metadata): +@pytest.mark.parametrize( + "format,create_z_metadata", + [("ZARR_V2", "YES"), ("ZARR_V2", "NO"), ("ZARR_V3", "NO")], +) +def test_zarr_create_group(format, create_z_metadata): - filename = 'tmp/test.zarr' + filename = "tmp/test.zarr" try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional(filename, options=['FORMAT='+format, 'CREATE_ZMETADATA='+create_z_metadata]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + filename, + options=["FORMAT=" + format, "CREATE_ZMETADATA=" + create_z_metadata], + ) assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' + assert rg.GetName() == "/" attr = rg.CreateAttribute( - 'str_attr', [], gdal.ExtendedDataType.CreateString()) + "str_attr", [], gdal.ExtendedDataType.CreateString() + ) assert attr - assert attr.Write('my_string') == gdal.CE_None + assert attr.Write("my_string") == gdal.CE_None attr = rg.CreateAttribute( - 'json_attr', [], gdal.ExtendedDataType.CreateString(0, gdal.GEDTST_JSON)) + "json_attr", [], gdal.ExtendedDataType.CreateString(0, gdal.GEDTST_JSON) + ) assert attr - assert attr.Write({"foo":"bar"}) == gdal.CE_None + assert attr.Write({"foo": "bar"}) == gdal.CE_None attr = rg.CreateAttribute( - 'str_array_attr', [2], gdal.ExtendedDataType.CreateString()) + "str_array_attr", [2], gdal.ExtendedDataType.CreateString() + ) assert attr - assert attr.Write( - ['first_string', 'second_string']) == gdal.CE_None + assert attr.Write(["first_string", "second_string"]) == gdal.CE_None with gdaltest.error_handler(): - attr = rg.CreateAttribute('dim_2_not_supported', [ - 2, 2], gdal.ExtendedDataType.CreateString()) + attr = rg.CreateAttribute( + "dim_2_not_supported", [2, 2], gdal.ExtendedDataType.CreateString() + ) assert attr is None attr = rg.CreateAttribute( - 'int_attr', [], gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + "int_attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) assert attr assert attr.Write(12345678) == gdal.CE_None attr = rg.CreateAttribute( - 'uint_attr', [], gdal.ExtendedDataType.Create(gdal.GDT_UInt32)) + "uint_attr", [], gdal.ExtendedDataType.Create(gdal.GDT_UInt32) + ) assert attr assert attr.Write(4000000000) == gdal.CE_None attr = rg.CreateAttribute( - 'int_array_attr', [2], gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + "int_array_attr", [2], gdal.ExtendedDataType.Create(gdal.GDT_Int32) + ) assert attr assert attr.Write([12345678, -12345678]) == gdal.CE_None attr = rg.CreateAttribute( - 'double_attr', [], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + "double_attr", [], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert attr assert attr.Write(12345678.5) == gdal.CE_None - attr = rg.CreateAttribute('double_array_attr', [ - 2], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) + attr = rg.CreateAttribute( + "double_array_attr", [2], gdal.ExtendedDataType.Create(gdal.GDT_Float64) + ) assert attr assert attr.Write([12345678.5, -12345678.5]) == gdal.CE_None - subgroup = rg.CreateGroup('foo') + subgroup = rg.CreateGroup("foo") assert subgroup - assert subgroup.GetName() == 'foo' - assert subgroup.GetFullName() == '/foo' - assert rg.GetGroupNames() == ['foo'] - subgroup = rg.OpenGroup('foo') + assert subgroup.GetName() == "foo" + assert subgroup.GetFullName() == "/foo" + assert rg.GetGroupNames() == ["foo"] + subgroup = rg.OpenGroup("foo") assert subgroup create() - if create_z_metadata == 'YES': - f = gdal.VSIFOpenL(filename + '/.zmetadata', 'rb') + if create_z_metadata == "YES": + f = gdal.VSIFOpenL(filename + "/.zmetadata", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert 'foo/.zgroup' in j['metadata'] + assert "foo/.zgroup" in j["metadata"] def update(): - ds = gdal.OpenEx(filename, - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg - assert rg.GetGroupNames() == ['foo'] + assert rg.GetGroupNames() == ["foo"] - attr = rg.GetAttribute('str_attr') + attr = rg.GetAttribute("str_attr") assert attr - assert attr.Read() == 'my_string' - assert attr.Write('my_string_modified') == gdal.CE_None + assert attr.Read() == "my_string" + assert attr.Write("my_string_modified") == gdal.CE_None - subgroup = rg.OpenGroup('foo') + subgroup = rg.OpenGroup("foo") assert subgroup - subgroup = rg.CreateGroup('bar') + subgroup = rg.CreateGroup("bar") assert subgroup - assert set(rg.GetGroupNames()) == set(['foo', 'bar']) - subgroup = rg.OpenGroup('foo') + assert set(rg.GetGroupNames()) == set(["foo", "bar"]) + subgroup = rg.OpenGroup("foo") assert subgroup - subsubgroup = subgroup.CreateGroup('baz') + subsubgroup = subgroup.CreateGroup("baz") assert subsubgroup ds = None @@ -1195,52 +1335,58 @@ def update(): rg = ds.GetRootGroup() assert rg - attr = rg.GetAttribute('str_attr') + attr = rg.GetAttribute("str_attr") assert attr - assert attr.Read() == 'my_string_modified' + assert attr.Read() == "my_string_modified" - attr = rg.GetAttribute('json_attr') + attr = rg.GetAttribute("json_attr") assert attr assert attr.GetDataType().GetSubType() == gdal.GEDTST_JSON - assert attr.Read() == { "foo": "bar" } + assert attr.Read() == {"foo": "bar"} - attr = rg.GetAttribute('str_array_attr') + attr = rg.GetAttribute("str_array_attr") assert attr - assert attr.Read() == ['first_string', 'second_string'] + assert attr.Read() == ["first_string", "second_string"] - attr = rg.GetAttribute('int_attr') + attr = rg.GetAttribute("int_attr") assert attr assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Int32 assert attr.ReadAsDouble() == 12345678 - attr = rg.GetAttribute('uint_attr') + attr = rg.GetAttribute("uint_attr") assert attr assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert attr.ReadAsDouble() == 4000000000 - attr = rg.GetAttribute('int_array_attr') + attr = rg.GetAttribute("int_array_attr") assert attr assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Int32 assert attr.ReadAsIntArray() == (12345678, -12345678) - attr = rg.GetAttribute('double_attr') + attr = rg.GetAttribute("double_attr") assert attr assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert attr.ReadAsDouble() == 12345678.5 - attr = rg.GetAttribute('double_array_attr') + attr = rg.GetAttribute("double_array_attr") assert attr assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert attr.Read() == (12345678.5, -12345678.5) - assert set(rg.GetGroupNames()) == set(['foo', 'bar']) + assert set(rg.GetGroupNames()) == set(["foo", "bar"]) with gdaltest.error_handler(): - assert rg.CreateGroup('not_opened_in_update_mode') is None - assert rg.CreateAttribute( - 'not_opened_in_update_mode', [], gdal.ExtendedDataType.CreateString()) is None - subgroup = rg.OpenGroup('foo') + assert rg.CreateGroup("not_opened_in_update_mode") is None + assert ( + rg.CreateAttribute( + "not_opened_in_update_mode", + [], + gdal.ExtendedDataType.CreateString(), + ) + is None + ) + subgroup = rg.OpenGroup("foo") assert subgroup - subsubgroup = subgroup.OpenGroup('baz') + subsubgroup = subgroup.OpenGroup("baz") assert subsubgroup ds = None @@ -1248,108 +1394,103 @@ def update(): gdal.RmdirRecursive(filename) -@pytest.mark.parametrize("group_name", ["foo", # already existing - "directory_with_that_name", - "", - ".", - "..", - "a/b", - "a\\n", - "a:b", - ".zarray", - ]) -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize( + "group_name", + [ + "foo", # already existing + "directory_with_that_name", + "", + ".", + "..", + "a/b", + "a\\n", + "a:b", + ".zarray", + ], +) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create_group_errors(group_name, format): try: - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg - subgroup = rg.CreateGroup('foo') + subgroup = rg.CreateGroup("foo") assert subgroup - if format == 'ZARR_V2': - gdal.Mkdir('/vsimem/test.zarr/directory_with_that_name', 0) + if format == "ZARR_V2": + gdal.Mkdir("/vsimem/test.zarr/directory_with_that_name", 0) else: - gdal.Mkdir( - '/vsimem/test.zarr/meta/root/directory_with_that_name', 0) + gdal.Mkdir("/vsimem/test.zarr/meta/root/directory_with_that_name", 0) with gdaltest.error_handler(): assert rg.CreateGroup(group_name) is None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def getCompoundDT(): - x = gdal.EDTComponent.Create( - 'x', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) - y = gdal.EDTComponent.Create( - 'y', 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) + x = gdal.EDTComponent.Create("x", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int16)) + y = gdal.EDTComponent.Create("y", 0, gdal.ExtendedDataType.Create(gdal.GDT_Int32)) subcompound = gdal.ExtendedDataType.CreateCompound("", 4, [y]) - subcompound_component = gdal.EDTComponent.Create( - 'y', 4, subcompound) + subcompound_component = gdal.EDTComponent.Create("y", 4, subcompound) return gdal.ExtendedDataType.CreateCompound("", 8, [x, subcompound_component]) -@pytest.mark.parametrize("datatype,nodata", [ - [gdal.ExtendedDataType.Create(gdal.GDT_Byte), None], - [gdal.ExtendedDataType.Create(gdal.GDT_Byte), 1], - [gdal.ExtendedDataType.Create( - gdal.GDT_UInt16), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_Int16), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_UInt32), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_Int32), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float32), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float64), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float64), 1.5], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float64), float('nan')], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float64), float('infinity')], - [gdal.ExtendedDataType.Create( - gdal.GDT_Float64), float('-infinity')], - [gdal.ExtendedDataType.Create( - gdal.GDT_CInt16), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_CInt32), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_CFloat32), None], - [gdal.ExtendedDataType.Create( - gdal.GDT_CFloat64), None], - [gdal.ExtendedDataType.CreateString(10), None], - [gdal.ExtendedDataType.CreateString(10), "ab"], - [getCompoundDT(), None], - [getCompoundDT(), bytes(array.array('h', [12])) + - bytes(array.array('h', [0])) + # padding - bytes(array.array('i', [2345678]))], -]) -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize( + "datatype,nodata", + [ + [gdal.ExtendedDataType.Create(gdal.GDT_Byte), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Byte), 1], + [gdal.ExtendedDataType.Create(gdal.GDT_UInt16), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Int16), None], + [gdal.ExtendedDataType.Create(gdal.GDT_UInt32), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Int32), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Float32), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Float64), None], + [gdal.ExtendedDataType.Create(gdal.GDT_Float64), 1.5], + [gdal.ExtendedDataType.Create(gdal.GDT_Float64), float("nan")], + [gdal.ExtendedDataType.Create(gdal.GDT_Float64), float("infinity")], + [gdal.ExtendedDataType.Create(gdal.GDT_Float64), float("-infinity")], + [gdal.ExtendedDataType.Create(gdal.GDT_CInt16), None], + [gdal.ExtendedDataType.Create(gdal.GDT_CInt32), None], + [gdal.ExtendedDataType.Create(gdal.GDT_CFloat32), None], + [gdal.ExtendedDataType.Create(gdal.GDT_CFloat64), None], + [gdal.ExtendedDataType.CreateString(10), None], + [gdal.ExtendedDataType.CreateString(10), "ab"], + [getCompoundDT(), None], + [ + getCompoundDT(), + bytes(array.array("h", [12])) + + bytes(array.array("h", [0])) + + bytes(array.array("i", [2345678])), # padding + ], + ], +) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create_array(datatype, nodata, format): error_expected = False - if format == 'ZARR_V3': - if datatype.GetClass() != gdal.GEDTC_NUMERIC or \ - gdal.DataTypeIsComplex(datatype.GetNumericDataType()): + if format == "ZARR_V3": + if datatype.GetClass() != gdal.GEDTC_NUMERIC or gdal.DataTypeIsComplex( + datatype.GetNumericDataType() + ): error_expected = True elif datatype.GetNumericDataType() in (gdal.GDT_CInt16, gdal.GDT_CInt32): error_expected = True try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', - options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.GetName() == '/' + assert rg.GetName() == "/" dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 3) @@ -1372,11 +1513,11 @@ def create(): return True if create(): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - ar = rg.OpenMDArray('my_ar') + ar = rg.OpenMDArray("my_ar") assert ar got_dt = ar.GetDataType() if got_dt.GetClass() == gdal.GEDTC_COMPOUND: @@ -1384,16 +1525,20 @@ def create(): assert len(comps) == 2 assert comps[1].GetType().GetClass() == gdal.GEDTC_COMPOUND comps[1] = gdal.EDTComponent.Create( - comps[1].GetName(), comps[1].GetType().GetSize(), + comps[1].GetName(), + comps[1].GetType().GetSize(), gdal.ExtendedDataType.CreateCompound( - "", comps[1].GetType().GetSize(), - comps[1].GetType().GetComponents())) + "", + comps[1].GetType().GetSize(), + comps[1].GetType().GetComponents(), + ), + ) got_dt = gdal.ExtendedDataType.CreateCompound( - "", got_dt.GetSize(), comps) + "", got_dt.GetSize(), comps + ) assert got_dt == datatype assert len(ar.GetDimensions()) == 2 - assert [ar.GetDimensions()[i].GetSize() - for i in range(2)] == [2, 3] + assert [ar.GetDimensions()[i].GetSize() for i in range(2)] == [2, 3] if nodata: if datatype.GetClass() == gdal.GEDTC_STRING: got_nodata = ar.GetNoDataValueAsString() @@ -1411,206 +1556,265 @@ def create(): assert ar.GetNoDataValueAsRaw() is None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') - - -@pytest.mark.parametrize("array_name", ["foo", # already existing - "directory_with_that_name", - "", - ".", - "..", - "a/b", - "a\\n", - "a:b", - ".zarray", - ]) + gdal.RmdirRecursive("/vsimem/test.zarr") + + +@pytest.mark.parametrize( + "array_name", + [ + "foo", # already existing + "directory_with_that_name", + "", + ".", + "..", + "a/b", + "a\\n", + "a:b", + ".zarray", + ], +) def test_zarr_create_array_errors(array_name): try: - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional("/vsimem/test.zarr") assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.CreateMDArray( - 'foo', [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) is not None - gdal.Mkdir('/vsimem/test.zarr/directory_with_that_name', 0) + assert ( + rg.CreateMDArray("foo", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + is not None + ) + gdal.Mkdir("/vsimem/test.zarr/directory_with_that_name", 0) with gdaltest.error_handler(): - assert rg.CreateMDArray( - array_name, [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) is None + assert ( + rg.CreateMDArray( + array_name, [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) + is None + ) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') - - -@pytest.mark.parametrize("compressor,options,expected_json", [ - ["NONE", [], None], - ["zlib", [], {'id': 'zlib', 'level': 6}], - ["zlib", ["ZLIB_LEVEL=1"], {'id': 'zlib', 'level': 1}], - ["blosc", [], {'blocksize': 0, - 'clevel': 5, - 'cname': 'lz4', - 'id': 'blosc', - 'shuffle': 1}]]) + gdal.RmdirRecursive("/vsimem/test.zarr") + + +@pytest.mark.parametrize( + "compressor,options,expected_json", + [ + ["NONE", [], None], + ["zlib", [], {"id": "zlib", "level": 6}], + ["zlib", ["ZLIB_LEVEL=1"], {"id": "zlib", "level": 1}], + [ + "blosc", + [], + {"blocksize": 0, "clevel": 5, "cname": "lz4", "id": "blosc", "shuffle": 1}, + ], + ], +) def test_zarr_create_array_compressor(compressor, options, expected_json): - compressors = gdal.GetDriverByName('Zarr').GetMetadataItem('COMPRESSORS') - if compressor != 'NONE' and compressor not in compressors: - pytest.skip('compressor %s not available' % compressor) + compressors = gdal.GetDriverByName("Zarr").GetMetadataItem("COMPRESSORS") + if compressor != "NONE" and compressor not in compressors: + pytest.skip("compressor %s not available" % compressor) try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['COMPRESS=' + compressor] + options) is not None + assert ( + rg.CreateMDArray( + "test", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ["COMPRESS=" + compressor] + options, + ) + is not None + ) create() - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zarray', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zarray", "rb") assert f data = gdal.VSIFReadL(1, 1000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert j['compressor'] == expected_json + assert j["compressor"] == expected_json finally: - gdal.RmdirRecursive('/vsimem/test.zarr') - - -@pytest.mark.parametrize("compressor,options,expected_json", [ - ["NONE", [], None], - ["gzip", [], {'codec': 'https://purl.org/zarr/spec/codec/gzip/1.0', - 'configuration': {'level': 6}}]]) + gdal.RmdirRecursive("/vsimem/test.zarr") + + +@pytest.mark.parametrize( + "compressor,options,expected_json", + [ + ["NONE", [], None], + [ + "gzip", + [], + { + "codec": "https://purl.org/zarr/spec/codec/gzip/1.0", + "configuration": {"level": 6}, + }, + ], + ], +) def test_zarr_create_array_compressor_v3(compressor, options, expected_json): - compressors = gdal.GetDriverByName('Zarr').GetMetadataItem('COMPRESSORS') - if compressor != 'NONE' and compressor not in compressors: - pytest.skip('compressor %s not available' % compressor) + compressors = gdal.GetDriverByName("Zarr").GetMetadataItem("COMPRESSORS") + if compressor != "NONE" and compressor not in compressors: + pytest.skip("compressor %s not available" % compressor) try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', - options=['FORMAT=ZARR_V3']) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=ZARR_V3"] + ) assert ds is not None rg = ds.GetRootGroup() assert rg - assert rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['COMPRESS=' + compressor] + options) is not None + assert ( + rg.CreateMDArray( + "test", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ["COMPRESS=" + compressor] + options, + ) + is not None + ) create() - f = gdal.VSIFOpenL('/vsimem/test.zarr/meta/root/test.array.json', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/meta/root/test.array.json", "rb") assert f data = gdal.VSIFReadL(1, 1000, f) gdal.VSIFCloseL(f) j = json.loads(data) if expected_json is None: - assert 'compressor' not in j + assert "compressor" not in j else: - assert j['compressor'] == expected_json + assert j["compressor"] == expected_json finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create_array_bad_compressor(format): try: - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', - options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg with gdaltest.error_handler(): - assert rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['COMPRESS=invalid']) is None + assert ( + rg.CreateMDArray( + "test", + [], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ["COMPRESS=invalid"], + ) + is None + ) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create_array_attributes(format): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', - options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg ar = rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert ar attr = ar.CreateAttribute( - 'str_attr', [], gdal.ExtendedDataType.CreateString()) + "str_attr", [], gdal.ExtendedDataType.CreateString() + ) assert attr - assert attr.Write('my_string') == gdal.CE_None + assert attr.Write("my_string") == gdal.CE_None with gdaltest.error_handler(): - assert ar.CreateAttribute( - 'invalid_2d', [2, 3], gdal.ExtendedDataType.CreateString()) is None + assert ( + ar.CreateAttribute( + "invalid_2d", [2, 3], gdal.ExtendedDataType.CreateString() + ) + is None + ) create() def update(): - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() assert rg - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") assert ar - attr = ar.GetAttribute('str_attr') + attr = ar.GetAttribute("str_attr") assert attr - assert attr.Read() == 'my_string' - assert attr.Write('my_string_modified') == gdal.CE_None + assert attr.Read() == "my_string" + assert attr.Write("my_string_modified") == gdal.CE_None update() - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") assert ar - attr = ar.GetAttribute('str_attr') + attr = ar.GetAttribute("str_attr") assert attr - assert attr.Read() == 'my_string_modified' + assert attr.Read() == "my_string_modified" with gdaltest.error_handler(): - assert attr.Write('foo') == gdal.CE_Failure + assert attr.Write("foo") == gdal.CE_Failure with gdaltest.error_handler(): - assert ar.CreateAttribute( - 'another_attr', [], gdal.ExtendedDataType.CreateString()) is None + assert ( + ar.CreateAttribute( + "another_attr", [], gdal.ExtendedDataType.CreateString() + ) + is None + ) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_array_set_crs(): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg ar = rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert ar crs = osr.SpatialReference() crs.ImportFromEPSG(4326) @@ -1618,202 +1822,237 @@ def create(): create() - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zattrs', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zattrs", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert '_CRS' in j - crs = j['_CRS'] - assert 'wkt' in crs - assert 'url' in crs - if 'projjson' in crs: - assert crs['projjson']['type'] == 'GeographicCRS' + assert "_CRS" in j + crs = j["_CRS"] + assert "wkt" in crs + assert "url" in crs + if "projjson" in crs: + assert crs["projjson"]["type"] == "GeographicCRS" finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_array_set_dimension_name(): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg dim0 = rg.CreateDimension("dim0", None, None, 2) dim0_ar = rg.CreateMDArray( - "dim0", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + "dim0", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) dim0.SetIndexingVariable(dim0_ar) rg.CreateMDArray( - "test", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + "test", [dim0], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) create() - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zattrs', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zattrs", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert '_ARRAY_DIMENSIONS' in j - assert j['_ARRAY_DIMENSIONS'] == ['dim0'] + assert "_ARRAY_DIMENSIONS" in j + assert j["_ARRAY_DIMENSIONS"] == ["dim0"] finally: - gdal.RmdirRecursive('/vsimem/test.zarr') - - -@pytest.mark.parametrize("dtype,structtype,gdaltype,fill_value,nodata_value", - [["!b1", 'B', gdal.GDT_Byte, None, None], - ["!i1", 'b', gdal.GDT_Int16, None, None], - ["!i1", 'b', gdal.GDT_Int16, -1, -1], - ["!u1", 'B', gdal.GDT_Byte, None, None], - ["!u1", 'B', gdal.GDT_Byte, "1", 1], - ["i2", 'h', gdal.GDT_Int16, None, None], - ["i4", 'i', gdal.GDT_Int32, None, None], - ["i8", 'q', gdal.GDT_Float64, None, None], - ["u2", 'H', gdal.GDT_UInt16, None, None], - ["u4", 'I', gdal.GDT_UInt32, None, None], - ["u8", 'Q', gdal.GDT_Float64, None, None], - ["f4", 'f', gdal.GDT_Float32, None, None], - ["f8", 'd', gdal.GDT_Float64, None, None], - ["c8", 'f', gdal.GDT_CFloat32, None, None], - ["c16", 'd', gdal.GDT_CFloat64, None, None]]) + gdal.RmdirRecursive("/vsimem/test.zarr") + + +@pytest.mark.parametrize( + "dtype,structtype,gdaltype,fill_value,nodata_value", + [ + ["!b1", "B", gdal.GDT_Byte, None, None], + ["!i1", "b", gdal.GDT_Int16, None, None], + ["!i1", "b", gdal.GDT_Int16, -1, -1], + ["!u1", "B", gdal.GDT_Byte, None, None], + ["!u1", "B", gdal.GDT_Byte, "1", 1], + ["i2", "h", gdal.GDT_Int16, None, None], + ["i4", "i", gdal.GDT_Int32, None, None], + ["i8", "q", gdal.GDT_Float64, None, None], + ["u2", "H", gdal.GDT_UInt16, None, None], + ["u4", "I", gdal.GDT_UInt32, None, None], + ["u8", "Q", gdal.GDT_Float64, None, None], + ["f4", "f", gdal.GDT_Float32, None, None], + ["f8", "d", gdal.GDT_Float64, None, None], + ["c8", "f", gdal.GDT_CFloat32, None, None], + ["c16", "d", gdal.GDT_CFloat64, None, None], + ], +) @pytest.mark.parametrize("use_optimized_code_paths", [True, False]) -def test_zarr_write_array_content(dtype, structtype, gdaltype, fill_value, nodata_value, use_optimized_code_paths): +def test_zarr_write_array_content( + dtype, structtype, gdaltype, fill_value, nodata_value, use_optimized_code_paths +): j = { - "chunks": [ - 2, - 3 - ], + "chunks": [2, 3], "compressor": None, "dtype": dtype, "fill_value": fill_value, "filters": None, "order": "C", - "shape": [ - 5, - 4 - ], - "zarr_format": 2 + "shape": [5, 4], + "zarr_format": 2, } - filename = '/vsimem/test' + \ - dtype.replace('<', 'lt').replace('>', 'gt').replace( - '!', 'not') + structtype + '.zarr' + filename = ( + "/vsimem/test" + + dtype.replace("<", "lt").replace(">", "gt").replace("!", "not") + + structtype + + ".zarr" + ) try: gdal.Mkdir(filename, 0o755) - f = gdal.VSIFOpenL(filename + '/.zarray', 'wb') + f = gdal.VSIFOpenL(filename + "/.zarray", "wb") assert f data = json.dumps(j) gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) if gdaltype not in (gdal.GDT_CFloat32, gdal.GDT_CFloat64): - tile_0_0_data = struct.pack( - dtype[0] + (structtype * 6), 1, 2, 3, 5, 6, 7) - tile_0_1_data = struct.pack( - dtype[0] + (structtype * 6), 4, 0, 0, 8, 0, 0) + tile_0_0_data = struct.pack(dtype[0] + (structtype * 6), 1, 2, 3, 5, 6, 7) + tile_0_1_data = struct.pack(dtype[0] + (structtype * 6), 4, 0, 0, 8, 0, 0) else: tile_0_0_data = struct.pack( - dtype[0] + (structtype * 12), 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0) + dtype[0] + (structtype * 12), 1, 11, 2, 0, 3, 0, 5, 0, 6, 0, 7, 0 + ) tile_0_1_data = struct.pack( - dtype[0] + (structtype * 12), 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0) - gdal.FileFromMemBuffer(filename + '/0.0', tile_0_0_data) - gdal.FileFromMemBuffer(filename + '/0.1', tile_0_1_data) - - with gdaltest.config_option('GDAL_ZARR_USE_OPTIMIZED_CODE_PATHS', - 'YES' if use_optimized_code_paths else 'NO'): - ds = gdal.OpenEx( - filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + dtype[0] + (structtype * 12), 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0 + ) + gdal.FileFromMemBuffer(filename + "/0.0", tile_0_0_data) + gdal.FileFromMemBuffer(filename + "/0.1", tile_0_1_data) + + with gdaltest.config_option( + "GDAL_ZARR_USE_OPTIMIZED_CODE_PATHS", + "YES" if use_optimized_code_paths else "NO", + ): + ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar - dt = gdal.ExtendedDataType.Create(gdal.GDT_CFloat64 if gdaltype in ( - gdal.GDT_CFloat32, gdal.GDT_CFloat64) else gdal.GDT_Float64) + dt = gdal.ExtendedDataType.Create( + gdal.GDT_CFloat64 + if gdaltype in (gdal.GDT_CFloat32, gdal.GDT_CFloat64) + else gdal.GDT_Float64 + ) # Write all nodataset. That should cause tiles to be removed. nv = nodata_value if nodata_value else 0 buf_nodata = array.array( - 'd', [nv] * (5 * 4 * (2 if gdaltype in (gdal.GDT_CFloat32, gdal.GDT_CFloat64) else 1))) + "d", + [nv] + * ( + 5 * 4 * (2 if gdaltype in (gdal.GDT_CFloat32, gdal.GDT_CFloat64) else 1) + ), + ) assert ar.Write(buf_nodata, buffer_datatype=dt) == gdal.CE_None assert ar.Read(buffer_datatype=dt) == bytearray(buf_nodata) - if fill_value is None or fill_value == 0 or not gdal.DataTypeIsComplex(gdaltype): - assert gdal.VSIStatL(filename + '/0.0') is None + if ( + fill_value is None + or fill_value == 0 + or not gdal.DataTypeIsComplex(gdaltype) + ): + assert gdal.VSIStatL(filename + "/0.0") is None # Write all ones - ones = array.array('d', [ - 0] * (5 * 4 * (2 if gdaltype in (gdal.GDT_CFloat32, gdal.GDT_CFloat64) else 1))) + ones = array.array( + "d", + [0] + * ( + 5 * 4 * (2 if gdaltype in (gdal.GDT_CFloat32, gdal.GDT_CFloat64) else 1) + ), + ) assert ar.Write(ones, buffer_datatype=dt) == gdal.CE_None assert ar.Read(buffer_datatype=dt) == bytearray(ones) # Write with odd array_step - assert ar.Write(struct.pack('d' * 4, nv, nv, 6, 5), - array_start_idx=[2, 1], - count=[2, 2], - array_step=[-1, -1], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == gdal.CE_None + assert ( + ar.Write( + struct.pack("d" * 4, nv, nv, 6, 5), + array_start_idx=[2, 1], + count=[2, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) + == gdal.CE_None + ) # Check back - assert ar.Read(array_start_idx=[2, 1], - count=[2, 2], - array_step=[-1, -1], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == struct.pack('d' * 4, nv, nv, 6, 5) + assert ar.Read( + array_start_idx=[2, 1], + count=[2, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 4, nv, nv, 6, 5) # Force dirty block eviction ar.Read(buffer_datatype=dt) # Check back again - assert ar.Read(array_start_idx=[2, 1], - count=[2, 2], - array_step=[-1, -1], - buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64)) == struct.pack('d' * 4, nv, nv, 6, 5) + assert ar.Read( + array_start_idx=[2, 1], + count=[2, 2], + array_step=[-1, -1], + buffer_datatype=gdal.ExtendedDataType.Create(gdal.GDT_Float64), + ) == struct.pack("d" * 4, nv, nv, 6, 5) finally: gdal.RmdirRecursive(filename) - -@pytest.mark.parametrize("string_format,input_str,output_str", - [('ASCII', '0123456789truncated', '0123456789'), - ('UNICODE','\u00E9' + '123456789truncated', '\u00E9' + '123456789')], - ids=('ASCII', 'UNICODE')) +@pytest.mark.parametrize( + "string_format,input_str,output_str", + [ + ("ASCII", "0123456789truncated", "0123456789"), + ("UNICODE", "\u00E9" + "123456789truncated", "\u00E9" + "123456789"), + ], + ids=("ASCII", "UNICODE"), +) def test_zarr_create_array_string(string_format, input_str, output_str): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg @@ -1821,43 +2060,49 @@ def create(): dim0 = rg.CreateDimension("dim0", None, None, 2) ar = rg.CreateMDArray( - "test", [dim0], gdal.ExtendedDataType.CreateString(10), - ['STRING_FORMAT='+string_format, 'COMPRESS=ZLIB']) - assert ar.Write(['ab', input_str]) == gdal.CE_None + "test", + [dim0], + gdal.ExtendedDataType.CreateString(10), + ["STRING_FORMAT=" + string_format, "COMPRESS=ZLIB"], + ) + assert ar.Write(["ab", input_str]) == gdal.CE_None + create() - ds = gdal.OpenEx( - '/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - assert ar.Read() == ['ab', output_str] + assert ar.Read() == ["ab", output_str] finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("srcfilename", ["data/zarr/unicode_le.zarr", - "data/zarr/unicode_be.zarr"]) +@pytest.mark.parametrize( + "srcfilename", ["data/zarr/unicode_le.zarr", "data/zarr/unicode_be.zarr"] +) def test_zarr_update_array_string(srcfilename): - filename = '/vsimem/test.zarr' + filename = "/vsimem/test.zarr" try: gdal.Mkdir(filename, 0) - gdal.FileFromMemBuffer(filename + '/.zarray', open(srcfilename + '/.zarray', 'rb').read()) - gdal.FileFromMemBuffer(filename + '/0', open(srcfilename + '/0', 'rb').read()) + gdal.FileFromMemBuffer( + filename + "/.zarray", open(srcfilename + "/.zarray", "rb").read() + ) + gdal.FileFromMemBuffer(filename + "/0", open(srcfilename + "/0", "rb").read()) - eta = '\u03B7' + eta = "\u03B7" def update(): ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) rg = ds.GetRootGroup() ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - assert ar.Read() == ['\u00E9'] + assert ar.Read() == ["\u00E9"] assert ar.Write([eta]) == gdal.CE_None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" update() @@ -1873,14 +2118,15 @@ def check(): gdal.RmdirRecursive(filename) -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create_fortran_order_3d_and_compression_and_dim_separator(format): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr', - options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr", options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg @@ -1890,133 +2136,137 @@ def create(): dim2 = rg.CreateDimension("dim2", None, None, 4) ar = rg.CreateMDArray( - "test", [dim0, dim1, dim2], + "test", + [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['CHUNK_MEMORY_LAYOUT=F', 'COMPRESS=zlib', 'DIM_SEPARATOR=/']) - assert ar.Write(array.array( - 'b', [i for i in range(2 * 3 * 4)])) == gdal.CE_None + ["CHUNK_MEMORY_LAYOUT=F", "COMPRESS=zlib", "DIM_SEPARATOR=/"], + ) + assert ( + ar.Write(array.array("b", [i for i in range(2 * 3 * 4)])) + == gdal.CE_None + ) create() - if format == 'ZARR_V2': - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zarray', 'rb') + if format == "ZARR_V2": + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zarray", "rb") else: - f = gdal.VSIFOpenL( - '/vsimem/test.zarr/meta/root/test.array.json', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/meta/root/test.array.json", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - if format == 'ZARR_V2': - assert 'order' in j - assert j['order'] == 'F' + if format == "ZARR_V2": + assert "order" in j + assert j["order"] == "F" else: - assert 'chunk_memory_layout' in j - assert j['chunk_memory_layout'] == 'F' + assert "chunk_memory_layout" in j + assert j["chunk_memory_layout"] == "F" - ds = gdal.OpenEx( - '/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) - assert ar.Read() == \ - array.array('b', [i for i in range(2 * 3 * 4)]) + assert ar.Read() == array.array("b", [i for i in range(2 * 3 * 4)]) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_unit_offset_scale(): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg ar = rg.CreateMDArray( - "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte)) + "test", [], gdal.ExtendedDataType.Create(gdal.GDT_Byte) + ) assert ar.SetOffset(1.5) == gdal.CE_None assert ar.SetScale(2.5) == gdal.CE_None assert ar.SetUnit("my unit") == gdal.CE_None create() - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zattrs', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zattrs", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert 'add_offset' in j - assert j['add_offset'] == 1.5 - assert 'scale_factor' in j - assert j['scale_factor'] == 2.5 - assert 'units' in j - assert j['units'] == 'my unit' - - ds = gdal.OpenEx( - '/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + assert "add_offset" in j + assert j["add_offset"] == 1.5 + assert "scale_factor" in j + assert j["scale_factor"] == 2.5 + assert "units" in j + assert j["units"] == "my unit" + + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar.GetOffset() == 1.5 assert ar.GetScale() == 2.5 - assert ar.GetUnit() == 'my unit' + assert ar.GetUnit() == "my unit" finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_getcoordinatevariables(): src_ds = gdal.OpenEx( - 'data/netcdf/expanded_form_of_grid_mapping.nc', gdal.OF_MULTIDIM_RASTER) + "data/netcdf/expanded_form_of_grid_mapping.nc", gdal.OF_MULTIDIM_RASTER + ) if src_ds is None: pytest.skip() try: + def create(src_ds): - ds = gdal.MultiDimTranslate( - '/vsimem/test.zarr', src_ds, format='Zarr') + ds = gdal.MultiDimTranslate("/vsimem/test.zarr", src_ds, format="Zarr") src_ds = None assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('temp') + ar = rg.OpenMDArray("temp") coordinate_vars = ar.GetCoordinateVariables() assert len(coordinate_vars) == 2 - assert coordinate_vars[0].GetName() == 'lat' - assert coordinate_vars[1].GetName() == 'lon' + assert coordinate_vars[0].GetName() == "lat" + assert coordinate_vars[1].GetName() == "lon" assert len(coordinate_vars[0].GetCoordinateVariables()) == 0 create(src_ds) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_copy(): - tst = gdaltest.GDALTest('Zarr', '../../gcore/data/uint16.tif', 1, 4672) + tst = gdaltest.GDALTest("Zarr", "../../gcore/data/uint16.tif", 1, 4672) try: - return tst.testCreate(vsimem=1, new_filename='/vsimem/test.zarr') + return tst.testCreate(vsimem=1, new_filename="/vsimem/test.zarr") finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_create(format): try: - ds = gdal.GetDriverByName('Zarr').Create('/vsimem/test.zarr', 1, 1, 3, - options=['ARRAY_NAME=foo', - 'FORMAT=' + format]) + ds = gdal.GetDriverByName("Zarr").Create( + "/vsimem/test.zarr", 1, 1, 3, options=["ARRAY_NAME=foo", "FORMAT=" + format] + ) assert ds.GetGeoTransform(can_return_null=True) is None assert ds.GetSpatialRef() is None assert ds.GetRasterBand(1).GetNoDataValue() is None @@ -2025,83 +2275,95 @@ def test_zarr_create(format): assert ds.GetRasterBand(1).SetOffset(1.5) == gdal.CE_None assert ds.GetRasterBand(1).GetScale() is None assert ds.GetRasterBand(1).SetScale(2.5) == gdal.CE_None - assert ds.GetRasterBand(1).GetUnitType() == '' + assert ds.GetRasterBand(1).GetUnitType() == "" assert ds.GetRasterBand(1).SetUnitType("my_unit") == gdal.CE_None assert ds.SetMetadata({"FOO": "BAR"}) == gdal.CE_None ds = None - ds = gdal.Open('ZARR:/vsimem/test.zarr:/foo_band1') + ds = gdal.Open("ZARR:/vsimem/test.zarr:/foo_band1") assert ds assert ds.GetMetadata() == {"FOO": "BAR"} assert ds.GetRasterBand(1).GetNoDataValue() == 10.0 assert ds.GetRasterBand(1).GetOffset() == 1.5 finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_append_subdataset(): try: + def create(): - ds = gdal.GetDriverByName('Zarr').Create('/vsimem/test.zarr', 3, 2, 1, - options=['ARRAY_NAME=foo']) + ds = gdal.GetDriverByName("Zarr").Create( + "/vsimem/test.zarr", 3, 2, 1, options=["ARRAY_NAME=foo"] + ) assert ds ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) ds = None # Same dimensions. Will reuse the ones of foo - ds = gdal.GetDriverByName('Zarr').Create('/vsimem/test.zarr', 3, 2, 1, - options=['APPEND_SUBDATASET=YES', - 'ARRAY_NAME=bar']) + ds = gdal.GetDriverByName("Zarr").Create( + "/vsimem/test.zarr", + 3, + 2, + 1, + options=["APPEND_SUBDATASET=YES", "ARRAY_NAME=bar"], + ) assert ds ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) ds = None # Different dimensions. - ds = gdal.GetDriverByName('Zarr').Create('/vsimem/test.zarr', 30, 20, 1, - options=['APPEND_SUBDATASET=YES', - 'ARRAY_NAME=baz']) + ds = gdal.GetDriverByName("Zarr").Create( + "/vsimem/test.zarr", + 30, + 20, + 1, + options=["APPEND_SUBDATASET=YES", "ARRAY_NAME=baz"], + ) assert ds - ds.SetGeoTransform([2, .1, 0, 49, 0, -.1]) + ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds = None create() def check(): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() - foo = rg.OpenMDArray('foo') + foo = rg.OpenMDArray("foo") assert foo - assert foo.GetDimensions()[0].GetName() == 'Y' - assert foo.GetDimensions()[1].GetName() == 'X' + assert foo.GetDimensions()[0].GetName() == "Y" + assert foo.GetDimensions()[1].GetName() == "X" - bar = rg.OpenMDArray('bar') + bar = rg.OpenMDArray("bar") assert bar - assert bar.GetDimensions()[0].GetName() == 'Y' - assert bar.GetDimensions()[1].GetName() == 'X' + assert bar.GetDimensions()[0].GetName() == "Y" + assert bar.GetDimensions()[1].GetName() == "X" - baz = rg.OpenMDArray('baz') + baz = rg.OpenMDArray("baz") assert baz - assert baz.GetDimensions()[0].GetName() == 'baz_Y' - assert baz.GetDimensions()[1].GetName() == 'baz_X' + assert baz.GetDimensions()[0].GetName() == "baz_Y" + assert baz.GetDimensions()[1].GetName() == "baz_X" check() finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("blocksize", ['1,2', - '2,2,0', - '4000000000,4000000000,4000000000']) +@pytest.mark.parametrize( + "blocksize", ["1,2", "2,2,0", "4000000000,4000000000,4000000000"] +) def test_zarr_create_array_invalid_blocksize(blocksize): try: + def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional('/vsimem/test.zarr') + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + "/vsimem/test.zarr" + ) assert ds is not None rg = ds.GetRootGroup() assert rg @@ -2112,107 +2374,116 @@ def create(): with gdaltest.error_handler(): ar = rg.CreateMDArray( - "test", [dim0, dim1, dim2], + "test", + [dim0, dim1, dim2], gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['BLOCKSIZE=' + blocksize]) + ["BLOCKSIZE=" + blocksize], + ) assert ar is None create() finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_filters(): - filename = 'data/zarr/delta_filter_i4.zarr' + filename = "data/zarr/delta_filter_i4.zarr" ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar - assert ar.Read() == array.array('i', [i for i in range(10)]) + assert ar.Read() == array.array("i", [i for i in range(10)]) def test_zarr_update_with_filters(): try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', - open('data/zarr/delta_filter_i4.zarr/.zarray', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/test.zarr/0', - open('data/zarr/delta_filter_i4.zarr/0', 'rb').read()) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer( + "/vsimem/test.zarr/.zarray", + open("data/zarr/delta_filter_i4.zarr/.zarray", "rb").read(), + ) + gdal.FileFromMemBuffer( + "/vsimem/test.zarr/0", open("data/zarr/delta_filter_i4.zarr/0", "rb").read() + ) def update(): - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx( + "/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE + ) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar - assert ar.Read() == array.array('i', [i for i in range(10)]) - assert ar.Write(array.array( - 'i', [10-i for i in range(10)])) == gdal.CE_None + assert ar.Read() == array.array("i", [i for i in range(10)]) + assert ( + ar.Write(array.array("i", [10 - i for i in range(10)])) == gdal.CE_None + ) update() - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds rg = ds.GetRootGroup() assert rg ar = rg.OpenMDArray(rg.GetMDArrayNames()[0]) assert ar - assert ar.Read() == array.array('i', [10 - i for i in range(10)]) + assert ar.Read() == array.array("i", [10 - i for i in range(10)]) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_create_with_filter(): - tst = gdaltest.GDALTest('Zarr', '../../gcore/data/uint16.tif', 1, 4672, - options=['FILTER=delta']) + tst = gdaltest.GDALTest( + "Zarr", "../../gcore/data/uint16.tif", 1, 4672, options=["FILTER=delta"] + ) try: - ret = tst.testCreate(vsimem=1, new_filename='/vsimem/test.zarr') + ret = tst.testCreate(vsimem=1, new_filename="/vsimem/test.zarr") - f = gdal.VSIFOpenL('/vsimem/test.zarr/test/.zarray', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/test/.zarray", "rb") assert f data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) j = json.loads(data) - assert 'filters' in j - assert j['filters'] == [{'id': 'delta', 'dtype': '\n') - data = data[0:-len('\n')] + '' + '\n' + data = gdal.VSIFReadL(1, 1000, f).decode("utf-8") + assert data.endswith("\n") + data = data[0 : -len("\n")] + "" + "\n" gdal.VSIFSeekL(f, 0, 0) gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) def check_crs(): - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -2263,14 +2532,14 @@ def check_crs(): assert ar crs = ar.GetSpatialRef() assert crs is not None - assert crs.GetAuthorityCode(None) == '4326' + assert crs.GetAuthorityCode(None) == "4326" assert crs.GetDataAxisToSRSAxisMapping() == [2, 1] assert crs.GetCoordinateEpoch() == 2021.2 check_crs() def check_crs_classic_dataset(): - ds = gdal.Open('/vsimem/test.zarr') + ds = gdal.Open("/vsimem/test.zarr") crs = ds.GetSpatialRef() assert crs is not None @@ -2278,8 +2547,7 @@ def check_crs_classic_dataset(): def unset_crs(): # Open in read-only - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -2289,15 +2557,14 @@ def unset_crs(): unset_crs() - f = gdal.VSIFOpenL('/vsimem/test.zarr/pam.aux.xml', 'rb') + f = gdal.VSIFOpenL("/vsimem/test.zarr/pam.aux.xml", "rb") assert f - data = gdal.VSIFReadL(1, 1000, f).decode('utf-8') + data = gdal.VSIFReadL(1, 1000, f).decode("utf-8") gdal.VSIFCloseL(f) - assert '' in data + assert "" in data def check_unset_crs(): - ds = gdal.OpenEx('/vsimem/test.zarr', - gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg @@ -2309,117 +2576,120 @@ def check_unset_crs(): check_unset_crs() finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_too_large_tile_size(): j = { - "chunks": [ - 1000000, - 2000 - ], + "chunks": [1000000, 2000], "compressor": None, - "dtype": '!b1', + "dtype": "!b1", "fill_value": None, "filters": None, "order": "C", - "shape": [ - 5, - 4 - ], - "zarr_format": 2 + "shape": [5, 4], + "zarr_format": 2, } try: - gdal.Mkdir('/vsimem/test.zarr', 0) - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + gdal.Mkdir("/vsimem/test.zarr", 0) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds is not None with gdaltest.error_handler(): - assert ds.GetRootGroup().OpenMDArray('test').Read() is None + assert ds.GetRootGroup().OpenMDArray("test").Read() is None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_recursive_array_loading(): try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "zarr_format": 2 } - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zgroup', json.dumps(j)) - - j = { "chunks": [1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1 ], - "zarr_format": 2 + gdal.Mkdir("/vsimem/test.zarr", 0) + + j = {"zarr_format": 2} + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zgroup", json.dumps(j)) + + j = { + "chunks": [1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1], + "zarr_format": 2, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/a/.zarray', json.dumps(j)) - gdal.FileFromMemBuffer('/vsimem/test.zarr/b/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/a/.zarray", json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/b/.zarray", json.dumps(j)) - j = { "_ARRAY_DIMENSIONS": ["b"] } - gdal.FileFromMemBuffer('/vsimem/test.zarr/a/.zattrs', json.dumps(j)) + j = {"_ARRAY_DIMENSIONS": ["b"]} + gdal.FileFromMemBuffer("/vsimem/test.zarr/a/.zattrs", json.dumps(j)) - j = { "_ARRAY_DIMENSIONS": ["a"] } - gdal.FileFromMemBuffer('/vsimem/test.zarr/b/.zattrs', json.dumps(j)) + j = {"_ARRAY_DIMENSIONS": ["a"]} + gdal.FileFromMemBuffer("/vsimem/test.zarr/b/.zattrs", json.dumps(j)) - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds is not None with gdaltest.error_handler(): - ar = ds.GetRootGroup().OpenMDArray('a') + ar = ds.GetRootGroup().OpenMDArray("a") assert ar - assert gdal.GetLastErrorMsg() == 'Attempt at recursively loading /vsimem/test.zarr/a/.zarray' + assert ( + gdal.GetLastErrorMsg() + == "Attempt at recursively loading /vsimem/test.zarr/a/.zarray" + ) finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_too_deep_array_loading(): try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "zarr_format": 2 } - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zgroup', json.dumps(j)) - - j = { "chunks": [1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1 ], - "zarr_format": 2 + gdal.Mkdir("/vsimem/test.zarr", 0) + + j = {"zarr_format": 2} + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zgroup", json.dumps(j)) + + j = { + "chunks": [1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1], + "zarr_format": 2, } N = 33 for i in range(N): - gdal.FileFromMemBuffer('/vsimem/test.zarr/%d/.zarray' % i, json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/%d/.zarray" % i, json.dumps(j)) - for i in range(N-1): - j = { "_ARRAY_DIMENSIONS": ["%d" % (i+1)] } - gdal.FileFromMemBuffer('/vsimem/test.zarr/%d/.zattrs' % i, json.dumps(j)) + for i in range(N - 1): + j = {"_ARRAY_DIMENSIONS": ["%d" % (i + 1)]} + gdal.FileFromMemBuffer("/vsimem/test.zarr/%d/.zattrs" % i, json.dumps(j)) - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds is not None with gdaltest.error_handler(): - ar = ds.GetRootGroup().OpenMDArray('0') + ar = ds.GetRootGroup().OpenMDArray("0") assert ar - assert gdal.GetLastErrorMsg() == 'Too deep call stack in LoadArray()' + assert gdal.GetLastErrorMsg() == "Too deep call stack in LoadArray()" finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") -@pytest.mark.parametrize("filename,path", - [('data/zarr/nczarr_v2.zarr', '/MyGroup/Group_A'), - ('data/zarr/nczarr_v2.zarr/MyGroup', '/Group_A'), - ('data/zarr/nczarr_v2.zarr/MyGroup/Group_A', ''), - ('data/zarr/nczarr_v2.zarr/MyGroup/Group_A/dset2', None)]) -def test_zarr_read_nczarr_v2(filename,path): +@pytest.mark.parametrize( + "filename,path", + [ + ("data/zarr/nczarr_v2.zarr", "/MyGroup/Group_A"), + ("data/zarr/nczarr_v2.zarr/MyGroup", "/Group_A"), + ("data/zarr/nczarr_v2.zarr/MyGroup/Group_A", ""), + ("data/zarr/nczarr_v2.zarr/MyGroup/Group_A/dset2", None), + ], +) +def test_zarr_read_nczarr_v2(filename, path): with gdaltest.error_handler(): assert gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) is None @@ -2428,90 +2698,101 @@ def test_zarr_read_nczarr_v2(filename,path): assert ds is not None rg = ds.GetRootGroup() - ar = rg.OpenMDArrayFromFullname((path if path else '') + '/dset2') + ar = rg.OpenMDArrayFromFullname((path if path else "") + "/dset2") assert ar dims = ar.GetDimensions() assert len(dims) == 2 assert dims[0].GetSize() == 3 - assert dims[0].GetName() == 'lat' - assert dims[0].GetFullName() == '/MyGroup/lat' + assert dims[0].GetName() == "lat" + assert dims[0].GetFullName() == "/MyGroup/lat" assert dims[0].GetIndexingVariable() is not None - assert dims[0].GetIndexingVariable().GetName() == 'lat' + assert dims[0].GetIndexingVariable().GetName() == "lat" assert dims[0].GetType() == gdal.DIM_TYPE_HORIZONTAL_Y - assert dims[0].GetDirection() == 'NORTH' + assert dims[0].GetDirection() == "NORTH" assert dims[1].GetSize() == 3 - assert dims[1].GetName() == 'lon' - assert dims[1].GetFullName() == '/MyGroup/lon' + assert dims[1].GetName() == "lon" + assert dims[1].GetFullName() == "/MyGroup/lon" assert dims[1].GetIndexingVariable() is not None - assert dims[1].GetIndexingVariable().GetName() == 'lon' + assert dims[1].GetIndexingVariable().GetName() == "lon" assert dims[1].GetType() == gdal.DIM_TYPE_HORIZONTAL_X - assert dims[1].GetDirection() == 'EAST' + assert dims[1].GetDirection() == "EAST" if path: - ar = rg.OpenMDArrayFromFullname(path + '/dset3') + ar = rg.OpenMDArrayFromFullname(path + "/dset3") assert ar dims = ar.GetDimensions() assert len(dims) == 2 assert dims[0].GetSize() == 2 - assert dims[0].GetName() == 'lat' - assert dims[0].GetFullName() == '/MyGroup/Group_A/lat' + assert dims[0].GetName() == "lat" + assert dims[0].GetFullName() == "/MyGroup/Group_A/lat" assert dims[1].GetSize() == 2 - assert dims[1].GetName() == 'lon' - assert dims[1].GetFullName() == '/MyGroup/Group_A/lon' + assert dims[1].GetName() == "lon" + assert dims[1].GetFullName() == "/MyGroup/Group_A/lon" - if filename == 'data/zarr/nczarr_v2.zarr': - mygroup = rg.OpenGroup('MyGroup') - assert mygroup.GetMDArrayNames() == ['lon', 'lat', 'dset1'] + if filename == "data/zarr/nczarr_v2.zarr": + mygroup = rg.OpenGroup("MyGroup") + assert mygroup.GetMDArrayNames() == ["lon", "lat", "dset1"] -@pytest.mark.parametrize("format", ['ZARR_V2', 'ZARR_V3']) +@pytest.mark.parametrize("format", ["ZARR_V2", "ZARR_V3"]) def test_zarr_cache_tile_presence(format): - if gdal.GetDriverByName('netCDF') is None: - pytest.skip('netCDF driver missing') + if gdal.GetDriverByName("netCDF") is None: + pytest.skip("netCDF driver missing") - filename = 'tmp/test.zarr' + filename = "tmp/test.zarr" try: # Create a Zarr array with sparse tiles def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional(filename, options=['FORMAT='+format]) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional( + filename, options=["FORMAT=" + format] + ) assert ds is not None rg = ds.GetRootGroup() assert rg dim0 = rg.CreateDimension("dim0", None, None, 2) dim1 = rg.CreateDimension("dim1", None, None, 5) - ar = rg.CreateMDArray("test", [dim0, dim1], - gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['BLOCKSIZE=1,2']) + ar = rg.CreateMDArray( + "test", + [dim0, dim1], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + ["BLOCKSIZE=1,2"], + ) assert ar - assert ar.Write(struct.pack('B' * 1, 10), - array_start_idx=[0, 0], - count=[1, 1]) == gdal.CE_None - assert ar.Write(struct.pack('B' * 1, 100), - array_start_idx=[1, 3], - count=[1, 1]) == gdal.CE_None + assert ( + ar.Write(struct.pack("B" * 1, 10), array_start_idx=[0, 0], count=[1, 1]) + == gdal.CE_None + ) + assert ( + ar.Write( + struct.pack("B" * 1, 100), array_start_idx=[1, 3], count=[1, 1] + ) + == gdal.CE_None + ) create() # Create the tile presence cache def open_with_cache_tile_presence_option(): - ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER, - open_options = ['CACHE_TILE_PRESENCE=YES']) + ds = gdal.OpenEx( + filename, + gdal.OF_MULTIDIM_RASTER, + open_options=["CACHE_TILE_PRESENCE=YES"], + ) assert ds is not None rg = ds.GetRootGroup() - assert rg.OpenMDArray('test') is not None + assert rg.OpenMDArray("test") is not None open_with_cache_tile_presence_option() # Check that the cache exists - if format == 'ZARR_V2': - cache_filename = filename + '/test/.zarray.gmac' + if format == "ZARR_V2": + cache_filename = filename + "/test/.zarray.gmac" else: - cache_filename = filename + '/meta/root/test.array.json.gmac' + cache_filename = filename + "/meta/root/test.array.json.gmac" assert gdal.VSIStatL(cache_filename) is not None # Read content of the array @@ -2519,10 +2800,20 @@ def read_content(): ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") assert ar is not None - assert struct.unpack('B' * 2 * 5, ar.Read()) == (10, 0, 0, 0, 0, - 0, 0, 0, 100, 0) + assert struct.unpack("B" * 2 * 5, ar.Read()) == ( + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100, + 0, + ) read_content() @@ -2533,18 +2824,16 @@ def read_content(): # Now alter the cache to mark a present tile as missing def alter_cache(): - ds = gdal.OpenEx(cache_filename, - gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) + ds = gdal.OpenEx(cache_filename, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) assert ds is not None rg = ds.GetRootGroup() - assert rg.GetMDArrayNames() == [ '_test_tile_presence' ] - ar = rg.OpenMDArray('_test_tile_presence') - assert struct.unpack('B' * 2 * 3, ar.Read()) == (1, 0, 0, - 0, 1, 0) - assert ar.Write(struct.pack('B' * 1, 0), - array_start_idx=[1, 1], - count=[1, 1]) == gdal.CE_None - + assert rg.GetMDArrayNames() == ["_test_tile_presence"] + ar = rg.OpenMDArray("_test_tile_presence") + assert struct.unpack("B" * 2 * 3, ar.Read()) == (1, 0, 0, 0, 1, 0) + assert ( + ar.Write(struct.pack("B" * 1, 0), array_start_idx=[1, 1], count=[1, 1]) + == gdal.CE_None + ) alter_cache() @@ -2553,10 +2842,20 @@ def read_content_altered(): ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") assert ar is not None - assert struct.unpack('B' * 2 * 5, ar.Read()) == (10, 0, 0, 0, 0, - 0, 0, 0, 0, 0) + assert struct.unpack("B" * 2 * 5, ar.Read()) == ( + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ) read_content_altered() @@ -2567,7 +2866,7 @@ def read_content_altered(): @pytest.mark.parametrize("compression", ["NONE", "ZLIB"]) def test_zarr_advise_read(compression): - filename = 'tmp/test.zarr' + filename = "tmp/test.zarr" try: dim0_size = 1230 dim1_size = 2570 @@ -2582,21 +2881,25 @@ def test_zarr_advise_read(compression): for x in range(dim1_blocksize): data_ar[dim1_size * (y + y_offset) + x + x_offset] = 0 - data = array.array('B', data_ar) + data = array.array("B", data_ar) def create(): - ds = gdal.GetDriverByName( - 'ZARR').CreateMultiDimensional(filename) + ds = gdal.GetDriverByName("ZARR").CreateMultiDimensional(filename) assert ds is not None rg = ds.GetRootGroup() assert rg dim0 = rg.CreateDimension("dim0", None, None, dim0_size) dim1 = rg.CreateDimension("dim1", None, None, dim1_size) - ar = rg.CreateMDArray("test", [dim0, dim1], - gdal.ExtendedDataType.Create(gdal.GDT_Byte), - ['COMPRESS=' + compression, - 'BLOCKSIZE=%d,%d' % (dim0_blocksize, dim1_blocksize)]) + ar = rg.CreateMDArray( + "test", + [dim0, dim1], + gdal.ExtendedDataType.Create(gdal.GDT_Byte), + [ + "COMPRESS=" + compression, + "BLOCKSIZE=%d,%d" % (dim0_blocksize, dim1_blocksize), + ], + ) assert ar ar.SetNoDataValueDouble(0) assert ar.Write(data) == gdal.CE_None @@ -2607,137 +2910,154 @@ def read(): ds = gdal.OpenEx(filename, gdal.OF_MULTIDIM_RASTER) assert ds is not None rg = ds.GetRootGroup() - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") with gdaltest.error_handler(): - assert ar.AdviseRead(options = ['CACHE_SIZE=1']) == gdal.CE_Failure + assert ar.AdviseRead(options=["CACHE_SIZE=1"]) == gdal.CE_Failure - got_data_before_advise_read = ar.Read(array_start_idx=[40, 51], - count=[2 * dim0_blocksize, 2 * dim1_blocksize]) + got_data_before_advise_read = ar.Read( + array_start_idx=[40, 51], count=[2 * dim0_blocksize, 2 * dim1_blocksize] + ) assert ar.AdviseRead() == gdal.CE_None assert ar.Read() == data - assert ar.AdviseRead(array_start_idx=[40, 51], - count=[2 * dim0_blocksize, dim1_blocksize]) == gdal.CE_None + assert ( + ar.AdviseRead( + array_start_idx=[40, 51], count=[2 * dim0_blocksize, dim1_blocksize] + ) + == gdal.CE_None + ) # Read more than AdviseRead() window - got_data = ar.Read(array_start_idx=[40, 51], - count=[2 * dim0_blocksize, 2 * dim1_blocksize]) + got_data = ar.Read( + array_start_idx=[40, 51], count=[2 * dim0_blocksize, 2 * dim1_blocksize] + ) assert got_data == got_data_before_advise_read read() - finally: gdal.RmdirRecursive(filename) - def test_zarr_read_invalid_nczarr_dim(): try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "chunks": [1,1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1,1 ], - "zarr_format": 2, - "_NCZARR_ARRAY":{"dimrefs":["/MyGroup/lon", "/OtherGroup/lat"]} + gdal.Mkdir("/vsimem/test.zarr", 0) + + j = { + "chunks": [1, 1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1, 1], + "zarr_format": 2, + "_NCZARR_ARRAY": {"dimrefs": ["/MyGroup/lon", "/OtherGroup/lat"]}, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) - - j = { "chunks": [1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1 ], - "zarr_format": 2 + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) + + j = { + "chunks": [1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1], + "zarr_format": 2, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/MyGroup/lon/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/MyGroup/lon/.zarray", json.dumps(j)) - j = { "_NCZARR_GROUP":{ "dims":{ "lon": 0 } } } + j = {"_NCZARR_GROUP": {"dims": {"lon": 0}}} - gdal.FileFromMemBuffer('/vsimem/test.zarr/MyGroup/.zgroup', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/MyGroup/.zgroup", json.dumps(j)) - j = { "chunks": [2], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 2 ], - "zarr_format": 2 + j = { + "chunks": [2], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [2], + "zarr_format": 2, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/OtherGroup/lat/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer( + "/vsimem/test.zarr/OtherGroup/lat/.zarray", json.dumps(j) + ) - j = { "_NCZARR_GROUP":{ "dims":{ "lat": 2, "invalid.name": 2 } } } + j = {"_NCZARR_GROUP": {"dims": {"lat": 2, "invalid.name": 2}}} - gdal.FileFromMemBuffer('/vsimem/test.zarr/OtherGroup/.zgroup', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/OtherGroup/.zgroup", json.dumps(j)) with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") assert ar finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_nczar_repeated_array_names(): try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "_NCZARR_GROUP":{ "dims":{ "lon": 1 }, "vars": ["a", "a", "lon", "lon"], "groups": ["g", "g"] } } - - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zgroup', json.dumps(j)) - - j = { "chunks": [1,1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1,1 ], - "zarr_format": 2 + gdal.Mkdir("/vsimem/test.zarr", 0) + + j = { + "_NCZARR_GROUP": { + "dims": {"lon": 1}, + "vars": ["a", "a", "lon", "lon"], + "groups": ["g", "g"], + } } - gdal.FileFromMemBuffer('/vsimem/test.zarr/a/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zgroup", json.dumps(j)) + + j = { + "chunks": [1, 1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1, 1], + "zarr_format": 2, + } - j = { "chunks": [1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "C", - "shape": [ 1 ], - "zarr_format": 2 + gdal.FileFromMemBuffer("/vsimem/test.zarr/a/.zarray", json.dumps(j)) + + j = { + "chunks": [1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "C", + "shape": [1], + "zarr_format": 2, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/lon/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/lon/.zarray", json.dumps(j)) with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - assert rg.GetMDArrayNames() == ['lon', 'a'] - ar = rg.OpenMDArray('a') + assert rg.GetMDArrayNames() == ["lon", "a"] + ar = rg.OpenMDArray("a") assert ar assert rg.GetGroupNames() == ["g"] finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_test_overflow_in_AllocateWorkingBuffers_due_to_fortran(): @@ -2746,29 +3066,30 @@ def test_zarr_read_test_overflow_in_AllocateWorkingBuffers_due_to_fortran(): pytest.skip() try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "chunks": [(1 << 32) - 1, (1 << 32) - 1], - "compressor": None, - "dtype": '!b1', - "fill_value": None, - "filters": None, - "order": "F", - "shape": [ 1, 1 ], - "zarr_format": 2 + gdal.Mkdir("/vsimem/test.zarr", 0) + + j = { + "chunks": [(1 << 32) - 1, (1 << 32) - 1], + "compressor": None, + "dtype": "!b1", + "fill_value": None, + "filters": None, + "order": "F", + "shape": [1, 1], + "zarr_format": 2, } - gdal.FileFromMemBuffer('/vsimem/test.zarr/.zarray', json.dumps(j)) + gdal.FileFromMemBuffer("/vsimem/test.zarr/.zarray", json.dumps(j)) - ds = gdal.OpenEx('/vsimem/test.zarr', gdal.OF_MULTIDIM_RASTER) + ds = gdal.OpenEx("/vsimem/test.zarr", gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() - ar = rg.OpenMDArray('test') + ar = rg.OpenMDArray("test") with gdaltest.error_handler(): - assert ar.Read(count = [1,1]) is None + assert ar.Read(count=[1, 1]) is None finally: - gdal.RmdirRecursive('/vsimem/test.zarr') + gdal.RmdirRecursive("/vsimem/test.zarr") def test_zarr_read_test_overflow_in_AllocateWorkingBuffers_due_to_type_change(): @@ -2777,26 +3098,27 @@ def test_zarr_read_test_overflow_in_AllocateWorkingBuffers_due_to_type_change(): pytest.skip() try: - gdal.Mkdir('/vsimem/test.zarr', 0) - - j = { "chunks": [(1 << 32) - 1, ((1 << 32) - 1) / 8], - "compressor": None, - "dtype": '= 2.2(dev)') +from osgeo import gdal, ogr, osr + +if int(gdal.VersionInfo("VERSION_NUM")) < 2020000: + print("Requires GDAL >= 2.2(dev)") sys.exit(1) sr4326 = osr.SpatialReference() -sr4326.SetFromUserInput('WGS84') +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']) +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') +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}) + ("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'] + 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'] + if not ("spi" in options and options["spi"]): + layer_options += ["SPATIAL_INDEX=NO"] - ds = ogr.GetDriverByName('GPKG').CreateDataSource(out_filename, options=dataset_options) + 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)) + lyr = ds.CreateLayer("attribute_table", geom_type=ogr.wkbNone) + lyr.CreateField(ogr.FieldDefn("intfield", ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) - feat['intfield'] = 1 + 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)) + 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)')) + 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()) @@ -91,98 +104,138 @@ feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) - lyr = ds.CreateLayer('linestring2d', geom_type=ogr.wkbLineString, srs=sr4326, options=layer_options) + 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)')) + 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) + 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))')) + 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) + 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)')) + 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) + 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))')) + 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) + 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)))')) + 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) + 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))))')) + 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)')) + 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))')) + 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)))')) + 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) + lyr = ds.CreateLayer("geometry2d", geom_type=ogr.wkbUnknown, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 2)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)')) + 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))')) + 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)')) + 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))')) + 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)))')) + 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))))')) + 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 = 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()) @@ -190,158 +243,255 @@ feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) - lyr = ds.CreateLayer('linestring3d', geom_type=ogr.wkbLineString25D, options=layer_options) + 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)')) + 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) + 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))')) + 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) + 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)')) + 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) + 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))')) + 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) + 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)))')) + 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) + 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))))')) + 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)')) + 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))')) + 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)))')) + 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) + 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)')) + 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)')) + 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))')) + 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)')) + 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))')) + 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)))')) + 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))))')) + 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) + 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)')) + 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) + 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))')) + 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) + 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)))')) + 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) + 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))')) + 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) + 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))))')) + 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) + 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)')) + 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)')) + 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))')) + 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) + 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))')) + 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)))')) + 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']) + 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"], + ) diff --git a/autotest/ogc_cite_testing/kml_generate_test_files.py b/autotest/ogc_cite_testing/kml_generate_test_files.py index c8df175be0d5..3aff01641804 100755 --- a/autotest/ogc_cite_testing/kml_generate_test_files.py +++ b/autotest/ogc_cite_testing/kml_generate_test_files.py @@ -31,8 +31,7 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import ogr +from osgeo import gdal, ogr ############################################################################### # Generate a .kml/.kmz file with OGR LIBKML driver covering most requirements @@ -123,44 +122,57 @@ def generate_libkml(filename): 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_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_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)) @@ -196,41 +208,53 @@ def generate_libkml(filename): 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)')) + 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) + 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)') + 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)))')) + 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.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2.2945 48.85825 10)")) feat.SetField("tilt", 75) feat.SetField("roll", 10) feat.SetField("heading", -70) @@ -243,7 +267,9 @@ def generate_libkml(filename): 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", "http://developers.google.com/kml/documentation/Point.kml" + ) feat.SetField("networklink_refreshVisibility", 1) feat.SetField("networklink_flyToView", 1) feat.SetField("networklink_refreshInterval", 60) @@ -251,20 +277,29 @@ def generate_libkml(filename): lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetField("networklink", "http://developers.google.com/kml/documentation/Point.kml") + 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", "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]') + 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( + "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) @@ -280,7 +315,7 @@ def generate_libkml(filename): feat.SetField("heading", 0) feat.SetField("tilt", 90) feat.SetField("roll", 0) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.2945 48.85825)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2.2945 48.85825)")) lyr.CreateFeature(feat) # feat = ogr.Feature(lyr.GetLayerDefn()) @@ -299,22 +334,35 @@ def generate_libkml(filename): # 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)) + 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)')) + 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 # @@ -326,9 +374,13 @@ def generate_libkml(filename): 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') + 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) @@ -337,6 +389,7 @@ def generate_libkml_update(filename): lyr.DeleteFeature(1) ds = None + ############################################################################### # Generate a .kml file with GDAL KMLSuperOverlay driver covering the GroundOverlay KML features # @@ -348,16 +401,16 @@ def generate_libkml_update(filename): 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) + src_ds = gdal.GetDriverByName("MEM").Create("", 512, 256, 3) + src_ds.SetGeoTransform([-180, 360.0 / 512, 0, 90, 0, -180.0 / 256]) + ds = gdal.GetDriverByName("KMLSuperOverlay").CreateCopy(filename, src_ds) del ds src_ds = None -if __name__ == '__main__': +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') + generate_libkml("test_ogrlibkml.kml") + generate_libkml("test_ogrlibkml.kmz") + generate_libkml_update("test_ogrlibkml_update.kml") + generate_kmlsuperoverlay("test_superoverlay.kmz") diff --git a/autotest/ogr/data/pydrivers/missingidentify/ogr_missing_identify.py b/autotest/ogr/data/pydrivers/missingidentify/ogr_missing_identify.py index c8f74fbf0c63..5cd40cf7ea3a 100644 --- a/autotest/ogr/data/pydrivers/missingidentify/ogr_missing_identify.py +++ b/autotest/ogr/data/pydrivers/missingidentify/ogr_missing_identify.py @@ -13,6 +13,7 @@ # gdal: DRIVER_DCAP_VECTOR = "YES" # gdal: DRIVER_DMD_LONGNAME = "my super plugin" + class Driver(BaseDriver): def __init__(self): pass diff --git a/autotest/ogr/data/pydrivers/missingmetadata/ogr_missing_metadata.py b/autotest/ogr/data/pydrivers/missingmetadata/ogr_missing_metadata.py index 4955e5a29d6a..7ec3c8a6eabe 100644 --- a/autotest/ogr/data/pydrivers/missingmetadata/ogr_missing_metadata.py +++ b/autotest/ogr/data/pydrivers/missingmetadata/ogr_missing_metadata.py @@ -5,4 +5,3 @@ # or, at the choice of the licensee, # Copyright 2019 Even Rouault # SPDX-License-Identifier: MIT - diff --git a/autotest/ogr/data/pydrivers/ogr_DUMMY.py b/autotest/ogr/data/pydrivers/ogr_DUMMY.py index ed3baae30414..0d740b74fd85 100644 --- a/autotest/ogr/data/pydrivers/ogr_DUMMY.py +++ b/autotest/ogr/data/pydrivers/ogr_DUMMY.py @@ -21,7 +21,7 @@ try: # The gdal_python_driver module is defined by the GDAL library at runtime - from gdal_python_driver import BaseDriver, BaseDataset, BaseLayer + from gdal_python_driver import BaseDataset, BaseDriver, BaseLayer except ImportError: # To be able to run in standalone mode class BaseDriver(object): @@ -39,42 +39,47 @@ def __init__(self): # Reserved attribute names. Either those or the corresponding method # must be defined - self.name = 'my_layer' # Required, or name() method - - self.fid_name = 'my_fid' # Optional - - self.fields = [{'name': 'boolField', 'type': 'Boolean'}, - {'name': 'int16Field', 'type': 'Integer16'}, - {'name': 'int32Field', 'type': 'Integer'}, - {'name': 'int64Field', 'type': 'Integer64'}, - {'name': 'realField', 'type': 'Real'}, - {'name': 'floatField', 'type': 'Float'}, - {'name': 'strField', 'type': 'String'}, - {'name': 'strNullField', 'type': 'String'}, - {'name': 'strUnsetField', 'type': 'String'}, - {'name': 'binaryField', 'type': 'Binary'}, - {'name': 'timeField', 'type': 'Time'}, - {'name': 'dateField', 'type': 'Date'}, - {'name': 'datetimeField', 'type': 'DateTime'}] # Required, or fields() method - - self.geometry_fields = [{'name': 'geomField', - 'type': 'Point', # optional - 'srs': 'EPSG:4326' # optional - }] # Required, or geometry_fields() method - - self.metadata = {'foo': 'bar'} # optional + self.name = "my_layer" # Required, or name() method + + self.fid_name = "my_fid" # Optional + + self.fields = [ + {"name": "boolField", "type": "Boolean"}, + {"name": "int16Field", "type": "Integer16"}, + {"name": "int32Field", "type": "Integer"}, + {"name": "int64Field", "type": "Integer64"}, + {"name": "realField", "type": "Real"}, + {"name": "floatField", "type": "Float"}, + {"name": "strField", "type": "String"}, + {"name": "strNullField", "type": "String"}, + {"name": "strUnsetField", "type": "String"}, + {"name": "binaryField", "type": "Binary"}, + {"name": "timeField", "type": "Time"}, + {"name": "dateField", "type": "Date"}, + {"name": "datetimeField", "type": "DateTime"}, + ] # Required, or fields() method + + self.geometry_fields = [ + { + "name": "geomField", + "type": "Point", # optional + "srs": "EPSG:4326", # optional + } + ] # Required, or geometry_fields() method + + self.metadata = {"foo": "bar"} # optional # uncomment if __iter__() honour self.attribute_filter - #self.iterator_honour_attribute_filter = True + # self.iterator_honour_attribute_filter = True # uncomment if __iter__() honour self.spatial_filter - #self.iterator_honour_spatial_filter = True + # self.iterator_honour_spatial_filter = True # uncomment if feature_count() honour self.attribute_filter - #self.feature_count_honour_attribute_filter = True + # self.feature_count_honour_attribute_filter = True # uncomment if feature_count() honour self.spatial_filter - #self.feature_count_honour_spatial_filter = True + # self.feature_count_honour_spatial_filter = True # End of reserved attribute names @@ -149,25 +154,27 @@ def feature_count(self, force_computation): def __iter__(self): for i in range(self.count): properties = { - 'boolField': True, - 'int16Field': 32767, - 'int32Field': i + 2, - 'int64Field': 1234567890123, - 'realField': 1.23, - 'floatField': 1.2, - 'strField': 'foo', - 'strNullField': None, - 'binaryField': b'\x01\x00\x02', - 'timeField': '12:34:56.789', - 'dateField': '2017-04-26', - 'datetimeField': '2017-04-26T12:34:56.789Z'} - - yield {"type": "OGRFeature", - "id": i + 1, - "fields": properties, - "geometry_fields": {"geomField": "POINT(2 49)"}, - "style": "SYMBOL(a:0)" if i % 2 == 0 else None, - } + "boolField": True, + "int16Field": 32767, + "int32Field": i + 2, + "int64Field": 1234567890123, + "realField": 1.23, + "floatField": 1.2, + "strField": "foo", + "strNullField": None, + "binaryField": b"\x01\x00\x02", + "timeField": "12:34:56.789", + "dateField": "2017-04-26", + "datetimeField": "2017-04-26T12:34:56.789Z", + } + + yield { + "type": "OGRFeature", + "id": i + 1, + "fields": properties, + "geometry_fields": {"geomField": "POINT(2 49)"}, + "style": "SYMBOL(a:0)" if i % 2 == 0 else None, + } # Optional # def feature_by_id(self, fid): @@ -180,7 +187,7 @@ class Dataset(BaseDataset): def __init__(self, filename): # If the layers member is set, layer_count() and layer() will not be used self.layers = [Layer()] - self.metadata = {'foo': 'bar'} + self.metadata = {"foo": "bar"} # Optional, called on native object destruction def close(self): @@ -210,7 +217,7 @@ def __init__(self): # Required def identify(self, filename, first_bytes, open_flags, open_options={}): - return filename == 'DUMMY:' + return filename == "DUMMY:" # Required def open(self, filename, first_bytes, open_flags, open_options={}): diff --git a/autotest/ogr/data/pydrivers/unsupportedapiversion/ogr_unsupported_api_version.py b/autotest/ogr/data/pydrivers/unsupportedapiversion/ogr_unsupported_api_version.py index d0f7058a1a3e..1a87b836d5f9 100644 --- a/autotest/ogr/data/pydrivers/unsupportedapiversion/ogr_unsupported_api_version.py +++ b/autotest/ogr/data/pydrivers/unsupportedapiversion/ogr_unsupported_api_version.py @@ -14,6 +14,7 @@ # gdal: DRIVER_DCAP_VECTOR = "YES" # gdal: DRIVER_DMD_LONGNAME = "my super plugin" + class Driver(BaseDriver): def __init__(self): pass diff --git a/autotest/ogr/ogr_arrow.py b/autotest/ogr/ogr_arrow.py index e9cbf394e50c..fef2bbf7d9dd 100755 --- a/autotest/ogr/ogr_arrow.py +++ b/autotest/ogr/ogr_arrow.py @@ -31,18 +31,21 @@ import json import math -from osgeo import gdal, ogr, osr import gdaltest import pytest -pytestmark = pytest.mark.require_driver('Arrow') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("Arrow") from . import ogr_parquet def check(test_filename, filename_prefix, dim): - ref_filename = 'data/arrow/from_paleolimbot_geoarrow/' + filename_prefix + dim + '-wkb.feather' + ref_filename = ( + "data/arrow/from_paleolimbot_geoarrow/" + filename_prefix + dim + "-wkb.feather" + ) ds_ref = ogr.Open(ref_filename) lyr_ref = ds_ref.GetLayer(0) ds = ogr.Open(test_filename) @@ -68,17 +71,27 @@ def check(test_filename, filename_prefix, dim): # Test reading test files from https://github.com/paleolimbot/geoarrow/tree/master/inst/example_feather -@pytest.mark.parametrize("filename_prefix", ['point', - 'linestring', - 'polygon', - 'multipoint', - 'multilinestring', - 'multipolygon', - 'geometrycollection']) -@pytest.mark.parametrize("dim", ['', '_z', '_m', '_zm']) +@pytest.mark.parametrize( + "filename_prefix", + [ + "point", + "linestring", + "polygon", + "multipoint", + "multilinestring", + "multipolygon", + "geometrycollection", + ], +) +@pytest.mark.parametrize("dim", ["", "_z", "_m", "_zm"]) def test_ogr_arrow_read_all_geom_types(filename_prefix, dim): - test_filename = 'data/arrow/from_paleolimbot_geoarrow/' + filename_prefix + dim + '-default.feather' + test_filename = ( + "data/arrow/from_paleolimbot_geoarrow/" + + filename_prefix + + dim + + "-default.feather" + ) check(test_filename, filename_prefix, dim) @@ -86,35 +99,50 @@ def test_ogr_arrow_read_all_geom_types(filename_prefix, dim): # Test dplicating test files from https://github.com/paleolimbot/geoarrow/tree/master/inst/example_feather -@pytest.mark.parametrize("filename_prefix", ['point', - 'linestring', - 'polygon', - 'multipoint', - 'multilinestring', - 'multipolygon', - 'geometrycollection']) -@pytest.mark.parametrize("dim", ['', '_z', '_m', '_zm']) -@pytest.mark.parametrize("encoding", ['WKB', 'WKT', 'GEOARROW']) +@pytest.mark.parametrize( + "filename_prefix", + [ + "point", + "linestring", + "polygon", + "multipoint", + "multilinestring", + "multipolygon", + "geometrycollection", + ], +) +@pytest.mark.parametrize("dim", ["", "_z", "_m", "_zm"]) +@pytest.mark.parametrize("encoding", ["WKB", "WKT", "GEOARROW"]) def test_ogr_arrow_write_all_geom_types(filename_prefix, dim, encoding): - test_filename = 'data/arrow/from_paleolimbot_geoarrow/' + filename_prefix + dim + '-default.feather' + test_filename = ( + "data/arrow/from_paleolimbot_geoarrow/" + + filename_prefix + + dim + + "-default.feather" + ) ds_ref = ogr.Open(test_filename) lyr_ref = ds_ref.GetLayer(0) - if encoding != 'GEOARROW' or \ - lyr_ref.GetGeomType() not in (ogr.wkbGeometryCollection, - ogr.wkbGeometryCollection25D, - ogr.wkbGeometryCollectionM, - ogr.wkbGeometryCollectionZM): - vsifilename = '/vsimem/test.feather' - with gdaltest.config_option('OGR_ARROW_ALLOW_ALL_DIMS', 'YES'): - gdal.VectorTranslate(vsifilename, test_filename, - dstSRS='EPSG:4326', - reproject=False, - layerCreationOptions = ['GEOMETRY_ENCODING='+encoding]) + if encoding != "GEOARROW" or lyr_ref.GetGeomType() not in ( + ogr.wkbGeometryCollection, + ogr.wkbGeometryCollection25D, + ogr.wkbGeometryCollectionM, + ogr.wkbGeometryCollectionZM, + ): + vsifilename = "/vsimem/test.feather" + with gdaltest.config_option("OGR_ARROW_ALLOW_ALL_DIMS", "YES"): + gdal.VectorTranslate( + vsifilename, + test_filename, + dstSRS="EPSG:4326", + reproject=False, + layerCreationOptions=["GEOMETRY_ENCODING=" + encoding], + ) check(vsifilename, filename_prefix, dim) gdal.Unlink(vsifilename) + ############################################################################### # Read a file with all data types @@ -122,33 +150,39 @@ def test_ogr_arrow_write_all_geom_types(filename_prefix, dim, encoding): @pytest.mark.parametrize("use_vsi", [False, True]) def test_ogr_arrow_1(use_vsi): - filename = 'data/arrow/test.feather' + filename = "data/arrow/test.feather" if use_vsi: - vsifilename = '/vsimem/test.feather' - gdal.FileFromMemBuffer(vsifilename, open(filename, 'rb').read()) + vsifilename = "/vsimem/test.feather" + gdal.FileFromMemBuffer(vsifilename, open(filename, "rb").read()) filename = vsifilename try: - ogr_parquet._check_test_parquet(filename, - expect_fast_get_extent=False, - expect_ignore_fields=False) + ogr_parquet._check_test_parquet( + filename, expect_fast_get_extent=False, expect_ignore_fields=False + ) finally: if use_vsi: gdal.Unlink(vsifilename) + ############################################################################### # Run test_ogrsf on a Feather file def test_ogr_arrow_test_ogrsf_test_feather(): 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/arrow/from_paleolimbot_geoarrow/polygon-default.feather') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + + " -ro data/arrow/from_paleolimbot_geoarrow/polygon-default.feather" + ) + + assert "INFO" in ret + assert "ERROR" not in ret - assert 'INFO' in ret - assert 'ERROR' not in ret ############################################################################### # Run test_ogrsf on a IPC stream file @@ -156,13 +190,18 @@ def test_ogr_arrow_test_ogrsf_test_feather(): def test_ogr_arrow_test_ogrsf_test_ipc(): 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/arrow/from_paleolimbot_geoarrow/polygon-default.ipc') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + + " -ro data/arrow/from_paleolimbot_geoarrow/polygon-default.ipc" + ) + + assert "INFO" in ret + assert "ERROR" not in ret - assert 'INFO' in ret - assert 'ERROR' not in ret ############################################################################### # Run test_ogrsf on a IPC stream file, in streamable mode @@ -170,41 +209,57 @@ def test_ogr_arrow_test_ogrsf_test_ipc(): def test_ogr_arrow_test_ogrsf_test_ipc_streamable(): 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 ARROW_IPC_STREAM:data/arrow/from_paleolimbot_geoarrow/polygon-default.ipc') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + + " -ro ARROW_IPC_STREAM:data/arrow/from_paleolimbot_geoarrow/polygon-default.ipc" + ) - assert 'INFO' in ret - assert 'ERROR' not in ret + assert "INFO" in ret + assert "ERROR" not in ret ############################################################################### # Test write support -@pytest.mark.parametrize("use_vsi,batch_size,fid,write_gdal_footer,format,open_as_stream", - [(False, None, None, False, 'FILE', None), - (True, 2, "fid", True, 'FILE', None), - (False, None, None, False, 'STREAM', False), - (False, 2, None, False, 'STREAM', False), - (False, 2, None, False, 'STREAM', True), - ]) -def test_ogr_arrow_write_from_another_dataset(use_vsi, batch_size, fid, write_gdal_footer, format, open_as_stream): - - outfilename = '/vsimem/out' if use_vsi else 'tmp/out' +@pytest.mark.parametrize( + "use_vsi,batch_size,fid,write_gdal_footer,format,open_as_stream", + [ + (False, None, None, False, "FILE", None), + (True, 2, "fid", True, "FILE", None), + (False, None, None, False, "STREAM", False), + (False, 2, None, False, "STREAM", False), + (False, 2, None, False, "STREAM", True), + ], +) +def test_ogr_arrow_write_from_another_dataset( + use_vsi, batch_size, fid, write_gdal_footer, format, open_as_stream +): + + outfilename = "/vsimem/out" if use_vsi else "tmp/out" try: - layerCreationOptions = [ 'FORMAT=' + format ] + layerCreationOptions = ["FORMAT=" + format] if batch_size: - layerCreationOptions.append('BATCH_SIZE=' + str(batch_size)) + layerCreationOptions.append("BATCH_SIZE=" + str(batch_size)) if fid: - layerCreationOptions.append('FID=' + fid) - with gdaltest.config_option('OGR_ARROW_WRITE_GDAL_FOOTER', str(write_gdal_footer)): - gdal.VectorTranslate(outfilename, 'data/arrow/test.feather', - format='ARROW', - layerCreationOptions=layerCreationOptions) - - ds = gdal.OpenEx('ARROW_IPC_STREAM:' + outfilename if open_as_stream else outfilename) + layerCreationOptions.append("FID=" + fid) + with gdaltest.config_option( + "OGR_ARROW_WRITE_GDAL_FOOTER", str(write_gdal_footer) + ): + gdal.VectorTranslate( + outfilename, + "data/arrow/test.feather", + format="ARROW", + layerCreationOptions=layerCreationOptions, + ) + + ds = gdal.OpenEx( + "ARROW_IPC_STREAM:" + outfilename if open_as_stream else outfilename + ) lyr = ds.GetLayer(0) assert lyr.GetFIDColumn() == (fid if fid else "") @@ -218,47 +273,52 @@ def test_ogr_arrow_write_from_another_dataset(use_vsi, batch_size, fid, write_gd assert lyr.GetFeature(5) is None - if batch_size and format == 'FILE': + if batch_size and format == "FILE": num_features = lyr.GetFeatureCount() expected_num_row_groups = int(math.ceil(num_features / batch_size)) - assert lyr.GetMetadataItem("NUM_RECORD_BATCHES", "_ARROW_") == str(expected_num_row_groups) + assert lyr.GetMetadataItem("NUM_RECORD_BATCHES", "_ARROW_") == str( + expected_num_row_groups + ) for i in range(expected_num_row_groups): - got_num_rows = lyr.GetMetadataItem("RECORD_BATCHES[%d].NUM_ROWS" % i, "_ARROW_") + got_num_rows = lyr.GetMetadataItem( + "RECORD_BATCHES[%d].NUM_ROWS" % i, "_ARROW_" + ) if i < expected_num_row_groups - 1: assert got_num_rows == str(batch_size) else: - assert got_num_rows == str(num_features - (expected_num_row_groups - 1) * batch_size) + assert got_num_rows == str( + num_features - (expected_num_row_groups - 1) * batch_size + ) - assert lyr.GetMetadataItem('FORMAT', '_ARROW_') == format + assert lyr.GetMetadataItem("FORMAT", "_ARROW_") == format geo = lyr.GetMetadataItem("geo", "_ARROW_METADATA_") assert geo is not None j = json.loads(geo) assert j is not None - assert 'primary_column' in j - assert j['primary_column'] == 'geometry' - assert 'columns' in j - assert 'geometry' in j['columns'] - assert 'encoding' in j['columns']['geometry'] - assert j['columns']['geometry']['encoding'] == 'geoarrow.point' - assert 'bbox' not in j['columns']['geometry'] + assert "primary_column" in j + assert j["primary_column"] == "geometry" + assert "columns" in j + assert "geometry" in j["columns"] + assert "encoding" in j["columns"]["geometry"] + assert j["columns"]["geometry"]["encoding"] == "geoarrow.point" + assert "bbox" not in j["columns"]["geometry"] md = lyr.GetMetadata("_ARROW_METADATA_") - assert 'geo' in md + assert "geo" in md if write_gdal_footer: geo = lyr.GetMetadataItem("gdal:geo", "_ARROW_FOOTER_METADATA_") assert geo is not None j = json.loads(geo) assert j is not None - assert 'bbox' in j['columns']['geometry'] - + assert "bbox" in j["columns"]["geometry"] md = lyr.GetMetadata("_ARROW_FOOTER_METADATA_") if write_gdal_footer: - assert 'gdal:geo' in md + assert "gdal:geo" in md else: - assert 'gdal:geo' not in md + assert "gdal:geo" not in md if open_as_stream: @@ -270,16 +330,20 @@ def test_ogr_arrow_write_from_another_dataset(use_vsi, batch_size, fid, write_gd with gdaltest.error_handler(): gdal.ErrorReset() assert lyr.GetNextFeature() is None - assert gdal.GetLastErrorMsg() == 'Attempting to rewind non-seekable stream' + assert ( + gdal.GetLastErrorMsg() == "Attempting to rewind non-seekable stream" + ) - elif format == 'STREAM' and batch_size: + elif format == "STREAM" and batch_size: assert lyr.GetFeatureCount(force=0) == 5 - ogr_parquet._check_test_parquet(outfilename, - expect_fast_feature_count=False if open_as_stream else True, - expect_fast_get_extent=False, - expect_ignore_fields=False) + ogr_parquet._check_test_parquet( + outfilename, + expect_fast_feature_count=False if open_as_stream else True, + expect_fast_get_extent=False, + expect_ignore_fields=False, + ) finally: gdal.Unlink(outfilename) @@ -289,17 +353,17 @@ def test_ogr_arrow_write_from_another_dataset(use_vsi, batch_size, fid, write_gd # Test compression support -@pytest.mark.parametrize("compression", ['uncompressed', 'lz4', 'zstd']) +@pytest.mark.parametrize("compression", ["uncompressed", "lz4", "zstd"]) def test_ogr_arrow_write_compression(compression): - lco = gdal.GetDriverByName('Arrow').GetMetadataItem("DS_LAYER_CREATIONOPTIONLIST") + lco = gdal.GetDriverByName("Arrow").GetMetadataItem("DS_LAYER_CREATIONOPTIONLIST") if compression.upper() not in lco: pytest.skip() - outfilename = '/vsimem/out.feather' - ds = gdal.GetDriverByName('Arrow').Create(outfilename, 0, 0, 0, gdal.GDT_Unknown) - options = ['FID=fid', 'COMPRESSION=' + compression] - lyr = ds.CreateLayer('out', geom_type=ogr.wkbNone, options=options) + outfilename = "/vsimem/out.feather" + ds = gdal.GetDriverByName("Arrow").Create(outfilename, 0, 0, 0, gdal.GDT_Unknown) + options = ["FID=fid", "COMPRESSION=" + compression] + lyr = ds.CreateLayer("out", geom_type=ogr.wkbNone, options=options) assert lyr is not None f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) @@ -324,7 +388,7 @@ def test_ogr_arrow_write_compression(compression): def test_ogr_arrow_invalid_arrow(): with gdaltest.error_handler(): - assert ogr.Open('data/arrow/invalid.arrow') is None + assert ogr.Open("data/arrow/invalid.arrow") is None ############################################################################### @@ -334,26 +398,28 @@ def test_ogr_arrow_invalid_arrow(): def test_ogr_arrow_invalid_arrows(): with gdaltest.error_handler(): - assert ogr.Open('data/arrow/invalid.arrows') is None + assert ogr.Open("data/arrow/invalid.arrows") is None with gdaltest.error_handler(): - ogr.Open('ARROW_IPC_STREAM:/vsimem/i_dont_exist.bin') is None + ogr.Open("ARROW_IPC_STREAM:/vsimem/i_dont_exist.bin") is None ############################################################################### # Test coordinate epoch support -@pytest.mark.parametrize("write_gdal_footer", [True,False]) +@pytest.mark.parametrize("write_gdal_footer", [True, False]) def test_ogr_arrow_coordinate_epoch(write_gdal_footer): - outfilename = '/vsimem/out.feather' - with gdaltest.config_option('OGR_ARROW_WRITE_GDAL_FOOTER', str(write_gdal_footer)): - ds = gdal.GetDriverByName('Arrow').Create(outfilename, 0, 0, 0, gdal.GDT_Unknown) + outfilename = "/vsimem/out.feather" + with gdaltest.config_option("OGR_ARROW_WRITE_GDAL_FOOTER", str(write_gdal_footer)): + ds = gdal.GetDriverByName("Arrow").Create( + outfilename, 0, 0, 0, gdal.GDT_Unknown + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) srs.SetCoordinateEpoch(2022.3) - ds.CreateLayer('out', geom_type=ogr.wkbPoint, srs=srs) + ds.CreateLayer("out", geom_type=ogr.wkbPoint, srs=srs) ds = None ds = ogr.Open(outfilename) @@ -376,10 +442,11 @@ def test_ogr_arrow_coordinate_epoch(write_gdal_footer): def test_ogr_arrow_extension_type(): - outfilename = '/vsimem/out.feather' - with gdaltest.config_options({'OGR_ARROW_WRITE_GDAL_FOOTER': 'NO', - 'OGR_ARROW_WRITE_GEO': 'NO'}): - gdal.VectorTranslate(outfilename, 'data/arrow/test.feather') + outfilename = "/vsimem/out.feather" + with gdaltest.config_options( + {"OGR_ARROW_WRITE_GDAL_FOOTER": "NO", "OGR_ARROW_WRITE_GEO": "NO"} + ): + gdal.VectorTranslate(outfilename, "data/arrow/test.feather") ds = ogr.Open(outfilename) assert ds is not None @@ -399,11 +466,10 @@ def test_ogr_arrow_extension_type(): def test_ogr_arrow_read_with_geoarrow_extension_registered(): - pa = pytest.importorskip('pyarrow') + pa = pytest.importorskip("pyarrow") _point_storage_type = pa.list_(pa.field("xy", pa.float64()), 2) class PointGeometryType(pa.ExtensionType): - def __init__(self): pa.ExtensionType.__init__(self, _point_storage_type, "geoarrow.point") @@ -414,13 +480,12 @@ def __arrow_ext_serialize__(self): def __arrow_ext_deserialize__(cls, storage_type, serialized): return cls() - point_type = PointGeometryType() pa.register_extension_type(point_type) try: - ds = ogr.Open('data/arrow/from_paleolimbot_geoarrow/point-default.feather') + ds = ogr.Open("data/arrow/from_paleolimbot_geoarrow/point-default.feather") lyr = ds.GetLayer(0) - assert lyr.GetGeometryColumn() == 'geometry' + assert lyr.GetGeometryColumn() == "geometry" finally: pa.unregister_extension_type(point_type.extension_name) diff --git a/autotest/ogr/ogr_as_sqlite_extension.py b/autotest/ogr/ogr_as_sqlite_extension.py index be062be172e6..4dd19201ce89 100755 --- a/autotest/ogr/ogr_as_sqlite_extension.py +++ b/autotest/ogr/ogr_as_sqlite_extension.py @@ -41,46 +41,46 @@ def do(sqlite3name, gdalname): try: import ctypes except ImportError: - print('skip') + print("skip") return 0 sqlite_handle = ctypes.cdll.LoadLibrary(sqlite3name) if sqlite_handle is None: - print('skip') + print("skip") return 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) + 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') + print("skip") return 0 if ret != 0: - print('Error sqlite3_open ret = %d' % ret) + print("Error sqlite3_open ret = %d" % ret) return 1 - if hasattr(sqlite_handle, 'sqlite3_enable_load_extension'): + 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'): + elif hasattr(sqlite_handle, "SPLite3_enable_load_extension"): ret = sqlite_handle.SPLite3_enable_load_extension(db, 1) else: - print('skip') + print("skip") return 0 if ret != 0: - print('skip') + print("skip") return 0 - gdalname = gdalname.encode('ascii') + gdalname = gdalname.encode("ascii") - if hasattr(sqlite_handle, 'sqlite3_load_extension'): + 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) + print("Error sqlite3_load_extension ret = %d" % ret) return 1 tab = ctypes.c_void_p() @@ -90,19 +90,23 @@ def do(sqlite3name, gdalname): 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) + 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) + 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) + print("Error sqlite3_get_table ret = %d" % ret) return 1 cast_tab = ctypes.cast(tab, ctypes.POINTER(ctypes.c_char_p)) - sys.stdout.write(cast_tab[1].decode('ascii')) + sys.stdout.write(cast_tab[1].decode("ascii")) sys.stdout.flush() - if hasattr(sqlite_handle, 'sqlite3_close'): + if hasattr(sqlite_handle, "sqlite3_close"): ret = sqlite_handle.sqlite3_close(db) else: ret = sqlite_handle.SPLite3_close(db) @@ -112,11 +116,11 @@ def do(sqlite3name, gdalname): def main(argv): if len(argv) != 3: - print('python ogr_as_sqlite_extension name_of_libsqlite3 name_of_libgdal') + print("python ogr_as_sqlite_extension name_of_libsqlite3 name_of_libgdal") return 1 return do(argv[1], argv[2]) -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/autotest/ogr/ogr_avc.py b/autotest/ogr/ogr_avc.py index b222046fe7cb..413eee96ccbc 100755 --- a/autotest/ogr/ogr_avc.py +++ b/autotest/ogr/ogr_avc.py @@ -29,29 +29,35 @@ ############################################################################### - import ogrtest -from osgeo import ogr -from osgeo import gdal import pytest +from osgeo import gdal, ogr + ############################################################################### # def check_content(ds): - lyr = ds.GetLayerByName('ARC') - expect = ['1', '2', '3', '4', '5', '6', '7'] + lyr = ds.GetLayerByName("ARC") + expect = ["1", "2", "3", "4", "5", "6", "7"] - tr = ogrtest.check_features_against_list(lyr, 'UserID', expect) + tr = ogrtest.check_features_against_list(lyr, "UserID", expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() - assert (ogrtest.check_feature_geometry(feat, 'LINESTRING (340099.875 4100200.0,340400.0625 4100399.5,340900.125 4100200.0,340700.03125 4100199.5)', - max_error=0.01) == 0) + assert ( + ogrtest.check_feature_geometry( + feat, + "LINESTRING (340099.875 4100200.0,340400.0625 4100399.5,340900.125 4100200.0,340700.03125 4100199.5)", + max_error=0.01, + ) + == 0 + ) + ############################################################################### # Open AVCE00 datasource. @@ -60,40 +66,43 @@ def check_content(ds): def test_ogr_avc_1(): # Example given at Annex A of http://avce00.maptools.org/docs/v7_e00_cover.html - avc_ds = ogr.Open('data/avc/test.e00') - assert avc_ds.GetLayer(0).GetSpatialRef() is not None, 'expected SRS' + avc_ds = ogr.Open("data/avc/test.e00") + assert avc_ds.GetLayer(0).GetSpatialRef() is not None, "expected SRS" if avc_ds is not None: return check_content(avc_ds) pytest.fail() + ############################################################################### # Open AVCBin datasource. def test_ogr_avc_2(): - avc_ds = ogr.Open('data/avc/testavc/testavc') - assert avc_ds.GetLayer(0).GetSpatialRef() is not None, 'expected SRS' + avc_ds = ogr.Open("data/avc/testavc/testavc") + assert avc_ds.GetLayer(0).GetSpatialRef() is not None, "expected SRS" if avc_ds is not None: return check_content(avc_ds) pytest.fail() + ############################################################################### # Try opening a compressed E00 (which is not supported) def test_ogr_avc_3(): - gdal.PushErrorHandler('CPLQuietErrorHandler') - avc_ds = ogr.Open('data/avc/compressed.e00') + gdal.PushErrorHandler("CPLQuietErrorHandler") + avc_ds = ogr.Open("data/avc/compressed.e00") gdal.PopErrorHandler() last_error_msg = gdal.GetLastErrorMsg() - assert avc_ds is None, 'expected failure' + assert avc_ds is None, "expected failure" + + assert last_error_msg != "", "expected error message" - assert last_error_msg != '', 'expected error message' ############################################################################### # Open larger AVCBin datasource. @@ -101,7 +110,7 @@ def test_ogr_avc_3(): def test_ogr_avc_4(): - for filename in ['data/avc/testpointavc/testpointavc', 'data/avc/testpoint.e00']: + for filename in ["data/avc/testpointavc/testpointavc", "data/avc/testpoint.e00"]: avc_ds = ogr.Open(filename) lyr = avc_ds.GetLayer(0) last_feature = None @@ -115,24 +124,27 @@ def test_ogr_avc_4(): if last_feature.GetFieldCount() != 7: f.DumpReadable() pytest.fail(filename) - if filename == 'data/avc/testpointavc/testpointavc': - fld_name = 'TESTPOINTAVC-ID' + if filename == "data/avc/testpointavc/testpointavc": + fld_name = "TESTPOINTAVC-ID" else: - fld_name = 'WELLS-ID' - if last_feature.GetField('ValueId') != 80 or last_feature.GetField(fld_name) != 80: + fld_name = "WELLS-ID" + if ( + last_feature.GetField("ValueId") != 80 + or last_feature.GetField(fld_name) != 80 + ): f.DumpReadable() pytest.fail(filename) - + ############################################################################### # Open AVCBin datasource with polygon def test_ogr_avc_5(): - for filename in ['data/avc/testpolyavc/testpolyavc', 'data/avc/testpoly.e00']: + for filename in ["data/avc/testpolyavc/testpolyavc", "data/avc/testpoly.e00"]: avc_ds = ogr.Open(filename) - lyr = avc_ds.GetLayerByName('PAL') + lyr = avc_ds.GetLayerByName("PAL") last_feature = None count = 0 for f in lyr: @@ -144,17 +156,15 @@ def test_ogr_avc_5(): if last_feature.GetFieldCount() != 5: f.DumpReadable() pytest.fail(filename) - if last_feature.GetField('ArcIds') != [-4, -5] or last_feature.GetField('AREA') != pytest.approx(9939.059, abs=1e-3): + if last_feature.GetField("ArcIds") != [-4, -5] or last_feature.GetField( + "AREA" + ) != pytest.approx(9939.059, abs=1e-3): f.DumpReadable() pytest.fail(filename) - if filename == 'data/avc/testpolyavc/testpolyavc': - expected_wkt = 'POLYGON ((340700.03125 4100199.5,340500.0 4100199.75,340599.96875 4100100.25,340700.03125 4100199.5))' + if filename == "data/avc/testpolyavc/testpolyavc": + expected_wkt = "POLYGON ((340700.03125 4100199.5,340500.0 4100199.75,340599.96875 4100100.25,340700.03125 4100199.5))" else: - expected_wkt = 'POLYGON ((340700.03 4100199.5,340500.0 4100199.8,340599.97 4100100.2,340700.03 4100199.5))' + expected_wkt = "POLYGON ((340700.03 4100199.5,340500.0 4100199.8,340599.97 4100100.2,340700.03 4100199.5))" if last_feature.GetGeometryRef().ExportToWkt() != expected_wkt: f.DumpReadable() pytest.fail(filename) - - - - diff --git a/autotest/ogr/ogr_basic_test.py b/autotest/ogr/ogr_basic_test.py index c23f5e013518..8a4f86f94a41 100755 --- a/autotest/ogr/ogr_basic_test.py +++ b/autotest/ogr/ogr_basic_test.py @@ -33,37 +33,38 @@ import gdaltest import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import gdal, ogr, osr + ############################################################################### def test_ogr_basic_1(): - gdaltest.ds = ogr.Open('data/poly.shp') + 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') + gdaltest.lyr = gdaltest.ds.GetLayerByName("poly") - assert gdaltest.lyr.GetName() == 'poly' + assert gdaltest.lyr.GetName() == "poly" assert gdaltest.lyr.GetGeomType() == ogr.wkbPolygon - assert gdaltest.lyr.GetLayerDefn().GetName() == 'poly' + 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) + 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() @@ -74,8 +75,10 @@ def test_ogr_basic_2(): count2 = count2 + 1 feat = gdaltest.lyr.GetNextFeature() - assert count2 == 10, \ - ('Got wrong count with GetNextFeature() - %d, expecting 10' % count2) + assert count2 == 10, ( + "Got wrong count with GetNextFeature() - %d, expecting 10" % count2 + ) + ############################################################################### # Test Spatial Query. @@ -106,19 +109,24 @@ def test_ogr_basic_3(): gdaltest.lyr.ResetReading() count = gdaltest.lyr.GetFeatureCount() - assert count == 1, \ - ('Got wrong feature count with spatial filter, expected 1, got %d' % count) + 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.' + 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) + assert count == 10, ( + "Clearing spatial query may not have worked properly, getting\n%d features instead of expected 10 features." + % count + ) + ############################################################################### # Test GetDriver(). @@ -126,10 +134,12 @@ def test_ogr_basic_3(): def test_ogr_basic_4(): driver = gdaltest.ds.GetDriver() - assert driver is not None, 'GetDriver() returns None' + assert driver is not None, "GetDriver() returns None" + + assert driver.GetName() == "ESRI Shapefile", ( + "Got wrong driver name: " + driver.GetName() + ) - assert driver.GetName() == 'ESRI Shapefile', \ - ('Got wrong driver name: ' + driver.GetName()) ############################################################################### # Test attribute query on special field fid - per bug 1468. @@ -137,7 +147,7 @@ def test_ogr_basic_4(): def test_ogr_basic_5(): - gdaltest.lyr.SetAttributeFilter('FID = 3') + gdaltest.lyr.SetAttributeFilter("FID = 3") gdaltest.lyr.ResetReading() feat1 = gdaltest.lyr.GetNextFeature() @@ -145,9 +155,9 @@ def test_ogr_basic_5(): gdaltest.lyr.SetAttributeFilter(None) - assert feat1 is not None and feat2 is None, 'unexpected result count.' + assert feat1 is not None and feat2 is None, "unexpected result count." - assert feat1.GetFID() == 3, 'got wrong feature.' + assert feat1.GetFID() == 3, "got wrong feature." ############################################################################### @@ -155,9 +165,10 @@ def test_ogr_basic_5(): def test_ogr_basic_6(): # Put inside try/except for OG python bindings - assert ogr.Open('') is None + assert ogr.Open("") is None + + assert ogr.Open("non_existing") is None - assert ogr.Open('non_existing') is None ############################################################################### # Test ogr.Feature.Equal() @@ -182,29 +193,29 @@ def test_ogr_basic_7(): feat = None feat_clone = None - field_defn = ogr.FieldDefn('field1', ogr.OFTInteger) + field_defn = ogr.FieldDefn("field1", ogr.OFTInteger) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field2', ogr.OFTReal) + field_defn = ogr.FieldDefn("field2", ogr.OFTReal) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field3', ogr.OFTString) + field_defn = ogr.FieldDefn("field3", ogr.OFTString) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field4', ogr.OFTIntegerList) + field_defn = ogr.FieldDefn("field4", ogr.OFTIntegerList) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field5', ogr.OFTRealList) + field_defn = ogr.FieldDefn("field5", ogr.OFTRealList) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field6', ogr.OFTStringList) + field_defn = ogr.FieldDefn("field6", ogr.OFTStringList) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field7', ogr.OFTDate) + field_defn = ogr.FieldDefn("field7", ogr.OFTDate) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field8', ogr.OFTTime) + field_defn = ogr.FieldDefn("field8", ogr.OFTTime) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field9', ogr.OFTDateTime) + field_defn = ogr.FieldDefn("field9", ogr.OFTDateTime) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field10', ogr.OFTBinary) + field_defn = ogr.FieldDefn("field10", ogr.OFTBinary) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field11', ogr.OFTInteger64) + field_defn = ogr.FieldDefn("field11", ogr.OFTInteger64) feat_defn.AddFieldDefn(field_defn) - field_defn = ogr.FieldDefn('field12', ogr.OFTReal) + field_defn = ogr.FieldDefn("field12", ogr.OFTReal) feat_defn.AddFieldDefn(field_defn) feat = ogr.Feature(feat_defn) @@ -218,7 +229,7 @@ def test_ogr_basic_7(): 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.SetFieldBinaryFromHexString(9, "012345678ABCDEF") feat.SetField(10, 1234567890123) feat.SetField(11, math.nan) @@ -228,7 +239,7 @@ def test_ogr_basic_7(): pytest.fail() feat_almost_clone = feat.Clone() - geom = ogr.CreateGeometryFromWkt('POINT(0 1)') + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") feat_almost_clone.SetGeometry(geom) if feat.Equal(feat_almost_clone) or feat_almost_clone.Equal(feat): feat.DumpReadable() @@ -236,7 +247,7 @@ def test_ogr_basic_7(): pytest.fail() feat_almost_clone = feat.Clone() - geom = ogr.CreateGeometryFromWkt('POINT(0 1)') + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") feat.SetGeometry(geom) if feat.Equal(feat_almost_clone) or feat_almost_clone.Equal(feat): feat.DumpReadable() @@ -329,16 +340,23 @@ def test_ogr_basic_7(): 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)) + 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) or feat_almost_clone.Equal(feat): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() - feat_almost_clone.SetFieldBinaryFromHexString(9, '00') + feat_almost_clone.SetFieldBinaryFromHexString(9, "00") if feat.Equal(feat_almost_clone) or feat_almost_clone.Equal(feat): feat.DumpReadable() feat_almost_clone.DumpReadable() @@ -376,31 +394,33 @@ def test_ogr_basic_8(): 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"] - ] + 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] @@ -413,12 +433,16 @@ def test_ogr_basic_9(): 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') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " -all_drivers" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test double call to UseExceptions() (#5704) @@ -432,7 +456,9 @@ def test_ogr_basic_11(): 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))') + 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: @@ -447,43 +473,43 @@ def test_ogr_basic_12(): # boolean integer feat_def = ogr.FeatureDefn() - assert ogr.GetFieldSubTypeName(ogr.OFSTBoolean) == 'Boolean' - field_def = ogr.FieldDefn('fld', ogr.OFTInteger) + 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) + f.SetField("fld", 0) + f.SetField("fld", 1) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - f.SetField('fld', 2) + gdal.PushErrorHandler("CPLQuietErrorHandler") + f.SetField("fld", 2) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - assert isinstance(f.GetField('fld'), bool) - assert f.GetField('fld') == True + assert gdal.GetLastErrorMsg() != "" + assert isinstance(f.GetField("fld"), bool) + assert f.GetField("fld") == True - f.SetField('fld', '0') - f.SetField('fld', '1') + f.SetField("fld", "0") + f.SetField("fld", "1") gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - f.SetField('fld', '2') + gdal.PushErrorHandler("CPLQuietErrorHandler") + f.SetField("fld", "2") gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - assert f.GetField('fld') == True + assert gdal.GetLastErrorMsg() != "" + assert f.GetField("fld") == True gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - field_def = ogr.FieldDefn('fld', ogr.OFTString) + gdal.PushErrorHandler("CPLQuietErrorHandler") + field_def = ogr.FieldDefn("fld", ogr.OFTString) field_def.SetSubType(ogr.OFSTBoolean) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" assert field_def.GetSubType() == ogr.OFSTNone # boolean list feat_def = ogr.FeatureDefn() - field_def = ogr.FieldDefn('fld', ogr.OFTIntegerList) + field_def = ogr.FieldDefn("fld", ogr.OFTIntegerList) field_def.SetSubType(ogr.OFSTBoolean) assert field_def.GetSubType() == ogr.OFSTBoolean feat_def.AddFieldDefn(field_def) @@ -491,50 +517,50 @@ def test_ogr_basic_12(): f = ogr.Feature(feat_def) f.SetFieldIntegerList(0, [False, True]) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") f.SetFieldIntegerList(0, [0, 1, 2, 1]) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - for x in f.GetField('fld'): + assert gdal.GetLastErrorMsg() != "" + for x in f.GetField("fld"): assert isinstance(x, bool) - assert f.GetField('fld') == [False, True, True, True] + assert f.GetField("fld") == [False, True, True, True] # int16 integer feat_def = ogr.FeatureDefn() - assert ogr.GetFieldSubTypeName(ogr.OFSTInt16) == 'Int16' - field_def = ogr.FieldDefn('fld', ogr.OFTInteger) + 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) + f.SetField("fld", -32768) + f.SetField("fld", 32767) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - f.SetField('fld', -32769) + gdal.PushErrorHandler("CPLQuietErrorHandler") + f.SetField("fld", -32769) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - assert f.GetField('fld') == -32768 + assert gdal.GetLastErrorMsg() != "" + assert f.GetField("fld") == -32768 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - f.SetField('fld', 32768) + gdal.PushErrorHandler("CPLQuietErrorHandler") + f.SetField("fld", 32768) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - assert f.GetField('fld') == 32767 + assert gdal.GetLastErrorMsg() != "" + assert f.GetField("fld") == 32767 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - field_def = ogr.FieldDefn('fld', ogr.OFTString) + gdal.PushErrorHandler("CPLQuietErrorHandler") + field_def = ogr.FieldDefn("fld", ogr.OFTString) field_def.SetSubType(ogr.OFSTInt16) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + 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) + 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) @@ -542,61 +568,64 @@ def test_ogr_basic_12(): if False: # pylint: disable=using-constant-test f = ogr.Feature(feat_def) gdal.ErrorReset() - f.SetField('fld', '1.23') - assert gdal.GetLastErrorMsg() == '' + f.SetField("fld", "1.23") + assert gdal.GetLastErrorMsg() == "" gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - f.SetField('fld', 1.230000000001) + gdal.PushErrorHandler("CPLQuietErrorHandler") + f.SetField("fld", 1.230000000001) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' - if f.GetField('fld') == pytest.approx(1.23, abs=1e-8): + assert gdal.GetLastErrorMsg() != "" + if f.GetField("fld") == pytest.approx(1.23, abs=1e-8): f.DumpReadable() pytest.fail() gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - field_def = ogr.FieldDefn('fld', ogr.OFSTFloat32) + gdal.PushErrorHandler("CPLQuietErrorHandler") + field_def = ogr.FieldDefn("fld", ogr.OFSTFloat32) field_def.SetSubType(ogr.OFSTInt16) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + 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 = 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)] + 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 + f.SetField("date", val) + assert f.GetField("date") == expected_ret, val ############################################################################### @@ -605,14 +634,15 @@ def test_ogr_basic_13(): def test_ogr_basic_14(): - os.mkdir('tmp/ogr_basic_14') - os.chdir('tmp/ogr_basic_14') - ds = ogr.Open('.') - os.chdir('../..') + 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') + os.rmdir("tmp/ogr_basic_14") + ############################################################################### # Test exceptions with OGRErr return code @@ -620,7 +650,7 @@ def test_ogr_basic_14(): def test_ogr_basic_15(): - ds = ogr.Open('data/poly.shp') + ds = ogr.Open("data/poly.shp") lyr = ds.GetLayer(0) used_exceptions_before = ogr.GetUseExceptions() @@ -628,19 +658,25 @@ def test_ogr_basic_15(): 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)) + 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') + 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) @@ -660,39 +696,38 @@ def test_ogr_basic_16(): def test_ogr_basic_invalid_unicode(): - val = '\udcfc' + val = "\udcfc" try: ogr.Open(val) except: pass - data_source = ogr.GetDriverByName('Memory').CreateDataSource('') + data_source = ogr.GetDriverByName("Memory").CreateDataSource("") layer = data_source.CreateLayer("test") - layer.CreateField(ogr.FieldDefn('attr', ogr.OFTString)) + layer.CreateField(ogr.FieldDefn("attr", ogr.OFTString)) feature = ogr.Feature(layer.GetLayerDefn()) try: - feature.SetField('attr', val) + 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') + 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'] + assert lyrs == ["lyr2", "lyr3"] lyrs = [lyr.GetName() for lyr in ds[0:4]] - assert lyrs == ['lyr1', 'lyr2', 'lyr3'] + assert lyrs == ["lyr1", "lyr2", "lyr3"] lyrs = [lyr.GetName() for lyr in ds[0:3:2]] - assert lyrs == ['lyr1', 'lyr3'] + assert lyrs == ["lyr1", "lyr3"] def test_ogr_basic_feature_iterator(): @@ -712,50 +747,50 @@ def test_ogr_basic_feature_iterator(): def test_ogr_basic_dataset_copy_layer_dst_srswkt(): - ds = ogr.GetDriverByName('Memory').CreateDataSource('') - src_lyr = ds.CreateLayer('lyr1') + ds = ogr.GetDriverByName("Memory").CreateDataSource("") + src_lyr = ds.CreateLayer("lyr1") sr = osr.SpatialReference() - sr.SetFromUserInput('WGS84') + sr.SetFromUserInput("WGS84") sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) - out_lyr = ds.CopyLayer(src_lyr, 'lyr2', - options=['DST_SRSWKT=' + sr.ExportToWkt()]) + out_lyr = ds.CopyLayer(src_lyr, "lyr2", options=["DST_SRSWKT=" + sr.ExportToWkt()]) assert out_lyr.GetSpatialRef() is not None assert out_lyr.GetSpatialRef().IsSame(sr) def test_ogr_basic_field_alternative_name(): - field_defn = ogr.FieldDefn('test') + field_defn = ogr.FieldDefn("test") - assert field_defn.GetAlternativeName() == '' + assert field_defn.GetAlternativeName() == "" - field_defn.SetAlternativeName('my alias') - assert field_defn.GetAlternativeName() == 'my alias' + field_defn.SetAlternativeName("my alias") + assert field_defn.GetAlternativeName() == "my alias" def test_ogr_basic_float32_formatting(): - def cast_as_float(x): - return struct.unpack('f', struct.pack('f', x))[0] + return struct.unpack("f", struct.pack("f", x))[0] - feat_defn = ogr.FeatureDefn('test') - fldn_defn = ogr.FieldDefn('float32', ogr.OFTReal) + feat_defn = ogr.FeatureDefn("test") + fldn_defn = ogr.FieldDefn("float32", ogr.OFTReal) fldn_defn.SetSubType(ogr.OFSTFloat32) feat_defn.AddFieldDefn(fldn_defn) f = ogr.Feature(feat_defn) - for x in ('0.35', '0.15', '123.0', '0.12345678', '1.2345678e-15'): - f['float32'] = cast_as_float(float(x)) - assert f.GetFieldAsString('float32').replace('e+0', 'e+').replace('e-0', 'e-') == x - - - feat_defn = ogr.FeatureDefn('test') - fldn_defn = ogr.FieldDefn('float32_list', ogr.OFTRealList) + for x in ("0.35", "0.15", "123.0", "0.12345678", "1.2345678e-15"): + f["float32"] = cast_as_float(float(x)) + assert ( + f.GetFieldAsString("float32").replace("e+0", "e+").replace("e-0", "e-") == x + ) + + feat_defn = ogr.FeatureDefn("test") + fldn_defn = ogr.FieldDefn("float32_list", ogr.OFTRealList) fldn_defn.SetSubType(ogr.OFSTFloat32) feat_defn.AddFieldDefn(fldn_defn) f = ogr.Feature(feat_defn) - f['float32_list'] = [ cast_as_float(0.35), math.nan, math.inf, -math.inf ] - assert f.GetFieldAsString('float32_list') == '(4:0.35,nan,inf,-inf)' + f["float32_list"] = [cast_as_float(0.35), math.nan, math.inf, -math.inf] + assert f.GetFieldAsString("float32_list") == "(4:0.35,nan,inf,-inf)" + ############################################################################### # cleanup diff --git a/autotest/ogr/ogr_cad.py b/autotest/ogr/ogr_cad.py index 1abf63ef7f63..2112ce07540c 100755 --- a/autotest/ogr/ogr_cad.py +++ b/autotest/ogr/ogr_cad.py @@ -34,12 +34,11 @@ import gdaltest import ogrtest -from osgeo import gdal -from osgeo import ogr import pytest +from osgeo import gdal, ogr -pytestmark = pytest.mark.require_driver('CAD') +pytestmark = pytest.mark.require_driver("CAD") ############################################################################### # Check driver properly opens simple file, reads correct feature (ellipse). @@ -47,55 +46,61 @@ def test_ogr_cad_2(): - ds = gdal.OpenEx('data/cad/ellipse_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/ellipse_r2000.dwg", allowed_drivers=["CAD"]) assert ds is not None - assert ds.GetLayerCount() == 1, 'expected exactly one layer.' + assert ds.GetLayerCount() == 1, "expected exactly one layer." layer = ds.GetLayer(0) - assert layer.GetName() == '0', \ - 'layer name is expected to be default = 0.' + assert layer.GetName() == "0", "layer name is expected to be default = 0." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 5, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 5, ( + "did not get expected number of fields in defn. got %d" % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 1, ('did not get expected feature count, got %d' % fc) + assert fc == 1, "did not get expected feature count, got %d" % fc layer.ResetReading() feat = layer.GetNextFeature() - assert feat is not None, 'cad feature 0 get failed.' + 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.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.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.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.' + 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)) + 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 is not None, "cad geometry is None." - assert geom.GetGeometryType() == ogr.wkbLineString25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbLineString25D + ), "did not get expected geometry type." + + assert geom.GetPointCount() > 2, "cad geometry is invalid" - assert geom.GetPointCount() > 2, 'cad geometry is invalid' ############################################################################### # Check proper read of 3 layers (one circle on each) with different parameters. @@ -103,123 +108,137 @@ def test_ogr_cad_2(): def test_ogr_cad_3(): - ds = gdal.OpenEx('data/cad/triple_circles_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/triple_circles_r2000.dwg", allowed_drivers=["CAD"]) assert ds is not None - assert ds.GetLayerCount() == 3, 'expected 3 layers.' + assert ds.GetLayerCount() == 3, "expected 3 layers." # test first layer and circle layer = ds.GetLayer(0) - assert layer.GetName() == '0', \ - 'layer name is expected to be default = 0.' + assert layer.GetName() == "0", "layer name is expected to be default = 0." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 5, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 5, ( + "did not get expected number of fields in defn. got %d" % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 1, ('did not get expected feature count, got %d' % fc) + assert fc == 1, "did not get expected feature count, got %d" % fc layer.ResetReading() feat = layer.GetNextFeature() - assert feat.cadgeom_type == 'CADCircle', \ - ('cad geometry type is wrong. Expected CADCircle, got: %s' - % feat.cadgeom_type) + 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.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.' + 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)) + 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.' + assert ( + geom.GetGeometryType() == ogr.wkbCircularStringZ + ), "did not get expected geometry type." # test second layer and circle layer = ds.GetLayer(1) - assert layer.GetName() == '1', 'layer name is expected to be 1.' + assert layer.GetName() == "1", "layer name is expected to be 1." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 5, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 5, ( + "did not get expected number of fields in defn. got %d" % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 1, ('did not get expected feature count, got %d' % fc) + assert fc == 1, "did not get expected feature count, got %d" % fc layer.ResetReading() feat = layer.GetNextFeature() - assert feat.cadgeom_type == 'CADCircle', \ - ('cad geometry type is wrong. Expected CADCircle, got: %s' - % feat.cadgeom_type) + 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.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.' + 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)) + 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.' + assert ( + geom.GetGeometryType() == ogr.wkbCircularStringZ + ), "did not get expected geometry type." # test third layer and circle layer = ds.GetLayer(2) - assert layer.GetName() == '2', 'layer name is expected to be 2.' + assert layer.GetName() == "2", "layer name is expected to be 2." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 5, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 5, ( + "did not get expected number of fields in defn. got %d" % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 1, ('did not get expected feature count, got %d' % fc) + assert fc == 1, "did not get expected feature count, got %d" % fc layer.ResetReading() feat = layer.GetNextFeature() - assert feat.cadgeom_type == 'CADCircle', \ - ('cad geometry type is wrong. Expected CADCircle, got: %s' - % feat.cadgeom_type) + 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.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.' + 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)) + 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.' + assert ( + geom.GetGeometryType() == ogr.wkbCircularStringZ + ), "did not get expected geometry type." ############################################################################### @@ -228,18 +247,20 @@ def test_ogr_cad_3(): def test_ogr_cad_4(): - ds = gdal.OpenEx('data/cad/point2d_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/point2d_r2000.dwg", allowed_drivers=["CAD"]) - assert ds.GetLayerCount() == 1, 'expected exactly one layer.' + assert ds.GetLayerCount() == 1, "expected exactly one layer." layer = ds.GetLayer(0) - assert layer.GetFeatureCount() == 1, 'expected exactly one feature.' + assert layer.GetFeatureCount() == 1, "expected exactly one feature." feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT (50 50 0)'), \ - 'got feature which does not fit expectations.' + assert not ogrtest.check_feature_geometry( + feat, "POINT (50 50 0)" + ), "got feature which does not fit expectations." + ############################################################################### # Check reading of a simple line. @@ -247,18 +268,20 @@ def test_ogr_cad_4(): def test_ogr_cad_5(): - ds = gdal.OpenEx('data/cad/line_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/line_r2000.dwg", allowed_drivers=["CAD"]) - assert ds.GetLayerCount() == 1, 'expected exactly one layer.' + assert ds.GetLayerCount() == 1, "expected exactly one layer." layer = ds.GetLayer(0) - assert layer.GetFeatureCount() == 1, 'expected exactly one feature.' + assert layer.GetFeatureCount() == 1, "expected exactly one feature." feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (50 50 0,100 100 0)'), \ - 'got feature which does not fit expectations.' + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING (50 50 0,100 100 0)" + ), "got feature which does not fit expectations." + ############################################################################### # Check reading of a text (point with attached 'text' attribute, and set up @@ -267,24 +290,28 @@ def test_ogr_cad_5(): def test_ogr_cad_6(): - ds = gdal.OpenEx('data/cad/text_mtext_attdef_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/text_mtext_attdef_r2000.dwg", allowed_drivers=["CAD"]) - assert ds.GetLayerCount() == 1, 'expected exactly one layer.' + assert ds.GetLayerCount() == 1, "expected exactly one layer." layer = ds.GetLayer(0) - assert layer.GetFeatureCount() == 3, ('expected 3 features, got: %d' - % layer.GetFeatureCount()) + assert layer.GetFeatureCount() == 3, ( + "expected 3 features, got: %d" % layer.GetFeatureCount() + ) feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT(0.7413 1.7794 0)') + 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 + 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. @@ -292,18 +319,22 @@ def test_ogr_cad_6(): def test_ogr_cad_7(): - ds = gdal.OpenEx('data/cad/text_mtext_attdef_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/text_mtext_attdef_r2000.dwg", allowed_drivers=["CAD"]) layer = ds.GetLayer(0) feat = layer.GetNextFeature() feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT(2.8139 5.7963 0)') + 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)) + assert ( + feat.GetStyleString() == expected_style + ), "Got unexpected style string:\n%s\ninstead of:\n%s." % ( + feat.GetStyleString(), + expected_style, + ) + ############################################################################### # Check ATTDEF as TEXT geometry. @@ -311,19 +342,25 @@ def test_ogr_cad_7(): def test_ogr_cad_8(): - ds = gdal.OpenEx('data/cad/text_mtext_attdef_r2000.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/text_mtext_attdef_r2000.dwg", allowed_drivers=["CAD"]) layer = ds.GetLayer(0) feat = layer.GetNextFeature() feat = layer.GetNextFeature() feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT(4.98953601938918 2.62670161690571 0)') + 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)) + 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 @@ -332,7 +369,7 @@ def test_ogr_cad_8(): def test_ogr_cad_9(): with gdaltest.error_handler(): - ds = gdal.OpenEx('data/cad/AC1018_signature.dwg', allowed_drivers=['CAD']) + ds = gdal.OpenEx("data/cad/AC1018_signature.dwg", allowed_drivers=["CAD"]) assert ds is None msg = gdal.GetLastErrorMsg() - assert 'does not support this version' in msg + assert "does not support this version" in msg diff --git a/autotest/ogr/ogr_carto.py b/autotest/ogr/ogr_carto.py index 490c17ed14b0..66afe7c48dca 100755 --- a/autotest/ogr/ogr_carto.py +++ b/autotest/ogr/ogr_carto.py @@ -31,129 +31,164 @@ import uuid - import gdaltest import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import gdal, ogr, osr -pytestmark = pytest.mark.require_driver('Carto') +pytestmark = pytest.mark.require_driver("Carto") ############################################################################### # + def test_ogr_carto_vsimem(): - ogrtest.carto_api_key_ori = gdal.GetConfigOption('CARTO_API_KEY') - gdal.SetConfigOption('CARTO_API_URL', '/vsimem/carto') - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + 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.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') + 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 + gdal.FileFromMemBuffer( + "/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0", + """Content-Type: text/html\r -Error""") +Error""", + ) gdal.PushErrorHandler() - ds = ogr.Open('CARTO:foo') + ds = ogr.Open("CARTO:foo") gdal.PopErrorHandler() - assert ds is None and gdal.GetLastErrorMsg().find('HTML error page') >= 0 + 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') + 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.FileFromMemBuffer( + "/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0", """{""" + ) gdal.PushErrorHandler() - ds = ogr.Open('CARTO:foo') + ds = ogr.Open("CARTO:foo") gdal.PopErrorHandler() - assert ds is None and gdal.GetLastErrorMsg().find('JSON parsing error') >= 0 + 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') + 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.FileFromMemBuffer( + "/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0", + """{ "error" : [ "bla"] }""", + ) gdal.PushErrorHandler() - ds = ogr.Open('CARTO:foo') + 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 + 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') + 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') + 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') + 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') + 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') + 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') + 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') + 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') + 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.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') + 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.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') + 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') + 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() @@ -163,67 +198,93 @@ def test_ogr_carto_vsimem(): 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') + 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":{}}}""") + 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') + 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"}}}""") + 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': + 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.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.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') + 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() @@ -235,8 +296,9 @@ def test_ogr_carto_vsimem(): gdal.PopErrorHandler() assert f is None - gdal.FileFromMemBuffer(get_full_details_fields_url, - """{"rows":[{"attname":"strfield", "typname":"varchar", "attnotnull": true, "defaultexpr": "def_value"}, + 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"}, @@ -258,44 +320,53 @@ def test_ogr_carto_vsimem(): "dim":{"type":"number"}, "srid":{"type":"number"}, "geomtyp":{"type":"string"}, - "srtext":{"type":"string"}}}""") + "srtext":{"type":"string"}}}""", + ) - ds = ogr.Open('CARTO:foo') + 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.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).GetName() == "my_geom" assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbPoint25D - assert lyr_defn.GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 + 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.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.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"}}}""") + 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() @@ -303,45 +374,55 @@ def test_ogr_carto_vsimem(): 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.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.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() != '' + 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.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() != '' + 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.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() != '' + 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"}}}""") + 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() @@ -349,24 +430,30 @@ def test_ogr_carto_vsimem(): 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.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"}}}""") + 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"}}}""") + 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 @@ -377,9 +464,11 @@ def test_ogr_carto_vsimem(): 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"}}}""") + 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 @@ -388,48 +477,58 @@ def test_ogr_carto_vsimem(): 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"}}}""") + 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"}}}""") + 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() == '' + assert f is None and gdal.GetLastErrorMsg() == "" - lyr.SetAttributeFilter('strfield is NULL') + 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"}}}""") + 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.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() == '' + 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"}}}""") + 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) @@ -439,70 +538,84 @@ def test_ogr_carto_vsimem(): 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"}}}""") + 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)' + 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"}}}""") + 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.CreateLayer("foo") ds.DeleteLayer(0) lyr.CreateFeature(f) lyr.SetFeature(f) lyr.DeleteFeature(0) - lyr.CreateField(ogr.FieldDefn('foo')) + 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.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() != '' + assert gdal.GetLastErrorMsg() != "" - gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT cdb_cartodbfytable('my_layer')&api_key=foo""", - """{"rows":[], - "fields":{}}""") + 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') + 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) + 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":{}}""") + 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() @@ -511,23 +624,27 @@ def test_ogr_carto_vsimem(): assert ret != 0 f = None - fld_defn = ogr.FieldDefn('INTFIELD', ogr.OFTInteger) + 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":{}}""") + 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 = 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":{}}""") + 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 @@ -538,15 +655,19 @@ def test_ogr_carto_vsimem(): 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":{}}""") + 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":{}}""") + 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()) @@ -556,13 +677,15 @@ def test_ogr_carto_vsimem(): 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"}}}""") + 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 @@ -578,13 +701,17 @@ def test_ogr_carto_vsimem(): 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}""") + 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}""") + 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 @@ -594,9 +721,11 @@ def test_ogr_carto_vsimem(): 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"}}}""") + 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 @@ -605,54 +734,72 @@ def test_ogr_carto_vsimem(): 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}""") + 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}""") + 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":{}}""") + 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']) + 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 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"}}}""") + 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') + 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":{}}"""): + 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']) + 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":{}}"""): + 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 @@ -661,8 +808,9 @@ def test_ogr_carto_vsimem(): pytest.fail() # Now remove default value to strfield - gdal.FileFromMemBuffer(get_full_details_fields_url, - """{"rows":[{"attname":"strfield", "typname":"varchar"}, + gdal.FileFromMemBuffer( + get_full_details_fields_url, + """{"rows":[{"attname":"strfield", "typname":"varchar"}, {"attname":"intfield", "typname":"int4"}, {"attname":"doublefield", "typname":"float"}, {"attname":"boolfield", "typname":"bool"}, @@ -684,70 +832,97 @@ def test_ogr_carto_vsimem(): "dim":{"type":"number"}, "srid":{"type":"number"}, "geomtyp":{"type":"string"}, - "srtext":{"type":"string"}}}""") + "srtext":{"type":"string"}}}""", + ) - ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) + 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"}}}"""): + 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') + f.SetField("strfield", "bar") ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 12 f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('strfield', 'baz') + 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":{}}"""): + 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() == '' + assert gdal.GetLastErrorMsg() == "" - ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) + ds = gdal.OpenEx( + "CARTO:foo", gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=["COPY_MODE=NO"] + ) gdal.PushErrorHandler() - lyr = ds.CreateLayer('table1') + 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']) + 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))')) + 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":{}}"""): + 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']) + 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":{}}"""): + 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) + ds = ogr.Open("CARTO:foo", update=1) gdal.PushErrorHandler() ret = ds.DeleteLayer(0) @@ -755,43 +930,60 @@ def test_ogr_carto_vsimem(): assert ret != 0 gdal.ErrorReset() - ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=YES']) + 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') + lyr = ds.GetLayerByName("table1") assert lyr is not None - with gdaltest.tempfile("""/vsimem/carto/copyfrom?q=COPY%20%22table1%22%20(%22strfield%22,%22my_geom%22,%22cartodb_id%22)%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%22table1%22%20(%22strfield%22,%22my_geom%22,%22cartodb_id%22)%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%22table1%22%20(%22intfield%22,%22my_geom%22)%20FROM%20STDIN%20WITH%20(FORMAT%20text,%20ENCODING%20UTF8)&api_key=foo&POSTFIELDS=12\t0101000020E610000000000000000059400000000000005940\n\\.\n%22""","""{}"""): + with gdaltest.tempfile( + """/vsimem/carto/copyfrom?q=COPY%20%22table1%22%20(%22intfield%22,%22my_geom%22)%20FROM%20STDIN%20WITH%20(FORMAT%20text,%20ENCODING%20UTF8)&api_key=foo&POSTFIELDS=12\t0101000020E610000000000000000059400000000000005940\n\\.\n%22""", + """{}""", + ): f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('strfield', 'copytest') - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(100 100)')) + 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)')) + f.SetField("intfield", 12) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(100 100)")) assert lyr.CreateFeature(f) == 0 - ds = None # force flush + ds = None # force flush - ds = ogr.Open('CARTO:foo', update=1) + 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 + 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 + ############################################################################### # @@ -799,36 +991,45 @@ def test_ogr_carto_vsimem(): def test_ogr_carto_vsimem_cleanup(): - 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) + 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) + for f in gdal.ReadDir("/vsimem/"): + gdal.Unlink("/vsimem/" + f) ############################################################################### # Run test_ogrsf -@pytest.mark.skipif(gdaltest.is_ci(), reason='test skipped on CI due to regular failures on it due to platform limits') + +@pytest.mark.skipif( + gdaltest.is_ci(), + reason="test skipped on CI due to regular failures on it due to platform limits", +) def test_ogr_carto_test_ogrsf(): - if gdal.GetConfigOption('SKIP_SLOW') is not None: + if gdal.GetConfigOption("SKIP_SLOW") is not None: pytest.skip() - ogrtest.carto_test_server = 'https://gdalautotest2.carto.com' + ogrtest.carto_test_server = "https://gdalautotest2.carto.com" if gdaltest.gdalurlopen(ogrtest.carto_test_server) is None: - pytest.skip('cannot open %s' % ogrtest.carto_test_server) + 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"') + 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 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test if driver is available @@ -836,11 +1037,11 @@ def test_ogr_carto_test_ogrsf(): def ogr_carto_rw_init(): - ogrtest.carto_connection = gdal.GetConfigOption('CARTO_CONNECTION') + 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') + pytest.skip("CARTO_CONNECTION missing") + if gdal.GetConfigOption("CARTO_API_KEY") is None: + pytest.skip("CARTO_API_KEY missing") ############################################################################### @@ -852,7 +1053,7 @@ def ogr_carto_rw_1(): ds = ogr.Open(ogrtest.carto_connection, update=1) assert ds is not None - a_uuid = str(uuid.uuid1()).replace('-', '_') + a_uuid = str(uuid.uuid1()).replace("-", "_") lyr_name = "LAYER_" + a_uuid # No-op @@ -878,19 +1079,19 @@ def ogr_carto_rw_1(): 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)')) + 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)')) + 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() @@ -907,17 +1108,19 @@ def ogr_carto_rw_1(): lyr = ds.GetLayerByName(lyr_name) found = False for i in range(lyr.GetLayerDefn().GetFieldCount()): - if lyr.GetLayerDefn().GetFieldDefn(i).GetName() == 'strfield': + 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)': + 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() @@ -942,16 +1145,18 @@ def ogr_carto_rw_1(): # 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)')) + 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) + 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'): + if not f.GetField(0).startswith("POINT"): ds.ExecuteSQL("DELLAYER:" + lyr_name) ds.ReleaseResultSet(sql_lyr) pytest.fail() @@ -967,16 +1172,16 @@ def ogr_carto_rw_1(): fd.SetNullable(0) lyr.CreateField(fd) - field_defn = ogr.FieldDefn('field_string', ogr.OFTString) + 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 = 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') + f.SetField("not_nullable", "foo") lyr.CreateFeature(f) f = None @@ -985,27 +1190,49 @@ def ogr_carto_rw_1(): ds = ogr.Open(ogrtest.carto_connection, update=1) lyr = ds.GetLayerByName(lyr_name) - if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('nullable')).IsNullable() != 1: + 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: + 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'": + 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': + 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'): + 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, diff --git a/autotest/ogr/ogr_csv.py b/autotest/ogr/ogr_csv.py index b5aa520edbfa..3521be9f715a 100755 --- a/autotest/ogr/ogr_csv.py +++ b/autotest/ogr/ogr_csv.py @@ -31,28 +31,28 @@ import gdaltest import ogrtest -from osgeo import ogr -from osgeo import osr -from osgeo import gdal import pytest +from osgeo import gdal, ogr, osr + ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): yield try: - gdal.PushErrorHandler('CPLQuietErrorHandler') - ogr.GetDriverByName('CSV').DeleteDataSource('tmp/csvwrk') + 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.PushErrorHandler("CPLQuietErrorHandler") + ogr.GetDriverByName("CSV").DeleteDataSource("tmp/ogr_csv_29") gdal.PopErrorHandler() except: pass @@ -61,48 +61,54 @@ def startup_and_cleanup(): ############################################################################### # 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'] + expect = ["8901", "8902", "8903", "8904"] - tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) + 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'] + 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) + 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(): - csv_ds = ogr.Open('data/prime_meridian.csv') + csv_ds = ogr.Open("data/prime_meridian.csv") with gdaltest.error_handler(): - assert csv_ds.CreateLayer('foo') is None + assert csv_ds.CreateLayer("foo") is None assert csv_ds.DeleteLayer(0) != 0 - lyr = csv_ds.GetLayerByName('prime_meridian') + lyr = csv_ds.GetLayerByName("prime_meridian") f = ogr.Feature(lyr.GetLayerDefn()) with gdaltest.error_handler(): - assert lyr.CreateField(ogr.FieldDefn('foo')) != 0 + assert lyr.CreateField(ogr.FieldDefn("foo")) != 0 assert lyr.CreateFeature(f) != 0 ogr_csv_check_layer(lyr, False) + ############################################################################### # Copy layer @@ -118,16 +124,20 @@ def ogr_csv_copy_layer(csv_ds, csv_tmpds, layer_name, options): ####################################################### # Setup Schema - ogrtest.quick_create_layer_def(new_lyr, - [('PRIME_MERIDIAN_CODE', ogr.OFTInteger), - ('INFORMATION_SOURCE', ogr.OFTString)]) + 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 = csv_ds.GetLayerByName('prime_meridian') + srclyr = csv_ds.GetLayerByName("prime_meridian") srclyr.ResetReading() feat = srclyr.GetNextFeature() @@ -141,37 +151,37 @@ def ogr_csv_copy_layer(csv_ds, csv_tmpds, layer_name, options): return new_lyr + ############################################################################### # Copy prime_meridian.csv to a new subtree under the tmp directory. def test_ogr_csv_3(): - csv_ds = ogr.Open('data/prime_meridian.csv') + csv_ds = ogr.Open("data/prime_meridian.csv") ####################################################### # Ensure any old copy of our working datasource is cleaned up try: - gdal.PushErrorHandler('CPLQuietErrorHandler') - ogr.GetDriverByName('CSV').DeleteDataSource('tmp/csvwrk') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ogr.GetDriverByName("CSV").DeleteDataSource("tmp/csvwrk") gdal.PopErrorHandler() except: pass ####################################################### # Create CSV datasource (directory) - csv_tmpds = \ - ogr.GetDriverByName('CSV').CreateDataSource('tmp/csvwrk') + csv_tmpds = ogr.GetDriverByName("CSV").CreateDataSource("tmp/csvwrk") ####################################################### # Create layer (.csv file) - csv_lyr1 = ogr_csv_copy_layer(csv_ds, csv_tmpds, 'pm1', None) + csv_lyr1 = ogr_csv_copy_layer(csv_ds, csv_tmpds, "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 csv_lyr1.TestCapability(ogr.OLCCreateField) == 0 - field_defn = ogr.FieldDefn('dummy', ogr.OFTString) - gdal.PushErrorHandler('CPLQuietErrorHandler') + field_defn = ogr.FieldDefn("dummy", ogr.OFTString) + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = csv_lyr1.CreateField(field_defn) gdal.PopErrorHandler() assert ret != 0 @@ -183,18 +193,26 @@ def test_ogr_csv_3(): ogr_csv_check_layer(csv_lyr1, True) + ############################################################################### # Copy prime_meridian.csv again, in CRLF mode. def test_ogr_csv_5(): - csv_ds = ogr.Open('data/prime_meridian.csv') - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) + csv_ds = ogr.Open("data/prime_meridian.csv") + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) ####################################################### # Create layer (.csv file) - csv_lyr2 = ogr_csv_copy_layer(csv_ds, csv_tmpds, 'pm2', ['LINEFORMAT=CRLF', ]) + csv_lyr2 = ogr_csv_copy_layer( + csv_ds, + csv_tmpds, + "pm2", + [ + "LINEFORMAT=CRLF", + ], + ) ############################################################################### # Verify the some attributes read properly. @@ -202,6 +220,7 @@ def test_ogr_csv_5(): return ogr_csv_check_layer(csv_lyr2, True) + ############################################################################### # Delete a layer and verify it seems to have worked properly. # @@ -209,27 +228,29 @@ def test_ogr_csv_5(): def test_ogr_csv_7(): - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) idx = 0 while idx < csv_tmpds.GetLayerCount(): lyr = csv_tmpds.GetLayer(idx) - if lyr.GetName() == 'pm1': + if lyr.GetName() == "pm1": break idx += 1 - assert lyr.GetName() == 'pm1', 'unexpected name for first layer' + assert lyr.GetName() == "pm1", "unexpected name for first layer" err = csv_tmpds.DeleteLayer(idx) - assert err == 0, 'got error code from DeleteLayer' + assert err == 0, "got error code from DeleteLayer" - assert csv_tmpds.GetLayerCount() == 1 and csv_tmpds.GetLayer(0).GetName() == 'pm2', \ - 'Layer not destroyed properly?' + assert ( + csv_tmpds.GetLayerCount() == 1 and csv_tmpds.GetLayer(0).GetName() == "pm2" + ), "Layer not destroyed properly?" with gdaltest.error_handler(): assert csv_tmpds.DeleteLayer(-1) != 0 assert csv_tmpds.DeleteLayer(csv_tmpds.GetLayerCount()) != 0 + ############################################################################### # Reopen and append a record then close. # @@ -237,17 +258,18 @@ def test_ogr_csv_7(): def test_ogr_csv_8(): - ds = ogr.Open('tmp/csvwrk', update=1) + ds = ogr.Open("tmp/csvwrk", update=1) lyr = ds.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') + feat.SetField("PRIME_MERIDIAN_CODE", "7000") + feat.SetField("INFORMATION_SOURCE", "This is a newline test\n") lyr.CreateFeature(feat) + ############################################################################### # Verify the some attributes read properly. # @@ -255,25 +277,29 @@ def test_ogr_csv_8(): def test_ogr_csv_9(): - ds = ogr.Open('tmp/csvwrk', update=1) + ds = ogr.Open("tmp/csvwrk", update=1) lyr = ds.GetLayer(0) - expect = ['8901', '8902', '8903', '8904', '7000'] + expect = ["8901", "8902", "8903", "8904", "7000"] - tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) + 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'] + 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) + tr = ogrtest.check_features_against_list(lyr, "INFORMATION_SOURCE", expect) assert tr + ############################################################################### # Verify some capabilities and related stuff. # @@ -281,44 +307,54 @@ def test_ogr_csv_9(): def test_ogr_csv_10(): - csv_ds = ogr.Open('data/prime_meridian.csv') - lyr = csv_ds.GetLayerByName('prime_meridian') + csv_ds = ogr.Open("data/prime_meridian.csv") + lyr = csv_ds.GetLayerByName("prime_meridian") - assert not lyr.TestCapability('SequentialWrite'), \ - 'should not have write access to readonly layer' + 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("RandomRead"), ( + "CSV files do not efficiently support " "random reading." + ) - assert not lyr.TestCapability('FastGetExtent'), 'CSV files do not support getextent' + 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 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( + "DeleteDataSource" + ), "CSV files do support DeleteDataSource" - assert ogr.GetDriverByName('CSV').TestCapability('CreateDataSource'), \ - 'CSV files do support CreateDataSource' + assert ogr.GetDriverByName("CSV").TestCapability( + "CreateDataSource" + ), "CSV files do support CreateDataSource" - assert not csv_ds.TestCapability('CreateLayer'), \ - 'readonly datasource should not CreateLayer' + assert not csv_ds.TestCapability( + "CreateLayer" + ), "readonly datasource should not CreateLayer" - assert not csv_ds.TestCapability('DeleteLayer'), \ - 'should not have deletelayer on readonly ds.' + assert not csv_ds.TestCapability( + "DeleteLayer" + ), "should not have deletelayer on readonly ds." - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) lyr = csv_tmpds.GetLayer(0) - assert lyr.TestCapability('SequentialWrite'), \ - 'should have write access to updatable layer' + assert lyr.TestCapability( + "SequentialWrite" + ), "should have write access to updatable layer" - assert csv_tmpds.TestCapability('CreateLayer'), \ - 'should have createlayer on updatable ds.' + assert csv_tmpds.TestCapability( + "CreateLayer" + ), "should have createlayer on updatable ds." + + assert csv_tmpds.TestCapability( + "DeleteLayer" + ), "should have deletelayer on updatable ds." - assert csv_tmpds.TestCapability('DeleteLayer'), \ - 'should have deletelayer on updatable ds.' ############################################################################### @@ -328,62 +364,69 @@ def ogr_csv_check_testcsvt(lyr): lyr.ResetReading() expect = [12, None] - tr = ogrtest.check_features_against_list(lyr, 'INTCOL', expect) + 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) + tr = ogrtest.check_features_against_list(lyr, "REALCOL", expect) assert tr lyr.ResetReading() - expect = ['foo', ''] - tr = ogrtest.check_features_against_list(lyr, 'STRINGCOL', expect) + 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' + assert feat.GetFieldAsString("DATETIME") == "2008/12/25 11:22:33" feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('DATETIME') == '' + assert feat.GetFieldAsString("DATETIME") == "" lyr.ResetReading() feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('DATE') == '2008/12/25' + assert feat.GetFieldAsString("DATE") == "2008/12/25" feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('DATE') == '' + assert feat.GetFieldAsString("DATE") == "" lyr.ResetReading() feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('TIME') == '11:22:33' + assert feat.GetFieldAsString("TIME") == "11:22:33" feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('TIME') == '' + assert feat.GetFieldAsString("TIME") == "" - assert lyr.GetLayerDefn().GetFieldDefn(0).GetWidth() == 5, \ - 'Field 0 : expecting width = 5' + 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).GetWidth() == 10 + ), "Field 1 : expecting width = 10" - assert lyr.GetLayerDefn().GetFieldDefn(1).GetPrecision() == 7, \ - 'Field 1 : expecting precision = 7' + 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(2).GetWidth() == 15 + ), "Field 2 : expecting width = 15" - assert lyr.GetLayerDefn().GetFieldDefn(6).GetType() == ogr.OFTDateTime, \ - 'Field DATETIME : wrong type' + 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(7).GetType() == ogr.OFTDate + ), "Field DATETIME : wrong type" - assert lyr.GetLayerDefn().GetFieldDefn(8).GetType() == ogr.OFTTime, \ - 'Field DATETIME : wrong type' + assert ( + lyr.GetLayerDefn().GetFieldDefn(8).GetType() == ogr.OFTTime + ), "Field DATETIME : wrong type" lyr.ResetReading() @@ -392,36 +435,40 @@ def ogr_csv_check_testcsvt(lyr): # Verify handling of csvt with width and precision specified # Test NULL handling of non string columns too (#2756) + def test_ogr_csv_11(): - csv_ds = ogr.Open('data/csv/testcsvt.csv') + csv_ds = ogr.Open("data/csv/testcsvt.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testcsvt') + lyr = csv_ds.GetLayerByName("testcsvt") return ogr_csv_check_testcsvt(lyr) + ############################################################################### # Verify CREATE_CSVT=YES option def test_ogr_csv_12(): - csv_ds = ogr.Open('data/csv/testcsvt.csv') - srclyr = csv_ds.GetLayerByName('testcsvt') + csv_ds = ogr.Open("data/csv/testcsvt.csv") + srclyr = csv_ds.GetLayerByName("testcsvt") ####################################################### # Create layer (.csv file) - options = ['CREATE_CSVT=YES', ] - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) - csv_lyr2 = csv_tmpds.CreateLayer('testcsvt_copy', options=options) + options = [ + "CREATE_CSVT=YES", + ] + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) + csv_lyr2 = 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") csv_lyr2.CreateField(field_defn) gdal.PopErrorHandler() @@ -441,187 +488,197 @@ def test_ogr_csv_12(): feat = srclyr.GetNextFeature() with gdaltest.error_handler(): - assert csv_tmpds.CreateLayer('testcsvt_copy') is None + assert csv_tmpds.CreateLayer("testcsvt_copy") is None ####################################################### # Closes everything and reopen csv_tmpds = None csv_ds = None - csv_ds = ogr.Open('tmp/csvwrk/testcsvt_copy.csv') + csv_ds = ogr.Open("tmp/csvwrk/testcsvt_copy.csv") ####################################################### # Checks copy assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testcsvt_copy') + lyr = 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(): - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) # AS_WKT - options = ['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES'] - lyr = csv_tmpds.CreateLayer('as_wkt', options=options) + options = ["GEOMETRY=AS_WKT", "CREATE_CSVT=YES"] + lyr = csv_tmpds.CreateLayer("as_wkt", options=options) - field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) + 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') + 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 = csv_tmpds.CreateLayer('as_wkt_no_field', options=options) + options = ["GEOMETRY=AS_WKT", "CREATE_CSVT=YES"] + lyr = 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)')) + dst_feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 2)")) lyr.CreateFeature(dst_feat) # AS_XY - options = ['GEOMETRY=AS_XY', 'CREATE_CSVT=YES'] - lyr = csv_tmpds.CreateLayer('as_xy', options=options) + options = ["GEOMETRY=AS_XY", "CREATE_CSVT=YES"] + lyr = csv_tmpds.CreateLayer("as_xy", options=options) - field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) + 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') + 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') + 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 = csv_tmpds.CreateLayer('as_yx', options=options) + options = ["GEOMETRY=AS_YX", "CREATE_CSVT=YES"] + lyr = csv_tmpds.CreateLayer("as_yx", options=options) - field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) + 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') + 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 = csv_tmpds.CreateLayer('as_xyz', options=options) + options = ["GEOMETRY=AS_XYZ", "CREATE_CSVT=YES"] + lyr = csv_tmpds.CreateLayer("as_xyz", options=options) - field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) + 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') + dst_feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 2 3)")) + dst_feat.SetField("ADATA", "avalue") lyr.CreateFeature(dst_feat) ####################################################### # Closes everything and reopen csv_tmpds = None - csv_tmpds = ogr.Open('tmp/csvwrk') + csv_tmpds = ogr.Open("tmp/csvwrk") # Test AS_WKT - lyr = csv_tmpds.GetLayerByName('as_wkt') + lyr = csv_tmpds.GetLayerByName("as_wkt") - expect = ['POINT (1 2)'] - tr = ogrtest.check_features_against_list(lyr, 'WKT', expect) + 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) + expect = ["avalue"] + tr = ogrtest.check_features_against_list(lyr, "ADATA", expect) assert tr # Test as_wkt_no_field - lyr = csv_tmpds.GetLayerByName('as_wkt_no_field') + lyr = csv_tmpds.GetLayerByName("as_wkt_no_field") - expect = ['POINT (1 2)'] - tr = ogrtest.check_features_against_list(lyr, 'WKT', expect) + expect = ["POINT (1 2)"] + tr = ogrtest.check_features_against_list(lyr, "WKT", expect) assert tr # Test AS_XY - lyr = csv_tmpds.GetLayerByName('as_xy') + lyr = csv_tmpds.GetLayerByName("as_xy") - assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'X' + assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == "X" expect = [1, None] - tr = ogrtest.check_features_against_list(lyr, 'X', expect) + 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) + 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) + expect = ["avalue", "avalue"] + tr = ogrtest.check_features_against_list(lyr, "ADATA", expect) assert tr # Test AS_YX - lyr = csv_tmpds.GetLayerByName('as_yx') + lyr = csv_tmpds.GetLayerByName("as_yx") - assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'Y' + assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == "Y" expect = [1] - tr = ogrtest.check_features_against_list(lyr, 'X', expect) + tr = ogrtest.check_features_against_list(lyr, "X", expect) assert tr lyr.ResetReading() expect = [2] - tr = ogrtest.check_features_against_list(lyr, 'Y', expect) + tr = ogrtest.check_features_against_list(lyr, "Y", expect) assert tr # Test AS_XYZ - lyr = csv_tmpds.GetLayerByName('as_xyz') + lyr = csv_tmpds.GetLayerByName("as_xyz") - assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'X' + assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == "X" expect = [1] - tr = ogrtest.check_features_against_list(lyr, 'X', expect) + tr = ogrtest.check_features_against_list(lyr, "X", expect) assert tr lyr.ResetReading() expect = [2] - tr = ogrtest.check_features_against_list(lyr, 'Y', expect) + tr = ogrtest.check_features_against_list(lyr, "Y", expect) assert tr lyr.ResetReading() expect = [3] - tr = ogrtest.check_features_against_list(lyr, 'Z', expect) + 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(): - csv_tmpds = ogr.Open('tmp/csvwrk', update=1) - csv_ds = ogr.Open('data/prime_meridian.csv') + csv_tmpds = ogr.Open("tmp/csvwrk", update=1) + csv_ds = ogr.Open("data/prime_meridian.csv") ####################################################### # Create layer (.csv file) - csv_lyr1 = ogr_csv_copy_layer(csv_ds, csv_tmpds, 'pm3', ['SEPARATOR=SEMICOLON', ]) + csv_lyr1 = ogr_csv_copy_layer( + csv_ds, + csv_tmpds, + "pm3", + [ + "SEPARATOR=SEMICOLON", + ], + ) ogr_csv_check_layer(csv_lyr1, True) + ############################################################################### # Close the file and check again # @@ -629,11 +686,12 @@ def test_ogr_csv_14(): def test_ogr_csv_16(): - ds = ogr.Open('tmp/csvwrk') - csv_lyr1 = ds.GetLayerByName('pm3') + ds = ogr.Open("tmp/csvwrk") + csv_lyr1 = ds.GetLayerByName("pm3") return ogr_csv_check_layer(csv_lyr1, False) + ############################################################################### # Verify that WKT field treated as geometry. # @@ -641,99 +699,122 @@ def test_ogr_csv_16(): def test_ogr_csv_17(): - csv_ds = ogr.Open('data/wkt.csv') + 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.' + 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 ( + 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))') + 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))') + 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')) + 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.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(): - csv_ds = ogr.Open('data/csv/testnull.csv') + csv_ds = ogr.Open("data/csv/testnull.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testnull') + lyr = csv_ds.GetLayerByName("testnull") lyr.ResetReading() with gdaltest.error_handler(): - assert ogrtest.check_features_against_list(lyr, 'INTCOL', [12]) + assert ogrtest.check_features_against_list(lyr, "INTCOL", [12]) lyr.ResetReading() - assert ogrtest.check_features_against_list(lyr, 'REALCOL', [5.7]) + assert ogrtest.check_features_against_list(lyr, "REALCOL", [5.7]) lyr.ResetReading() - assert ogrtest.check_features_against_list(lyr, 'INTCOL2', [None]) + assert ogrtest.check_features_against_list(lyr, "INTCOL2", [None]) lyr.ResetReading() - assert ogrtest.check_features_against_list(lyr, 'REALCOL2', [None]) + assert ogrtest.check_features_against_list(lyr, "REALCOL2", [None]) lyr.ResetReading() - assert ogrtest.check_features_against_list(lyr, 'STRINGCOL', ['foo']) + assert ogrtest.check_features_against_list(lyr, "STRINGCOL", ["foo"]) ############################################################################### # Verify handling of column names with numbers + def test_ogr_csv_20(): - csv_ds = ogr.Open('data/csv/testnumheader1.csv') + csv_ds = ogr.Open("data/csv/testnumheader1.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testnumheader1') + lyr = 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]))) - - csv_ds = ogr.Open('data/csv/testnumheader2.csv') + 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]), + ) + + csv_ds = ogr.Open("data/csv/testnumheader2.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testnumheader2') + lyr = 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]))) + 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) @@ -741,55 +822,62 @@ def test_ogr_csv_20(): def test_ogr_csv_21(): - - csv_ds = ogr.Open('data/csv/testquoteheader1.csv') + csv_ds = ogr.Open("data/csv/testquoteheader1.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testquoteheader1') + lyr = csv_ds.GetLayerByName("testquoteheader1") assert lyr is not None lyr.ResetReading() - expect = ['test', '2000', '2000.12'] + 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]))) + assert got == expect[i], "column %d got name %s expected %s" % ( + i, + str(got), + str(expect[i]), + ) - csv_ds = ogr.Open('data/csv/testquoteheader2.csv') + csv_ds = ogr.Open("data/csv/testquoteheader2.csv") assert csv_ds is not None - lyr = csv_ds.GetLayerByName('testquoteheader2') + lyr = csv_ds.GetLayerByName("testquoteheader2") assert lyr is not None lyr.ResetReading() - expect = ['field_1', 'field_2', 'field_3'] + 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]))) + 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/csv_with_utf8_bom.csv') + ds = ogr.Open("data/csv/csv_with_utf8_bom.csv") lyr = ds.GetLayer(0) fld0_name = lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef() - assert fld0_name == 'id', 'bad field name' + 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)) + 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.SetField("foo", 123) + feat.SetField("bar", "baz") + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") feat.SetGeometry(geom) lyr.CreateFeature(feat) @@ -797,18 +885,18 @@ def test_ogr_csv_23(): lyr = None ds = None - data = open('tmp/csvwrk/utf8.csv', 'rb').read() - assert data[:6] == b'\xef\xbb\xbfWKT', "No UTF8 BOM header on output" + data = open("tmp/csvwrk/utf8.csv", "rb").read() + assert data[:6] == b"\xef\xbb\xbfWKT", "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)) + 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.SetField("foo", 123) + feat.SetField("bar", "baz") + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") feat.SetGeometry(geom) lyr.CreateFeature(feat) @@ -816,8 +904,9 @@ def test_ogr_csv_23(): lyr = None ds = None - data = open('tmp/csvwrk/utf8no.csv', 'rb').read() - assert data[:3] != '\xef\xbb\xbfWKT', "Found UTF8 BOM header on output!" + 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 @@ -826,44 +915,47 @@ def test_ogr_csv_23(): def test_ogr_csv_24(): # Create an invalid CSV file - f = gdal.VSIFOpenL('/vsimem/invalid.csv', 'wb') + 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)) + 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') + feat.SetField(0, "bar") lyr.CreateFeature(feat) feat = None lyr = None ds = None - ds = ogr.Open('/vsimem/single.csv') + ds = ogr.Open("/vsimem/single.csv") lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 1 feat = lyr.GetNextFeature() - assert feat.GetField(0) == '' + assert feat.GetField(0) == "" feat = lyr.GetNextFeature() - assert feat.GetField(0) == 'bar' + assert feat.GetField(0) == "bar" ds = None - gdal.Unlink('/vsimem/single.csv') - gdal.Unlink('/vsimem/invalid.csv') + 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)) + 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:') + feat.SetField("foo", "windows newline:\r\nlinux newline:\nend of string:") lyr.CreateFeature(feat) feat = None @@ -872,38 +964,44 @@ def test_ogr_csv_25(): 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))) + 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... + 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 = ogr.FieldDefn("foo", ogr.OFTReal) field.SetWidth(50) field.SetPrecision(25) lyr.CreateField(field) feature = ogr.Feature(lyr.GetLayerDefn()) - feature.SetField('foo', 10.5) + feature.SetField("foo", 10.5) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetField('foo', 10.5) + feat.SetField("foo", 10.5) lyr.CreateFeature(feat) feat = None lyr = None ds = None - EXPECTED = 'foo,\n10.5000000000000000000000000\n' + 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)) - 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 @@ -911,19 +1009,21 @@ def test_ogr_csv_26(): def test_ogr_csv_27(): - ds = ogr.Open('data/csv/test_eurostat.tsv') + ds = ogr.Open("data/csv/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)] + 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) @@ -932,14 +1032,16 @@ def test_ogr_csv_27(): 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'): + 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() @@ -950,20 +1052,21 @@ def test_ogr_csv_27(): def test_ogr_csv_28(): - f = open('tmp/ogr_csv_28.csv', 'wb') - f.write('1,2\n'.encode('ascii')) + 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) + 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 = open("tmp/ogr_csv_28.csv", "rb") + data = f.read().decode("ascii") f.close() - os.unlink('tmp/ogr_csv_28.csv') + os.unlink("tmp/ogr_csv_28.csv") + + assert data == "1,2\n" - assert data == '1,2\n' ############################################################################### # Check multi geometry field support @@ -971,41 +1074,57 @@ def test_ogr_csv_28(): def test_ogr_csv_29(): - ds = ogr.GetDriverByName('CSV').CreateDataSource('tmp/ogr_csv_29', options=['GEOMETRY=AS_WKT']) + 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 + 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 + 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') + 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))')) + 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') + 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' + assert srs.GetAuthorityCode(None) == "4326" srs = lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef() - assert srs.GetAuthorityCode(None) == '32632' + assert srs.GetAuthorityCode(None) == "32632" feat = lyr.GetNextFeature() - geom = feat.GetGeomFieldRef('geom__WKT_lyr1_EPSG_4326') - if geom.ExportToWkt() != 'POINT (1 2)': + 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))': + 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 @@ -1013,12 +1132,16 @@ def test_ogr_csv_29(): 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') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " tmp/ogr_csv_29" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Read geonames.org allCountries.txt @@ -1026,22 +1149,26 @@ def test_ogr_csv_30(): def test_ogr_csv_31(): - ds = ogr.Open('data/csv/allCountries.txt') + ds = ogr.Open("data/csv/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)': + 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': + if f.GetField("GEONAMEID") != "3038814": f.DumpReadable() pytest.fail() assert lyr.GetFeatureCount() == 10 + ############################################################################### # Test AUTODETECT_TYPE=YES @@ -1049,145 +1176,349 @@ def test_ogr_csv_31(): def test_ogr_csv_32(): # Without limit, everything will be detected as string - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES']) + ds = gdal.OpenEx( + "data/csv/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'] + 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 if i != 1 else ogr.OFTReal) and \ - lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) + assert ( + lyr.GetLayerDefn().GetFieldDefn(i).GetType() + == (ogr.OFTString if i != 1 else ogr.OFTReal) + and lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0 + ) if str(f.GetField(i)) != col_values[i]: f.DumpReadable() - pytest.fail('Field %d' % i) + pytest.fail("Field %d" % i) # Without limit, everything will be detected as string def check_size_limit_0(): - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=0']) + ds = gdal.OpenEx( + "data/csv/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 if i != 1 else ogr.OFTReal) and \ - lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) + assert ( + lyr.GetLayerDefn().GetFieldDefn(i).GetType() + == (ogr.OFTString if i != 1 else ogr.OFTReal) + and lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0 + ) if str(f.GetField(i)) != col_values[i]: f.DumpReadable() - pytest.fail('Field %d' % i) + pytest.fail("Field %d" % i) check_size_limit_0() - with gdaltest.config_option('OGR_CSV_SIMULATE_VSISTDIN', 'YES'): - with gdaltest.error_handler(): # a warning will be emitted + with gdaltest.config_option("OGR_CSV_SIMULATE_VSISTDIN", "YES"): + with gdaltest.error_handler(): # a warning will be emitted check_size_limit_0() # We limit to the first "1.5" line def check_size_limit_300_quote_fields(): - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=300', 'QUOTED_FIELDS_AS_STRING=YES']) + ds = gdal.OpenEx( + "data/csv/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'] + 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) + 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('Field %d' % i) + pytest.fail("Field %d" % i) check_size_limit_300_quote_fields() - with gdaltest.config_option('OGR_CSV_SIMULATE_VSISTDIN', 'YES'): + with gdaltest.config_option("OGR_CSV_SIMULATE_VSISTDIN", "YES"): check_size_limit_300_quote_fields() # Without QUOTED_FIELDS_AS_STRING=YES, str3 will be detected as integer - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=300']) + ds = gdal.OpenEx( + "data/csv/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 + assert ( + lyr.GetLayerDefn() + .GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex("str3")) + .GetType() + == ogr.OFTInteger + ) # We limit to the first 2 lines - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'QUOTED_FIELDS_AS_STRING=YES']) + ds = gdal.OpenEx( + "data/csv/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'] + 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) + 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('Field %d' % i) + pytest.fail("Field %d" % i) # Test AUTODETECT_WIDTH=YES - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=YES', 'QUOTED_FIELDS_AS_STRING=YES']) + ds = gdal.OpenEx( + "data/csv/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_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]), lyr.GetLayerDefn().GetFieldDefn(i).GetName() + 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] + ), (lyr.GetLayerDefn().GetFieldDefn(i).GetName()) if f.GetField(i) != col_values[i]: f.DumpReadable() - pytest.fail('Field %d' % i) + pytest.fail("Field %d" % i) # Test AUTODETECT_WIDTH=STRING_ONLY - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=STRING_ONLY', 'QUOTED_FIELDS_AS_STRING=YES']) + ds = gdal.OpenEx( + "data/csv/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]) + 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('Field %d' % i) + pytest.fail("Field %d" % i) # Test KEEP_SOURCE_COLUMNS=YES - ds = gdal.OpenEx('data/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'KEEP_SOURCE_COLUMNS=YES', 'QUOTED_FIELDS_AS_STRING=YES']) + ds = gdal.OpenEx( + "data/csv/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'] + 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') + 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('Field %d' % i) + pytest.fail("Field %d" % 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/csv/testtypeautodetect.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=YES']) + 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/csv/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') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr.GetFeature(fid) gdal.PopErrorHandler() if gdal.GetLastErrorType() != gdal.CE_Warning: @@ -1195,44 +1526,60 @@ def check_size_limit_300_quote_fields(): pytest.fail(fid) # Test Real -> Integer64 (https://github.com/OSGeo/gdal/issues/343) - gdal.FileFromMemBuffer('/vsimem/testtypeautodetect.csv', - """foo,bar + 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') +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 AUTODETECT_TYPE=YES on string content only def test_ogr_csv_autodetect_type_only_strings(): - # Without AUTODETECT_WIDTH - ds = gdal.OpenEx('data/csv/only_strings.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES']) + ds = gdal.OpenEx( + "data/csv/only_strings.csv", + gdal.OF_VECTOR, + open_options=["AUTODETECT_TYPE=YES"], + ) lyr = ds.GetLayer(0) for i in range(lyr.GetLayerDefn().GetFieldCount()): - assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString, lyr.GetLayerDefn().GetFieldDefn(i).GetName() + assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString, ( + lyr.GetLayerDefn().GetFieldDefn(i).GetName() + ) # With AUTODETECT_WIDTH=YES - ds = gdal.OpenEx('data/csv/only_strings.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_WIDTH=YES']) + ds = gdal.OpenEx( + "data/csv/only_strings.csv", + gdal.OF_VECTOR, + open_options=["AUTODETECT_TYPE=YES", "AUTODETECT_WIDTH=YES"], + ) lyr = ds.GetLayer(0) - col_width = [4, 3, 4] + col_width = [4, 3, 4] col_precision = [0, 0, 0] for i in range(lyr.GetLayerDefn().GetFieldCount()): - assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString and \ - lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == col_width[i] and \ - lyr.GetLayerDefn().GetFieldDefn(i).GetPrecision() == col_precision[i]), lyr.GetLayerDefn().GetFieldDefn(i).GetName() + assert ( + lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString + and lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == col_width[i] + and lyr.GetLayerDefn().GetFieldDefn(i).GetPrecision() == col_precision[i] + ), (lyr.GetLayerDefn().GetFieldDefn(i).GetName()) + ############################################################################### # Test Boolean, Int16 and Float32 support @@ -1240,28 +1587,36 @@ def test_ogr_csv_autodetect_type_only_strings(): def test_ogr_csv_33(): - ds = gdal.OpenEx('data/csv/testtypeautodetectboolean.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES']) + ds = gdal.OpenEx( + "data/csv/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'] + 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)) + 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('Field %d' % i) + pytest.fail("Field %d" % 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) + 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 = ogr.FieldDefn("int16", ogr.OFTInteger) fld.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld) - fld = ogr.FieldDefn('float32', ogr.OFTReal) + fld = ogr.FieldDefn("float32", ogr.OFTReal) fld.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld) f = ogr.Feature(lyr.GetLayerDefn()) @@ -1272,22 +1627,29 @@ def test_ogr_csv_33(): f = None ds = None - ds = ogr.Open('/vsimem/subtypes.csv') + 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) + 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') + gdal.Unlink("/vsimem/subtypes.csv") + gdal.Unlink("/vsimem/subtypes.csvt") + ############################################################################### # Test Integer64 support @@ -1295,26 +1657,29 @@ def test_ogr_csv_33(): def test_ogr_csv_34(): - ds = gdal.OpenEx('data/csv/testtypeautodetectinteger64.csv', gdal.OF_VECTOR, - open_options=['AUTODETECT_TYPE=YES']) + ds = gdal.OpenEx( + "data/csv/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('Field %d' % i) + pytest.fail("Field %d" % 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('Field %d' % i) + pytest.fail("Field %d" % 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) + 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) @@ -1322,7 +1687,7 @@ def test_ogr_csv_34(): f = None ds = None - ds = ogr.Open('/vsimem/int64.csv') + ds = ogr.Open("/vsimem/int64.csv") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField(0) != 10000000000: @@ -1330,8 +1695,9 @@ def test_ogr_csv_34(): pytest.fail() ds = None - gdal.Unlink('/vsimem/int64.csv') - gdal.Unlink('/vsimem/int64.csvt') + gdal.Unlink("/vsimem/int64.csv") + gdal.Unlink("/vsimem/int64.csvt") + ############################################################################### # Test comma separator @@ -1339,39 +1705,43 @@ def test_ogr_csv_34(): def test_ogr_csv_35(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_35.csv', - """FIELD_1 "FIELD 2" FIELD_3 + 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']) + 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': + 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') + 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)) + 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') + 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') + 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') + gdal.Unlink("/vsimem/ogr_csv_35.csv") + ############################################################################### # Test GEOM_POSSIBLE_NAMES open option @@ -1379,32 +1749,42 @@ def test_ogr_csv_35(): def test_ogr_csv_36(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_36.csv', - """id,mygeometry,format + 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']) +""", + ) + + 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': + 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)': + if f.GetGeometryRef().ExportToWkt() != "POINT (2 49)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': + if f.GetGeometryRef().ExportToWkt() != "POINT (3 50)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': + if f.GetGeometryRef().ExportToWkt() != "POINT (3 50)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() @@ -1414,54 +1794,74 @@ def test_ogr_csv_36(): ds = None # Test prefix* pattern - ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, - open_options=['GEOM_POSSIBLE_NAMES=mygeom*']) + 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)': + 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']) + 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)': + 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*']) + 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)': + 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']) + 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']) + 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': + 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') + gdal.Unlink("/vsimem/ogr_csv_36.csv") + ############################################################################### # Test X_POSSIBLE_NAMES, Y_POSSIBLE_NAMES and Z_POSSIBLE_NAMES open options @@ -1469,22 +1869,34 @@ def test_ogr_csv_36(): def test_ogr_csv_37(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_37.csv', - """id,y,other,x,z + 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']) +""", + ) + + 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': + 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)': + if f.GetGeometryRef().ExportToWkt() != "POINT (3 50)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() @@ -1494,15 +1906,29 @@ def test_ogr_csv_37(): 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']) + 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: + 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)': + if f.GetGeometryRef().ExportToWkt() != "POINT (3 50)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() @@ -1512,17 +1938,29 @@ def test_ogr_csv_37(): 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']) + 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': + 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') + gdal.Unlink("/vsimem/ogr_csv_37.csv") + ############################################################################### # Test GeoCSV WKT type @@ -1530,30 +1968,42 @@ def test_ogr_csv_37(): def test_ogr_csv_38(): - ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_38.csv') + 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)) + 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)')) + f.SetField("id", 1) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 49)")) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/ogr_csv_38.csv') + ds = ogr.Open("/vsimem/ogr_csv_38.csv") lyr = ds.GetLayer(0) - assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'geom_mygeom' - assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 + assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == "geom_mygeom" + assert ( + lyr.GetLayerDefn() + .GetGeomFieldDefn(0) + .GetSpatialRef() + .ExportToWkt() + .find("4326") + >= 0 + ) f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': + 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') + 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 @@ -1561,25 +2011,26 @@ def test_ogr_csv_38(): 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)) + 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)')) + f.SetField("id", 1) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 49)")) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/ogr_csv_39.csv') + ds = ogr.Open("/vsimem/ogr_csv_39.csv") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': + 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') + 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) @@ -1587,39 +2038,69 @@ def test_ogr_csv_39(): def test_ogr_csv_40(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_40.csv', - """latitude,longitude,the_geom,id + 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']) +""", + ) + + 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': + 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.Unlink("/vsimem/ogr_csv_40.csv") - gdal.FileFromMemBuffer('/vsimem/ogr_csv_40.csv', - """the_geom,latitude,longitude,id + 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']) +""", + ) + + 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': + 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') + gdal.Unlink("/vsimem/ogr_csv_40.csv") + ############################################################################### # Test GEOM_POSSIBLE_NAMES and KEEP_GEOM_COLUMNS=NO together with empty content in geom column (#6152) @@ -1627,21 +2108,27 @@ def test_ogr_csv_40(): def test_ogr_csv_41(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_41.csv', - """id,the_geom,foo + 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']) +""", + ) + + 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': + 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') + gdal.Unlink("/vsimem/ogr_csv_41.csv") + ############################################################################### # Test writing field with empty content @@ -1649,16 +2136,17 @@ def test_ogr_csv_41(): 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)) + 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) + f.SetField("id", 1) assert lyr.CreateFeature(f) == 0 ds = None - gdal.Unlink('/vsimem/ogr_csv_42.csv') + gdal.Unlink("/vsimem/ogr_csv_42.csv") + ############################################################################### # Test editing capabilities @@ -1666,56 +2154,68 @@ def test_ogr_csv_42(): def test_ogr_csv_43(): - filename = '/vsimem/ogr_csv_43.csv' - ds = ogr.GetDriverByName('CSV').CreateDataSource(filename) - lyr = ds.CreateLayer('ogr_csv_43', options=['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES']) - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) + filename = "/vsimem/ogr_csv_43.csv" + ds = ogr.GetDriverByName("CSV").CreateDataSource(filename) + 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)')) + 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: + 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 + assert lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) == 0 with gdaltest.error_handler(): - assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) != 0 + assert lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) != 0 f = lyr.GetFeature(1) - f.SetField('foo', 'bar') + 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)': + 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)': + 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') + 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)': + 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: + if f["id"] != 2: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() @@ -1729,14 +2229,18 @@ def test_ogr_csv_43(): ds = ogr.Open(filename, 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)': + 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.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 @@ -1749,13 +2253,13 @@ def test_ogr_csv_43(): f = lyr.GetNextFeature() assert f is None f = ogr.Feature(lyr.GetLayerDefn()) - f['id'] = 3 + f["id"] = 3 assert lyr.CreateFeature(f) == 0 assert f.GetFID() == 3 f = None - assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) == 0 + assert lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) == 0 f = lyr.GetFeature(1) - assert f['foo'] != 'bar' + assert f["foo"] != "bar" f = lyr.GetFeature(3) assert f.GetFID() == 3 f = None @@ -1764,13 +2268,13 @@ def test_ogr_csv_43(): ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(2) - if f['id'] != 3: + if f["id"] != 3: f.DumpReadable() pytest.fail() f = None - assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('foo')) == 0 + assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex("foo")) == 0 f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(4 51)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(4 51)")) assert lyr.CreateFeature(f) == 0 if f.GetFID() != 3: f.DumpReadable() @@ -1800,8 +2304,8 @@ def test_ogr_csv_43(): lyr.RollbackTransaction() lyr.CommitTransaction() - assert lyr.GetGeometryColumn() == '' - assert lyr.GetFIDColumn() == '' + assert lyr.GetGeometryColumn() == "" + assert lyr.GetFIDColumn() == "" assert lyr.TestCapability(ogr.OLCReorderFields) == 1 assert lyr.ReorderFields([0, 1]) == 0 @@ -1815,13 +2319,13 @@ def test_ogr_csv_43(): assert lyr.AlterFieldDefn(-1, fld_defn, 0) != 0 f = lyr.GetFeature(2) - f.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (1 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 + assert lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_2")) == 0 f = lyr.GetFeature(2) - f.SetGeomField(1, ogr.CreateGeometryFromWkt('POINT (3 4)')) + f.SetGeomField(1, ogr.CreateGeometryFromWkt("POINT (3 4)")) assert lyr.SetFeature(f) == 0 f = None @@ -1830,7 +2334,7 @@ def test_ogr_csv_43(): ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(2) - if f['WKT'] != 'POINT (1 2)' or f['_WKT_2'] != 'POINT (3 4)': + if f["WKT"] != "POINT (1 2)" or f["_WKT_2"] != "POINT (3 4)": f.DumpReadable() pytest.fail() assert lyr.SetFeature(f) == 0 @@ -1841,7 +2345,8 @@ def test_ogr_csv_43(): ds = None gdal.Unlink(filename) - gdal.Unlink(filename + 't') + gdal.Unlink(filename + "t") + ############################################################################### # Test seeking back while creating @@ -1849,28 +2354,29 @@ def test_ogr_csv_43(): 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)) + 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)')) + 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)': + if f["id"] != 1 or f.GetGeometryRef().ExportToWkt() != "POINT (2 49)": f.DumpReadable() pytest.fail() f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('id', 2) + f.SetField("id", 2) assert lyr.CreateFeature(f) == 0 f = lyr.GetFeature(2) - if f['id'] != 2 or f.GetGeometryRef() is not None: + if f["id"] != 2 or f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('/vsimem/ogr_csv_44.csv') + gdal.Unlink("/vsimem/ogr_csv_44.csv") + ############################################################################### # Test QGIS use case that consists in reopening a file just after calling @@ -1879,23 +2385,24 @@ def test_ogr_csv_44(): 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 = 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) + ds = ogr.Open("/vsimem/ogr_csv_45.csv", update=1) lyr = ds.GetLayer(0) - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTInteger)) + lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTInteger)) - ds2 = ogr.Open('/vsimem/ogr_csv_45.csv') + 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') + gdal.Unlink("/vsimem/ogr_csv_45.csv") + ############################################################################### # Test edition of CSV files with X_POSSIBLE_NAMES, Y_POSSIBLE_NAMES open options @@ -1903,73 +2410,95 @@ def test_ogr_csv_45(): 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)) + 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 + 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']) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (10 20 30)")) lyr.SetFeature(f) f = None ds = None - ds = ogr.Open('/vsimem/ogr_csv_46.csv') + 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': + 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']) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (-10 -20 30)")) lyr.SetFeature(f) f = None ds = None - ds = ogr.Open('/vsimem/ogr_csv_46.csv') + 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': + 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']) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (-1 -2 -3)")) lyr.SetFeature(f) f = None ds = None - ds = ogr.Open('/vsimem/ogr_csv_46.csv') + 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': + 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') + gdal.Unlink("/vsimem/ogr_csv_46.csv") + ############################################################################### # Test writing XYZM @@ -1977,27 +2506,28 @@ def test_ogr_csv_46(): def test_ogr_csv_47(): - ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_47.csv') + 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']) + lyr = ds.CreateLayer("ogr_csv_47", options=["GEOMETRY=AS_WKT"]) assert lyr.TestCapability(ogr.OLCMeasuredGeometries) == 1 - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) + 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)')) + 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') + 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)': + if f.GetGeometryRef().ExportToIsoWkt() != "POINT ZM (1 2 3 4)": f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('/vsimem/ogr_csv_47.csv') + gdal.Unlink("/vsimem/ogr_csv_47.csv") + ############################################################################### # Test reading/writing StringList, etc.. @@ -2005,50 +2535,70 @@ def test_ogr_csv_47(): def test_ogr_csv_48(): - gdal.FileFromMemBuffer('/vsimem/ogr_csv_48.csvt', 'JsonStringList,JsonStringList,JsonIntegerList,JsonInteger64List,JsonRealList\n') - gdal.FileFromMemBuffer('/vsimem/ogr_csv_48.csv', - """stringlist,emptystringlist,intlist,int64list,reallist + gdal.FileFromMemBuffer( + "/vsimem/ogr_csv_48.csvt", + "JsonStringList,JsonStringList,JsonIntegerList,JsonInteger64List,JsonRealList\n", + ) + gdal.FileFromMemBuffer( + "/vsimem/ogr_csv_48.csv", + """stringlist,emptystringlist,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.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,emptystringlist,intlist,int64list,reallist\n"[ ""a"", """" ]",[],[ 1 ],[ 1234567890123 ],[ 0.125') + assert data.startswith( + 'stringlist,emptystringlist,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') + 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,JSonStringList,JSonIntegerList,JSonInteger64List,JSonRealList') + assert data.startswith( + "JSonStringList,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") - 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 + 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']) + 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'): + if not f.IsFieldNull("str"): f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('/vsimem/ogr_csv_49.csv') + gdal.Unlink("/vsimem/ogr_csv_49.csv") + ############################################################################### @@ -2056,109 +2606,133 @@ def test_ogr_csv_49(): def test_ogr_csv_more_than_100_geom_fields(): with gdaltest.error_handler(): - ds = ogr.Open('data/csv/more_than_100_geom_fields.csv') + ds = ogr.Open("data/csv/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.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 = 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') + 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"') + 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") - 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')) + 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' + 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') + 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') + 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') + 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')) + 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' + 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']) + 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') + 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 + assert "00123,x,1.25" in data + + gdal.Unlink("/vsimem/ogr_csv_string_quoting_if_needed.csv") - 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 + 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) + ds = gdal.OpenEx("/vsimem/ogr_csv_iter_and_set_feature.csv", gdal.OF_UPDATE) lyr = ds.GetLayer(0) count = 0 for f in lyr: @@ -2166,6 +2740,6 @@ def test_ogr_csv_iter_and_set_feature(): count += 1 ds = None - gdal.Unlink('/vsimem/ogr_csv_iter_and_set_feature.csv') + gdal.Unlink("/vsimem/ogr_csv_iter_and_set_feature.csv") assert count == 2 diff --git a/autotest/ogr/ogr_csw.py b/autotest/ogr/ogr_csw.py index 59b8c142c717..16fffbc8f1b5 100755 --- a/autotest/ogr/ogr_csw.py +++ b/autotest/ogr/ogr_csw.py @@ -30,27 +30,26 @@ ############################################################################### +import gdaltest import pytest -import gdaltest -from osgeo import ogr -from osgeo import gdal +from osgeo import gdal, ogr ############################################################################### # Test underlying OGR drivers # -pytestmark = pytest.mark.require_driver('CSW') +pytestmark = pytest.mark.require_driver("CSW") -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def ogr_csw_init(): - gml_ds = ogr.Open('data/gml/ionic_wfs.gml') + gml_ds = ogr.Open("data/gml/ionic_wfs.gml") if gml_ds is None: - if gdal.GetLastErrorMsg().find('Xerces') != -1: + if gdal.GetLastErrorMsg().find("Xerces") != -1: pytest.skip() - pytest.skip('failed to open test file.') + pytest.skip("failed to open test file.") ############################################################################### @@ -59,125 +58,146 @@ def ogr_csw_init(): @pytest.mark.skip() def test_ogr_csw_pycsw(): - ds = ogr.Open('CSW:http://catalog.data.gov/csw') + 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') + 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' + 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') + 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.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") gdal.PushErrorHandler() - ds = ogr.Open('CSW:/vsimem/csw_endpoint') + 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.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - '') + gdal.FileFromMemBuffer( + "/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities", "" + ) gdal.PushErrorHandler() - ds = ogr.Open('CSW:/vsimem/csw_endpoint') + ds = ogr.Open("CSW:/vsimem/csw_endpoint") gdal.PopErrorHandler() assert ds is None - assert gdal.GetLastErrorMsg().find('Empty content returned by server') >= 0 + 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.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - '') + gdal.FileFromMemBuffer( + "/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities", "" + ) gdal.PushErrorHandler() - ds = ogr.Open('CSW:/vsimem/csw_endpoint') + ds = ogr.Open("CSW:/vsimem/csw_endpoint") gdal.PopErrorHandler() assert ds is None - assert gdal.GetLastErrorMsg().find('Cannot find Capabilities.version') >= 0 + 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.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - '') + gdal.FileFromMemBuffer( + "/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities", + "", + ) gdal.PushErrorHandler() - ds = ogr.Open('CSW:/vsimem/csw_endpoint') + ds = ogr.Open("CSW:/vsimem/csw_endpoint") gdal.PopErrorHandler() assert ds is None - assert gdal.GetLastErrorMsg().find('Error returned by server : ') >= 0 + 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.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - '= 0 + assert gdal.GetLastErrorMsg().find("Invalid XML content : = 0 + ############################################################################### def test_ogr_csw_vsimem_fail_because_missing_version(): - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - """ + gdal.FileFromMemBuffer( + "/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities", + """ -""") +""", + ) gdal.PushErrorHandler() - ds = ogr.Open('CSW:/vsimem/csw_endpoint') + ds = ogr.Open("CSW:/vsimem/csw_endpoint") gdal.PopErrorHandler() assert ds is None - assert gdal.GetLastErrorMsg().find('Cannot find Capabilities.version') >= 0 + assert gdal.GetLastErrorMsg().find("Cannot find Capabilities.version") >= 0 + ############################################################################### def test_ogr_csw_vsimem_csw_minimal_instance(): - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") # Invalid response, but enough for use - gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', - """ + gdal.FileFromMemBuffer( + "/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities", + """ -""") - ds = ogr.Open('CSW:/vsimem/csw_endpoint') +""", + ) + ds = ogr.Open("CSW:/vsimem/csw_endpoint") assert ds is not None - ds.TestCapability('foo') + 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') + lyr.TestCapability("foo") gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() @@ -188,40 +208,52 @@ def test_ogr_csw_vsimem_csw_minimal_instance(): gdal.PopErrorHandler() assert fc == 0 - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """""") + 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""", + """= 0 + assert f is None and gdal.GetLastErrorMsg().find("Error: cannot parse") >= 0 - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """""") + 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 + assert f is None and gdal.GetLastErrorMsg().find("Error: cannot parse") >= 0 - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """""") + 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 + assert f is None and gdal.GetLastErrorMsg().find("Error returned by server") >= 0 - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """ + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """ -""") +""", + ) 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))': + 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() @@ -282,8 +322,9 @@ def test_ogr_csw_vsimem_csw_minimal_instance(): lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """ + 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""", - """ + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """ -""") +""", + ) f = lyr.GetNextFeature() assert f is None - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """""") + 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.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.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.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.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""", - """ + 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""", - """ + 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( + "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']) + ds = gdal.OpenEx("CSW:/vsimem/csw_endpoint", open_options=["OUTPUT_SCHEMA=CSW"]) lyr = ds.GetLayer(0) - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """full""", + """full""", - """""") + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """""", + ) lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None - gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", - """ + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """ -""") +""", + ) lyr.ResetReading() f = lyr.GetNextFeature() - if f['raw_xml'].find('full""", - """ + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """ -""") +""", + ) f = lyr.GetNextFeature() - if f['raw_xml'].find('full""", - """ + gdal.FileFromMemBuffer( + """/vsimem/csw_endpoint&POSTFIELDS=full""", + """ -""") +""", + ) f = lyr.GetNextFeature() - if f['raw_xml'].find('= 15, \ - 'Unexpected small number of circle interpolation points.' + assert ( + geom.GetPointCount() >= 15 + ), "Unexpected small number of circle interpolation points." genvelope = geom.GetEnvelope() - assert genvelope[0] >= 0.328593 and genvelope[0] <= 0.328594 and genvelope[1] >= 9.68780 and genvelope[1] <= 9.68781 and genvelope[2] >= -0.09611 and genvelope[2] <= -0.09610 and genvelope[3] >= 9.26310 and genvelope[3] <= 9.26311, \ - 'geometry extents seem odd' + assert ( + genvelope[0] >= 0.328593 + and genvelope[0] <= 0.328594 + and genvelope[1] >= 9.68780 + and genvelope[1] <= 9.68781 + and genvelope[2] >= -0.09611 + and genvelope[2] <= -0.09610 + and genvelope[3] >= 9.26310 + and genvelope[3] <= 9.26311 + ), "geometry extents seem odd" + ############################################################################### # Check third feature, a polygon with fill styling. @@ -91,21 +108,26 @@ def test_ogr_dgn_3(): def test_ogr_dgn_4(): - dgn_ds = ogr.Open('data/dgn/smalltest.dgn') + dgn_ds = ogr.Open("data/dgn/smalltest.dgn") dgn_lyr = dgn_ds.GetLayer(0) feat = dgn_lyr.GetNextFeature() feat = dgn_lyr.GetNextFeature() feat = dgn_lyr.GetNextFeature() - assert feat.GetField('Type') == 6 and feat.GetField('Level') == 2 and feat.GetField('ColorIndex') == 83, \ - 'feature 3: expected attributes' + assert ( + feat.GetField("Type") == 6 + and feat.GetField("Level") == 2 + and feat.GetField("ColorIndex") == 83 + ), "feature 3: expected attributes" - wkt = 'POLYGON ((4.53550000 3.31700000,4.38320000 2.65170000,4.94410000 2.52350000,4.83200000 3.33310000,4.53550000 3.31700000))' + wkt = "POLYGON ((4.53550000 3.31700000,4.38320000 2.65170000,4.94410000 2.52350000,4.83200000 3.33310000,4.53550000 3.31700000))" assert not ogrtest.check_feature_geometry(feat, wkt) - assert feat.GetStyleString() == 'BRUSH(fc:#b40000,id:"ogr-brush-0")', \ - 'Style string different than expected.' + assert ( + feat.GetStyleString() == 'BRUSH(fc:#b40000,id:"ogr-brush-0")' + ), "Style string different than expected." + ############################################################################### # Use attribute query to pick just the type 15 level 2 object. @@ -113,48 +135,54 @@ def test_ogr_dgn_4(): def test_ogr_dgn_5(): - dgn_ds = ogr.Open('data/dgn/smalltest.dgn') + dgn_ds = ogr.Open("data/dgn/smalltest.dgn") dgn_lyr = dgn_ds.GetLayer(0) - dgn_lyr.SetAttributeFilter('Type = 15 and Level = 2') - tr = ogrtest.check_features_against_list(dgn_lyr, 'Type', [15]) + dgn_lyr.SetAttributeFilter("Type = 15 and Level = 2") + tr = ogrtest.check_features_against_list(dgn_lyr, "Type", [15]) dgn_lyr.SetAttributeFilter(None) assert tr + ############################################################################### # Use spatial filter to just pick the big circle. def test_ogr_dgn_6(): - dgn_ds = ogr.Open('data/dgn/smalltest.dgn') + dgn_ds = ogr.Open("data/dgn/smalltest.dgn") dgn_lyr = dgn_ds.GetLayer(0) - geom = ogr.CreateGeometryFromWkt('LINESTRING(1.0 8.55, 2.5 6.86)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(1.0 8.55, 2.5 6.86)") dgn_lyr.SetSpatialFilter(geom) geom.Destroy() - tr = ogrtest.check_features_against_list(dgn_lyr, 'Type', [15]) + tr = ogrtest.check_features_against_list(dgn_lyr, "Type", [15]) dgn_lyr.SetSpatialFilter(None) assert tr + ############################################################################### # Copy our small dgn file to a new dgn file. def test_ogr_dgn_7(): - co_opts = ['UOR_PER_SUB_UNIT=100', 'SUB_UNITS_PER_MASTER_UNIT=100', - 'ORIGIN=-50,-50,0'] + co_opts = [ + "UOR_PER_SUB_UNIT=100", + "SUB_UNITS_PER_MASTER_UNIT=100", + "ORIGIN=-50,-50,0", + ] - dgn2_ds = ogr.GetDriverByName('DGN').CreateDataSource('tmp/dgn7.dgn', - options=co_opts) + dgn2_ds = ogr.GetDriverByName("DGN").CreateDataSource( + "tmp/dgn7.dgn", options=co_opts + ) - dgn2_lyr = dgn2_ds.CreateLayer('elements') + dgn2_lyr = dgn2_ds.CreateLayer("elements") - dgn_ds = ogr.Open('data/dgn/smalltest.dgn') + dgn_ds = ogr.Open("data/dgn/smalltest.dgn") dgn_lyr = dgn_ds.GetLayer(0) dst_feat = ogr.Feature(feature_def=dgn2_lyr.GetLayerDefn()) @@ -162,10 +190,11 @@ def test_ogr_dgn_7(): feat = dgn_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert dgn2_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert dgn2_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = dgn_lyr.GetNextFeature() + ############################################################################### # Verify that our copy is pretty similar. # @@ -176,51 +205,68 @@ def test_ogr_dgn_7(): def test_ogr_dgn_8(): - dgn2_ds = ogr.Open('tmp/dgn7.dgn') + dgn2_ds = ogr.Open("tmp/dgn7.dgn") - dgn2_lyr = dgn2_ds.GetLayerByName('elements') + dgn2_lyr = dgn2_ds.GetLayerByName("elements") # Test first first, a text element. feat = dgn2_lyr.GetNextFeature() - assert feat.GetField('Type') == 17 and feat.GetField('Level') == 1, \ - 'feature 1: expected attributes' + assert ( + feat.GetField("Type") == 17 and feat.GetField("Level") == 1 + ), "feature 1: expected attributes" - assert feat.GetField('Text') == 'Demo Text', 'feature 1: expected text' + assert feat.GetField("Text") == "Demo Text", "feature 1: expected text" - assert not ogrtest.check_feature_geometry(feat, 'POINT (0.73650000 4.21980000)') + assert not ogrtest.check_feature_geometry(feat, "POINT (0.73650000 4.21980000)") - assert feat.GetStyleString() == 'LABEL(t:"Demo Text",c:#ffffff,s:1.000g,f:ENGINEERING)', \ - 'feature 1: Style string different than expected.' + assert ( + feat.GetStyleString() == 'LABEL(t:"Demo Text",c:#ffffff,s:1.000g,f:ENGINEERING)' + ), "feature 1: Style string different than expected." # Check second element, a circle. feat = dgn2_lyr.GetNextFeature() - assert feat.GetField('Type') == 12 and feat.GetField('Level') == 2, \ - 'feature 2: expected attributes' + assert ( + feat.GetField("Type") == 12 and feat.GetField("Level") == 2 + ), "feature 2: expected attributes" geom = feat.GetGeometryRef() - assert geom.GetCoordinateDimension() == 2, 'feature 2: expected 2d circle.' + assert geom.GetCoordinateDimension() == 2, "feature 2: expected 2d circle." - assert geom.GetGeometryName() == 'MULTILINESTRING', \ - 'feature 2: Expected MULTILINESTRING.' + assert ( + geom.GetGeometryName() == "MULTILINESTRING" + ), "feature 2: Expected MULTILINESTRING." genvelope = geom.GetEnvelope() - assert genvelope[0] >= 0.3285 and genvelope[0] <= 0.3287 and genvelope[1] >= 9.6878 and genvelope[1] <= 9.6879 and genvelope[2] >= -0.0962 and genvelope[2] <= -0.0960 and genvelope[3] >= 9.26310 and genvelope[3] <= 9.2632, \ - 'feature 2: geometry extents seem odd' + assert ( + genvelope[0] >= 0.3285 + and genvelope[0] <= 0.3287 + and genvelope[1] >= 9.6878 + and genvelope[1] <= 9.6879 + and genvelope[2] >= -0.0962 + and genvelope[2] <= -0.0960 + and genvelope[3] >= 9.26310 + and genvelope[3] <= 9.2632 + ), "feature 2: geometry extents seem odd" # Check 3rd feature, a polygon feat = dgn2_lyr.GetNextFeature() - assert feat.GetField('Type') == 6 and feat.GetField('Level') == 2 and feat.GetField('ColorIndex') == 83, \ - 'feature 3: expected attributes' + assert ( + feat.GetField("Type") == 6 + and feat.GetField("Level") == 2 + and feat.GetField("ColorIndex") == 83 + ), "feature 3: expected attributes" - wkt = 'POLYGON ((4.53550000 3.31700000,4.38320000 2.65170000,4.94410000 2.52350000,4.83200000 3.33310000,4.53550000 3.31700000))' + wkt = "POLYGON ((4.53550000 3.31700000,4.38320000 2.65170000,4.94410000 2.52350000,4.83200000 3.33310000,4.53550000 3.31700000))" assert not ogrtest.check_feature_geometry(feat, wkt) # should be: 'BRUSH(fc:#b40000,id:"ogr-brush-0")' - assert feat.GetStyleString() == 'PEN(id:"ogr-pen-0",c:#b40000)', \ - ('feature 3: Style string different than expected: ' + feat.GetStyleString()) + assert feat.GetStyleString() == 'PEN(id:"ogr-pen-0",c:#b40000)', ( + "feature 3: Style string different than expected: " + feat.GetStyleString() + ) + ############################################################################### # Test delta encoding (#6806) @@ -228,13 +274,15 @@ def test_ogr_dgn_8(): def test_ogr_dgn_online_1(): - if not gdaltest.download_file('http://download.osgeo.org/gdal/data/dgn/DGNSample_v7.dgn', 'DGNSample_v7.dgn'): + if not gdaltest.download_file( + "http://download.osgeo.org/gdal/data/dgn/DGNSample_v7.dgn", "DGNSample_v7.dgn" + ): pytest.skip() - ds = ogr.Open('tmp/cache/DGNSample_v7.dgn') + ds = ogr.Open("tmp/cache/DGNSample_v7.dgn") assert ds is not None lyr = ds.GetLayer(0) feat = lyr.GetFeature(35) - wkt = 'LINESTRING (82.9999500717185 23.2084166997284,83.0007450788903 23.2084495986816,83.00081490524 23.2068095339824,82.9999503769036 23.2067737968078)' + wkt = "LINESTRING (82.9999500717185 23.2084166997284,83.0007450788903 23.2084495986816,83.00081490524 23.2068095339824,82.9999503769036 23.2067737968078)" assert not ogrtest.check_feature_geometry(feat, wkt) diff --git a/autotest/ogr/ogr_dgnv8.py b/autotest/ogr/ogr_dgnv8.py index d3e98550d1a3..8b71f495d478 100755 --- a/autotest/ogr/ogr_dgnv8.py +++ b/autotest/ogr/ogr_dgnv8.py @@ -31,13 +31,13 @@ import os import shutil - import gdaltest import ogrtest -from osgeo import gdal, ogr import pytest -pytestmark = pytest.mark.require_driver('DGNv8') +from osgeo import gdal, ogr + +pytestmark = pytest.mark.require_driver("DGNv8") ############################################################################### # Compare with a reference CSV dump @@ -45,19 +45,23 @@ def test_ogr_dgnv8_2(): - gdal.VectorTranslate('/vsimem/ogr_dgnv8_2.csv', 'data/dgnv8/test_dgnv8.dgn', - options='-f CSV -dsco geometry=as_wkt -sql "select *, ogr_style from my_model"') + gdal.VectorTranslate( + "/vsimem/ogr_dgnv8_2.csv", + "data/dgnv8/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') + ds_ref = ogr.Open("/vsimem/ogr_dgnv8_2.csv") lyr_ref = ds_ref.GetLayer(0) - ds = ogr.Open('data/dgnv8/test_dgnv8_ref.csv') + ds = ogr.Open("data/dgnv8/test_dgnv8_ref.csv") lyr = ds.GetLayer(0) - ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=['WKT']) + ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=["WKT"]) - gdal.Unlink('/vsimem/ogr_dgnv8_2.csv') + gdal.Unlink("/vsimem/ogr_dgnv8_2.csv") return ret + ############################################################################### # Run test_ogrsf @@ -65,18 +69,24 @@ def test_ogr_dgnv8_2(): def test_ogr_dgnv8_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 data/dgnv8/test_dgnv8.dgn') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " -ro data/dgnv8/test_dgnv8.dgn" + ) - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - shutil.copy('data/dgnv8/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') + shutil.copy("data/dgnv8/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 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test creation code @@ -84,76 +94,88 @@ def test_ogr_dgnv8_3(): def test_ogr_dgnv8_4(): - tmp_dgn = 'tmp/ogr_dgnv8_4.dgn' - gdal.VectorTranslate(tmp_dgn, 'data/dgnv8/test_dgnv8.dgn', format='DGNv8') + tmp_dgn = "tmp/ogr_dgnv8_4.dgn" + gdal.VectorTranslate(tmp_dgn, "data/dgnv8/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"') + 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/dgnv8/test_dgnv8_write_ref.csv') + ds = ogr.Open("data/dgnv8/test_dgnv8_write_ref.csv") lyr = ds.GetLayer(0) - ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=['WKT']) + ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=["WKT"]) gdal.Unlink(tmp_csv) return ret + ############################################################################### # Test creation options def test_ogr_dgnv8_5(): - 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 = ogr.GetDriverByName('DGNv8').CreateDataSource(tmp_dgn, options=options) - lyr = ds.CreateLayer('my_layer') + 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 = ogr.GetDriverByName("DGNv8").CreateDataSource(tmp_dgn, options=options) + lyr = ds.CreateLayer("my_layer") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 1)")) lyr.CreateFeature(f) ds = None ds = ogr.Open(tmp_dgn) - got_md = ds.GetMetadata_List('DGN') + got_md = ds.GetMetadata_List("DGN") assert got_md == options ds = None - tmp2_dgn = 'tmp/ogr_dgnv8_5_2.dgn' - ogr.GetDriverByName('DGNv8').CreateDataSource(tmp2_dgn, options=['SEED=' + tmp_dgn, 'TITLE=another_title']) + tmp2_dgn = "tmp/ogr_dgnv8_5_2.dgn" + ogr.GetDriverByName("DGNv8").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') + 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.GetName() == "my_layer" assert lyr.GetFeatureCount() == 0 ds = None - ds = ogr.GetDriverByName('DGNv8').CreateDataSource(tmp2_dgn, options=['SEED=' + tmp_dgn]) - lyr = ds.CreateLayer('a_layer', options=['DESCRIPTION=my_layer', 'DIM=2']) + ds = ogr.GetDriverByName("DGNv8").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)')) + 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.GetName() == "a_layer" assert lyr.GetFeatureCount() == 1 f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (2 3)': + if f.GetGeometryRef().ExportToWkt() != "POINT (2 3)": f.DumpReadable() pytest.fail() ds = None diff --git a/autotest/ogr/ogr_dwg.py b/autotest/ogr/ogr_dwg.py index 2b4da6653111..a04b1aa9743a 100755 --- a/autotest/ogr/ogr_dwg.py +++ b/autotest/ogr/ogr_dwg.py @@ -28,21 +28,22 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -import pytest import json -from osgeo import gdal import gdaltest +import pytest + +from osgeo import gdal -pytestmark = pytest.mark.require_driver('DWG') +pytestmark = pytest.mark.require_driver("DWG") ############################################################################### # # The test file was contributed by Maxime Colmant, from Mapwize # (see https://github.com/OSGeo/gdal/pull/5013) # -# The AutoCAD drawing format version for this file is: -# AC1027 - DWG AutoCAD 2013/2014/2015/2016/2017 +# The AutoCAD drawing format version for this file is: +# AC1027 - DWG AutoCAD 2013/2014/2015/2016/2017 # # The drawing format can be checked reading the first six bytes of the DWG file # @@ -51,162 +52,192 @@ # ############################################################################### + def test_ogr_dwg_1(): - ds = gdal.OpenEx('data/cad/Building_A_Floor_0_Mapwize.dwg', allowed_drivers=['DWG']) + ds = gdal.OpenEx("data/cad/Building_A_Floor_0_Mapwize.dwg", allowed_drivers=["DWG"]) assert ds is not None - assert ds.GetLayerCount() == 1, 'expected exactly one layer.' + assert ds.GetLayerCount() == 1, "expected exactly one layer." layer = ds.GetLayer(0) - assert layer.GetName() == 'entities', \ - 'layer name is expected to be entities.' + assert layer.GetName() == "entities", "layer name is expected to be entities." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 6, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 6, ( + "did not get expected number of fields in defn. got %d" % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 425, ('did not get expected feature count, got %d' % fc) + assert fc == 425, "did not get expected feature count, got %d" % fc layer.ResetReading() layer.SetAttributeFilter("layer = 'Trees'") tree = layer.GetNextFeature() geom = tree.GetGeometryRef() - assert geom.GetGeometryName() == 'GEOMETRYCOLLECTION', \ - 'expanded block geometry is expected to be GEOMETRYCOLLECTION.' + assert ( + geom.GetGeometryName() == "GEOMETRYCOLLECTION" + ), "expanded block geometry is expected to be GEOMETRYCOLLECTION." ds = None def test_ogr_dwg_2(): - with gdaltest.config_option('DWG_INLINE_BLOCKS', 'FALSE'): + with gdaltest.config_option("DWG_INLINE_BLOCKS", "FALSE"): - ds = gdal.OpenEx('data/cad/Building_A_Floor_0_Mapwize.dwg', allowed_drivers=['DWG']) + ds = gdal.OpenEx( + "data/cad/Building_A_Floor_0_Mapwize.dwg", allowed_drivers=["DWG"] + ) assert ds is not None - assert ds.GetLayerCount() == 2, 'expected two layers.' + assert ds.GetLayerCount() == 2, "expected two layers." zero = ds.GetLayer(0) - assert zero.GetName() == 'blocks', \ - 'layer name is expected to be blocks.' + assert zero.GetName() == "blocks", "layer name is expected to be blocks." - layer = ds.GetLayer( 'entities' ) + layer = ds.GetLayer("entities") defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 10, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 10, ( + "did not get expected number of fields in defn. got %d" + % defn.GetFieldCount() + ) fc = layer.GetFeatureCount() - assert fc == 245, ('did not get expected feature count, got %d' % fc) + assert fc == 245, "did not get expected feature count, got %d" % fc layer.ResetReading() layer.SetAttributeFilter("layer = 'Trees'") tree = layer.GetNextFeature() geom = tree.GetGeometryRef() - assert geom.GetGeometryName() == 'POINT', \ - 'block placement is expected to be POINT.' + assert ( + geom.GetGeometryName() == "POINT" + ), "block placement is expected to be POINT." ds = None + def test_ogr_dwg_3(): - with gdaltest.config_option('DWG_INLINE_BLOCKS', 'FALSE'): + with gdaltest.config_option("DWG_INLINE_BLOCKS", "FALSE"): - ds = gdal.OpenEx('data/cad/Building_A_Floor_0_Mapwize.dwg', allowed_drivers=['DWG']) + ds = gdal.OpenEx( + "data/cad/Building_A_Floor_0_Mapwize.dwg", allowed_drivers=["DWG"] + ) assert ds is not None - layer = ds.GetLayer( 'entities' ) + layer = ds.GetLayer("entities") layer.ResetReading() layer.SetAttributeFilter("layer = 'RoomsID'") dwg_occupants = set() for feature in layer: - data = json.loads( feature.GetField("blockattributes") ) - dwg_occupants.add( data['OCCUPANT'] ) - - occupants = {'Mederic', 'Everybody', 'Mathieu', 'Alex, Manon', 'Perrine', 'Maxime, Cyprien, Etienne, Thierry, Kevin'} - - assert occupants == dwg_occupants, \ - ('block attribute OCCUPANT for features in layer RoomsID is expected to be %s.' % str(occupants) ) + data = json.loads(feature.GetField("blockattributes")) + dwg_occupants.add(data["OCCUPANT"]) + + occupants = { + "Mederic", + "Everybody", + "Mathieu", + "Alex, Manon", + "Perrine", + "Maxime, Cyprien, Etienne, Thierry, Kevin", + } + + assert occupants == dwg_occupants, ( + "block attribute OCCUPANT for features in layer RoomsID is expected to be %s." + % str(occupants) + ) ds = None def test_ogr_dwg_4(): - with gdaltest.config_options({'DWG_INLINE_BLOCKS':'FALSE','DWG_ATTRIBUTES':'TRUE'}): + with gdaltest.config_options( + {"DWG_INLINE_BLOCKS": "FALSE", "DWG_ATTRIBUTES": "TRUE"} + ): - ds = gdal.OpenEx('data/cad/Building_A_Floor_0_Mapwize.dwg', allowed_drivers=['DWG']) + ds = gdal.OpenEx( + "data/cad/Building_A_Floor_0_Mapwize.dwg", allowed_drivers=["DWG"] + ) assert ds is not None - layer = ds.GetLayer( 'entities' ) + layer = ds.GetLayer("entities") defn = layer.GetLayerDefn() - + foundMathieu = False for feature in layer: - if feature.GetField("OCCUPANT") == 'Mathieu' : + if feature.GetField("OCCUPANT") == "Mathieu": foundMathieu = True - - - assert defn.GetFieldCount() == 28, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) - - assert defn.GetFieldIndex('AVAILABILITY') >-1, \ - ('did not get the expected field in defn. AVAILABILITY') - assert defn.GetFieldIndex('ROOM') >-1, \ - ('did not get the expected field in defn. ROOM') - - assert foundMathieu, \ - ('Mathieu was not found as OCCUPANT field value') - + + assert defn.GetFieldCount() == 28, ( + "did not get expected number of fields in defn. got %d" + % defn.GetFieldCount() + ) + + assert ( + defn.GetFieldIndex("AVAILABILITY") > -1 + ), "did not get the expected field in defn. AVAILABILITY" + assert ( + defn.GetFieldIndex("ROOM") > -1 + ), "did not get the expected field in defn. ROOM" + + assert foundMathieu, "Mathieu was not found as OCCUPANT field value" ds = None - + + def test_ogr_dwg_5(): - with gdaltest.config_options({'DWG_INLINE_BLOCKS':'FALSE','DWG_ATTRIBUTES':'TRUE','DWG_ALL_ATTRIBUTES':'FALSE'}): + with gdaltest.config_options( + { + "DWG_INLINE_BLOCKS": "FALSE", + "DWG_ATTRIBUTES": "TRUE", + "DWG_ALL_ATTRIBUTES": "FALSE", + } + ): - ds = gdal.OpenEx('data/cad/attribs.dwg', allowed_drivers=['DWG']) + ds = gdal.OpenEx("data/cad/attribs.dwg", allowed_drivers=["DWG"]) assert ds is not None - layer = ds.GetLayer( 'entities' ) + layer = ds.GetLayer("entities") defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 11, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 11, ( + "did not get expected number of fields in defn. got %d" + % defn.GetFieldCount() + ) ds = None - - with gdaltest.config_options({'DWG_INLINE_BLOCKS':'FALSE','DWG_ATTRIBUTES':'TRUE'}): - ds = gdal.OpenEx('data/cad/attribs.dwg', allowed_drivers=['DWG']) + with gdaltest.config_options( + {"DWG_INLINE_BLOCKS": "FALSE", "DWG_ATTRIBUTES": "TRUE"} + ): + + ds = gdal.OpenEx("data/cad/attribs.dwg", allowed_drivers=["DWG"]) assert ds is not None - layer = ds.GetLayer( 'entities' ) + layer = ds.GetLayer("entities") defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 32, \ - ('did not get expected number of fields in defn. got %d' - % defn.GetFieldCount()) + assert defn.GetFieldCount() == 32, ( + "did not get expected number of fields in defn. got %d" + % defn.GetFieldCount() + ) ds = None - diff --git a/autotest/ogr/ogr_dxf.py b/autotest/ogr/ogr_dxf.py index ac259009716b..cdb5fb419d5f 100644 --- a/autotest/ogr/ogr_dxf.py +++ b/autotest/ogr/ogr_dxf.py @@ -32,13 +32,11 @@ import os - -import ogrtest import gdaltest -from osgeo import gdal -from osgeo import ogr +import ogrtest import pytest +from osgeo import gdal, ogr ############################################################################### @@ -52,22 +50,21 @@ def test_ogr_dxf_1(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") assert ds is not None - assert ds.GetLayerCount() == 1, 'expected exactly one layer!' + assert ds.GetLayerCount() == 1, "expected exactly one layer!" layer = ds.GetLayer(0) - assert layer.GetName() == 'entities', \ - 'did not get expected layer name.' + assert layer.GetName() == "entities", "did not get expected layer name." defn = layer.GetLayerDefn() - assert defn.GetFieldCount() == 6, 'did not get expected number of fields.' + assert defn.GetFieldCount() == 6, "did not get expected number of fields." fc = layer.GetFeatureCount() - assert fc == 22, ('did not get expected feature count, got %d' % fc) + assert fc == 22, "did not get expected feature count, got %d" % fc ############################################################################### @@ -76,42 +73,51 @@ def test_ogr_dxf_1(): def test_ogr_dxf_2(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) feat = layer.GetNextFeature() - assert feat.Layer == '0', 'did not get expected layer for feature 0' + assert feat.Layer == "0", "did not get expected layer for feature 0" - assert feat.PaperSpace == None, 'did not get expected PaperSpace for feature 0' + assert feat.PaperSpace == None, "did not get expected PaperSpace for feature 0" - assert feat.GetFID() == 0, 'did not get expected fid for feature 0' + assert feat.GetFID() == 0, "did not get expected fid for feature 0" - assert feat.SubClasses == 'AcDbEntity:AcDbEllipse', \ - 'did not get expected SubClasses on feature 0.' + assert ( + feat.SubClasses == "AcDbEntity:AcDbEllipse" + ), "did not get expected SubClasses on feature 0." - assert feat.LineType == 'ByLayer', 'Did not get expected LineType' + assert feat.LineType == "ByLayer", "Did not get expected LineType" - assert feat.EntityHandle == '43', 'did not get expected EntityHandle' + assert feat.EntityHandle == "43", "did not get expected EntityHandle" - if feat.GetStyleString() != 'PEN(c:#000000)': - print('%s' % feat.GetStyleString()) - pytest.fail('did not get expected style string on feat 0.') + if feat.GetStyleString() != "PEN(c:#000000)": + print("%s" % feat.GetStyleString()) + pytest.fail("did not get expected style string on feat 0.") geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbLineString25D + ), "did not get expected geometry type." envelope = geom.GetEnvelope() area = (envelope[1] - envelope[0]) * (envelope[3] - envelope[2]) exp_area = 1596.12 - assert area >= exp_area - 0.5 and area <= exp_area + 0.5, \ - ('envelope area not as expected, got %g.' % area) + assert area >= exp_area - 0.5 and area <= exp_area + 0.5, ( + "envelope area not as expected, got %g." % area + ) + + assert geom.GetX(0) == pytest.approx(73.25, abs=0.001) and geom.GetY( + 0 + ) == pytest.approx( + 139.75, abs=0.001 + ), "first point (%g,%g) not expected location." % ( + geom.GetX(0), + geom.GetY(0), + ) - assert geom.GetX(0) == pytest.approx(73.25, abs=0.001) and geom.GetY(0) == pytest.approx(139.75, abs=0.001), \ - ('first point (%g,%g) not expected location.' - % (geom.GetX(0), geom.GetY(0))) ############################################################################### # Second feature should be a partial ellipse. @@ -119,7 +125,7 @@ def test_ogr_dxf_2(): def test_ogr_dxf_3(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(1): layer.GetNextFeature() @@ -131,12 +137,19 @@ def test_ogr_dxf_3(): area = (envelope[1] - envelope[0]) * (envelope[3] - envelope[2]) exp_area = 311.864 - assert area >= exp_area - 0.5 and area <= exp_area + 0.5, \ - ('envelope area not as expected, got %g.' % area) + assert area >= exp_area - 0.5 and area <= exp_area + 0.5, ( + "envelope area not as expected, got %g." % area + ) + + assert geom.GetX(0) == pytest.approx(61.133, abs=0.01) and geom.GetY( + 0 + ) == pytest.approx( + 103.592, abs=0.01 + ), "first point (%g,%g) not expected location." % ( + geom.GetX(0), + geom.GetY(0), + ) - assert geom.GetX(0) == pytest.approx(61.133, abs=0.01) and geom.GetY(0) == pytest.approx(103.592, abs=0.01), \ - ('first point (%g,%g) not expected location.' - % (geom.GetX(0), geom.GetY(0))) ############################################################################### # Third feature: POINT with RGB true color @@ -144,16 +157,16 @@ def test_ogr_dxf_3(): def test_ogr_dxf_4(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(2): layer.GetNextFeature() feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT (83.5 160.0 0)') + assert not ogrtest.check_feature_geometry(feat, "POINT (83.5 160.0 0)") + + assert feat.GetStyleString() == "PEN(c:#ffbeb8)", "got wrong color on POINT" - assert feat.GetStyleString() == 'PEN(c:#ffbeb8)', \ - 'got wrong color on POINT' ############################################################################### # Fourth feature: LINE @@ -161,16 +174,20 @@ def test_ogr_dxf_4(): def test_ogr_dxf_5(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(3): layer.GetNextFeature() feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (97.0 159.5 0,108.5 132.25 0)') + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING (97.0 159.5 0,108.5 132.25 0)" + ) + + assert ( + feat.GetGeometryRef().GetGeometryType() != ogr.wkbLineString + ), "not keeping 3D linestring as 3D" - assert feat.GetGeometryRef().GetGeometryType() != ogr.wkbLineString, \ - 'not keeping 3D linestring as 3D' ############################################################################### # Fourth feature: MTEXT @@ -178,19 +195,22 @@ def test_ogr_dxf_5(): def test_ogr_dxf_6(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(4): layer.GetNextFeature() feat = layer.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POINT (84 126)') + assert not ogrtest.check_feature_geometry(feat, "POINT (84 126)") - assert feat.GetGeometryRef().GetGeometryType() != ogr.wkbPoint25D, \ - 'not keeping 2D text as 2D' + assert ( + feat.GetGeometryRef().GetGeometryType() != ogr.wkbPoint25D + ), "not keeping 2D text as 2D" + + assert ( + feat.GetStyleString() == 'LABEL(f:"Arial",t:"Test",a:30,s:5g,p:7,c:#000000)' + ), "got wrong style string" - assert feat.GetStyleString() == 'LABEL(f:"Arial",t:"Test",a:30,s:5g,p:7,c:#000000)', \ - 'got wrong style string' ############################################################################### # Partial CIRCLE @@ -198,7 +218,7 @@ def test_ogr_dxf_6(): def test_ogr_dxf_7(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(5): layer.GetNextFeature() @@ -212,11 +232,17 @@ def test_ogr_dxf_7(): if area < exp_area - 0.5 or area > exp_area + 0.5: print(envelope) - pytest.fail('envelope area not as expected, got %g.' % area) + pytest.fail("envelope area not as expected, got %g." % area) + + assert geom.GetX(0) == pytest.approx(115.258, abs=0.01) and geom.GetY( + 0 + ) == pytest.approx( + 107.791, abs=0.01 + ), "first point (%g,%g) not expected location." % ( + geom.GetX(0), + geom.GetY(0), + ) - assert geom.GetX(0) == pytest.approx(115.258, abs=0.01) and geom.GetY(0) == pytest.approx(107.791, abs=0.01), \ - ('first point (%g,%g) not expected location.' - % (geom.GetX(0), geom.GetY(0))) ############################################################################### # PaperSpace and dimension @@ -224,50 +250,69 @@ def test_ogr_dxf_7(): def test_ogr_dxf_8(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(6): layer.GetNextFeature() # Check that this line is in PaperSpace feat = layer.GetNextFeature() - assert feat.GetField('PaperSpace') == 1, 'did not get expected PaperSpace' + assert feat.GetField("PaperSpace") == 1, "did not get expected PaperSpace" # Dimension lines feat = layer.GetNextFeature() geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbMultiLineString, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbMultiLineString + ), "did not get expected geometry type." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((63.8628719444825 149.209935992088,24.3419606685507 111.934531038653),(72.3255686642474 140.237438265109,63.0051995752285 150.119275371538),(32.8046573883157 102.962033311673,23.4842882992968 112.843870418103))') + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((63.8628719444825 149.209935992088,24.3419606685507 111.934531038653),(72.3255686642474 140.237438265109,63.0051995752285 150.119275371538),(32.8046573883157 102.962033311673,23.4842882992968 112.843870418103))", + ) # Dimension arrowheads feat = layer.GetNextFeature() geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbPolygon25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbPolygon25D + ), "did not get expected geometry type." - assert not ogrtest.check_feature_geometry(feat, 'POLYGON Z ((61.7583023958313 147.797704380064 0,63.8628719444825 149.209935992088 0,62.3300839753339 147.191478127097 0,61.7583023958313 147.797704380064 0))') + assert not ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((61.7583023958313 147.797704380064 0,63.8628719444825 149.209935992088 0,62.3300839753339 147.191478127097 0,61.7583023958313 147.797704380064 0))", + ) feat = layer.GetNextFeature() geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbPolygon25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbPolygon25D + ), "did not get expected geometry type." - assert not ogrtest.check_feature_geometry(feat, 'POLYGON Z ((26.4465302172018 113.346762650677 0,24.3419606685507 111.934531038653 0,25.8747486376992 113.952988903644 0,26.4465302172018 113.346762650677 0))') + assert not ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((26.4465302172018 113.346762650677 0,24.3419606685507 111.934531038653 0,25.8747486376992 113.952988903644 0,26.4465302172018 113.346762650677 0))", + ) # Dimension text feat = layer.GetNextFeature() geom = feat.GetGeometryRef() - assert not ogrtest.check_feature_geometry(feat, 'POINT (42.815907752635709 131.936242584545397)') + assert not ogrtest.check_feature_geometry( + feat, "POINT (42.815907752635709 131.936242584545397)" + ) expected_style = 'LABEL(f:"Arial",t:"54.33",p:5,a:43.3,s:2.5g,c:#000000)' - assert feat.GetStyleString() == expected_style, \ - ('Got unexpected style string:\n%s\ninstead of:\n%s' % (feat.GetStyleString(), expected_style)) + assert ( + feat.GetStyleString() == expected_style + ), "Got unexpected style string:\n%s\ninstead of:\n%s" % ( + feat.GetStyleString(), + expected_style, + ) + ############################################################################### # BLOCK (inlined) @@ -275,7 +320,7 @@ def test_ogr_dxf_8(): def test_ogr_dxf_9(): - ds = ogr.Open('data/dxf/assorted.dxf') + ds = ogr.Open("data/dxf/assorted.dxf") layer = ds.GetLayer(0) for _ in range(11): layer.GetNextFeature() @@ -288,30 +333,43 @@ def test_ogr_dxf_9(): feat = layer.GetNextFeature() geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbMultiLineString25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbMultiLineString25D + ), "did not get expected geometry type." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((79.069506278985116 121.003652476272777 0,79.716898725419625 118.892590150942851 0),(79.716898725419625 118.892590150942851 0,78.140638855839953 120.440702522851453 0),(78.140638855839953 120.440702522851453 0,80.139111190485622 120.328112532167196 0),(80.139111190485622 120.328112532167196 0,78.619146316248077 118.920737648613908 0),(78.619146316248077 118.920737648613908 0,79.041358781314059 120.975504978601705 0))') + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((79.069506278985116 121.003652476272777 0,79.716898725419625 118.892590150942851 0),(79.716898725419625 118.892590150942851 0,78.140638855839953 120.440702522851453 0),(78.140638855839953 120.440702522851453 0,80.139111190485622 120.328112532167196 0),(80.139111190485622 120.328112532167196 0,78.619146316248077 118.920737648613908 0),(78.619146316248077 118.920737648613908 0,79.041358781314059 120.975504978601705 0))", + ) # First of two MTEXTs feat = layer.GetNextFeature() - assert feat.GetField('Text') == sample_text, \ - 'Did not get expected first mtext.' + assert feat.GetField("Text") == sample_text, "Did not get expected first mtext." expected_style = f'LABEL(f:"Arial",t:"{sample_style}",a:45,s:0.5g,p:5,c:#000000)' - assert feat.GetStyleString() == expected_style, \ - ('Got unexpected style string:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) + assert ( + feat.GetStyleString() == expected_style + ), "Got unexpected style string:\n%s\ninstead of:\n%s." % ( + feat.GetStyleString(), + expected_style, + ) - assert not ogrtest.check_feature_geometry(feat, 'POINT (77.602201427662891 120.775897075866169 0)') + assert not ogrtest.check_feature_geometry( + feat, "POINT (77.602201427662891 120.775897075866169 0)" + ) # Second of two MTEXTs feat = layer.GetNextFeature() - assert feat.GetField('Text') == 'Second', 'Did not get expected second mtext.' + assert feat.GetField("Text") == "Second", "Did not get expected second mtext." - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbMText', \ - 'Did not get expected subclasses.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbMText" + ), "Did not get expected subclasses." + + assert not ogrtest.check_feature_geometry( + feat, "POINT (79.977331629005178 119.698291706738644 0)" + ) - assert not ogrtest.check_feature_geometry(feat, 'POINT (79.977331629005178 119.698291706738644 0)') ############################################################################### # LWPOLYLINE in an Object Coordinate System. @@ -319,7 +377,7 @@ def test_ogr_dxf_9(): def test_ogr_dxf_10(): - ocs_ds = ogr.Open('data/dxf/LWPOLYLINE-OCS.dxf') + ocs_ds = ogr.Open("data/dxf/LWPOLYLINE-OCS.dxf") ocs_lyr = ocs_ds.GetLayer(0) # Skip boring line. @@ -329,73 +387,84 @@ def test_ogr_dxf_10(): feat = ocs_lyr.GetNextFeature() geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbLineString25D + ), "did not get expected geometry type." - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (600325.567999998573214 3153021.253000000491738 562.760000000052969,600255.215999998385087 3151973.98600000096485 536.950000000069849,597873.927999997511506 3152247.628000000491738 602.705000000089058)') + assert not ogrtest.check_feature_geometry( + feat, + "LINESTRING (600325.567999998573214 3153021.253000000491738 562.760000000052969,600255.215999998385087 3151973.98600000096485 536.950000000069849,597873.927999997511506 3152247.628000000491738 602.705000000089058)", + ) # LWPOLYLINE in OCS with bulge feat = ocs_lyr.GetFeature(12) - assert (not ogrtest.check_feature_geometry(feat, 'LINESTRING Z (611415.459819656 3139300.00002682 1807.37309215522,611245.079665823 3139720.59876424 1807.37309215522,611245.079665823 3139720.59876424 1807.37309215522,611244.054791235 3139723.12875936 1807.27984293229,611243.034695086 3139725.64695847 1807.00053001486,611242.024133533 3139728.14162057 1806.53645568869,611241.027818282 3139730.6011144 1805.88978368251,611240.050394615 3139733.01397265 1805.06352907972,611239.096419732 3139735.36894547 1804.06154426071,611238.170341503 3139737.65505289 1802.88850094122,611237.276477734 3139739.86163602 1801.54986839073,611236.418996029 3139741.97840675 1800.0518879321,611235.601894365 3139743.99549572 1798.40154384175,611234.828982446 3139745.90349832 1796.60653078564,611234.103863944 3139747.69351857 1794.67521794327,611233.429919697 3139749.35721058 1792.61660998662,611232.810291944 3139750.88681743 1790.44030509629,611232.247869676 3139752.27520739 1788.15645021029,611231.745275164 3139753.51590716 1785.77569371438,611231.304851737 3139754.60313201 1783.30913579435,611230.928652852 3139755.5318128 1780.76827668182,611230.618432521 3139756.29761959 1778.16496303489,611230.375637135 3139756.89698184 1775.51133270351,611230.201398719 3139757.32710505 1772.81975813727,611230.096529651 3139757.58598378 1770.10278869926,611230.06151888 3139757.67241101 1767.37309215522,611230.06151892 3139757.67241089 1661.18408370228,611230.06151892 3139757.67241089 1661.18408370228,611230.026508154 3139757.75883812 1658.45438717061,611229.921639091 3139758.01771683 1655.73741774404,611229.74740068 3139758.44784002 1653.04584318824,611229.5046053 3139759.04720226 1650.39221286628,611229.194384975 3139759.81300904 1647.78889922769,611228.818186096 3139760.74168982 1645.24804012238,611228.377762675 3139761.82891465 1642.78148220841,611227.87516817 3139763.0696144 1640.40072571739,611227.312745909 3139764.45800435 1638.11687083509,611226.693118163 3139765.98761118 1635.94056594722,611226.019173923 3139767.65130317 1633.88195799181,611225.294055428 3139769.4413234 1631.95064514943,611224.521143516 3139771.34932599 1630.15563209209,611223.704041858 3139773.36641494 1628.50528799927,611222.84656016 3139775.48318565 1627.00730753696,611221.952696397 3139777.68976876 1625.66867498157,611221.026618175 3139779.97587617 1624.49563165602,611220.072643298 3139782.33084897 1623.49364682979,611219.095219637 3139784.74370721 1622.66739221866,611218.098904392 3139787.20320102 1622.02072020306,611217.088342845 3139789.69786311 1621.55664586644,' + - '611216.0682467 3139792.21606221 1621.27733293758,611215.043372117 3139794.74605732 1621.18408370228,610905.973331759 3140557.71325641 1621.18408370228,610905.973331759 3140557.71325641 1621.18408370228,610904.948457176 3140560.24325151 1621.2773329396,610903.928361033 3140562.76145061 1621.55664587034,610902.917799487 3140565.2561127 1622.02072020868,610901.921484243 3140567.71560651 1622.66739222582,610900.944060583 3140570.12846474 1623.49364683831,610899.990085707 3140572.48343755 1624.49563166573,610899.064007486 3140574.76954495 1625.66867499227,610898.170143725 3140576.97612806 1627.00730754846,610897.312662028 3140579.09289877 1628.50528801138,610896.495560372 3140581.10998771 1630.1556321046,610895.722648461 3140583.0179903 1631.95064516215,610894.997529967 3140584.80801053 1633.88195800453,610894.323585729 3140586.47170251 1635.94056595974,610893.703957984 3140588.00130935 1638.1168708472,610893.141535724 3140589.38969929 1640.4007257289,610892.63894122 3140590.63039904 1642.78148221912,610892.198517801 3140591.71762387 1645.2480401321,610891.822318923 3140592.64630464 1647.78889923622,610891.5120986 3140593.41211142 1650.39221287345,610891.269303221 3140594.01147366 1653.04584319386,610891.095064811 3140594.44159685 1655.73741774794,610890.99019575 3140594.70047556 1658.45438717264,610890.955184986 3140594.78690278 1661.18408370228,610890.955185021 3140594.78690272 1752.31638281001,610890.955185021 3140594.78690271 1752.31638281001,610890.920174252 3140594.87332995 1755.04607934987,610890.815305187 3140595.13220867 1757.76304878401,610890.641066773 3140595.56233187 1760.45462334672,610890.398271389 3140596.16169412 1763.10825367492,610890.088051061 3140596.92750091 1765.71156731903,610889.711852178 3140597.85618169 1768.25242642912,610889.271428753 3140598.94340654 1770.71898434711,610888.768834244 3140600.1841063 1773.09974084137,610888.206411978 3140601.57249626 1775.38359572612,610887.586784228 3140603.1021031 1777.55990061562,610886.912839984 3140604.7657951 1779.61850857185,610886.187721485 3140606.55581535 1781.54982141423,610885.414809569 3140608.46381795 1783.34483447076,610884.597707907 3140610.48090691 1784.99517856195,610883.740226205 3140612.59767763 1786.49315902182,610882.846362438 3140614.80426075 1787.83179157397,610881.920284211 3140617.09036817 1789.0048348955,610880.96630933 3140619.44534098 1790.00681971696,610879.988885665 3140621.85819923 1790.83307432256,610878.992570417 3140624.31769305 1791.47974633192,610877.982008866 3140626.81235515 1791.94382066162,610876.961912718 3140629.33055426 1792.22313358291,610875.937038132 3140631.86054938 1792.31638281001,610699.99993399 3141066.17711854 1792.31638281001)')) + assert not ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (611415.459819656 3139300.00002682 1807.37309215522,611245.079665823 3139720.59876424 1807.37309215522,611245.079665823 3139720.59876424 1807.37309215522,611244.054791235 3139723.12875936 1807.27984293229,611243.034695086 3139725.64695847 1807.00053001486,611242.024133533 3139728.14162057 1806.53645568869,611241.027818282 3139730.6011144 1805.88978368251,611240.050394615 3139733.01397265 1805.06352907972,611239.096419732 3139735.36894547 1804.06154426071,611238.170341503 3139737.65505289 1802.88850094122,611237.276477734 3139739.86163602 1801.54986839073,611236.418996029 3139741.97840675 1800.0518879321,611235.601894365 3139743.99549572 1798.40154384175,611234.828982446 3139745.90349832 1796.60653078564,611234.103863944 3139747.69351857 1794.67521794327,611233.429919697 3139749.35721058 1792.61660998662,611232.810291944 3139750.88681743 1790.44030509629,611232.247869676 3139752.27520739 1788.15645021029,611231.745275164 3139753.51590716 1785.77569371438,611231.304851737 3139754.60313201 1783.30913579435,611230.928652852 3139755.5318128 1780.76827668182,611230.618432521 3139756.29761959 1778.16496303489,611230.375637135 3139756.89698184 1775.51133270351,611230.201398719 3139757.32710505 1772.81975813727,611230.096529651 3139757.58598378 1770.10278869926,611230.06151888 3139757.67241101 1767.37309215522,611230.06151892 3139757.67241089 1661.18408370228,611230.06151892 3139757.67241089 1661.18408370228,611230.026508154 3139757.75883812 1658.45438717061,611229.921639091 3139758.01771683 1655.73741774404,611229.74740068 3139758.44784002 1653.04584318824,611229.5046053 3139759.04720226 1650.39221286628,611229.194384975 3139759.81300904 1647.78889922769,611228.818186096 3139760.74168982 1645.24804012238,611228.377762675 3139761.82891465 1642.78148220841,611227.87516817 3139763.0696144 1640.40072571739,611227.312745909 3139764.45800435 1638.11687083509,611226.693118163 3139765.98761118 1635.94056594722,611226.019173923 3139767.65130317 1633.88195799181,611225.294055428 3139769.4413234 1631.95064514943,611224.521143516 3139771.34932599 1630.15563209209,611223.704041858 3139773.36641494 1628.50528799927,611222.84656016 3139775.48318565 1627.00730753696,611221.952696397 3139777.68976876 1625.66867498157,611221.026618175 3139779.97587617 1624.49563165602,611220.072643298 3139782.33084897 1623.49364682979,611219.095219637 3139784.74370721 1622.66739221866,611218.098904392 3139787.20320102 1622.02072020306,611217.088342845 3139789.69786311 1621.55664586644," + + "611216.0682467 3139792.21606221 1621.27733293758,611215.043372117 3139794.74605732 1621.18408370228,610905.973331759 3140557.71325641 1621.18408370228,610905.973331759 3140557.71325641 1621.18408370228,610904.948457176 3140560.24325151 1621.2773329396,610903.928361033 3140562.76145061 1621.55664587034,610902.917799487 3140565.2561127 1622.02072020868,610901.921484243 3140567.71560651 1622.66739222582,610900.944060583 3140570.12846474 1623.49364683831,610899.990085707 3140572.48343755 1624.49563166573,610899.064007486 3140574.76954495 1625.66867499227,610898.170143725 3140576.97612806 1627.00730754846,610897.312662028 3140579.09289877 1628.50528801138,610896.495560372 3140581.10998771 1630.1556321046,610895.722648461 3140583.0179903 1631.95064516215,610894.997529967 3140584.80801053 1633.88195800453,610894.323585729 3140586.47170251 1635.94056595974,610893.703957984 3140588.00130935 1638.1168708472,610893.141535724 3140589.38969929 1640.4007257289,610892.63894122 3140590.63039904 1642.78148221912,610892.198517801 3140591.71762387 1645.2480401321,610891.822318923 3140592.64630464 1647.78889923622,610891.5120986 3140593.41211142 1650.39221287345,610891.269303221 3140594.01147366 1653.04584319386,610891.095064811 3140594.44159685 1655.73741774794,610890.99019575 3140594.70047556 1658.45438717264,610890.955184986 3140594.78690278 1661.18408370228,610890.955185021 3140594.78690272 1752.31638281001,610890.955185021 3140594.78690271 1752.31638281001,610890.920174252 3140594.87332995 1755.04607934987,610890.815305187 3140595.13220867 1757.76304878401,610890.641066773 3140595.56233187 1760.45462334672,610890.398271389 3140596.16169412 1763.10825367492,610890.088051061 3140596.92750091 1765.71156731903,610889.711852178 3140597.85618169 1768.25242642912,610889.271428753 3140598.94340654 1770.71898434711,610888.768834244 3140600.1841063 1773.09974084137,610888.206411978 3140601.57249626 1775.38359572612,610887.586784228 3140603.1021031 1777.55990061562,610886.912839984 3140604.7657951 1779.61850857185,610886.187721485 3140606.55581535 1781.54982141423,610885.414809569 3140608.46381795 1783.34483447076,610884.597707907 3140610.48090691 1784.99517856195,610883.740226205 3140612.59767763 1786.49315902182,610882.846362438 3140614.80426075 1787.83179157397,610881.920284211 3140617.09036817 1789.0048348955,610880.96630933 3140619.44534098 1790.00681971696,610879.988885665 3140621.85819923 1790.83307432256,610878.992570417 3140624.31769305 1791.47974633192,610877.982008866 3140626.81235515 1791.94382066162,610876.961912718 3140629.33055426 1792.22313358291,610875.937038132 3140631.86054938 1792.31638281001,610699.99993399 3141066.17711854 1792.31638281001)", + ) ocs_lyr = None ocs_ds = None + ############################################################################### # Test reading from an entities-only dxf file (#3412) def test_ogr_dxf_11(): - eo_ds = ogr.Open('data/dxf/entities_only.dxf') + eo_ds = ogr.Open("data/dxf/entities_only.dxf") eo_lyr = eo_ds.GetLayer(0) # Check first point. feat = eo_lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'POINT (672500.0 242000.0 539.986)')) + assert not ogrtest.check_feature_geometry(feat, "POINT (672500.0 242000.0 539.986)") # Check second point. feat = eo_lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'POINT (672750.0 242000.0 558.974)')) + assert not ogrtest.check_feature_geometry(feat, "POINT (672750.0 242000.0 558.974)") eo_lyr = None eo_ds = None + ############################################################################### # Write a simple file with a polygon and a line, and read back. def test_ogr_dxf_12(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/dxf_11.dxf') + ds = ogr.GetDriverByName("DXF").CreateDataSource("tmp/dxf_11.dxf") - lyr = ds.CreateLayer('entities') + lyr = ds.CreateLayer("entities") dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(10 12, 60 65)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(10 12, 60 65)")) lyr.CreateFeature(dst_feat) dst_feat = None dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,100 0,100 100,0 0))')) + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("POLYGON((0 0,100 0,100 100,0 0))") + ) lyr.CreateFeature(dst_feat) dst_feat = None # Test 25D linestring with constant Z (#5210) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(1 2 10,3 4 10)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(1 2 10,3 4 10)")) lyr.CreateFeature(dst_feat) dst_feat = None # Test 25D linestring with different Z (#5210) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(1 2 -10,3 4 10)')) + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("LINESTRING(1 2 -10,3 4 10)") + ) lyr.CreateFeature(dst_feat) dst_feat = None @@ -403,77 +472,82 @@ def test_ogr_dxf_12(): ds = None # Read back. - ds = ogr.Open('tmp/dxf_11.dxf') + ds = ogr.Open("tmp/dxf_11.dxf") lyr = ds.GetLayer(0) # Check first feature feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'LINESTRING(10 12, 60 65)')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING(10 12, 60 65)" + ), feat.GetGeometryRef().ExportToWkt() - assert feat.GetGeometryRef().GetGeometryType() == ogr.wkbLineString, \ - 'not linestring 2D' + assert ( + feat.GetGeometryRef().GetGeometryType() == ogr.wkbLineString + ), "not linestring 2D" feat = None # Check second feature feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'POLYGON((0 0,100 0,100 100,0 0))')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "POLYGON((0 0,100 0,100 100,0 0))" + ), feat.GetGeometryRef().ExportToWkt() - assert feat.GetGeometryRef().GetGeometryType() == ogr.wkbPolygon, \ - 'not keeping polygon 2D' + assert ( + feat.GetGeometryRef().GetGeometryType() == ogr.wkbPolygon + ), "not keeping polygon 2D" feat = None # Check third feature feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'LINESTRING(1 2 10,3 4 10)')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING(1 2 10,3 4 10)" + ), feat.GetGeometryRef().ExportToWkt() feat = None # Check fourth feature feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'LINESTRING(1 2 -10,3 4 10)')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING(1 2 -10,3 4 10)" + ), feat.GetGeometryRef().ExportToWkt() feat = None lyr = None ds = None ds = None - os.unlink('tmp/dxf_11.dxf') + os.unlink("tmp/dxf_11.dxf") ############################################################################### # Check smoothed polyline. + def test_ogr_dxf_13(): - ds = ogr.Open('data/dxf/polyline_smooth.dxf') + ds = ogr.Open("data/dxf/polyline_smooth.dxf") layer = ds.GetLayer(0) feat = layer.GetNextFeature() - assert feat.Layer == '1', 'did not get expected layer for feature 0' + assert feat.Layer == "1", "did not get expected layer for feature 0" geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString25D, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbLineString25D + ), "did not get expected geometry type." envelope = geom.GetEnvelope() area = (envelope[1] - envelope[0]) * (envelope[3] - envelope[2]) exp_area = 1350.43 - assert area >= exp_area - 0.5 and area <= exp_area + 0.5, \ - ('envelope area not as expected, got %g.' % area) + assert area >= exp_area - 0.5 and area <= exp_area + 0.5, ( + "envelope area not as expected, got %g." % area + ) # Check for specific number of points from tessellated arc(s). # Note that this number depends on the tessellation algorithm and @@ -484,12 +558,18 @@ def test_ogr_dxf_13(): # only that more points are returned than in the original polyline, and # that the points lie along (or reasonably close to) said path. - assert geom.GetPointCount() == 146, \ - ('did not get expected number of points, got %d' % geom.GetPointCount()) + assert geom.GetPointCount() == 146, ( + "did not get expected number of points, got %d" % geom.GetPointCount() + ) - assert geom.GetX(0) == pytest.approx(251297.8179, abs=0.001) and geom.GetY(0) == pytest.approx(412226.8286, abs=0.001), \ - ('first point (%g,%g) not expected location.' - % (geom.GetX(0), geom.GetY(0))) + assert geom.GetX(0) == pytest.approx(251297.8179, abs=0.001) and geom.GetY( + 0 + ) == pytest.approx( + 412226.8286, abs=0.001 + ), "first point (%g,%g) not expected location." % ( + geom.GetX(0), + geom.GetY(0), + ) # Other possible tests: # Polylines with no explicit Z coordinates (e.g., no attribute 38 for @@ -505,40 +585,50 @@ def test_ogr_dxf_13(): ############################################################################### # Check smooth LWPOLYLINE entity. + def test_ogr_dxf_14(): # This test is identical to the previous one except the # newer lwpolyline entity is used. See the comments in the # previous test regarding caveats, etc. - ds = ogr.Open('data/dxf/lwpolyline_smooth.dxf') + ds = ogr.Open("data/dxf/lwpolyline_smooth.dxf") layer = ds.GetLayer(0) feat = layer.GetNextFeature() - assert feat.Layer == '1', 'did not get expected layer for feature 0' + assert feat.Layer == "1", "did not get expected layer for feature 0" geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString, \ - 'did not get expected geometry type.' + assert ( + geom.GetGeometryType() == ogr.wkbLineString + ), "did not get expected geometry type." envelope = geom.GetEnvelope() area = (envelope[1] - envelope[0]) * (envelope[3] - envelope[2]) exp_area = 1350.43 - assert area >= exp_area - 0.5 and area <= exp_area + 0.5, \ - ('envelope area not as expected, got %g.' % area) + assert area >= exp_area - 0.5 and area <= exp_area + 0.5, ( + "envelope area not as expected, got %g." % area + ) - assert geom.GetPointCount() == 146, \ - ('did not get expected number of points, got %d' % geom.GetPointCount()) + assert geom.GetPointCount() == 146, ( + "did not get expected number of points, got %d" % geom.GetPointCount() + ) - assert geom.GetX(0) == pytest.approx(251297.8179, abs=0.001) and geom.GetY(0) == pytest.approx(412226.8286, abs=0.001), \ - ('first point (%g,%g) not expected location.' - % (geom.GetX(0), geom.GetY(0))) + assert geom.GetX(0) == pytest.approx(251297.8179, abs=0.001) and geom.GetY( + 0 + ) == pytest.approx( + 412226.8286, abs=0.001 + ), "first point (%g,%g) not expected location." % ( + geom.GetX(0), + geom.GetY(0), + ) ds = None + ############################################################################### # Write a file with dynamic layer creation and confirm that the # dynamically created layer 'abc' matches the definition of the default @@ -547,50 +637,55 @@ def test_ogr_dxf_14(): def test_ogr_dxf_15(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/dxf_14.dxf', - ['FIRST_ENTITY=80']) + ds = ogr.GetDriverByName("DXF").CreateDataSource( + "tmp/dxf_14.dxf", ["FIRST_ENTITY=80"] + ) - lyr = ds.CreateLayer('entities') + lyr = ds.CreateLayer("entities") dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(10 12, 60 65)')) - dst_feat.SetField('Layer', 'abc') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(10 12, 60 65)")) + dst_feat.SetField("Layer", "abc") lyr.CreateFeature(dst_feat) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,100 0,100 100,0 0))')) + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("POLYGON((0 0,100 0,100 100,0 0))") + ) lyr.CreateFeature(dst_feat) lyr = None ds = None # Read back. - ds = ogr.Open('tmp/dxf_14.dxf') + ds = ogr.Open("tmp/dxf_14.dxf") lyr = ds.GetLayer(0) # Check first feature feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'LINESTRING(10 12, 60 65)')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "LINESTRING(10 12, 60 65)" + ), feat.GetGeometryRef().ExportToWkt() - assert feat.GetGeometryRef().GetGeometryType() != ogr.wkbLineString25D, \ - 'not linestring 2D' + assert ( + feat.GetGeometryRef().GetGeometryType() != ogr.wkbLineString25D + ), "not linestring 2D" - assert feat.GetField('Layer') == 'abc', 'Did not get expected layer, abc.' + assert feat.GetField("Layer") == "abc", "Did not get expected layer, abc." # Check second point. feat = lyr.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, - 'POLYGON((0 0,100 0,100 100,0 0))')), \ - feat.GetGeometryRef().ExportToWkt() + assert not ogrtest.check_feature_geometry( + feat, "POLYGON((0 0,100 0,100 100,0 0))" + ), feat.GetGeometryRef().ExportToWkt() - assert feat.GetGeometryRef().GetGeometryType() != ogr.wkbPolygon25D, \ - 'not keeping polygon 2D' + assert ( + feat.GetGeometryRef().GetGeometryType() != ogr.wkbPolygon25D + ), "not keeping polygon 2D" - assert feat.GetField('Layer') == '0', 'Did not get expected layer, 0.' + assert feat.GetField("Layer") == "0", "Did not get expected layer, 0." lyr = None ds = None @@ -600,58 +695,65 @@ def test_ogr_dxf_15(): # that will be different is the layer name is 'abc' instead of '0' # and the entity id. - outdxf = open('tmp/dxf_14.dxf').read() - start_1 = outdxf.find(' 0\nLAYER') - start_2 = outdxf.find(' 0\nLAYER', start_1 + 10) + outdxf = open("tmp/dxf_14.dxf").read() + start_1 = outdxf.find(" 0\nLAYER") + start_2 = outdxf.find(" 0\nLAYER", start_1 + 10) txt_1 = outdxf[start_1:start_2] - txt_2 = outdxf[start_2:start_2 + len(txt_1) + 2] + txt_2 = outdxf[start_2 : start_2 + len(txt_1) + 2] - abc_off = txt_2.find('abc\n') + abc_off = txt_2.find("abc\n") - assert txt_2[16:abc_off] + '0' + txt_2[abc_off + 3:] == txt_1[16:], \ - 'Layer abc does not seem to match layer 0.' + assert ( + txt_2[16:abc_off] + "0" + txt_2[abc_off + 3 :] == txt_1[16:] + ), "Layer abc does not seem to match layer 0." # Check that $HANDSEED was set as expected. - start_seed = outdxf.find('$HANDSEED') - handseed = outdxf[start_seed + 10 + 4:start_seed + 10 + 4 + 8] - assert handseed == '00000053', ('Did not get expected HANDSEED, got %s.' % handseed) + start_seed = outdxf.find("$HANDSEED") + handseed = outdxf[start_seed + 10 + 4 : start_seed + 10 + 4 + 8] + assert handseed == "00000053", "Did not get expected HANDSEED, got %s." % handseed - os.unlink('tmp/dxf_14.dxf') + os.unlink("tmp/dxf_14.dxf") ############################################################################### # Test reading without DXF blocks inlined. + def test_ogr_dxf_16(): - gdal.SetConfigOption('DXF_INLINE_BLOCKS', 'FALSE') + gdal.SetConfigOption("DXF_INLINE_BLOCKS", "FALSE") try: - dxf_ds = ogr.Open('data/dxf/assorted.dxf') + dxf_ds = ogr.Open("data/dxf/assorted.dxf") assert dxf_ds is not None - assert dxf_ds.GetLayerCount() == 2, 'expected exactly two layers!' + assert dxf_ds.GetLayerCount() == 2, "expected exactly two layers!" dxf_layer = dxf_ds.GetLayer(1) - assert dxf_layer.GetName() == 'entities', 'did not get expected layer name.' + assert dxf_layer.GetName() == "entities", "did not get expected layer name." # read through till we encounter the block reference. feat = dxf_layer.GetNextFeature() - while feat.GetField('EntityHandle') != '55': + while feat.GetField("EntityHandle") != "55": feat = dxf_layer.GetNextFeature() # check contents. - assert feat.GetField('BlockName') == 'STAR', 'Did not get blockname!' + assert feat.GetField("BlockName") == "STAR", "Did not get blockname!" - assert feat.GetField('BlockAngle') == 0.0, 'Did not get expected angle.' + assert feat.GetField("BlockAngle") == 0.0, "Did not get expected angle." - assert feat.GetField('BlockScale') == [1.0, 1.0, 1.0], \ - 'Did not get expected BlockScale' + assert feat.GetField("BlockScale") == [ + 1.0, + 1.0, + 1.0, + ], "Did not get expected BlockScale" - assert not ogrtest.check_feature_geometry(feat, 'POINT (79.097653776656188 119.962195062443342 0)') + assert not ogrtest.check_feature_geometry( + feat, "POINT (79.097653776656188 119.962195062443342 0)" + ) feat = None @@ -659,40 +761,54 @@ def test_ogr_dxf_16(): dxf_layer = dxf_ds.GetLayer(0) - assert dxf_layer.GetName() == 'blocks', 'did not get expected layer name.' + assert dxf_layer.GetName() == "blocks", "did not get expected layer name." # STAR geometry feat = dxf_layer.GetNextFeature() - assert feat.GetField('Block') == 'STAR', 'Did not get expected block name.' + assert feat.GetField("Block") == "STAR", "Did not get expected block name." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((-0.028147497671066 1.041457413829428 0,0.619244948763444 -1.069604911500494 0),(0.619244948763444 -1.069604911500494 0,-0.957014920816232 0.478507460408116 0),(-0.957014920816232 0.478507460408116 0,1.041457413829428 0.365917469723853 0),(1.041457413829428 0.365917469723853 0,-0.478507460408116 -1.041457413829428 0),(-0.478507460408116 -1.041457413829428 0,-0.056294995342131 1.013309916158363 0))') + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((-0.028147497671066 1.041457413829428 0,0.619244948763444 -1.069604911500494 0),(0.619244948763444 -1.069604911500494 0,-0.957014920816232 0.478507460408116 0),(-0.957014920816232 0.478507460408116 0,1.041457413829428 0.365917469723853 0),(1.041457413829428 0.365917469723853 0,-0.478507460408116 -1.041457413829428 0),(-0.478507460408116 -1.041457413829428 0,-0.056294995342131 1.013309916158363 0))", + ) # First MTEXT feat = dxf_layer.GetNextFeature() - assert feat.GetField('Text') == sample_text, \ - 'Did not get expected first mtext.' - - expected_style = f'LABEL(f:"Arial",t:"{sample_style}",a:45,s:0.5g,p:5,c:#000000)' - assert feat.GetStyleString() == expected_style, \ - ('Got unexpected style string:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) - - assert not ogrtest.check_feature_geometry(feat, 'POINT (-1.495452348993292 0.813702013422821 0)') + assert feat.GetField("Text") == sample_text, "Did not get expected first mtext." + + expected_style = ( + f'LABEL(f:"Arial",t:"{sample_style}",a:45,s:0.5g,p:5,c:#000000)' + ) + assert ( + feat.GetStyleString() == expected_style + ), "Got unexpected style string:\n%s\ninstead of:\n%s." % ( + feat.GetStyleString(), + expected_style, + ) + + assert not ogrtest.check_feature_geometry( + feat, "POINT (-1.495452348993292 0.813702013422821 0)" + ) # Second MTEXT feat = dxf_layer.GetNextFeature() - assert feat.GetField('Text') == 'Second', 'Did not get expected second mtext.' + assert feat.GetField("Text") == "Second", "Did not get expected second mtext." - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbMText', \ - 'Did not get expected subclasses.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbMText" + ), "Did not get expected subclasses." - assert not ogrtest.check_feature_geometry(feat, 'POINT (0.879677852348995 -0.263903355704699 0)') + assert not ogrtest.check_feature_geometry( + feat, "POINT (0.879677852348995 -0.263903355704699 0)" + ) feat = None finally: # cleanup - gdal.SetConfigOption('DXF_INLINE_BLOCKS', None) + gdal.SetConfigOption("DXF_INLINE_BLOCKS", None) + ############################################################################### # Write a file with blocks defined from a source blocks layer. @@ -700,131 +816,153 @@ def test_ogr_dxf_16(): def test_ogr_dxf_17(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/dxf_17.dxf', - ['HEADER=data/dxf/header_extended.dxf']) + ds = ogr.GetDriverByName("DXF").CreateDataSource( + "tmp/dxf_17.dxf", ["HEADER=data/dxf/header_extended.dxf"] + ) - blyr = ds.CreateLayer('blocks') - lyr = ds.CreateLayer('entities') + blyr = ds.CreateLayer("blocks") + lyr = ds.CreateLayer("entities") dst_feat = ogr.Feature(feature_def=blyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt( - 'GEOMETRYCOLLECTION( LINESTRING(0 0,1 1),LINESTRING(1 0,0 1))')) - dst_feat.SetField('Block', 'XMark') + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt( + "GEOMETRYCOLLECTION( LINESTRING(0 0,1 1),LINESTRING(1 0,0 1))" + ) + ) + dst_feat.SetField("Block", "XMark") blyr.CreateFeature(dst_feat) # Block with 2 polygons dst_feat = ogr.Feature(feature_def=blyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt( - 'GEOMETRYCOLLECTION( POLYGON((10 10,10 20,20 20,20 10,10 10)),POLYGON((10 -10,10 -20,20 -20,20 -10,10 -10)))')) - dst_feat.SetField('Block', 'Block2') + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt( + "GEOMETRYCOLLECTION( POLYGON((10 10,10 20,20 20,20 10,10 10)),POLYGON((10 -10,10 -20,20 -20,20 -10,10 -10)))" + ) + ) + dst_feat.SetField("Block", "Block2") blyr.CreateFeature(dst_feat) # Block with point and line dst_feat = ogr.Feature(feature_def=blyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt( - 'GEOMETRYCOLLECTION( POINT(1 2),LINESTRING(0 0,1 1))')) - dst_feat.SetField('Block', 'Block3') + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("GEOMETRYCOLLECTION( POINT(1 2),LINESTRING(0 0,1 1))") + ) + dst_feat.SetField("Block", "Block3") blyr.CreateFeature(dst_feat) # Write a block reference feature. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(200 100)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'XMark') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(200 100)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "XMark") lyr.CreateFeature(dst_feat) # Write a block reference feature for a non-existent block. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(300 50)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'DoesNotExist') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(300 50)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "DoesNotExist") lyr.CreateFeature(dst_feat) # Write a block reference feature for a template defined block dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(250 200)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'STAR') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(250 200)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "STAR") lyr.CreateFeature(dst_feat) # Write a block reference feature with scaling and rotation dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(300 100)')) - dst_feat.SetField('BlockName', 'XMark') - dst_feat.SetField('BlockAngle', '30') - dst_feat.SetFieldDoubleList(lyr.GetLayerDefn().GetFieldIndex('BlockScale'), - [4.0, 5.0, 6.0]) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(300 100)")) + dst_feat.SetField("BlockName", "XMark") + dst_feat.SetField("BlockAngle", "30") + dst_feat.SetFieldDoubleList( + lyr.GetLayerDefn().GetFieldIndex("BlockScale"), [4.0, 5.0, 6.0] + ) lyr.CreateFeature(dst_feat) # Write a Block2 reference feature. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(350 100)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'Block2') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(350 100)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "Block2") lyr.CreateFeature(dst_feat) # Write a Block3 reference feature. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(400 100)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'Block3') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(400 100)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "Block3") lyr.CreateFeature(dst_feat) ds = None # Reopen and check contents. - ds = ogr.Open('tmp/dxf_17.dxf') + ds = ogr.Open("tmp/dxf_17.dxf") lyr = ds.GetLayer(0) # Check first feature. feat = lyr.GetNextFeature() - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbBlockReference', \ - 'Got wrong subclasses for feature 1.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbBlockReference" + ), "Got wrong subclasses for feature 1." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((200 100,201 101),(201 100,200 101))'), \ - 'Feature 1' + assert not ogrtest.check_feature_geometry( + feat, "MULTILINESTRING ((200 100,201 101),(201 100,200 101))" + ), "Feature 1" # Check 2nd feature. feat = lyr.GetNextFeature() - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbPoint', \ - 'Got wrong subclasses for feature 2.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbPoint" + ), "Got wrong subclasses for feature 2." - assert not ogrtest.check_feature_geometry(feat, 'POINT (300 50)'), 'Feature 2' + assert not ogrtest.check_feature_geometry(feat, "POINT (300 50)"), "Feature 2" # Check 3rd feature. feat = lyr.GetNextFeature() - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbBlockReference', \ - 'Got wrong subclasses for feature 3.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbBlockReference" + ), "Got wrong subclasses for feature 3." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((249.971852502328943 201.04145741382942 0,250.619244948763452 198.930395088499495 0),(250.619244948763452 198.930395088499495 0,249.042985079183779 200.47850746040811 0),(249.042985079183779 200.47850746040811 0,251.04145741382942 200.365917469723854 0),(251.04145741382942 200.365917469723854 0,249.52149253959189 198.95854258617058 0),(249.52149253959189 198.95854258617058 0,249.943705004657858 201.013309916158363 0))'), \ - 'Feature 3' + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((249.971852502328943 201.04145741382942 0,250.619244948763452 198.930395088499495 0),(250.619244948763452 198.930395088499495 0,249.042985079183779 200.47850746040811 0),(249.042985079183779 200.47850746040811 0,251.04145741382942 200.365917469723854 0),(251.04145741382942 200.365917469723854 0,249.52149253959189 198.95854258617058 0),(249.52149253959189 198.95854258617058 0,249.943705004657858 201.013309916158363 0))", + ), "Feature 3" # Check 4th feature (scaled and rotated) feat = lyr.GetNextFeature() - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbBlockReference', \ - 'Got wrong subclasses for feature 4.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbBlockReference" + ), "Got wrong subclasses for feature 4." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((300 100,300.964101615137736 106.330127018922198), (303.464101615137736 102.0,297.5 104.330127018922198))'), \ - 'Feature 4' + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((300 100,300.964101615137736 106.330127018922198), (303.464101615137736 102.0,297.5 104.330127018922198))", + ), "Feature 4" # Check 5th feature feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((360 110,360 120,370 120,370 110,360 110)),((360 90,360 80,370 80,370 90,360 90)))'), \ - 'Feature 5' + assert not ogrtest.check_feature_geometry( + feat, + "MULTIPOLYGON (((360 110,360 120,370 120,370 110,360 110)),((360 90,360 80,370 80,370 90,360 90)))", + ), "Feature 5" # Check 6th feature feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'GEOMETRYCOLLECTION (POINT (401 102),LINESTRING (400 100,401 101))'), \ - 'Feature 5' + assert not ogrtest.check_feature_geometry( + feat, "GEOMETRYCOLLECTION (POINT (401 102),LINESTRING (400 100,401 101))" + ), "Feature 5" # Cleanup lyr = None ds = None - os.unlink('tmp/dxf_17.dxf') + os.unlink("tmp/dxf_17.dxf") + ############################################################################### # Write a file with line patterns, and make sure corresponding Linetypes are @@ -833,40 +971,41 @@ def test_ogr_dxf_17(): def test_ogr_dxf_18(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/dxf_18.dxf', - ['HEADER=data/dxf/header_extended.dxf']) + ds = ogr.GetDriverByName("DXF").CreateDataSource( + "tmp/dxf_18.dxf", ["HEADER=data/dxf/header_extended.dxf"] + ) - lyr = ds.CreateLayer('entities') + lyr = ds.CreateLayer("entities") # Write a feature with a predefined LTYPE in the header. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(0 0,25 25)')) - dst_feat.SetField('Linetype', 'DASHED') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(0 0,25 25)")) + dst_feat.SetField("Linetype", "DASHED") dst_feat.SetStyleString('PEN(c:#ffff00,w:2g,p:"12.0g 6.0g")') lyr.CreateFeature(dst_feat) # Write a feature with a named linetype but that isn't predefined in the header. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(5 5,30 30)')) - dst_feat.SetField('Linetype', 'DOTTED') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(5 5,30 30)")) + dst_feat.SetField("Linetype", "DOTTED") dst_feat.SetStyleString('PEN(c:#ffff00,w:2g,p:"0.0g 4.0g")') lyr.CreateFeature(dst_feat) # Write a feature without a linetype name - it will be created. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(5 5,40 30)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(5 5,40 30)")) dst_feat.SetStyleString('PEN(c:#ffff00,w:2g,p:"3.0g 4.0g")') lyr.CreateFeature(dst_feat) # Write a feature with a linetype proportional to a predefined one. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(5 5,40 20)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(5 5,40 20)")) dst_feat.SetStyleString('PEN(c:#ffff00,w:0.3mm,p:"6.35g 3.0617284g")') lyr.CreateFeature(dst_feat) # Write a feature with a linetype proportional to an auto-created one. dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(5 5,40 10)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(5 5,40 10)")) dst_feat.SetStyleString('PEN(c:#ffff00,w:20px,p:"6.0g 8.0g")') lyr.CreateFeature(dst_feat) @@ -874,58 +1013,64 @@ def test_ogr_dxf_18(): # Reopen and check contents. - ds = ogr.Open('tmp/dxf_18.dxf') + ds = ogr.Open("tmp/dxf_18.dxf") lyr = ds.GetLayer(0) # Check first feature. feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DASHED', 'Got wrong linetype. (1)' + assert feat.GetField("Linetype") == "DASHED", "Got wrong linetype. (1)" - assert feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"12.7g 6.1234567892g")', \ - "got wrong style string (1)" + assert ( + feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"12.7g 6.1234567892g")' + ), "got wrong style string (1)" - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (0 0,25 25)') + assert not ogrtest.check_feature_geometry(feat, "LINESTRING (0 0,25 25)") # Check second feature. feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DOTTED', 'Got wrong linetype. (2)' + assert feat.GetField("Linetype") == "DOTTED", "Got wrong linetype. (2)" - assert feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"0g 4g")', \ - "got wrong style string (2)" + assert ( + feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"0g 4g")' + ), "got wrong style string (2)" - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (5 5,30 30)') + assert not ogrtest.check_feature_geometry(feat, "LINESTRING (5 5,30 30)") # Check third feature. feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'AutoLineType-1', 'Got wrong linetype. (3)' + assert feat.GetField("Linetype") == "AutoLineType-1", "Got wrong linetype. (3)" - assert feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"3g 4g")', \ - "got wrong style string (3)" + assert ( + feat.GetStyleString() == 'PEN(c:#ffff00,w:2g,p:"3g 4g")' + ), "got wrong style string (3)" - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (5 5,40 30)') + assert not ogrtest.check_feature_geometry(feat, "LINESTRING (5 5,40 30)") # Check fourth feature. feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DASHED', 'Got wrong linetype. (4)' + assert feat.GetField("Linetype") == "DASHED", "Got wrong linetype. (4)" # TODO why did the lineweight go AWOL here? - assert feat.GetStyleString() == 'PEN(c:#ffff00,p:"6.35g 3.0617283946g")', \ - "got wrong style string (4)" + assert ( + feat.GetStyleString() == 'PEN(c:#ffff00,p:"6.35g 3.0617283946g")' + ), "got wrong style string (4)" # Check fifth feature. feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'AutoLineType-1', 'Got wrong linetype. (5)' + assert feat.GetField("Linetype") == "AutoLineType-1", "Got wrong linetype. (5)" - assert feat.GetStyleString() == 'PEN(c:#ffff00,w:0.01g,p:"6g 8g")', \ - "got wrong style string (5)" + assert ( + feat.GetStyleString() == 'PEN(c:#ffff00,w:0.01g,p:"6g 8g")' + ), "got wrong style string (5)" # Cleanup lyr = None ds = None - os.unlink('tmp/dxf_18.dxf') + os.unlink("tmp/dxf_18.dxf") + ############################################################################### # Test writing a file using references to blocks defined entirely in the @@ -934,39 +1079,45 @@ def test_ogr_dxf_18(): def test_ogr_dxf_19(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/dxf_19.dxf', - ['HEADER=data/dxf/header_extended.dxf']) + ds = ogr.GetDriverByName("DXF").CreateDataSource( + "tmp/dxf_19.dxf", ["HEADER=data/dxf/header_extended.dxf"] + ) - lyr = ds.CreateLayer('entities') + lyr = ds.CreateLayer("entities") # Write a block reference feature for a template defined block dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(250 200)')) - dst_feat.SetField('Layer', 'abc') - dst_feat.SetField('BlockName', 'STAR') + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(250 200)")) + dst_feat.SetField("Layer", "abc") + dst_feat.SetField("BlockName", "STAR") lyr.CreateFeature(dst_feat) ds = None # Reopen and check contents. - ds = ogr.Open('tmp/dxf_19.dxf') + ds = ogr.Open("tmp/dxf_19.dxf") lyr = ds.GetLayer(0) # Check first feature. feat = lyr.GetNextFeature() - assert feat.GetField('SubClasses') == 'AcDbEntity:AcDbBlockReference', \ - 'Got wrong subclasses for feature 1.' + assert ( + feat.GetField("SubClasses") == "AcDbEntity:AcDbBlockReference" + ), "Got wrong subclasses for feature 1." - assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((249.971852502328943 201.04145741382942 0,250.619244948763452 198.930395088499495 0),(250.619244948763452 198.930395088499495 0,249.042985079183779 200.47850746040811 0),(249.042985079183779 200.47850746040811 0,251.04145741382942 200.365917469723854 0),(251.04145741382942 200.365917469723854 0,249.52149253959189 198.95854258617058 0),(249.52149253959189 198.95854258617058 0,249.943705004657858 201.013309916158363 0))') + assert not ogrtest.check_feature_geometry( + feat, + "MULTILINESTRING ((249.971852502328943 201.04145741382942 0,250.619244948763452 198.930395088499495 0),(250.619244948763452 198.930395088499495 0,249.042985079183779 200.47850746040811 0),(249.042985079183779 200.47850746040811 0,251.04145741382942 200.365917469723854 0),(251.04145741382942 200.365917469723854 0,249.52149253959189 198.95854258617058 0),(249.52149253959189 198.95854258617058 0,249.943705004657858 201.013309916158363 0))", + ) # Cleanup lyr = None ds = None - os.unlink('tmp/dxf_19.dxf') + os.unlink("tmp/dxf_19.dxf") + ############################################################################### # SPLINE @@ -974,34 +1125,42 @@ def test_ogr_dxf_19(): def test_ogr_dxf_20(): - ds = ogr.Open('data/dxf/spline_qcad.dxf') + ds = ogr.Open("data/dxf/spline_qcad.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (10.75 62.75,20.637752769146068 63.434832501489716,29.283239084385464 63.396838394381845,36.766943814562865 62.711565975596599,43.169351828522906 61.454563542054103,48.570947995110252 59.70137939067456,53.05221718316956 57.527561818378146,56.693644261545501 55.008659122085049,59.575714099082703 52.220219598715438,61.778911564625851 49.237791545189509,63.383721527019588 46.136923258427423,64.470628855108572 42.993163035349369,65.120118417737459 39.882059172875508,65.412419131869868 36.878358785215056,65.417809785093752 34.025663008687722,65.193643595004147 31.327113252708507,64.796409941597645 28.783146935042897,64.282598204870823 26.394201473456341,63.708697764820236 24.16071428571431,63.131198001442392 22.083122789582241,62.606588294733939 20.161864402825621,62.191358024691354 18.397376543209894,61.941996571311265 16.790096628500525,61.914993314590184 15.340462076462975,62.166837634524704 14.0489103048627,62.754018911111373 12.915878731465167,63.723652286703427 11.940700981548817,65.053571428571416 11.114552964042769,66.690557841792398 10.424954275262921,68.581246558980226 9.859407264767562,70.672272612748785 9.405414282114966,72.910271035711943 9.050477676863418,75.241876860483572 8.782099798571203,77.613725119677511 8.587782996796603,79.97245084590763 8.4550296210979,82.264689071787842 8.371342021033378,84.437074829931987 8.324222546161321,86.436243152953921 8.301173546040012,88.208926721776336 8.289771106365336,89.722559658784164 8.293223374005688,90.990763736417563 8.349615688917151,92.033410218878885 8.501752503862612,92.870370370370395 8.792438271604945,93.521515455094473 9.264477444907039,94.006716737253413 9.960674476531764,94.345845481049565 10.923833819242011,94.558772950685281 12.196759925800654,94.665370410362868 13.82225724897058,94.685509124284636 15.843130241514663,94.639060356652948 18.302183356195791,94.545895371670113 21.242221045776841,94.421471763308503 24.702030018356666,94.215205541358216 28.660279617432039,93.825673773330607 33.049360720184715,93.15014577259474 37.800473760933045,92.085890852519697 42.844819173995376,90.530178326474584 48.113597393690064,88.380277507828495 53.538008854335445,85.533457709950525 59.049253990249873,81.886988246209697 64.578533235751706,77.338138429975174 70.057047025159264,71.784177574615995 75.415995792790937,65.122374993501282 80.586579972965055,57.25 85.5)') + assert not ogrtest.check_feature_geometry( + feat, + "LINESTRING (10.75 62.75,20.637752769146068 63.434832501489716,29.283239084385464 63.396838394381845,36.766943814562865 62.711565975596599,43.169351828522906 61.454563542054103,48.570947995110252 59.70137939067456,53.05221718316956 57.527561818378146,56.693644261545501 55.008659122085049,59.575714099082703 52.220219598715438,61.778911564625851 49.237791545189509,63.383721527019588 46.136923258427423,64.470628855108572 42.993163035349369,65.120118417737459 39.882059172875508,65.412419131869868 36.878358785215056,65.417809785093752 34.025663008687722,65.193643595004147 31.327113252708507,64.796409941597645 28.783146935042897,64.282598204870823 26.394201473456341,63.708697764820236 24.16071428571431,63.131198001442392 22.083122789582241,62.606588294733939 20.161864402825621,62.191358024691354 18.397376543209894,61.941996571311265 16.790096628500525,61.914993314590184 15.340462076462975,62.166837634524704 14.0489103048627,62.754018911111373 12.915878731465167,63.723652286703427 11.940700981548817,65.053571428571416 11.114552964042769,66.690557841792398 10.424954275262921,68.581246558980226 9.859407264767562,70.672272612748785 9.405414282114966,72.910271035711943 9.050477676863418,75.241876860483572 8.782099798571203,77.613725119677511 8.587782996796603,79.97245084590763 8.4550296210979,82.264689071787842 8.371342021033378,84.437074829931987 8.324222546161321,86.436243152953921 8.301173546040012,88.208926721776336 8.289771106365336,89.722559658784164 8.293223374005688,90.990763736417563 8.349615688917151,92.033410218878885 8.501752503862612,92.870370370370395 8.792438271604945,93.521515455094473 9.264477444907039,94.006716737253413 9.960674476531764,94.345845481049565 10.923833819242011,94.558772950685281 12.196759925800654,94.665370410362868 13.82225724897058,94.685509124284636 15.843130241514663,94.639060356652948 18.302183356195791,94.545895371670113 21.242221045776841,94.421471763308503 24.702030018356666,94.215205541358216 28.660279617432039,93.825673773330607 33.049360720184715,93.15014577259474 37.800473760933045,92.085890852519697 42.844819173995376,90.530178326474584 48.113597393690064,88.380277507828495 53.538008854335445,85.533457709950525 59.049253990249873,81.886988246209697 64.578533235751706,77.338138429975174 70.057047025159264,71.784177574615995 75.415995792790937,65.122374993501282 80.586579972965055,57.25 85.5)", + ) ds = None + ############################################################################### # CIRCLE and long ARC with specified maximum interval between vertices def test_ogr_dxf_21(): - ds = ogr.Open('data/dxf/circle.dxf') + ds = ogr.Open("data/dxf/circle.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (5 2 3,4.990256201039297 1.720974105023499 3,4.961072274966281 1.443307596159738 3,4.912590402935223 1.168353236728963 3,4.845046783753276 0.897450576732003 3,4.758770483143634 0.631919426697325 3,4.654181830570403 0.373053427696799 3,4.531790371435708 0.122113748856437 3,4.392192384625703 -0.11967705693282 3,4.23606797749979 -0.351141009169893 3,4.064177772475912 -0.571150438746157 3,3.877359201354605 -0.778633481835989 3,3.676522425435433 -0.972579301909577 3,3.462645901302633 -1.152043014426888 3,3.236771613882987 -1.316150290220167 3,3.0 -1.464101615137754 3,2.75348458715631 -1.595176185196668 3,2.498426373663648 -1.70873541826715 3,2.23606797749979 -1.804226065180614 3,1.967687582398672 -1.881182905103986 3,1.694592710667722 -1.939231012048832 3,1.418113853070614 -1.978087581473093 3,1.139597986810004 -1.997563308076383 3,0.860402013189997 -1.997563308076383 3,0.581886146929387 -1.978087581473094 3,0.305407289332279 -1.939231012048832 3,0.032312417601329 -1.881182905103986 3,-0.236067977499789 -1.804226065180615 3,-0.498426373663648 -1.70873541826715 3,-0.75348458715631 -1.595176185196668 3,-1.0 -1.464101615137755 3,-1.236771613882987 -1.316150290220167 3,-1.462645901302633 -1.152043014426888 3,-1.676522425435433 -0.972579301909577 3,-1.877359201354605 -0.778633481835989 3,-2.064177772475912 -0.571150438746158 3,-2.236067977499789 -0.351141009169893 3,-2.392192384625704 -0.11967705693282 3,-2.531790371435707 0.122113748856436 3,-2.654181830570403 0.373053427696798 3,-2.758770483143633 0.631919426697324 3,-2.845046783753275 0.897450576732001 3,-2.912590402935223 1.168353236728963 3,-2.961072274966281 1.443307596159737 3,-2.990256201039297 1.720974105023498 3,-3.0 2.0 3,-2.990256201039297 2.279025894976499 3,-2.961072274966281 2.556692403840262 3,-2.912590402935223 2.831646763271036 3,-2.845046783753276 3.102549423267996 3,-2.758770483143634 3.368080573302675 3,-2.654181830570404 3.626946572303199 3,-2.531790371435708 3.877886251143563 3,-2.392192384625704 4.119677056932819 3,-2.23606797749979 4.351141009169892 3,-2.064177772475912 4.571150438746157 3,-1.877359201354604 4.778633481835989 3,-1.676522425435434 4.972579301909576 3,-1.462645901302632 5.152043014426889 3,-1.236771613882989 5.316150290220166 3,-1.0 5.464101615137753 3,-0.753484587156311 5.595176185196667 3,-0.498426373663649 5.70873541826715 3,-0.23606797749979 5.804226065180615 3,0.032312417601329 5.881182905103985 3,0.305407289332279 5.939231012048833 3,0.581886146929387 5.978087581473094 3,0.860402013189993 5.997563308076383 3,1.139597986810005 5.997563308076383 3,1.418113853070612 5.978087581473094 3,1.69459271066772 5.939231012048833 3,1.96768758239867 5.881182905103986 3,2.236067977499789 5.804226065180615 3,2.498426373663648 5.70873541826715 3,2.75348458715631 5.595176185196668 3,3.0 5.464101615137754 3,3.236771613882985 5.316150290220168 3,3.462645901302634 5.152043014426887 3,3.676522425435431 4.972579301909578 3,3.877359201354603 4.778633481835991 3,4.064177772475912 4.571150438746159 3,4.23606797749979 4.351141009169893 3,4.392192384625702 4.119677056932823 3,4.531790371435708 3.877886251143563 3,4.654181830570404 3.626946572303201 3,4.758770483143634 3.368080573302675 3,4.845046783753275 3.102549423267999 3,4.912590402935223 2.831646763271039 3,4.961072274966281 2.556692403840263 3,4.990256201039298 2.279025894976499 3,5.0 2.0 3)') + assert not ogrtest.check_feature_geometry( + feat, + "LINESTRING (5 2 3,4.990256201039297 1.720974105023499 3,4.961072274966281 1.443307596159738 3,4.912590402935223 1.168353236728963 3,4.845046783753276 0.897450576732003 3,4.758770483143634 0.631919426697325 3,4.654181830570403 0.373053427696799 3,4.531790371435708 0.122113748856437 3,4.392192384625703 -0.11967705693282 3,4.23606797749979 -0.351141009169893 3,4.064177772475912 -0.571150438746157 3,3.877359201354605 -0.778633481835989 3,3.676522425435433 -0.972579301909577 3,3.462645901302633 -1.152043014426888 3,3.236771613882987 -1.316150290220167 3,3.0 -1.464101615137754 3,2.75348458715631 -1.595176185196668 3,2.498426373663648 -1.70873541826715 3,2.23606797749979 -1.804226065180614 3,1.967687582398672 -1.881182905103986 3,1.694592710667722 -1.939231012048832 3,1.418113853070614 -1.978087581473093 3,1.139597986810004 -1.997563308076383 3,0.860402013189997 -1.997563308076383 3,0.581886146929387 -1.978087581473094 3,0.305407289332279 -1.939231012048832 3,0.032312417601329 -1.881182905103986 3,-0.236067977499789 -1.804226065180615 3,-0.498426373663648 -1.70873541826715 3,-0.75348458715631 -1.595176185196668 3,-1.0 -1.464101615137755 3,-1.236771613882987 -1.316150290220167 3,-1.462645901302633 -1.152043014426888 3,-1.676522425435433 -0.972579301909577 3,-1.877359201354605 -0.778633481835989 3,-2.064177772475912 -0.571150438746158 3,-2.236067977499789 -0.351141009169893 3,-2.392192384625704 -0.11967705693282 3,-2.531790371435707 0.122113748856436 3,-2.654181830570403 0.373053427696798 3,-2.758770483143633 0.631919426697324 3,-2.845046783753275 0.897450576732001 3,-2.912590402935223 1.168353236728963 3,-2.961072274966281 1.443307596159737 3,-2.990256201039297 1.720974105023498 3,-3.0 2.0 3,-2.990256201039297 2.279025894976499 3,-2.961072274966281 2.556692403840262 3,-2.912590402935223 2.831646763271036 3,-2.845046783753276 3.102549423267996 3,-2.758770483143634 3.368080573302675 3,-2.654181830570404 3.626946572303199 3,-2.531790371435708 3.877886251143563 3,-2.392192384625704 4.119677056932819 3,-2.23606797749979 4.351141009169892 3,-2.064177772475912 4.571150438746157 3,-1.877359201354604 4.778633481835989 3,-1.676522425435434 4.972579301909576 3,-1.462645901302632 5.152043014426889 3,-1.236771613882989 5.316150290220166 3,-1.0 5.464101615137753 3,-0.753484587156311 5.595176185196667 3,-0.498426373663649 5.70873541826715 3,-0.23606797749979 5.804226065180615 3,0.032312417601329 5.881182905103985 3,0.305407289332279 5.939231012048833 3,0.581886146929387 5.978087581473094 3,0.860402013189993 5.997563308076383 3,1.139597986810005 5.997563308076383 3,1.418113853070612 5.978087581473094 3,1.69459271066772 5.939231012048833 3,1.96768758239867 5.881182905103986 3,2.236067977499789 5.804226065180615 3,2.498426373663648 5.70873541826715 3,2.75348458715631 5.595176185196668 3,3.0 5.464101615137754 3,3.236771613882985 5.316150290220168 3,3.462645901302634 5.152043014426887 3,3.676522425435431 4.972579301909578 3,3.877359201354603 4.778633481835991 3,4.064177772475912 4.571150438746159 3,4.23606797749979 4.351141009169893 3,4.392192384625702 4.119677056932823 3,4.531790371435708 3.877886251143563 3,4.654181830570404 3.626946572303201 3,4.758770483143634 3.368080573302675 3,4.845046783753275 3.102549423267999 3,4.912590402935223 2.831646763271039 3,4.961072274966281 2.556692403840263 3,4.990256201039298 2.279025894976499 3,5.0 2.0 3)", + ) - gdal.SetConfigOption('OGR_ARC_MAX_GAP', '80') + gdal.SetConfigOption("OGR_ARC_MAX_GAP", "80") feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() - gdal.SetConfigOption('OGR_ARC_MAX_GAP', None) + gdal.SetConfigOption("OGR_ARC_MAX_GAP", None) - assert geom.GetPointCount() == 4, \ - ('did not get expected number of points, got %d' % geom.GetPointCount()) + assert geom.GetPointCount() == 4, ( + "did not get expected number of points, got %d" % geom.GetPointCount() + ) ds = None @@ -1009,30 +1168,34 @@ def test_ogr_dxf_21(): ############################################################################### # TEXT + def test_ogr_dxf_22(): # Read MTEXT feature - ds = ogr.Open('data/dxf/text.dxf') + ds = ogr.Open("data/dxf/text.dxf") lyr = ds.GetLayer(0) - test_text = 'test\ttext ab/c~d\u00B1ef^g.h#i jklm' + test_text = "test\ttext ab/c~d\u00B1ef^g.h#i jklm" feat = lyr.GetNextFeature() - if feat.GetFieldAsString('Text') != test_text: + if feat.GetFieldAsString("Text") != test_text: feat.DumpReadable() - pytest.fail('bad attribute') + pytest.fail("bad attribute") style = feat.GetStyleString() - if style != 'LABEL(f:"SwissCheese",bo:1,t:"' + test_text + '",a:45,s:10g,w:51,c:#ff0000)': + if ( + style + != 'LABEL(f:"SwissCheese",bo:1,t:"' + test_text + '",a:45,s:10g,w:51,c:#ff0000)' + ): feat.DumpReadable() print(style) - pytest.fail('bad style') - if ogrtest.check_feature_geometry(feat, 'POINT(1 2 3)'): + pytest.fail("bad style") + if ogrtest.check_feature_geometry(feat, "POINT(1 2 3)"): feat.DumpReadable() - pytest.fail('bad geometry') + pytest.fail("bad geometry") # Write text feature - out_ds = ogr.GetDriverByName('DXF').CreateDataSource('/vsimem/ogr_dxf_22.dxf') - out_lyr = out_ds.CreateLayer('entities') + out_ds = ogr.GetDriverByName("DXF").CreateDataSource("/vsimem/ogr_dxf_22.dxf") + out_lyr = out_ds.CreateLayer("entities") out_feat = ogr.Feature(out_lyr.GetLayerDefn()) out_feat.SetStyleString(style) out_feat.SetGeometry(feat.GetGeometryRef()) @@ -1044,36 +1207,42 @@ def test_ogr_dxf_22(): ds = None # Check written file - ds = ogr.Open('/vsimem/ogr_dxf_22.dxf') + ds = ogr.Open("/vsimem/ogr_dxf_22.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if feat.GetFieldAsString('Text') != test_text: + if feat.GetFieldAsString("Text") != test_text: feat.DumpReadable() - pytest.fail('bad attribute') + pytest.fail("bad attribute") style = feat.GetStyleString() - if style != 'LABEL(f:"SwissCheese",bo:1,t:"' + test_text + '",a:45,s:10g,w:51,c:#ff0000)': + if ( + style + != 'LABEL(f:"SwissCheese",bo:1,t:"' + test_text + '",a:45,s:10g,w:51,c:#ff0000)' + ): feat.DumpReadable() print(style) - pytest.fail('bad style') - if ogrtest.check_feature_geometry(feat, 'POINT(1 2 3)'): + pytest.fail("bad style") + if ogrtest.check_feature_geometry(feat, "POINT(1 2 3)"): feat.DumpReadable() - pytest.fail('bad geometry') + pytest.fail("bad geometry") ds = None - gdal.Unlink('/vsimem/ogr_dxf_22.dxf') + gdal.Unlink("/vsimem/ogr_dxf_22.dxf") # Now try reading in the MTEXT feature without translating escape sequences - gdal.SetConfigOption('DXF_TRANSLATE_ESCAPE_SEQUENCES', 'FALSE') - ds = ogr.Open('data/dxf/text.dxf') - gdal.SetConfigOption('DXF_TRANSLATE_ESCAPE_SEQUENCES', None) + gdal.SetConfigOption("DXF_TRANSLATE_ESCAPE_SEQUENCES", "FALSE") + ds = ogr.Open("data/dxf/text.dxf") + gdal.SetConfigOption("DXF_TRANSLATE_ESCAPE_SEQUENCES", None) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if feat.GetFieldAsString('Text') != r'\A1;test^Itext\~\pt0.2;{\H0.7x;\Sab\/c\~d%%p^ ef\^ g.h\#i;} j{\L\Ok\ol}m': + if ( + feat.GetFieldAsString("Text") + != r"\A1;test^Itext\~\pt0.2;{\H0.7x;\Sab\/c\~d%%p^ ef\^ g.h\#i;} j{\L\Ok\ol}m" + ): feat.DumpReadable() - pytest.fail('bad attribute with DXF_TRANSLATE_ESCAPE_SEQUENCES = FALSE') + pytest.fail("bad attribute with DXF_TRANSLATE_ESCAPE_SEQUENCES = FALSE") ds = None @@ -1081,14 +1250,15 @@ def test_ogr_dxf_22(): ############################################################################### # POLYGON with hole + def test_ogr_dxf_23(): # Write polygon - out_ds = ogr.GetDriverByName('DXF').CreateDataSource('/vsimem/ogr_dxf_23.dxf') - out_lyr = out_ds.CreateLayer('entities') + out_ds = ogr.GetDriverByName("DXF").CreateDataSource("/vsimem/ogr_dxf_23.dxf") + out_lyr = out_ds.CreateLayer("entities") out_feat = ogr.Feature(out_lyr.GetLayerDefn()) - out_feat.SetStyleString('BRUSH(fc:#ff0000)') - wkt = 'POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1))' + out_feat.SetStyleString("BRUSH(fc:#ff0000)") + wkt = "POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1))" out_feat.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) out_lyr.CreateFeature(out_feat) out_feat = None @@ -1098,17 +1268,18 @@ def test_ogr_dxf_23(): ds = None # Check written file - ds = ogr.Open('/vsimem/ogr_dxf_23.dxf') + ds = ogr.Open("/vsimem/ogr_dxf_23.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() style = feat.GetStyleString() - assert style == 'BRUSH(fc:#ff0000)', 'bad style' - assert not ogrtest.check_feature_geometry(feat, wkt), 'bad geometry' + assert style == "BRUSH(fc:#ff0000)", "bad style" + assert not ogrtest.check_feature_geometry(feat, wkt), "bad geometry" ds = None - gdal.Unlink('/vsimem/ogr_dxf_23.dxf') + gdal.Unlink("/vsimem/ogr_dxf_23.dxf") + ############################################################################### # HATCH @@ -1116,72 +1287,93 @@ def test_ogr_dxf_23(): def test_ogr_dxf_24(): - ds = ogr.Open('data/dxf/hatch.dxf') + ds = ogr.Open("data/dxf/hatch.dxf") lyr = ds.GetLayer(0) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") feat = lyr.GetNextFeature() - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) - assert not ogrtest.check_feature_geometry(feat, 'POLYGON ((2 1,1.646446609406726 0.853553390593274,1.5 0.5,1.646446609406726 0.146446609406726,2 0,2.146446609406726 -0.353553390593274,2.5 -0.5,2.853553390593274 -0.353553390593274,3.0 -0.0,3.353553390593274 0.146446609406726,3.5 0.5,3.353553390593274 0.853553390593273,3 1,2.853553390593274 1.353553390593274,2.5 1.5,2.146446609406726 1.353553390593274,2 1))') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) + assert not ogrtest.check_feature_geometry( + feat, + "POLYGON ((2 1,1.646446609406726 0.853553390593274,1.5 0.5,1.646446609406726 0.146446609406726,2 0,2.146446609406726 -0.353553390593274,2.5 -0.5,2.853553390593274 -0.353553390593274,3.0 -0.0,3.353553390593274 0.146446609406726,3.5 0.5,3.353553390593274 0.853553390593273,3 1,2.853553390593274 1.353553390593274,2.5 1.5,2.146446609406726 1.353553390593274,2 1))", + ) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") feat = lyr.GetNextFeature() - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) - assert not ogrtest.check_feature_geometry(feat, 'POLYGON ((0.0 0.0 0,-0.353553390593274 0.146446609406726 0,-0.5 0.5 0,-0.353553390593274 0.853553390593274 0,-0.0 1.0 0,0.146446609406726 1.353553390593274 0,0.5 1.5 0,0.853553390593274 1.353553390593274 0,1.0 1.0 0,1.353553390593274 0.853553390593274 0,1.5 0.5 0,1.353553390593274 0.146446609406727 0,1.0 0.0 0,0.853553390593274 -0.353553390593274 0,0.5 -0.5 0,0.146446609406726 -0.353553390593274 0,0.0 0.0 0))') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) + assert not ogrtest.check_feature_geometry( + feat, + "POLYGON ((0.0 0.0 0,-0.353553390593274 0.146446609406726 0,-0.5 0.5 0,-0.353553390593274 0.853553390593274 0,-0.0 1.0 0,0.146446609406726 1.353553390593274 0,0.5 1.5 0,0.853553390593274 1.353553390593274 0,1.0 1.0 0,1.353553390593274 0.853553390593274 0,1.5 0.5 0,1.353553390593274 0.146446609406727 0,1.0 0.0 0,0.853553390593274 -0.353553390593274 0,0.5 -0.5 0,0.146446609406726 -0.353553390593274 0,0.0 0.0 0))", + ) feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-1 -1 0,-1 0 0,0 0 0,-1 -1 0))') + assert not ogrtest.check_feature_geometry( + feat, "POLYGON Z ((-1 -1 0,-1 0 0,0 0 0,-1 -1 0))" + ) ds = None + ############################################################################### # 3DFACE def test_ogr_dxf_25(): - ds = ogr.Open('data/dxf/3dface.dxf') + ds = ogr.Open("data/dxf/3dface.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((10 20 30,11 21 31,12 22 32,10 20 30))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON ((10 20 30,11 21 31,12 22 32,10 20 30))" + ): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((10 20 30,11 21 31,12 22 32,13 23 33,10 20 30))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON ((10 20 30,11 21 31,12 22 32,13 23 33,10 20 30))" + ): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # SOLID (#5380) def test_ogr_dxf_26(): - ds = ogr.Open('data/dxf/solid.dxf') + ds = ogr.Open("data/dxf/solid.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((2.716846 2.762514,2.393674 1.647962,4.391042 1.06881,4.714214 2.183362,2.716846 2.762514))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON ((2.716846 2.762514,2.393674 1.647962,4.391042 1.06881,4.714214 2.183362,2.716846 2.762514))", + ): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # Test reading a DXF file without .dxf extensions (#5994) def test_ogr_dxf_27(): - gdal.FileFromMemBuffer('/vsimem/a_dxf_without_extension', open('data/dxf/solid.dxf').read()) + gdal.FileFromMemBuffer( + "/vsimem/a_dxf_without_extension", open("data/dxf/solid.dxf").read() + ) - ds = ogr.Open('/vsimem/a_dxf_without_extension') + ds = ogr.Open("/vsimem/a_dxf_without_extension") assert ds is not None - gdal.Unlink('/vsimem/a_dxf_without_extension') + gdal.Unlink("/vsimem/a_dxf_without_extension") + ############################################################################### # Test reading a ELLIPSE with Z extrusion axis value of -1.0 (#5075) @@ -1189,508 +1381,632 @@ def test_ogr_dxf_27(): def test_ogr_dxf_28(): - ds = ogr.Open('data/dxf/ellipse_z_extrusion_minus_1.dxf') + ds = ogr.Open("data/dxf/ellipse_z_extrusion_minus_1.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (247.379588068074 525.677518653024 0,247.560245171261 525.685592896308 0,247.739941456101 525.705876573267 0,247.917852718752 525.738276649788 0,248.09316294264 525.782644518081 0,248.265068041245 525.838776678293 0,248.432779546163 525.90641567189 0,248.595528223532 525.985251262527 0,248.752567602242 526.074921858996 0,248.903177397731 526.175016173715 0,249.046666815684 526.285075109164 0,249.182377720457 526.404593863601 0,249.309687653722 526.533024246411 0,249.428012689458 526.669777192466 0,249.536810112221 526.814225463957 0,249.635580906384 526.965706527318 0,249.723872044951 527.123525592032 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (247.379588068074 525.677518653024 0,247.560245171261 525.685592896308 0,247.739941456101 525.705876573267 0,247.917852718752 525.738276649788 0,248.09316294264 525.782644518081 0,248.265068041245 525.838776678293 0,248.432779546163 525.90641567189 0,248.595528223532 525.985251262527 0,248.752567602242 526.074921858996 0,248.903177397731 526.175016173715 0,249.046666815684 526.285075109164 0,249.182377720457 526.404593863601 0,249.309687653722 526.533024246411 0,249.428012689458 526.669777192466 0,249.536810112221 526.814225463957 0,249.635580906384 526.965706527318 0,249.723872044951 527.123525592032 0)", + ): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (290.988651614349 531.01336644407 0,290.900681473157 531.171364661134 0,290.823607338001 531.334954880971 0,290.757782720911 531.503386772611 0,290.703509536322 531.675887798031 0,290.661036716299 531.85166675552 0,290.630559068775 532.029917408641 0,290.612216384031 532.209822184155 0,290.606092793529 532.390555921946 0,290.612216384031 532.571289659737 0,290.630559068775 532.751194435252 0,290.661036716299 532.929445088373 0,290.703509536321 533.105224045862 0,290.75778272091 533.277725071282 0,290.823607338 533.446156962922 0,290.900681473156 533.60974718276 0,290.988651614348 533.767745399824 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (290.988651614349 531.01336644407 0,290.900681473157 531.171364661134 0,290.823607338001 531.334954880971 0,290.757782720911 531.503386772611 0,290.703509536322 531.675887798031 0,290.661036716299 531.85166675552 0,290.630559068775 532.029917408641 0,290.612216384031 532.209822184155 0,290.606092793529 532.390555921946 0,290.612216384031 532.571289659737 0,290.630559068775 532.751194435252 0,290.661036716299 532.929445088373 0,290.703509536321 533.105224045862 0,290.75778272091 533.277725071282 0,290.823607338 533.446156962922 0,290.900681473156 533.60974718276 0,290.988651614348 533.767745399824 0)", + ): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # SPLINE with weights def test_ogr_dxf_29(): - ds = ogr.Open('data/dxf/spline_weight.dxf') + ds = ogr.Open("data/dxf/spline_weight.dxf") lyr = ds.GetLayer(0) # spline 227, no weight feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 2, 2.10256409645081 2.15371131896973, 2.20512819290161 2.3066132068634, 2.307692527771 2.4578971862793, 2.41025638580322 2.6067533493042, 2.51282024383545 2.75237274169922, 2.61538457870483 2.89394640922546, 2.71794891357422 3.03066444396973, 2.82051301002502 3.16171884536743, 2.92307710647583 3.28629970550537, 3.02564096450806 3.40359783172607, 3.12820529937744 3.51280379295349, 3.23076939582825 3.61310863494873, 3.33333325386047 3.70370388031006, 3.43589782714844 3.78377938270569, 3.53846144676208 3.85252642631531, 3.64102602005005 3.90913581848145, 3.74358987808228 3.95279765129089, 3.84615445137024 3.98270392417908, 3.94871830940247 3.99804472923279, 4.05128240585327 3.99804425239563, 4.15384674072266 3.9827036857605, 4.25641107559204 3.95279765129089, 4.35897541046143 3.90913534164429, 4.46153926849365 3.85252571105957, 4.56410360336304 3.78377866744995, 4.66666793823242 3.70370292663574, 4.76923179626465 3.61310815811157, 4.87179613113403 3.51280236244202, 4.97436046600342 3.40359592437744, 5.07692432403564 3.2862982749939, 5.17948865890503 3.16171741485596, 5.28205299377441 3.03066277503967, 5.38461685180664 2.89394426345825, 5.48718070983887 2.75237035751343, 5.58974552154541 2.60675096511841, 5.69230937957764 2.45789456367493, 5.79487323760986 2.30661058425903, 5.89743757247925 2.15370845794678, 6 2)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 2, 2.10256409645081 2.15371131896973, 2.20512819290161 2.3066132068634, 2.307692527771 2.4578971862793, 2.41025638580322 2.6067533493042, 2.51282024383545 2.75237274169922, 2.61538457870483 2.89394640922546, 2.71794891357422 3.03066444396973, 2.82051301002502 3.16171884536743, 2.92307710647583 3.28629970550537, 3.02564096450806 3.40359783172607, 3.12820529937744 3.51280379295349, 3.23076939582825 3.61310863494873, 3.33333325386047 3.70370388031006, 3.43589782714844 3.78377938270569, 3.53846144676208 3.85252642631531, 3.64102602005005 3.90913581848145, 3.74358987808228 3.95279765129089, 3.84615445137024 3.98270392417908, 3.94871830940247 3.99804472923279, 4.05128240585327 3.99804425239563, 4.15384674072266 3.9827036857605, 4.25641107559204 3.95279765129089, 4.35897541046143 3.90913534164429, 4.46153926849365 3.85252571105957, 4.56410360336304 3.78377866744995, 4.66666793823242 3.70370292663574, 4.76923179626465 3.61310815811157, 4.87179613113403 3.51280236244202, 4.97436046600342 3.40359592437744, 5.07692432403564 3.2862982749939, 5.17948865890503 3.16171741485596, 5.28205299377441 3.03066277503967, 5.38461685180664 2.89394426345825, 5.48718070983887 2.75237035751343, 5.58974552154541 2.60675096511841, 5.69230937957764 2.45789456367493, 5.79487323760986 2.30661058425903, 5.89743757247925 2.15370845794678, 6 2)", + ): feat.DumpReadable() pytest.fail() # spline 261, weight(3) = 2.0 feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 2, 2.10976576805115 2.16451454162598, 2.23113083839417 2.34563326835632, 2.35994720458984 2.53639197349548, 2.49239826202393 2.73041176795959, 2.62522411346436 2.92225241661072, 2.75582838058472 3.10756635665894, 2.88229131698608 3.2831084728241, 3.00331926345825 3.44663000106812, 3.11815142631531 3.59672045707703, 3.2264621257782 3.73262500762939, 3.32825922966003 3.85407567024231, 3.42379808425903 3.96113181114197, 3.51351404190063 4.05405473709106, 3.59796214103699 4.13319540023804, 3.67778849601746 4.19891929626465, 3.75369834899902 4.25152969360352, 3.82645153999329 4.29121112823486, 3.89685702323914 4.31797361373901, 3.96579027175903 4.33159732818604, 4.03421020507812 4.33159732818604, 4.1031436920166 4.31797361373901, 4.17354917526245 4.29121017456055, 4.24630165100098 4.2515287399292, 4.32221221923828 4.19891929626465, 4.40203857421875 4.13319492340088, 4.48648738861084 4.05405378341675, 4.57620286941528 3.96113133430481, 4.67174291610718 3.85407471656799, 4.77353954315186 3.73262333869934, 4.88184928894043 3.59671831130981, 4.99668216705322 3.44662809371948, 5.11771011352539 3.28310608863831, 5.24417400360107 3.10756373405457, 5.37477827072144 2.92224931716919, 5.50760412216187 2.73040890693665, 5.64005517959595 2.5363883972168, 5.76887130737305 2.34562969207764, 5.89023685455322 2.16451120376587, 6 2)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 2, 2.10976576805115 2.16451454162598, 2.23113083839417 2.34563326835632, 2.35994720458984 2.53639197349548, 2.49239826202393 2.73041176795959, 2.62522411346436 2.92225241661072, 2.75582838058472 3.10756635665894, 2.88229131698608 3.2831084728241, 3.00331926345825 3.44663000106812, 3.11815142631531 3.59672045707703, 3.2264621257782 3.73262500762939, 3.32825922966003 3.85407567024231, 3.42379808425903 3.96113181114197, 3.51351404190063 4.05405473709106, 3.59796214103699 4.13319540023804, 3.67778849601746 4.19891929626465, 3.75369834899902 4.25152969360352, 3.82645153999329 4.29121112823486, 3.89685702323914 4.31797361373901, 3.96579027175903 4.33159732818604, 4.03421020507812 4.33159732818604, 4.1031436920166 4.31797361373901, 4.17354917526245 4.29121017456055, 4.24630165100098 4.2515287399292, 4.32221221923828 4.19891929626465, 4.40203857421875 4.13319492340088, 4.48648738861084 4.05405378341675, 4.57620286941528 3.96113133430481, 4.67174291610718 3.85407471656799, 4.77353954315186 3.73262333869934, 4.88184928894043 3.59671831130981, 4.99668216705322 3.44662809371948, 5.11771011352539 3.28310608863831, 5.24417400360107 3.10756373405457, 5.37477827072144 2.92224931716919, 5.50760412216187 2.73040890693665, 5.64005517959595 2.5363883972168, 5.76887130737305 2.34562969207764, 5.89023685455322 2.16451120376587, 6 2)", + ): feat.DumpReadable() pytest.fail() # spline 262, weight(3) = 0.5 feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 2, 2.09894275665283 2.14827871322632, 2.19183802604675 2.28667020797729, 2.28029608726501 2.41674375534058, 2.36573505401611 2.53972935676575, 2.4494321346283 2.65657186508179, 2.53256177902222 2.76796913146973, 2.61621570587158 2.87439489364624, 2.70142364501953 2.97611308097839, 2.78915071487427 3.07318329811096, 2.88029623031616 3.16546249389648, 2.97567653656006 3.25260472297668, 3.07599782943726 3.33406257629395, 3.18181824684143 3.40909075737, 3.29349946975708 3.4767644405365, 3.4111499786377 3.53600478172302, 3.53456783294678 3.58562660217285, 3.66318273544312 3.62440752983093, 3.79601716995239 3.6511766910553, 3.93166828155518 3.66492199897766, 4.06833267211914 3.66492199897766, 4.20398426055908 3.65117692947388, 4.33681774139404 3.62440729141235, 4.4654335975647 3.58562660217285, 4.58885097503662 3.53600406646729, 4.70650196075439 3.47676372528076, 4.81818294525146 3.40909028053284, 4.92400360107422 3.33406162261963, 5.02432489395142 3.25260376930237, 5.11970520019531 3.16546106338501, 5.21085071563721 3.07318210601807, 5.29857730865479 2.9761118888855, 5.38378524780273 2.87439346313477, 5.46744012832642 2.76796770095825, 5.55056858062744 2.65656995773315, 5.63426637649536 2.53972721099854, 5.71970558166504 2.41674160957336, 5.8081636428833 2.2866678237915, 5.9010591506958 2.14827609062195, 6 2)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 2, 2.09894275665283 2.14827871322632, 2.19183802604675 2.28667020797729, 2.28029608726501 2.41674375534058, 2.36573505401611 2.53972935676575, 2.4494321346283 2.65657186508179, 2.53256177902222 2.76796913146973, 2.61621570587158 2.87439489364624, 2.70142364501953 2.97611308097839, 2.78915071487427 3.07318329811096, 2.88029623031616 3.16546249389648, 2.97567653656006 3.25260472297668, 3.07599782943726 3.33406257629395, 3.18181824684143 3.40909075737, 3.29349946975708 3.4767644405365, 3.4111499786377 3.53600478172302, 3.53456783294678 3.58562660217285, 3.66318273544312 3.62440752983093, 3.79601716995239 3.6511766910553, 3.93166828155518 3.66492199897766, 4.06833267211914 3.66492199897766, 4.20398426055908 3.65117692947388, 4.33681774139404 3.62440729141235, 4.4654335975647 3.58562660217285, 4.58885097503662 3.53600406646729, 4.70650196075439 3.47676372528076, 4.81818294525146 3.40909028053284, 4.92400360107422 3.33406162261963, 5.02432489395142 3.25260376930237, 5.11970520019531 3.16546106338501, 5.21085071563721 3.07318210601807, 5.29857730865479 2.9761118888855, 5.38378524780273 2.87439346313477, 5.46744012832642 2.76796770095825, 5.55056858062744 2.65656995773315, 5.63426637649536 2.53972721099854, 5.71970558166504 2.41674160957336, 5.8081636428833 2.2866678237915, 5.9010591506958 2.14827609062195, 6 2)", + ): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # SPLINE closed def test_ogr_dxf_30(): - ds = ogr.Open('data/dxf/spline_closed.dxf') + ds = ogr.Open("data/dxf/spline_closed.dxf") lyr = ds.GetLayer(0) # spline 24b, closed feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (14 2, 13.9043273925781 2.11115527153015, 13.82310962677 2.23728489875793, 13.7564849853516 2.3759388923645, 13.7045974731445 2.52466750144958, 13.6675891876221 2.68102264404297, 13.6455984115601 2.84255337715149, 13.6387672424316 3.00681042671204, 13.6472396850586 3.17134499549866, 13.6711559295654 3.33370733261108, 13.7106552124023 3.49144792556763, 13.7658815383911 3.64211750030518, 13.8369770050049 3.78326630592346, 13.9240808486938 3.9124448299408, 14.0273275375366 4.0272102355957, 14.1460762023926 4.125901222229, 14.2781581878662 4.20836925506592, 14.4212408065796 4.27464532852173, 14.5729866027832 4.32475566864014, 14.7310619354248 4.35873079299927, 14.8931264877319 4.37659645080566, 15.056845664978 4.37838315963745, 15.2198839187622 4.36411762237549, 15.3799018859863 4.33382892608643, 15.5345678329468 4.2875452041626, 15.681544303894 4.22529458999634, 15.8184909820557 4.14710569381714, 15.9430751800537 4.05300617218018, 16.0530071258545 3.94307255744934, 16.1471080780029 3.81848883628845, 16.2252960205078 3.68154096603394, 16.2875461578369 3.53456616401672, 16.3338298797607 3.37990093231201, 16.3641166687012 3.219881772995, 16.3783836364746 3.05684399604797, 16.3765964508057 2.89312481880188, 16.3587284088135 2.73106050491333, 16.3247547149658 2.57298684120178, 16.2746448516846 2.42124080657959, 16.2083702087402 2.27815842628479, 16.1259021759033 2.146075963974, 16.0272102355957 2.02732920646667, 15.9124450683594 1.92408156394958, 15.7832660675049 1.83697760105133, 15.6421175003052 1.7658828496933, 15.4914503097534 1.71065592765808, 15.3337097167969 1.67115533351898, 15.1713457107544 1.6472395658493, 15.0068111419678 1.63876724243164, 14.8425559997559 1.64559710025787, 14.681022644043 1.66758728027344, 14.5246696472168 1.70459699630737, 14.375940322876 1.75648427009583, 14.2372856140137 1.82310783863068, 14.1111574172974 1.90432631969452, 14 2)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (14 2, 13.9043273925781 2.11115527153015, 13.82310962677 2.23728489875793, 13.7564849853516 2.3759388923645, 13.7045974731445 2.52466750144958, 13.6675891876221 2.68102264404297, 13.6455984115601 2.84255337715149, 13.6387672424316 3.00681042671204, 13.6472396850586 3.17134499549866, 13.6711559295654 3.33370733261108, 13.7106552124023 3.49144792556763, 13.7658815383911 3.64211750030518, 13.8369770050049 3.78326630592346, 13.9240808486938 3.9124448299408, 14.0273275375366 4.0272102355957, 14.1460762023926 4.125901222229, 14.2781581878662 4.20836925506592, 14.4212408065796 4.27464532852173, 14.5729866027832 4.32475566864014, 14.7310619354248 4.35873079299927, 14.8931264877319 4.37659645080566, 15.056845664978 4.37838315963745, 15.2198839187622 4.36411762237549, 15.3799018859863 4.33382892608643, 15.5345678329468 4.2875452041626, 15.681544303894 4.22529458999634, 15.8184909820557 4.14710569381714, 15.9430751800537 4.05300617218018, 16.0530071258545 3.94307255744934, 16.1471080780029 3.81848883628845, 16.2252960205078 3.68154096603394, 16.2875461578369 3.53456616401672, 16.3338298797607 3.37990093231201, 16.3641166687012 3.219881772995, 16.3783836364746 3.05684399604797, 16.3765964508057 2.89312481880188, 16.3587284088135 2.73106050491333, 16.3247547149658 2.57298684120178, 16.2746448516846 2.42124080657959, 16.2083702087402 2.27815842628479, 16.1259021759033 2.146075963974, 16.0272102355957 2.02732920646667, 15.9124450683594 1.92408156394958, 15.7832660675049 1.83697760105133, 15.6421175003052 1.7658828496933, 15.4914503097534 1.71065592765808, 15.3337097167969 1.67115533351898, 15.1713457107544 1.6472395658493, 15.0068111419678 1.63876724243164, 14.8425559997559 1.64559710025787, 14.681022644043 1.66758728027344, 14.5246696472168 1.70459699630737, 14.375940322876 1.75648427009583, 14.2372856140137 1.82310783863068, 14.1111574172974 1.90432631969452, 14 2)", + ): feat.DumpReadable() pytest.fail() # spline 24c, closed, recalculate knots feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (14 2, 13.9043273925781 2.11115527153015, 13.82310962677 2.23728489875793, 13.7564849853516 2.3759388923645, 13.7045974731445 2.52466750144958, 13.6675891876221 2.68102264404297, 13.6455984115601 2.84255337715149, 13.6387672424316 3.00681042671204, 13.6472396850586 3.17134499549866, 13.6711559295654 3.33370733261108, 13.7106552124023 3.49144792556763, 13.7658815383911 3.64211750030518, 13.8369770050049 3.78326630592346, 13.9240808486938 3.9124448299408, 14.0273275375366 4.0272102355957, 14.1460762023926 4.125901222229, 14.2781581878662 4.20836925506592, 14.4212408065796 4.27464532852173, 14.5729866027832 4.32475566864014, 14.7310619354248 4.35873079299927, 14.8931264877319 4.37659645080566, 15.056845664978 4.37838315963745, 15.2198839187622 4.36411762237549, 15.3799018859863 4.33382892608643, 15.5345678329468 4.2875452041626, 15.681544303894 4.22529458999634, 15.8184909820557 4.14710569381714, 15.9430751800537 4.05300617218018, 16.0530071258545 3.94307255744934, 16.1471080780029 3.81848883628845, 16.2252960205078 3.68154096603394, 16.2875461578369 3.53456616401672, 16.3338298797607 3.37990093231201, 16.3641166687012 3.219881772995, 16.3783836364746 3.05684399604797, 16.3765964508057 2.89312481880188, 16.3587284088135 2.73106050491333, 16.3247547149658 2.57298684120178, 16.2746448516846 2.42124080657959, 16.2083702087402 2.27815842628479, 16.1259021759033 2.146075963974, 16.0272102355957 2.02732920646667, 15.9124450683594 1.92408156394958, 15.7832660675049 1.83697760105133, 15.6421175003052 1.7658828496933, 15.4914503097534 1.71065592765808, 15.3337097167969 1.67115533351898, 15.1713457107544 1.6472395658493, 15.0068111419678 1.63876724243164, 14.8425559997559 1.64559710025787, 14.681022644043 1.66758728027344, 14.5246696472168 1.70459699630737, 14.375940322876 1.75648427009583, 14.2372856140137 1.82310783863068, 14.1111574172974 1.90432631969452, 14 2)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (14 2, 13.9043273925781 2.11115527153015, 13.82310962677 2.23728489875793, 13.7564849853516 2.3759388923645, 13.7045974731445 2.52466750144958, 13.6675891876221 2.68102264404297, 13.6455984115601 2.84255337715149, 13.6387672424316 3.00681042671204, 13.6472396850586 3.17134499549866, 13.6711559295654 3.33370733261108, 13.7106552124023 3.49144792556763, 13.7658815383911 3.64211750030518, 13.8369770050049 3.78326630592346, 13.9240808486938 3.9124448299408, 14.0273275375366 4.0272102355957, 14.1460762023926 4.125901222229, 14.2781581878662 4.20836925506592, 14.4212408065796 4.27464532852173, 14.5729866027832 4.32475566864014, 14.7310619354248 4.35873079299927, 14.8931264877319 4.37659645080566, 15.056845664978 4.37838315963745, 15.2198839187622 4.36411762237549, 15.3799018859863 4.33382892608643, 15.5345678329468 4.2875452041626, 15.681544303894 4.22529458999634, 15.8184909820557 4.14710569381714, 15.9430751800537 4.05300617218018, 16.0530071258545 3.94307255744934, 16.1471080780029 3.81848883628845, 16.2252960205078 3.68154096603394, 16.2875461578369 3.53456616401672, 16.3338298797607 3.37990093231201, 16.3641166687012 3.219881772995, 16.3783836364746 3.05684399604797, 16.3765964508057 2.89312481880188, 16.3587284088135 2.73106050491333, 16.3247547149658 2.57298684120178, 16.2746448516846 2.42124080657959, 16.2083702087402 2.27815842628479, 16.1259021759033 2.146075963974, 16.0272102355957 2.02732920646667, 15.9124450683594 1.92408156394958, 15.7832660675049 1.83697760105133, 15.6421175003052 1.7658828496933, 15.4914503097534 1.71065592765808, 15.3337097167969 1.67115533351898, 15.1713457107544 1.6472395658493, 15.0068111419678 1.63876724243164, 14.8425559997559 1.64559710025787, 14.681022644043 1.66758728027344, 14.5246696472168 1.70459699630737, 14.375940322876 1.75648427009583, 14.2372856140137 1.82310783863068, 14.1111574172974 1.90432631969452, 14 2)", + ): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # OCS2WCS transformations 1 def test_ogr_dxf_31(): - ds = ogr.Open('data/dxf/ocs2wcs1.dxf') + ds = ogr.Open("data/dxf/ocs2wcs1.dxf") lyr = ds.GetLayer(0) -# INFO: Open of `ocs2wcs1.dxf' using driver `DXF' successful. + # INFO: Open of `ocs2wcs1.dxf' using driver `DXF' successful. -# OGRFeature(entities):0 -# EntityHandle (String) = 1EF -# POINT Z (4 4 0) + # OGRFeature(entities):0 + # EntityHandle (String) = 1EF + # POINT Z (4 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (4 4 0)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (4 4 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):1 -# EntityHandle (String) = 1F0 -# LINESTRING Z (0 0 0,1 1 0) + # OGRFeature(entities):1 + # EntityHandle (String) = 1F0 + # LINESTRING Z (0 0 0,1 1 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,1 1 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (0 0 0,1 1 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):2 -# EntityHandle (String) = 1F1 -# LINESTRING (1 1,2 1,1 2,1 1) + # OGRFeature(entities):2 + # EntityHandle (String) = 1F1 + # LINESTRING (1 1,2 1,1 2,1 1) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (1 1,2 1,1 2,1 1)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING (1 1,2 1,1 2,1 1)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):3 -# EntityHandle (String) = 1F2 -# LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0) + # OGRFeature(entities):3 + # EntityHandle (String) = 1F2 + # LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):4 -# EntityHandle (String) = 1F7 -# LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0) + # OGRFeature(entities):4 + # EntityHandle (String) = 1F7 + # LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):5 -# EntityHandle (String) = 1F8 -# LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0) + # OGRFeature(entities):5 + # EntityHandle (String) = 1F8 + # LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):6 -# EntityHandle (String) = 1F9 -# LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0) + # OGRFeature(entities):6 + # EntityHandle (String) = 1F9 + # LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):7 -# EntityHandle (String) = 1FA -# POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0)) + # OGRFeature(entities):7 + # EntityHandle (String) = 1FA + # POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0))" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):8 -# EntityHandle (String) = 1FB -# POLYGON ((3 4,4 4,4 3,3 3,3 4)) + # OGRFeature(entities):8 + # EntityHandle (String) = 1FB + # POLYGON ((3 4,4 4,4 3,3 3,3 4)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((3 4,4 4,4 3,3 3,3 4))'): + if ogrtest.check_feature_geometry(feat, "POLYGON ((3 4,4 4,4 3,3 3,3 4))"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):9 -# EntityHandle (String) = 1FD -# POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0)) + # OGRFeature(entities):9 + # EntityHandle (String) = 1FD + # POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0))" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):10 -# EntityHandle (String) = 200 -# LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8) + # OGRFeature(entities):10 + # EntityHandle (String) = 200 + # LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):11 -# EntityHandle (String) = 201 -# LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8) + # OGRFeature(entities):11 + # EntityHandle (String) = 201 + # LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):12 -# EntityHandle (String) = 202 -# POINT Z (7 7 0) + # OGRFeature(entities):12 + # EntityHandle (String) = 202 + # POINT Z (7 7 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (7 7 0)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (7 7 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):13 -# EntityHandle (String) = 203 -# POINT Z (-4 4 -5e-16) + # OGRFeature(entities):13 + # EntityHandle (String) = 203 + # POINT Z (-4 4 -5e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-4 4 -5e-16)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-4 4 -5e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):14 -# EntityHandle (String) = 204 -# LINESTRING Z (0 0 0,-1 1 -1e-16) + # OGRFeature(entities):14 + # EntityHandle (String) = 204 + # LINESTRING Z (0 0 0,-1 1 -1e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,-1 1 -1e-16)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (0 0 0,-1 1 -1e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):15 -# EntityHandle (String) = 205 -# LINESTRING Z (-1 1 -1E-16,-2 1 -2E-16,-1 2 -1E-16,-1 1 -1E-16) + # OGRFeature(entities):15 + # EntityHandle (String) = 205 + # LINESTRING Z (-1 1 -1E-16,-2 1 -2E-16,-1 2 -1E-16,-1 1 -1E-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1 1 -1E-16,-2 1 -2E-16,-1 2 -1E-16,-1 1 -1E-16)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-1 1 -1E-16,-2 1 -2E-16,-1 2 -1E-16,-1 1 -1E-16)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):16 -# EntityHandle (String) = 206 -# LINESTRING Z (-1 1 -1e-16,-1 2 -1e-16,-2 2 -2e-16,-1 1 -1e-16) + # OGRFeature(entities):16 + # EntityHandle (String) = 206 + # LINESTRING Z (-1 1 -1e-16,-1 2 -1e-16,-2 2 -2e-16,-1 1 -1e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1 1 -1e-16,-1 2 -1e-16,-2 2 -2e-16,-1 1 -1e-16)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-1 1 -1e-16,-1 2 -1e-16,-2 2 -2e-16,-1 1 -1e-16)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):17 -# EntityHandle (String) = 20B -# LINESTRING Z (-6 4 -6e-16,-5.99512810051965 3.86048705251175 -5.99512810051965e-16,-5.98053613748314 3.72165379807987 -5.98053613748314e-16,-5.95629520146761 3.58417661836448 -5.95629520146761e-16,-5.92252339187664 3.448725288366 -5.92252339187664e-16,-5.87938524157182 3.31595971334866 -5.87938524157182e-16,-5.8270909152852 3.1865267138484 -5.8270909152852e-16,-5.76589518571785 3.06105687442822 -5.76589518571785e-16,-5.69609619231285 2.94016147153359 -5.69609619231285e-16,-5.61803398874989 2.82442949541505 -5.61803398874989e-16,-5.53208888623796 2.71442478062692 -5.53208888623796e-16,-5.4386796006773 2.61068325908201 -5.4386796006773e-16,-5.33826121271772 2.51371034904521 -5.33826121271772e-16,-5.23132295065132 2.42397849278656 -5.23132295065132e-16,-5.11838580694149 2.34192485488992 -5.11838580694149e-16,-5.0 2.26794919243112 -5e-16,-4.87674229357815 2.20241190740167 -4.87674229357815e-16,-4.74921318683182 2.14563229086643 -4.74921318683182e-16,-4.61803398874989 2.09788696740969 -4.61803398874989e-16,-4.48384379119934 2.05940854744801 -4.48384379119934e-16,-4.34729635533386 2.03038449397558 -4.34729635533386e-16,-4.20905692653531 2.01095620926345 -4.20905692653531e-16,-4.069798993405 2.00121834596181 -4.069798993405e-16,-3.930201006595 2.00121834596181 -3.930201006595e-16,-3.79094307346469 2.01095620926345 -3.79094307346469e-16,-3.65270364466614 2.03038449397558 -3.65270364466614e-16,-3.51615620880066 2.05940854744801 -3.51615620880066e-16,-3.38196601125011 2.09788696740969 -3.3819660112501e-16,-3.25078681316818 2.14563229086643 -3.25078681316818e-16,-3.12325770642185 2.20241190740167 -3.12325770642185e-16,-3.0 2.26794919243112 -3e-16,-2.88161419305851 2.34192485488992 -2.88161419305851e-16,-2.76867704934868 2.42397849278656 -2.76867704934868e-16,-2.66173878728228 2.51371034904521 -2.66173878728228e-16,-2.5613203993227 2.61068325908201 -2.5613203993227e-16,-2.46791111376204 2.71442478062692 -2.46791111376204e-16,-2.38196601125011 2.82442949541505 -2.3819660112501e-16,-2.30390380768715 2.94016147153359 -2.30390380768715e-16,-2.23410481428215 3.06105687442822 -2.23410481428215e-16,-2.1729090847148 3.1865267138484 -2.1729090847148e-16,-2.12061475842818 3.31595971334866 -2.12061475842818e-16,-2.07747660812336 3.448725288366 -2.07747660812336e-16,-2.04370479853239 3.58417661836448 -2.04370479853239e-16,-2.01946386251686 3.72165379807987 -2.01946386251686e-16,-2.00487189948035 3.86048705251175 -2.00487189948035e-16,-2.0 4.0 -2e-16,-2.00487189948035 4.13951294748825 -2.00487189948035e-16,-2.01946386251686 4.27834620192013 -2.01946386251686e-16,-2.04370479853239 4.41582338163552 -2.04370479853239e-16,-2.07747660812336 4.551274711634 -2.07747660812336e-16, -# -2.12061475842818 4.68404028665134 -2.12061475842818e-16,-2.1729090847148 4.8134732861516 -2.1729090847148e-16,-2.23410481428215 4.93894312557178 -2.23410481428215e-16,-2.30390380768715 5.05983852846641 -2.30390380768715e-16,-2.38196601125011 5.17557050458495 -2.3819660112501e-16,-2.46791111376204 5.28557521937308 -2.46791111376204e-16,-2.5613203993227 5.38931674091799 -2.5613203993227e-16,-2.66173878728228 5.48628965095479 -2.66173878728228e-16,-2.76867704934868 5.57602150721344 -2.76867704934868e-16,-2.88161419305851 5.65807514511008 -2.88161419305851e-16,-3.0 5.73205080756888 -3e-16,-3.12325770642184 5.79758809259833 -3.12325770642184e-16,-3.25078681316818 5.85436770913357 -3.25078681316817e-16,-3.38196601125011 5.90211303259031 -3.3819660112501e-16,-3.51615620880066 5.94059145255199 -3.51615620880066e-16,-3.65270364466614 5.96961550602442 -3.65270364466614e-16,-3.79094307346469 5.98904379073655 -3.79094307346469e-16,-3.930201006595 5.99878165403819 -3.930201006595e-16,-4.069798993405 5.99878165403819 -4.069798993405e-16,-4.20905692653531 5.98904379073655 -4.20905692653531e-16,-4.34729635533386 5.96961550602442 -4.34729635533386e-16,-4.48384379119933 5.94059145255199 -4.48384379119933e-16,-4.61803398874989 5.90211303259031 -4.61803398874989e-16,-4.74921318683182 5.85436770913357 -4.74921318683182e-16,-4.87674229357815 5.79758809259833 -4.87674229357815e-16,-5.0 5.73205080756888 -5e-16,-5.11838580694149 5.65807514511008 -5.11838580694149e-16,-5.23132295065132 5.57602150721344 -5.23132295065132e-16,-5.33826121271772 5.48628965095479 -5.33826121271772e-16,-5.4386796006773 5.389316740918 -5.4386796006773e-16,-5.53208888623796 5.28557521937308 -5.53208888623796e-16,-5.61803398874989 5.17557050458495 -5.61803398874989e-16,-5.69609619231285 5.05983852846641 -5.69609619231285e-16,-5.76589518571785 4.93894312557178 -5.76589518571785e-16,-5.8270909152852 4.8134732861516 -5.8270909152852e-16,-5.87938524157182 4.68404028665134 -5.87938524157182e-16,-5.92252339187664 4.551274711634 -5.92252339187664e-16,-5.95629520146761 4.41582338163552 -5.95629520146761e-16,-5.98053613748314 4.27834620192013 -5.98053613748314e-16,-5.99512810051965 4.13951294748825 -5.99512810051965e-16,-6.0 4.0 -6e-16) + # OGRFeature(entities):17 + # EntityHandle (String) = 20B + # LINESTRING Z (-6 4 -6e-16,-5.99512810051965 3.86048705251175 -5.99512810051965e-16,-5.98053613748314 3.72165379807987 -5.98053613748314e-16,-5.95629520146761 3.58417661836448 -5.95629520146761e-16,-5.92252339187664 3.448725288366 -5.92252339187664e-16,-5.87938524157182 3.31595971334866 -5.87938524157182e-16,-5.8270909152852 3.1865267138484 -5.8270909152852e-16,-5.76589518571785 3.06105687442822 -5.76589518571785e-16,-5.69609619231285 2.94016147153359 -5.69609619231285e-16,-5.61803398874989 2.82442949541505 -5.61803398874989e-16,-5.53208888623796 2.71442478062692 -5.53208888623796e-16,-5.4386796006773 2.61068325908201 -5.4386796006773e-16,-5.33826121271772 2.51371034904521 -5.33826121271772e-16,-5.23132295065132 2.42397849278656 -5.23132295065132e-16,-5.11838580694149 2.34192485488992 -5.11838580694149e-16,-5.0 2.26794919243112 -5e-16,-4.87674229357815 2.20241190740167 -4.87674229357815e-16,-4.74921318683182 2.14563229086643 -4.74921318683182e-16,-4.61803398874989 2.09788696740969 -4.61803398874989e-16,-4.48384379119934 2.05940854744801 -4.48384379119934e-16,-4.34729635533386 2.03038449397558 -4.34729635533386e-16,-4.20905692653531 2.01095620926345 -4.20905692653531e-16,-4.069798993405 2.00121834596181 -4.069798993405e-16,-3.930201006595 2.00121834596181 -3.930201006595e-16,-3.79094307346469 2.01095620926345 -3.79094307346469e-16,-3.65270364466614 2.03038449397558 -3.65270364466614e-16,-3.51615620880066 2.05940854744801 -3.51615620880066e-16,-3.38196601125011 2.09788696740969 -3.3819660112501e-16,-3.25078681316818 2.14563229086643 -3.25078681316818e-16,-3.12325770642185 2.20241190740167 -3.12325770642185e-16,-3.0 2.26794919243112 -3e-16,-2.88161419305851 2.34192485488992 -2.88161419305851e-16,-2.76867704934868 2.42397849278656 -2.76867704934868e-16,-2.66173878728228 2.51371034904521 -2.66173878728228e-16,-2.5613203993227 2.61068325908201 -2.5613203993227e-16,-2.46791111376204 2.71442478062692 -2.46791111376204e-16,-2.38196601125011 2.82442949541505 -2.3819660112501e-16,-2.30390380768715 2.94016147153359 -2.30390380768715e-16,-2.23410481428215 3.06105687442822 -2.23410481428215e-16,-2.1729090847148 3.1865267138484 -2.1729090847148e-16,-2.12061475842818 3.31595971334866 -2.12061475842818e-16,-2.07747660812336 3.448725288366 -2.07747660812336e-16,-2.04370479853239 3.58417661836448 -2.04370479853239e-16,-2.01946386251686 3.72165379807987 -2.01946386251686e-16,-2.00487189948035 3.86048705251175 -2.00487189948035e-16,-2.0 4.0 -2e-16,-2.00487189948035 4.13951294748825 -2.00487189948035e-16,-2.01946386251686 4.27834620192013 -2.01946386251686e-16,-2.04370479853239 4.41582338163552 -2.04370479853239e-16,-2.07747660812336 4.551274711634 -2.07747660812336e-16, + # -2.12061475842818 4.68404028665134 -2.12061475842818e-16,-2.1729090847148 4.8134732861516 -2.1729090847148e-16,-2.23410481428215 4.93894312557178 -2.23410481428215e-16,-2.30390380768715 5.05983852846641 -2.30390380768715e-16,-2.38196601125011 5.17557050458495 -2.3819660112501e-16,-2.46791111376204 5.28557521937308 -2.46791111376204e-16,-2.5613203993227 5.38931674091799 -2.5613203993227e-16,-2.66173878728228 5.48628965095479 -2.66173878728228e-16,-2.76867704934868 5.57602150721344 -2.76867704934868e-16,-2.88161419305851 5.65807514511008 -2.88161419305851e-16,-3.0 5.73205080756888 -3e-16,-3.12325770642184 5.79758809259833 -3.12325770642184e-16,-3.25078681316818 5.85436770913357 -3.25078681316817e-16,-3.38196601125011 5.90211303259031 -3.3819660112501e-16,-3.51615620880066 5.94059145255199 -3.51615620880066e-16,-3.65270364466614 5.96961550602442 -3.65270364466614e-16,-3.79094307346469 5.98904379073655 -3.79094307346469e-16,-3.930201006595 5.99878165403819 -3.930201006595e-16,-4.069798993405 5.99878165403819 -4.069798993405e-16,-4.20905692653531 5.98904379073655 -4.20905692653531e-16,-4.34729635533386 5.96961550602442 -4.34729635533386e-16,-4.48384379119933 5.94059145255199 -4.48384379119933e-16,-4.61803398874989 5.90211303259031 -4.61803398874989e-16,-4.74921318683182 5.85436770913357 -4.74921318683182e-16,-4.87674229357815 5.79758809259833 -4.87674229357815e-16,-5.0 5.73205080756888 -5e-16,-5.11838580694149 5.65807514511008 -5.11838580694149e-16,-5.23132295065132 5.57602150721344 -5.23132295065132e-16,-5.33826121271772 5.48628965095479 -5.33826121271772e-16,-5.4386796006773 5.389316740918 -5.4386796006773e-16,-5.53208888623796 5.28557521937308 -5.53208888623796e-16,-5.61803398874989 5.17557050458495 -5.61803398874989e-16,-5.69609619231285 5.05983852846641 -5.69609619231285e-16,-5.76589518571785 4.93894312557178 -5.76589518571785e-16,-5.8270909152852 4.8134732861516 -5.8270909152852e-16,-5.87938524157182 4.68404028665134 -5.87938524157182e-16,-5.92252339187664 4.551274711634 -5.92252339187664e-16,-5.95629520146761 4.41582338163552 -5.95629520146761e-16,-5.98053613748314 4.27834620192013 -5.98053613748314e-16,-5.99512810051965 4.13951294748825 -5.99512810051965e-16,-6.0 4.0 -6e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-6 4 -6e-16,-5.99512810051965 3.86048705251175 -5.99512810051965e-16,-5.98053613748314 3.72165379807987 -5.98053613748314e-16,-5.95629520146761 3.58417661836448 -5.95629520146761e-16,-5.92252339187664 3.448725288366 -5.92252339187664e-16,-5.87938524157182 3.31595971334866 -5.87938524157182e-16,-5.8270909152852 3.1865267138484 -5.8270909152852e-16,-5.76589518571785 3.06105687442822 -5.76589518571785e-16,-5.69609619231285 2.94016147153359 -5.69609619231285e-16,-5.61803398874989 2.82442949541505 -5.61803398874989e-16,-5.53208888623796 2.71442478062692 -5.53208888623796e-16,-5.4386796006773 2.61068325908201 -5.4386796006773e-16,-5.33826121271772 2.51371034904521 -5.33826121271772e-16,-5.23132295065132 2.42397849278656 -5.23132295065132e-16,-5.11838580694149 2.34192485488992 -5.11838580694149e-16,-5.0 2.26794919243112 -5e-16,-4.87674229357815 2.20241190740167 -4.87674229357815e-16,-4.74921318683182 2.14563229086643 -4.74921318683182e-16,-4.61803398874989 2.09788696740969 -4.61803398874989e-16,-4.48384379119934 2.05940854744801 -4.48384379119934e-16,-4.34729635533386 2.03038449397558 -4.34729635533386e-16,-4.20905692653531 2.01095620926345 -4.20905692653531e-16,-4.069798993405 2.00121834596181 -4.069798993405e-16,-3.930201006595 2.00121834596181 -3.930201006595e-16,-3.79094307346469 2.01095620926345 -3.79094307346469e-16,-3.65270364466614 2.03038449397558 -3.65270364466614e-16,-3.51615620880066 2.05940854744801 -3.51615620880066e-16,-3.38196601125011 2.09788696740969 -3.3819660112501e-16,-3.25078681316818 2.14563229086643 -3.25078681316818e-16,-3.12325770642185 2.20241190740167 -3.12325770642185e-16,-3.0 2.26794919243112 -3e-16,-2.88161419305851 2.34192485488992 -2.88161419305851e-16,-2.76867704934868 2.42397849278656 -2.76867704934868e-16,-2.66173878728228 2.51371034904521 -2.66173878728228e-16,-2.5613203993227 2.61068325908201 -2.5613203993227e-16,-2.46791111376204 2.71442478062692 -2.46791111376204e-16,-2.38196601125011 2.82442949541505 -2.3819660112501e-16,-2.30390380768715 2.94016147153359 -2.30390380768715e-16,-2.23410481428215 3.06105687442822 -2.23410481428215e-16,-2.1729090847148 3.1865267138484 -2.1729090847148e-16,-2.12061475842818 3.31595971334866 -2.12061475842818e-16,-2.07747660812336 3.448725288366 -2.07747660812336e-16,-2.04370479853239 3.58417661836448 -2.04370479853239e-16,-2.01946386251686 3.72165379807987 -2.01946386251686e-16,-2.00487189948035 3.86048705251175 -2.00487189948035e-16,-2.0 4.0 -2e-16,-2.00487189948035 4.13951294748825 -2.00487189948035e-16,-2.01946386251686 4.27834620192013 -2.01946386251686e-16,-2.04370479853239 4.41582338163552 -2.04370479853239e-16,' + - '-2.07747660812336 4.551274711634 -2.07747660812336e-16,-2.12061475842818 4.68404028665134 -2.12061475842818e-16,-2.1729090847148 4.8134732861516 -2.1729090847148e-16,-2.23410481428215 4.93894312557178 -2.23410481428215e-16,-2.30390380768715 5.05983852846641 -2.30390380768715e-16,-2.38196601125011 5.17557050458495 -2.3819660112501e-16,-2.46791111376204 5.28557521937308 -2.46791111376204e-16,-2.5613203993227 5.38931674091799 -2.5613203993227e-16,-2.66173878728228 5.48628965095479 -2.66173878728228e-16,-2.76867704934868 5.57602150721344 -2.76867704934868e-16,-2.88161419305851 5.65807514511008 -2.88161419305851e-16,-3.0 5.73205080756888 -3e-16,-3.12325770642184 5.79758809259833 -3.12325770642184e-16,-3.25078681316818 5.85436770913357 -3.25078681316817e-16,-3.38196601125011 5.90211303259031 -3.3819660112501e-16,-3.51615620880066 5.94059145255199 -3.51615620880066e-16,-3.65270364466614 5.96961550602442 -3.65270364466614e-16,-3.79094307346469 5.98904379073655 -3.79094307346469e-16,-3.930201006595 5.99878165403819 -3.930201006595e-16,-4.069798993405 5.99878165403819 -4.069798993405e-16,-4.20905692653531 5.98904379073655 -4.20905692653531e-16,-4.34729635533386 5.96961550602442 -4.34729635533386e-16,-4.48384379119933 5.94059145255199 -4.48384379119933e-16,-4.61803398874989 5.90211303259031 -4.61803398874989e-16,-4.74921318683182 5.85436770913357 -4.74921318683182e-16,-4.87674229357815 5.79758809259833 -4.87674229357815e-16,-5.0 5.73205080756888 -5e-16,-5.11838580694149 5.65807514511008 -5.11838580694149e-16,-5.23132295065132 5.57602150721344 -5.23132295065132e-16,-5.33826121271772 5.48628965095479 -5.33826121271772e-16,-5.4386796006773 5.389316740918 -5.4386796006773e-16,-5.53208888623796 5.28557521937308 -5.53208888623796e-16,-5.61803398874989 5.17557050458495 -5.61803398874989e-16,-5.69609619231285 5.05983852846641 -5.69609619231285e-16,-5.76589518571785 4.93894312557178 -5.76589518571785e-16,-5.8270909152852 4.8134732861516 -5.8270909152852e-16,-5.87938524157182 4.68404028665134 -5.87938524157182e-16,-5.92252339187664 4.551274711634 -5.92252339187664e-16,-5.95629520146761 4.41582338163552 -5.95629520146761e-16,-5.98053613748314 4.27834620192013 -5.98053613748314e-16,-5.99512810051965 4.13951294748825 -5.99512810051965e-16,-6.0 4.0 -6e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-6 4 -6e-16,-5.99512810051965 3.86048705251175 -5.99512810051965e-16,-5.98053613748314 3.72165379807987 -5.98053613748314e-16,-5.95629520146761 3.58417661836448 -5.95629520146761e-16,-5.92252339187664 3.448725288366 -5.92252339187664e-16,-5.87938524157182 3.31595971334866 -5.87938524157182e-16,-5.8270909152852 3.1865267138484 -5.8270909152852e-16,-5.76589518571785 3.06105687442822 -5.76589518571785e-16,-5.69609619231285 2.94016147153359 -5.69609619231285e-16,-5.61803398874989 2.82442949541505 -5.61803398874989e-16,-5.53208888623796 2.71442478062692 -5.53208888623796e-16,-5.4386796006773 2.61068325908201 -5.4386796006773e-16,-5.33826121271772 2.51371034904521 -5.33826121271772e-16,-5.23132295065132 2.42397849278656 -5.23132295065132e-16,-5.11838580694149 2.34192485488992 -5.11838580694149e-16,-5.0 2.26794919243112 -5e-16,-4.87674229357815 2.20241190740167 -4.87674229357815e-16,-4.74921318683182 2.14563229086643 -4.74921318683182e-16,-4.61803398874989 2.09788696740969 -4.61803398874989e-16,-4.48384379119934 2.05940854744801 -4.48384379119934e-16,-4.34729635533386 2.03038449397558 -4.34729635533386e-16,-4.20905692653531 2.01095620926345 -4.20905692653531e-16,-4.069798993405 2.00121834596181 -4.069798993405e-16,-3.930201006595 2.00121834596181 -3.930201006595e-16,-3.79094307346469 2.01095620926345 -3.79094307346469e-16,-3.65270364466614 2.03038449397558 -3.65270364466614e-16,-3.51615620880066 2.05940854744801 -3.51615620880066e-16,-3.38196601125011 2.09788696740969 -3.3819660112501e-16,-3.25078681316818 2.14563229086643 -3.25078681316818e-16,-3.12325770642185 2.20241190740167 -3.12325770642185e-16,-3.0 2.26794919243112 -3e-16,-2.88161419305851 2.34192485488992 -2.88161419305851e-16,-2.76867704934868 2.42397849278656 -2.76867704934868e-16,-2.66173878728228 2.51371034904521 -2.66173878728228e-16,-2.5613203993227 2.61068325908201 -2.5613203993227e-16,-2.46791111376204 2.71442478062692 -2.46791111376204e-16,-2.38196601125011 2.82442949541505 -2.3819660112501e-16,-2.30390380768715 2.94016147153359 -2.30390380768715e-16,-2.23410481428215 3.06105687442822 -2.23410481428215e-16,-2.1729090847148 3.1865267138484 -2.1729090847148e-16,-2.12061475842818 3.31595971334866 -2.12061475842818e-16,-2.07747660812336 3.448725288366 -2.07747660812336e-16,-2.04370479853239 3.58417661836448 -2.04370479853239e-16,-2.01946386251686 3.72165379807987 -2.01946386251686e-16,-2.00487189948035 3.86048705251175 -2.00487189948035e-16,-2.0 4.0 -2e-16,-2.00487189948035 4.13951294748825 -2.00487189948035e-16,-2.01946386251686 4.27834620192013 -2.01946386251686e-16,-2.04370479853239 4.41582338163552 -2.04370479853239e-16," + + "-2.07747660812336 4.551274711634 -2.07747660812336e-16,-2.12061475842818 4.68404028665134 -2.12061475842818e-16,-2.1729090847148 4.8134732861516 -2.1729090847148e-16,-2.23410481428215 4.93894312557178 -2.23410481428215e-16,-2.30390380768715 5.05983852846641 -2.30390380768715e-16,-2.38196601125011 5.17557050458495 -2.3819660112501e-16,-2.46791111376204 5.28557521937308 -2.46791111376204e-16,-2.5613203993227 5.38931674091799 -2.5613203993227e-16,-2.66173878728228 5.48628965095479 -2.66173878728228e-16,-2.76867704934868 5.57602150721344 -2.76867704934868e-16,-2.88161419305851 5.65807514511008 -2.88161419305851e-16,-3.0 5.73205080756888 -3e-16,-3.12325770642184 5.79758809259833 -3.12325770642184e-16,-3.25078681316818 5.85436770913357 -3.25078681316817e-16,-3.38196601125011 5.90211303259031 -3.3819660112501e-16,-3.51615620880066 5.94059145255199 -3.51615620880066e-16,-3.65270364466614 5.96961550602442 -3.65270364466614e-16,-3.79094307346469 5.98904379073655 -3.79094307346469e-16,-3.930201006595 5.99878165403819 -3.930201006595e-16,-4.069798993405 5.99878165403819 -4.069798993405e-16,-4.20905692653531 5.98904379073655 -4.20905692653531e-16,-4.34729635533386 5.96961550602442 -4.34729635533386e-16,-4.48384379119933 5.94059145255199 -4.48384379119933e-16,-4.61803398874989 5.90211303259031 -4.61803398874989e-16,-4.74921318683182 5.85436770913357 -4.74921318683182e-16,-4.87674229357815 5.79758809259833 -4.87674229357815e-16,-5.0 5.73205080756888 -5e-16,-5.11838580694149 5.65807514511008 -5.11838580694149e-16,-5.23132295065132 5.57602150721344 -5.23132295065132e-16,-5.33826121271772 5.48628965095479 -5.33826121271772e-16,-5.4386796006773 5.389316740918 -5.4386796006773e-16,-5.53208888623796 5.28557521937308 -5.53208888623796e-16,-5.61803398874989 5.17557050458495 -5.61803398874989e-16,-5.69609619231285 5.05983852846641 -5.69609619231285e-16,-5.76589518571785 4.93894312557178 -5.76589518571785e-16,-5.8270909152852 4.8134732861516 -5.8270909152852e-16,-5.87938524157182 4.68404028665134 -5.87938524157182e-16,-5.92252339187664 4.551274711634 -5.92252339187664e-16,-5.95629520146761 4.41582338163552 -5.95629520146761e-16,-5.98053613748314 4.27834620192013 -5.98053613748314e-16,-5.99512810051965 4.13951294748825 -5.99512810051965e-16,-6.0 4.0 -6e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):18 -# EntityHandle (String) = 20C -# LINESTRING Z (-2 4 -3e-16,-2.00487189948035 4.06975647374412 -3.00487189948035e-16,-2.01946386251686 4.13917310096007 -3.01946386251686e-16,-2.04370479853239 4.20791169081776 -3.04370479853239e-16,-2.07747660812336 4.275637355817 -3.07747660812336e-16,-2.12061475842818 4.34202014332567 -3.12061475842818e-16,-2.1729090847148 4.4067366430758 -3.1729090847148e-16,-2.23410481428215 4.46947156278589 -3.23410481428215e-16,-2.30390380768715 4.52991926423321 -3.30390380768715e-16,-2.38196601125011 4.58778525229247 -3.38196601125011e-16,-2.46791111376204 4.64278760968654 -3.46791111376204e-16,-2.5613203993227 4.694658370459 -3.5613203993227e-16,-2.66173878728228 4.74314482547739 -3.66173878728228e-16,-2.76867704934868 4.78801075360672 -3.76867704934868e-16,-2.88161419305851 4.82903757255504 -3.88161419305851e-16,-3.0 4.86602540378444 -4e-16,-3.12325770642185 4.89879404629917 -4.12325770642185e-16,-3.25078681316818 4.92718385456679 -4.25078681316818e-16,-3.38196601125011 4.95105651629515 -4.38196601125011e-16,-3.51615620880067 4.970295726276 -4.51615620880067e-16,-3.65270364466614 4.98480775301221 -4.65270364466614e-16,-3.79094307346469 4.99452189536827 -4.79094307346469e-16,-3.930201006595 4.9993908270191 -4.930201006595e-16,-4.069798993405 4.9993908270191 -5.069798993405e-16,-4.20905692653531 4.99452189536827 -5.20905692653531e-16,-4.34729635533386 4.98480775301221 -5.34729635533386e-16,-4.48384379119934 4.970295726276 -5.48384379119934e-16,-4.61803398874989 4.95105651629515 -5.6180339887499e-16,-4.74921318683182 4.92718385456679 -5.74921318683183e-16,-4.87674229357816 4.89879404629917 -5.87674229357816e-16,-5.0 4.86602540378444 -6e-16,-5.11838580694149 4.82903757255504 -6.1183858069415e-16,-5.23132295065132 4.78801075360672 -6.23132295065132e-16,-5.33826121271772 4.74314482547739 -6.33826121271772e-16,-5.4386796006773 4.694658370459 -6.4386796006773e-16,-5.53208888623796 4.64278760968654 -6.53208888623796e-16,-5.61803398874989 4.58778525229247 -6.61803398874989e-16,-5.69609619231285 4.5299192642332 -6.69609619231285e-16,-5.76589518571785 4.46947156278589 -6.76589518571785e-16,-5.8270909152852 4.4067366430758 -6.8270909152852e-16,-5.87938524157182 4.34202014332567 -6.87938524157182e-16,-5.92252339187664 4.275637355817 -6.92252339187664e-16,-5.95629520146761 4.20791169081776 -6.95629520146761e-16,-5.98053613748314 4.13917310096006 -6.98053613748314e-16,-5.99512810051965 4.06975647374412 -6.99512810051965e-16,-6.0 4.0 -7e-16,-5.99512810051965 3.93024352625587 -6.99512810051965e-16,-5.98053613748314 3.86082689903993 -6.98053613748314e-16,-5.95629520146761 3.79208830918224 -6.95629520146761e-16, -# -5.92252339187664 3.724362644183 -6.92252339187664e-16,-5.87938524157182 3.65797985667433 -6.87938524157182e-16,-5.8270909152852 3.5932633569242 -6.8270909152852e-16,-5.76589518571785 3.53052843721411 -6.76589518571785e-16,-5.69609619231285 3.4700807357668 -6.69609619231285e-16,-5.61803398874989 3.41221474770753 -6.61803398874989e-16,-5.53208888623796 3.35721239031346 -6.53208888623796e-16,-5.4386796006773 3.305341629541 -6.4386796006773e-16,-5.33826121271772 3.25685517452261 -6.33826121271772e-16,-5.23132295065132 3.21198924639328 -6.23132295065132e-16,-5.11838580694149 3.17096242744496 -6.11838580694149e-16,-5.0 3.13397459621556 -6e-16,-4.87674229357815 3.10120595370083 -5.87674229357816e-16,-4.74921318683182 3.07281614543321 -5.74921318683182e-16,-4.61803398874989 3.04894348370485 -5.6180339887499e-16,-4.48384379119934 3.029704273724 -5.48384379119934e-16,-4.34729635533386 3.01519224698779 -5.34729635533386e-16,-4.20905692653531 3.00547810463173 -5.20905692653531e-16,-4.069798993405 3.0006091729809 -5.069798993405e-16,-3.930201006595 3.0006091729809 -4.930201006595e-16,-3.79094307346469 3.00547810463173 -4.79094307346469e-16,-3.65270364466614 3.01519224698779 -4.65270364466614e-16,-3.51615620880066 3.029704273724 -4.51615620880066e-16,-3.38196601125011 3.04894348370485 -4.38196601125011e-16,-3.25078681316818 3.07281614543321 -4.25078681316818e-16,-3.12325770642185 3.10120595370083 -4.12325770642185e-16,-3.0 3.13397459621556 -4e-16,-2.88161419305851 3.17096242744496 -3.88161419305851e-16,-2.76867704934868 3.21198924639328 -3.76867704934868e-16,-2.66173878728228 3.25685517452261 -3.66173878728228e-16,-2.5613203993227 3.305341629541 -3.5613203993227e-16,-2.46791111376204 3.35721239031346 -3.46791111376204e-16,-2.38196601125011 3.41221474770753 -3.38196601125011e-16,-2.30390380768715 3.4700807357668 -3.30390380768715e-16,-2.23410481428215 3.53052843721411 -3.23410481428215e-16,-2.1729090847148 3.5932633569242 -3.1729090847148e-16,-2.12061475842818 3.65797985667433 -3.12061475842818e-16,-2.07747660812336 3.724362644183 -3.07747660812336e-16,-2.04370479853239 3.79208830918224 -3.04370479853239e-16,-2.01946386251686 3.86082689903993 -3.01946386251686e-16,-2.00487189948035 3.93024352625587 -3.00487189948035e-16,-2 4 -3e-16) + # OGRFeature(entities):18 + # EntityHandle (String) = 20C + # LINESTRING Z (-2 4 -3e-16,-2.00487189948035 4.06975647374412 -3.00487189948035e-16,-2.01946386251686 4.13917310096007 -3.01946386251686e-16,-2.04370479853239 4.20791169081776 -3.04370479853239e-16,-2.07747660812336 4.275637355817 -3.07747660812336e-16,-2.12061475842818 4.34202014332567 -3.12061475842818e-16,-2.1729090847148 4.4067366430758 -3.1729090847148e-16,-2.23410481428215 4.46947156278589 -3.23410481428215e-16,-2.30390380768715 4.52991926423321 -3.30390380768715e-16,-2.38196601125011 4.58778525229247 -3.38196601125011e-16,-2.46791111376204 4.64278760968654 -3.46791111376204e-16,-2.5613203993227 4.694658370459 -3.5613203993227e-16,-2.66173878728228 4.74314482547739 -3.66173878728228e-16,-2.76867704934868 4.78801075360672 -3.76867704934868e-16,-2.88161419305851 4.82903757255504 -3.88161419305851e-16,-3.0 4.86602540378444 -4e-16,-3.12325770642185 4.89879404629917 -4.12325770642185e-16,-3.25078681316818 4.92718385456679 -4.25078681316818e-16,-3.38196601125011 4.95105651629515 -4.38196601125011e-16,-3.51615620880067 4.970295726276 -4.51615620880067e-16,-3.65270364466614 4.98480775301221 -4.65270364466614e-16,-3.79094307346469 4.99452189536827 -4.79094307346469e-16,-3.930201006595 4.9993908270191 -4.930201006595e-16,-4.069798993405 4.9993908270191 -5.069798993405e-16,-4.20905692653531 4.99452189536827 -5.20905692653531e-16,-4.34729635533386 4.98480775301221 -5.34729635533386e-16,-4.48384379119934 4.970295726276 -5.48384379119934e-16,-4.61803398874989 4.95105651629515 -5.6180339887499e-16,-4.74921318683182 4.92718385456679 -5.74921318683183e-16,-4.87674229357816 4.89879404629917 -5.87674229357816e-16,-5.0 4.86602540378444 -6e-16,-5.11838580694149 4.82903757255504 -6.1183858069415e-16,-5.23132295065132 4.78801075360672 -6.23132295065132e-16,-5.33826121271772 4.74314482547739 -6.33826121271772e-16,-5.4386796006773 4.694658370459 -6.4386796006773e-16,-5.53208888623796 4.64278760968654 -6.53208888623796e-16,-5.61803398874989 4.58778525229247 -6.61803398874989e-16,-5.69609619231285 4.5299192642332 -6.69609619231285e-16,-5.76589518571785 4.46947156278589 -6.76589518571785e-16,-5.8270909152852 4.4067366430758 -6.8270909152852e-16,-5.87938524157182 4.34202014332567 -6.87938524157182e-16,-5.92252339187664 4.275637355817 -6.92252339187664e-16,-5.95629520146761 4.20791169081776 -6.95629520146761e-16,-5.98053613748314 4.13917310096006 -6.98053613748314e-16,-5.99512810051965 4.06975647374412 -6.99512810051965e-16,-6.0 4.0 -7e-16,-5.99512810051965 3.93024352625587 -6.99512810051965e-16,-5.98053613748314 3.86082689903993 -6.98053613748314e-16,-5.95629520146761 3.79208830918224 -6.95629520146761e-16, + # -5.92252339187664 3.724362644183 -6.92252339187664e-16,-5.87938524157182 3.65797985667433 -6.87938524157182e-16,-5.8270909152852 3.5932633569242 -6.8270909152852e-16,-5.76589518571785 3.53052843721411 -6.76589518571785e-16,-5.69609619231285 3.4700807357668 -6.69609619231285e-16,-5.61803398874989 3.41221474770753 -6.61803398874989e-16,-5.53208888623796 3.35721239031346 -6.53208888623796e-16,-5.4386796006773 3.305341629541 -6.4386796006773e-16,-5.33826121271772 3.25685517452261 -6.33826121271772e-16,-5.23132295065132 3.21198924639328 -6.23132295065132e-16,-5.11838580694149 3.17096242744496 -6.11838580694149e-16,-5.0 3.13397459621556 -6e-16,-4.87674229357815 3.10120595370083 -5.87674229357816e-16,-4.74921318683182 3.07281614543321 -5.74921318683182e-16,-4.61803398874989 3.04894348370485 -5.6180339887499e-16,-4.48384379119934 3.029704273724 -5.48384379119934e-16,-4.34729635533386 3.01519224698779 -5.34729635533386e-16,-4.20905692653531 3.00547810463173 -5.20905692653531e-16,-4.069798993405 3.0006091729809 -5.069798993405e-16,-3.930201006595 3.0006091729809 -4.930201006595e-16,-3.79094307346469 3.00547810463173 -4.79094307346469e-16,-3.65270364466614 3.01519224698779 -4.65270364466614e-16,-3.51615620880066 3.029704273724 -4.51615620880066e-16,-3.38196601125011 3.04894348370485 -4.38196601125011e-16,-3.25078681316818 3.07281614543321 -4.25078681316818e-16,-3.12325770642185 3.10120595370083 -4.12325770642185e-16,-3.0 3.13397459621556 -4e-16,-2.88161419305851 3.17096242744496 -3.88161419305851e-16,-2.76867704934868 3.21198924639328 -3.76867704934868e-16,-2.66173878728228 3.25685517452261 -3.66173878728228e-16,-2.5613203993227 3.305341629541 -3.5613203993227e-16,-2.46791111376204 3.35721239031346 -3.46791111376204e-16,-2.38196601125011 3.41221474770753 -3.38196601125011e-16,-2.30390380768715 3.4700807357668 -3.30390380768715e-16,-2.23410481428215 3.53052843721411 -3.23410481428215e-16,-2.1729090847148 3.5932633569242 -3.1729090847148e-16,-2.12061475842818 3.65797985667433 -3.12061475842818e-16,-2.07747660812336 3.724362644183 -3.07747660812336e-16,-2.04370479853239 3.79208830918224 -3.04370479853239e-16,-2.01946386251686 3.86082689903993 -3.01946386251686e-16,-2.00487189948035 3.93024352625587 -3.00487189948035e-16,-2 4 -3e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2 4 -3e-16,-2.00487189948035 4.06975647374412 -3.00487189948035e-16,-2.01946386251686 4.13917310096007 -3.01946386251686e-16,-2.04370479853239 4.20791169081776 -3.04370479853239e-16,-2.07747660812336 4.275637355817 -3.07747660812336e-16,-2.12061475842818 4.34202014332567 -3.12061475842818e-16,-2.1729090847148 4.4067366430758 -3.1729090847148e-16,-2.23410481428215 4.46947156278589 -3.23410481428215e-16,-2.30390380768715 4.52991926423321 -3.30390380768715e-16,-2.38196601125011 4.58778525229247 -3.38196601125011e-16,-2.46791111376204 4.64278760968654 -3.46791111376204e-16,-2.5613203993227 4.694658370459 -3.5613203993227e-16,-2.66173878728228 4.74314482547739 -3.66173878728228e-16,-2.76867704934868 4.78801075360672 -3.76867704934868e-16,-2.88161419305851 4.82903757255504 -3.88161419305851e-16,-3.0 4.86602540378444 -4e-16,-3.12325770642185 4.89879404629917 -4.12325770642185e-16,-3.25078681316818 4.92718385456679 -4.25078681316818e-16,-3.38196601125011 4.95105651629515 -4.38196601125011e-16,-3.51615620880067 4.970295726276 -4.51615620880067e-16,-3.65270364466614 4.98480775301221 -4.65270364466614e-16,-3.79094307346469 4.99452189536827 -4.79094307346469e-16,-3.930201006595 4.9993908270191 -4.930201006595e-16,-4.069798993405 4.9993908270191 -5.069798993405e-16,-4.20905692653531 4.99452189536827 -5.20905692653531e-16,-4.34729635533386 4.98480775301221 -5.34729635533386e-16,-4.48384379119934 4.970295726276 -5.48384379119934e-16,-4.61803398874989 4.95105651629515 -5.6180339887499e-16,-4.74921318683182 4.92718385456679 -5.74921318683183e-16,-4.87674229357816 4.89879404629917 -5.87674229357816e-16,-5.0 4.86602540378444 -6e-16,-5.11838580694149 4.82903757255504 -6.1183858069415e-16,-5.23132295065132 4.78801075360672 -6.23132295065132e-16,-5.33826121271772 4.74314482547739 -6.33826121271772e-16,-5.4386796006773 4.694658370459 -6.4386796006773e-16,-5.53208888623796 4.64278760968654 -6.53208888623796e-16,-5.61803398874989 4.58778525229247 -6.61803398874989e-16,-5.69609619231285 4.5299192642332 -6.69609619231285e-16,-5.76589518571785 4.46947156278589 -6.76589518571785e-16,-5.8270909152852 4.4067366430758 -6.8270909152852e-16,-5.87938524157182 4.34202014332567 -6.87938524157182e-16,-5.92252339187664 4.275637355817 -6.92252339187664e-16,-5.95629520146761 4.20791169081776 -6.95629520146761e-16,-5.98053613748314 4.13917310096006 -6.98053613748314e-16,-5.99512810051965 4.06975647374412 -6.99512810051965e-16,-6.0 4.0 -7e-16,-5.99512810051965 3.93024352625587 -6.99512810051965e-16,-5.98053613748314 3.86082689903993 -6.98053613748314e-16,-5.95629520146761 3.79208830918224 -6.95629520146761e-16,' + - '-5.92252339187664 3.724362644183 -6.92252339187664e-16,-5.87938524157182 3.65797985667433 -6.87938524157182e-16,-5.8270909152852 3.5932633569242 -6.8270909152852e-16,-5.76589518571785 3.53052843721411 -6.76589518571785e-16,-5.69609619231285 3.4700807357668 -6.69609619231285e-16,-5.61803398874989 3.41221474770753 -6.61803398874989e-16,-5.53208888623796 3.35721239031346 -6.53208888623796e-16,-5.4386796006773 3.305341629541 -6.4386796006773e-16,-5.33826121271772 3.25685517452261 -6.33826121271772e-16,-5.23132295065132 3.21198924639328 -6.23132295065132e-16,-5.11838580694149 3.17096242744496 -6.11838580694149e-16,-5.0 3.13397459621556 -6e-16,-4.87674229357815 3.10120595370083 -5.87674229357816e-16,-4.74921318683182 3.07281614543321 -5.74921318683182e-16,-4.61803398874989 3.04894348370485 -5.6180339887499e-16,-4.48384379119934 3.029704273724 -5.48384379119934e-16,-4.34729635533386 3.01519224698779 -5.34729635533386e-16,-4.20905692653531 3.00547810463173 -5.20905692653531e-16,-4.069798993405 3.0006091729809 -5.069798993405e-16,-3.930201006595 3.0006091729809 -4.930201006595e-16,-3.79094307346469 3.00547810463173 -4.79094307346469e-16,-3.65270364466614 3.01519224698779 -4.65270364466614e-16,-3.51615620880066 3.029704273724 -4.51615620880066e-16,-3.38196601125011 3.04894348370485 -4.38196601125011e-16,-3.25078681316818 3.07281614543321 -4.25078681316818e-16,-3.12325770642185 3.10120595370083 -4.12325770642185e-16,-3.0 3.13397459621556 -4e-16,-2.88161419305851 3.17096242744496 -3.88161419305851e-16,-2.76867704934868 3.21198924639328 -3.76867704934868e-16,-2.66173878728228 3.25685517452261 -3.66173878728228e-16,-2.5613203993227 3.305341629541 -3.5613203993227e-16,-2.46791111376204 3.35721239031346 -3.46791111376204e-16,-2.38196601125011 3.41221474770753 -3.38196601125011e-16,-2.30390380768715 3.4700807357668 -3.30390380768715e-16,-2.23410481428215 3.53052843721411 -3.23410481428215e-16,-2.1729090847148 3.5932633569242 -3.1729090847148e-16,-2.12061475842818 3.65797985667433 -3.12061475842818e-16,-2.07747660812336 3.724362644183 -3.07747660812336e-16,-2.04370479853239 3.79208830918224 -3.04370479853239e-16,-2.01946386251686 3.86082689903993 -3.01946386251686e-16,-2.00487189948035 3.93024352625587 -3.00487189948035e-16,-2 4 -3e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2 4 -3e-16,-2.00487189948035 4.06975647374412 -3.00487189948035e-16,-2.01946386251686 4.13917310096007 -3.01946386251686e-16,-2.04370479853239 4.20791169081776 -3.04370479853239e-16,-2.07747660812336 4.275637355817 -3.07747660812336e-16,-2.12061475842818 4.34202014332567 -3.12061475842818e-16,-2.1729090847148 4.4067366430758 -3.1729090847148e-16,-2.23410481428215 4.46947156278589 -3.23410481428215e-16,-2.30390380768715 4.52991926423321 -3.30390380768715e-16,-2.38196601125011 4.58778525229247 -3.38196601125011e-16,-2.46791111376204 4.64278760968654 -3.46791111376204e-16,-2.5613203993227 4.694658370459 -3.5613203993227e-16,-2.66173878728228 4.74314482547739 -3.66173878728228e-16,-2.76867704934868 4.78801075360672 -3.76867704934868e-16,-2.88161419305851 4.82903757255504 -3.88161419305851e-16,-3.0 4.86602540378444 -4e-16,-3.12325770642185 4.89879404629917 -4.12325770642185e-16,-3.25078681316818 4.92718385456679 -4.25078681316818e-16,-3.38196601125011 4.95105651629515 -4.38196601125011e-16,-3.51615620880067 4.970295726276 -4.51615620880067e-16,-3.65270364466614 4.98480775301221 -4.65270364466614e-16,-3.79094307346469 4.99452189536827 -4.79094307346469e-16,-3.930201006595 4.9993908270191 -4.930201006595e-16,-4.069798993405 4.9993908270191 -5.069798993405e-16,-4.20905692653531 4.99452189536827 -5.20905692653531e-16,-4.34729635533386 4.98480775301221 -5.34729635533386e-16,-4.48384379119934 4.970295726276 -5.48384379119934e-16,-4.61803398874989 4.95105651629515 -5.6180339887499e-16,-4.74921318683182 4.92718385456679 -5.74921318683183e-16,-4.87674229357816 4.89879404629917 -5.87674229357816e-16,-5.0 4.86602540378444 -6e-16,-5.11838580694149 4.82903757255504 -6.1183858069415e-16,-5.23132295065132 4.78801075360672 -6.23132295065132e-16,-5.33826121271772 4.74314482547739 -6.33826121271772e-16,-5.4386796006773 4.694658370459 -6.4386796006773e-16,-5.53208888623796 4.64278760968654 -6.53208888623796e-16,-5.61803398874989 4.58778525229247 -6.61803398874989e-16,-5.69609619231285 4.5299192642332 -6.69609619231285e-16,-5.76589518571785 4.46947156278589 -6.76589518571785e-16,-5.8270909152852 4.4067366430758 -6.8270909152852e-16,-5.87938524157182 4.34202014332567 -6.87938524157182e-16,-5.92252339187664 4.275637355817 -6.92252339187664e-16,-5.95629520146761 4.20791169081776 -6.95629520146761e-16,-5.98053613748314 4.13917310096006 -6.98053613748314e-16,-5.99512810051965 4.06975647374412 -6.99512810051965e-16,-6.0 4.0 -7e-16,-5.99512810051965 3.93024352625587 -6.99512810051965e-16,-5.98053613748314 3.86082689903993 -6.98053613748314e-16,-5.95629520146761 3.79208830918224 -6.95629520146761e-16," + + "-5.92252339187664 3.724362644183 -6.92252339187664e-16,-5.87938524157182 3.65797985667433 -6.87938524157182e-16,-5.8270909152852 3.5932633569242 -6.8270909152852e-16,-5.76589518571785 3.53052843721411 -6.76589518571785e-16,-5.69609619231285 3.4700807357668 -6.69609619231285e-16,-5.61803398874989 3.41221474770753 -6.61803398874989e-16,-5.53208888623796 3.35721239031346 -6.53208888623796e-16,-5.4386796006773 3.305341629541 -6.4386796006773e-16,-5.33826121271772 3.25685517452261 -6.33826121271772e-16,-5.23132295065132 3.21198924639328 -6.23132295065132e-16,-5.11838580694149 3.17096242744496 -6.11838580694149e-16,-5.0 3.13397459621556 -6e-16,-4.87674229357815 3.10120595370083 -5.87674229357816e-16,-4.74921318683182 3.07281614543321 -5.74921318683182e-16,-4.61803398874989 3.04894348370485 -5.6180339887499e-16,-4.48384379119934 3.029704273724 -5.48384379119934e-16,-4.34729635533386 3.01519224698779 -5.34729635533386e-16,-4.20905692653531 3.00547810463173 -5.20905692653531e-16,-4.069798993405 3.0006091729809 -5.069798993405e-16,-3.930201006595 3.0006091729809 -4.930201006595e-16,-3.79094307346469 3.00547810463173 -4.79094307346469e-16,-3.65270364466614 3.01519224698779 -4.65270364466614e-16,-3.51615620880066 3.029704273724 -4.51615620880066e-16,-3.38196601125011 3.04894348370485 -4.38196601125011e-16,-3.25078681316818 3.07281614543321 -4.25078681316818e-16,-3.12325770642185 3.10120595370083 -4.12325770642185e-16,-3.0 3.13397459621556 -4e-16,-2.88161419305851 3.17096242744496 -3.88161419305851e-16,-2.76867704934868 3.21198924639328 -3.76867704934868e-16,-2.66173878728228 3.25685517452261 -3.66173878728228e-16,-2.5613203993227 3.305341629541 -3.5613203993227e-16,-2.46791111376204 3.35721239031346 -3.46791111376204e-16,-2.38196601125011 3.41221474770753 -3.38196601125011e-16,-2.30390380768715 3.4700807357668 -3.30390380768715e-16,-2.23410481428215 3.53052843721411 -3.23410481428215e-16,-2.1729090847148 3.5932633569242 -3.1729090847148e-16,-2.12061475842818 3.65797985667433 -3.12061475842818e-16,-2.07747660812336 3.724362644183 -3.07747660812336e-16,-2.04370479853239 3.79208830918224 -3.04370479853239e-16,-2.01946386251686 3.86082689903993 -3.01946386251686e-16,-2.00487189948035 3.93024352625587 -3.00487189948035e-16,-2 4 -3e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):19 -# EntityHandle (String) = 20D -# LINESTRING Z (-2.0 2.0 -2e-16,-1.96657794502105 2.03582232791524 -1.96657794502105e-16,-1.93571660708646 2.07387296203834 -1.93571660708646e-16,-1.90756413746468 2.11396923855471 -1.90756413746468e-16,-1.88225568337755 2.15591867344963 -1.88225568337755e-16,-1.85991273921989 2.19951988653655 -1.85991273921989e-16,-1.84064256332004 2.24456356819194 -1.84064256332004e-16,-1.8245376630414 2.29083348415575 -1.8245376630414e-16,-1.81167535069652 2.33810751357387 -1.81167535069652e-16,-1.80211737240583 2.38615871529951 -1.80211737240583e-16,-1.79590961168258 2.43475641733454 -1.79590961168258e-16,-1.79308186916688 2.48366732418105 -1.79308186916688e-16,-1.79364771956639 2.53265663678705 -1.79364771956639e-16,-1.79760444649032 2.58148917971011 -1.79760444649032e-16,-1.80493305548955 2.62993053008785 -1.80493305548955e-16,-1.81559836524041 2.67774814299566 -1.81559836524041e-16,-1.8295491764342 2.72471246778926 -1.8295491764342e-16,-1.84671851756181 2.7705980500731 -1.84671851756181e-16,-1.86702396641357 2.81518461400453 -1.86702396641357e-16,-1.89036804575079 2.85825811973811 -1.89036804575079e-16,-1.91663869124976 2.89961179093366 -1.91663869124976e-16,-1.94570978947168 2.93904710739563 -1.94570978947168e-16,-1.97744178327594 2.97637475807832 -1.97744178327594e-16,-2.01168234177068 3.01141554988232 -2.01168234177068e-16,-2.04826709158413 3.04400126787917 -2.04826709158413e-16,-2.08702040594658 3.07397548283483 -2.08702040594658e-16,-2.12775624779472 3.10119430215541 -2.12775624779472e-16,-2.17027906285109 3.12552706065018 -2.17027906285109e-16,-2.2143847183914 3.14685694779575 -2.2143847183914e-16,-2.25986148319297 3.16508156849045 -2.25986148319297e-16,-2.30649104396024 3.18011343460661 -2.30649104396024e-16,-2.35404955334774 3.1918803849814 -2.35404955334774e-16,-2.40230870454951 3.20032593182975 -2.40230870454951e-16,-2.45103682729644 3.2054095319166 -2.45103682729644e-16,-2.5 3.20710678118655 -2.5e-16,-2.54896317270356 3.2054095319166 -2.54896317270356e-16,-2.59769129545049 3.20032593182975 -2.59769129545049e-16,-2.64595044665226 3.1918803849814 -2.64595044665226e-16,-2.69350895603976 3.18011343460661 -2.69350895603976e-16,-2.74013851680703 3.16508156849045 -2.74013851680703e-16,-2.7856152816086 3.14685694779575 -2.7856152816086e-16,-2.8297209371489 3.12552706065018 -2.8297209371489e-16,-2.87224375220528 3.10119430215541 -2.87224375220528e-16,-2.91297959405342 3.07397548283483 -2.91297959405342e-16,-2.95173290841587 3.04400126787917 -2.95173290841587e-16,-2.98831765822932 3.01141554988232 -2.98831765822932e-16,-3.02255821672406 2.97637475807832 -3.02255821672406e-16,-3.05429021052832 2.93904710739563 -3.05429021052832e-16,-3.08336130875024 2.89961179093367 -3.08336130875024e-16,-3.10963195424921 2.85825811973811 -3.10963195424921e-16,-3.13297603358643 2.81518461400453 -3.13297603358643e-16,-3.15328148243819 2.7705980500731 -3.15328148243819e-16,-3.1704508235658 2.72471246778926 -3.1704508235658e-16,-3.18440163475959 2.67774814299567 -3.18440163475959e-16,-3.19506694451045 2.62993053008786 -3.19506694451045e-16,-3.20239555350968 2.58148917971011 -3.20239555350968e-16,-3.20635228043361 2.53265663678705 -3.20635228043361e-16,-3.20691813083312 2.48366732418105 -3.20691813083312e-16,-3.20409038831742 2.43475641733454 -3.20409038831742e-16,-3.19788262759417 2.38615871529951 -3.19788262759417e-16,-3.18832464930348 2.33810751357387 -3.18832464930349e-16,-3.1754623369586 2.29083348415575 -3.1754623369586e-16,-3.15935743667996 2.24456356819194 -3.15935743667996e-16,-3.14008726078011 2.19951988653655 -3.14008726078011e-16,-3.11774431662245 2.15591867344963 -3.11774431662245e-16,-3.09243586253532 2.11396923855472 -3.09243586253532e-16,-3.06428339291354 2.07387296203834 -3.06428339291354e-16,-3.03342205497895 2.03582232791524 -3.03342205497895e-16,-3 2 -3e-16) + # OGRFeature(entities):19 + # EntityHandle (String) = 20D + # LINESTRING Z (-2.0 2.0 -2e-16,-1.96657794502105 2.03582232791524 -1.96657794502105e-16,-1.93571660708646 2.07387296203834 -1.93571660708646e-16,-1.90756413746468 2.11396923855471 -1.90756413746468e-16,-1.88225568337755 2.15591867344963 -1.88225568337755e-16,-1.85991273921989 2.19951988653655 -1.85991273921989e-16,-1.84064256332004 2.24456356819194 -1.84064256332004e-16,-1.8245376630414 2.29083348415575 -1.8245376630414e-16,-1.81167535069652 2.33810751357387 -1.81167535069652e-16,-1.80211737240583 2.38615871529951 -1.80211737240583e-16,-1.79590961168258 2.43475641733454 -1.79590961168258e-16,-1.79308186916688 2.48366732418105 -1.79308186916688e-16,-1.79364771956639 2.53265663678705 -1.79364771956639e-16,-1.79760444649032 2.58148917971011 -1.79760444649032e-16,-1.80493305548955 2.62993053008785 -1.80493305548955e-16,-1.81559836524041 2.67774814299566 -1.81559836524041e-16,-1.8295491764342 2.72471246778926 -1.8295491764342e-16,-1.84671851756181 2.7705980500731 -1.84671851756181e-16,-1.86702396641357 2.81518461400453 -1.86702396641357e-16,-1.89036804575079 2.85825811973811 -1.89036804575079e-16,-1.91663869124976 2.89961179093366 -1.91663869124976e-16,-1.94570978947168 2.93904710739563 -1.94570978947168e-16,-1.97744178327594 2.97637475807832 -1.97744178327594e-16,-2.01168234177068 3.01141554988232 -2.01168234177068e-16,-2.04826709158413 3.04400126787917 -2.04826709158413e-16,-2.08702040594658 3.07397548283483 -2.08702040594658e-16,-2.12775624779472 3.10119430215541 -2.12775624779472e-16,-2.17027906285109 3.12552706065018 -2.17027906285109e-16,-2.2143847183914 3.14685694779575 -2.2143847183914e-16,-2.25986148319297 3.16508156849045 -2.25986148319297e-16,-2.30649104396024 3.18011343460661 -2.30649104396024e-16,-2.35404955334774 3.1918803849814 -2.35404955334774e-16,-2.40230870454951 3.20032593182975 -2.40230870454951e-16,-2.45103682729644 3.2054095319166 -2.45103682729644e-16,-2.5 3.20710678118655 -2.5e-16,-2.54896317270356 3.2054095319166 -2.54896317270356e-16,-2.59769129545049 3.20032593182975 -2.59769129545049e-16,-2.64595044665226 3.1918803849814 -2.64595044665226e-16,-2.69350895603976 3.18011343460661 -2.69350895603976e-16,-2.74013851680703 3.16508156849045 -2.74013851680703e-16,-2.7856152816086 3.14685694779575 -2.7856152816086e-16,-2.8297209371489 3.12552706065018 -2.8297209371489e-16,-2.87224375220528 3.10119430215541 -2.87224375220528e-16,-2.91297959405342 3.07397548283483 -2.91297959405342e-16,-2.95173290841587 3.04400126787917 -2.95173290841587e-16,-2.98831765822932 3.01141554988232 -2.98831765822932e-16,-3.02255821672406 2.97637475807832 -3.02255821672406e-16,-3.05429021052832 2.93904710739563 -3.05429021052832e-16,-3.08336130875024 2.89961179093367 -3.08336130875024e-16,-3.10963195424921 2.85825811973811 -3.10963195424921e-16,-3.13297603358643 2.81518461400453 -3.13297603358643e-16,-3.15328148243819 2.7705980500731 -3.15328148243819e-16,-3.1704508235658 2.72471246778926 -3.1704508235658e-16,-3.18440163475959 2.67774814299567 -3.18440163475959e-16,-3.19506694451045 2.62993053008786 -3.19506694451045e-16,-3.20239555350968 2.58148917971011 -3.20239555350968e-16,-3.20635228043361 2.53265663678705 -3.20635228043361e-16,-3.20691813083312 2.48366732418105 -3.20691813083312e-16,-3.20409038831742 2.43475641733454 -3.20409038831742e-16,-3.19788262759417 2.38615871529951 -3.19788262759417e-16,-3.18832464930348 2.33810751357387 -3.18832464930349e-16,-3.1754623369586 2.29083348415575 -3.1754623369586e-16,-3.15935743667996 2.24456356819194 -3.15935743667996e-16,-3.14008726078011 2.19951988653655 -3.14008726078011e-16,-3.11774431662245 2.15591867344963 -3.11774431662245e-16,-3.09243586253532 2.11396923855472 -3.09243586253532e-16,-3.06428339291354 2.07387296203834 -3.06428339291354e-16,-3.03342205497895 2.03582232791524 -3.03342205497895e-16,-3 2 -3e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2.0 2.0 -2e-16,-1.96657794502105 2.03582232791524 -1.96657794502105e-16,-1.93571660708646 2.07387296203834 -1.93571660708646e-16,-1.90756413746468 2.11396923855471 -1.90756413746468e-16,-1.88225568337755 2.15591867344963 -1.88225568337755e-16,-1.85991273921989 2.19951988653655 -1.85991273921989e-16,-1.84064256332004 2.24456356819194 -1.84064256332004e-16,-1.8245376630414 2.29083348415575 -1.8245376630414e-16,-1.81167535069652 2.33810751357387 -1.81167535069652e-16,-1.80211737240583 2.38615871529951 -1.80211737240583e-16,-1.79590961168258 2.43475641733454 -1.79590961168258e-16,-1.79308186916688 2.48366732418105 -1.79308186916688e-16,-1.79364771956639 2.53265663678705 -1.79364771956639e-16,-1.79760444649032 2.58148917971011 -1.79760444649032e-16,-1.80493305548955 2.62993053008785 -1.80493305548955e-16,-1.81559836524041 2.67774814299566 -1.81559836524041e-16,-1.8295491764342 2.72471246778926 -1.8295491764342e-16,-1.84671851756181 2.7705980500731 -1.84671851756181e-16,-1.86702396641357 2.81518461400453 -1.86702396641357e-16,-1.89036804575079 2.85825811973811 -1.89036804575079e-16,-1.91663869124976 2.89961179093366 -1.91663869124976e-16,-1.94570978947168 2.93904710739563 -1.94570978947168e-16,-1.97744178327594 2.97637475807832 -1.97744178327594e-16,-2.01168234177068 3.01141554988232 -2.01168234177068e-16,-2.04826709158413 3.04400126787917 -2.04826709158413e-16,-2.08702040594658 3.07397548283483 -2.08702040594658e-16,-2.12775624779472 3.10119430215541 -2.12775624779472e-16,-2.17027906285109 3.12552706065018 -2.17027906285109e-16,-2.2143847183914 3.14685694779575 -2.2143847183914e-16,-2.25986148319297 3.16508156849045 -2.25986148319297e-16,-2.30649104396024 3.18011343460661 -2.30649104396024e-16,-2.35404955334774 3.1918803849814 -2.35404955334774e-16,-2.40230870454951 3.20032593182975 -2.40230870454951e-16,-2.45103682729644 3.2054095319166 -2.45103682729644e-16,' + - '-2.5 3.20710678118655 -2.5e-16,-2.54896317270356 3.2054095319166 -2.54896317270356e-16,-2.59769129545049 3.20032593182975 -2.59769129545049e-16,-2.64595044665226 3.1918803849814 -2.64595044665226e-16,-2.69350895603976 3.18011343460661 -2.69350895603976e-16,-2.74013851680703 3.16508156849045 -2.74013851680703e-16,-2.7856152816086 3.14685694779575 -2.7856152816086e-16,-2.8297209371489 3.12552706065018 -2.8297209371489e-16,-2.87224375220528 3.10119430215541 -2.87224375220528e-16,-2.91297959405342 3.07397548283483 -2.91297959405342e-16,-2.95173290841587 3.04400126787917 -2.95173290841587e-16,-2.98831765822932 3.01141554988232 -2.98831765822932e-16,-3.02255821672406 2.97637475807832 -3.02255821672406e-16,-3.05429021052832 2.93904710739563 -3.05429021052832e-16,-3.08336130875024 2.89961179093367 -3.08336130875024e-16,-3.10963195424921 2.85825811973811 -3.10963195424921e-16,-3.13297603358643 2.81518461400453 -3.13297603358643e-16,-3.15328148243819 2.7705980500731 -3.15328148243819e-16,-3.1704508235658 2.72471246778926 -3.1704508235658e-16,-3.18440163475959 2.67774814299567 -3.18440163475959e-16,-3.19506694451045 2.62993053008786 -3.19506694451045e-16,-3.20239555350968 2.58148917971011 -3.20239555350968e-16,-3.20635228043361 2.53265663678705 -3.20635228043361e-16,-3.20691813083312 2.48366732418105 -3.20691813083312e-16,-3.20409038831742 2.43475641733454 -3.20409038831742e-16,-3.19788262759417 2.38615871529951 -3.19788262759417e-16,-3.18832464930348 2.33810751357387 -3.18832464930349e-16,-3.1754623369586 2.29083348415575 -3.1754623369586e-16,-3.15935743667996 2.24456356819194 -3.15935743667996e-16,-3.14008726078011 2.19951988653655 -3.14008726078011e-16,-3.11774431662245 2.15591867344963 -3.11774431662245e-16,-3.09243586253532 2.11396923855472 -3.09243586253532e-16,-3.06428339291354 2.07387296203834 -3.06428339291354e-16,-3.03342205497895 2.03582232791524 -3.03342205497895e-16,-3 2 -3e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2.0 2.0 -2e-16,-1.96657794502105 2.03582232791524 -1.96657794502105e-16,-1.93571660708646 2.07387296203834 -1.93571660708646e-16,-1.90756413746468 2.11396923855471 -1.90756413746468e-16,-1.88225568337755 2.15591867344963 -1.88225568337755e-16,-1.85991273921989 2.19951988653655 -1.85991273921989e-16,-1.84064256332004 2.24456356819194 -1.84064256332004e-16,-1.8245376630414 2.29083348415575 -1.8245376630414e-16,-1.81167535069652 2.33810751357387 -1.81167535069652e-16,-1.80211737240583 2.38615871529951 -1.80211737240583e-16,-1.79590961168258 2.43475641733454 -1.79590961168258e-16,-1.79308186916688 2.48366732418105 -1.79308186916688e-16,-1.79364771956639 2.53265663678705 -1.79364771956639e-16,-1.79760444649032 2.58148917971011 -1.79760444649032e-16,-1.80493305548955 2.62993053008785 -1.80493305548955e-16,-1.81559836524041 2.67774814299566 -1.81559836524041e-16,-1.8295491764342 2.72471246778926 -1.8295491764342e-16,-1.84671851756181 2.7705980500731 -1.84671851756181e-16,-1.86702396641357 2.81518461400453 -1.86702396641357e-16,-1.89036804575079 2.85825811973811 -1.89036804575079e-16,-1.91663869124976 2.89961179093366 -1.91663869124976e-16,-1.94570978947168 2.93904710739563 -1.94570978947168e-16,-1.97744178327594 2.97637475807832 -1.97744178327594e-16,-2.01168234177068 3.01141554988232 -2.01168234177068e-16,-2.04826709158413 3.04400126787917 -2.04826709158413e-16,-2.08702040594658 3.07397548283483 -2.08702040594658e-16,-2.12775624779472 3.10119430215541 -2.12775624779472e-16,-2.17027906285109 3.12552706065018 -2.17027906285109e-16,-2.2143847183914 3.14685694779575 -2.2143847183914e-16,-2.25986148319297 3.16508156849045 -2.25986148319297e-16,-2.30649104396024 3.18011343460661 -2.30649104396024e-16,-2.35404955334774 3.1918803849814 -2.35404955334774e-16,-2.40230870454951 3.20032593182975 -2.40230870454951e-16,-2.45103682729644 3.2054095319166 -2.45103682729644e-16," + + "-2.5 3.20710678118655 -2.5e-16,-2.54896317270356 3.2054095319166 -2.54896317270356e-16,-2.59769129545049 3.20032593182975 -2.59769129545049e-16,-2.64595044665226 3.1918803849814 -2.64595044665226e-16,-2.69350895603976 3.18011343460661 -2.69350895603976e-16,-2.74013851680703 3.16508156849045 -2.74013851680703e-16,-2.7856152816086 3.14685694779575 -2.7856152816086e-16,-2.8297209371489 3.12552706065018 -2.8297209371489e-16,-2.87224375220528 3.10119430215541 -2.87224375220528e-16,-2.91297959405342 3.07397548283483 -2.91297959405342e-16,-2.95173290841587 3.04400126787917 -2.95173290841587e-16,-2.98831765822932 3.01141554988232 -2.98831765822932e-16,-3.02255821672406 2.97637475807832 -3.02255821672406e-16,-3.05429021052832 2.93904710739563 -3.05429021052832e-16,-3.08336130875024 2.89961179093367 -3.08336130875024e-16,-3.10963195424921 2.85825811973811 -3.10963195424921e-16,-3.13297603358643 2.81518461400453 -3.13297603358643e-16,-3.15328148243819 2.7705980500731 -3.15328148243819e-16,-3.1704508235658 2.72471246778926 -3.1704508235658e-16,-3.18440163475959 2.67774814299567 -3.18440163475959e-16,-3.19506694451045 2.62993053008786 -3.19506694451045e-16,-3.20239555350968 2.58148917971011 -3.20239555350968e-16,-3.20635228043361 2.53265663678705 -3.20635228043361e-16,-3.20691813083312 2.48366732418105 -3.20691813083312e-16,-3.20409038831742 2.43475641733454 -3.20409038831742e-16,-3.19788262759417 2.38615871529951 -3.19788262759417e-16,-3.18832464930348 2.33810751357387 -3.18832464930349e-16,-3.1754623369586 2.29083348415575 -3.1754623369586e-16,-3.15935743667996 2.24456356819194 -3.15935743667996e-16,-3.14008726078011 2.19951988653655 -3.14008726078011e-16,-3.11774431662245 2.15591867344963 -3.11774431662245e-16,-3.09243586253532 2.11396923855472 -3.09243586253532e-16,-3.06428339291354 2.07387296203834 -3.06428339291354e-16,-3.03342205497895 2.03582232791524 -3.03342205497895e-16,-3 2 -3e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):20 -# EntityHandle (String) = 20E -# POLYGON Z ((-1 2 -1e-16,-1 3 -1e-16,-2 3 -2e-16,-2 2 -2e-16,-1 2 -1e-16)) + # OGRFeature(entities):20 + # EntityHandle (String) = 20E + # POLYGON Z ((-1 2 -1e-16,-1 3 -1e-16,-2 3 -2e-16,-2 2 -2e-16,-1 2 -1e-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-1 2 -1e-16,-1 3 -1e-16,-2 3 -2e-16,-2 2 -2e-16,-1 2 -1e-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-1 2 -1e-16,-1 3 -1e-16,-2 3 -2e-16,-2 2 -2e-16,-1 2 -1e-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):21 -# EntityHandle (String) = 20F -# POLYGON Z ((-3 4 -3E-16,-4 4 -4E-16,-4 3 -4E-16,-3 3 -3E-16,-3 4 -3E-16)) + # OGRFeature(entities):21 + # EntityHandle (String) = 20F + # POLYGON Z ((-3 4 -3E-16,-4 4 -4E-16,-4 3 -4E-16,-3 3 -3E-16,-3 4 -3E-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-3 4 -3E-16,-4 4 -4E-16,-4 3 -4E-16,-3 3 -3E-16,-3 4 -3E-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-3 4 -3E-16,-4 4 -4E-16,-4 3 -4E-16,-3 3 -3E-16,-3 4 -3E-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):22 -# EntityHandle (String) = 211 -# POLYGON Z ((-8 8 -8E-16,-9 8 -9E-16,-9 9 -9E-16,-8 9 -8E-16,-8 8 -8E-16)) + # OGRFeature(entities):22 + # EntityHandle (String) = 211 + # POLYGON Z ((-8 8 -8E-16,-9 8 -9E-16,-9 9 -9E-16,-8 9 -8E-16,-8 8 -8E-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-8 8 -8E-16,-9 8 -9E-16,-9 9 -9E-16,-8 9 -8E-16,-8 8 -8E-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-8 8 -8E-16,-9 8 -9E-16,-9 9 -9E-16,-8 9 -8E-16,-8 8 -8E-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):23 -# EntityHandle (String) = 212 -# LINESTRING (-2 2,-2.15384615384615 2.15384615384615,-2.30769230769231 2.30769230769231,-2.46153846153846 2.46153846153846,-2.61538461538461 2.61538461538461,-2.76923076923077 2.76923076923077,-2.92307692307692 2.92307692307692,-3.07692307692308 3.07692307692308,-3.23076923076923 3.23076923076923,-3.38461538461538 3.38461538461538,-3.53846153846154 3.53846153846154,-3.69230769230769 3.69230769230769,-3.84615384615385 3.84615384615385,-4 4,-4.15384615384615 4.15384615384615,-4.30769230769231 4.30769230769231,-4.46153846153846 4.46153846153846,-4.61538461538462 4.61538461538462,-4.76923076923077 4.76923076923077,-4.92307692307692 4.92307692307692,-5.07692307692308 5.07692307692308,-5.23076923076923 5.23076923076923,-5.38461538461538 5.38461538461538,-5.53846153846154 5.53846153846154,-5.69230769230769 5.69230769230769,-5.84615384615385 5.84615384615385,-6.0 6.0,-6.15384615384615 6.15384615384615,-6.30769230769231 6.30769230769231,-6.46153846153846 6.46153846153846,-6.61538461538462 6.61538461538462,-6.76923076923077 6.76923076923077,-6.92307692307692 6.92307692307692,-7.07692307692308 7.07692307692308,-7.23076923076923 7.23076923076923,-7.38461538461539 7.38461538461539,-7.53846153846154 7.53846153846154,-7.69230769230769 7.69230769230769,-7.84615384615385 7.84615384615385,-8 8) + # OGRFeature(entities):23 + # EntityHandle (String) = 212 + # LINESTRING (-2 2,-2.15384615384615 2.15384615384615,-2.30769230769231 2.30769230769231,-2.46153846153846 2.46153846153846,-2.61538461538461 2.61538461538461,-2.76923076923077 2.76923076923077,-2.92307692307692 2.92307692307692,-3.07692307692308 3.07692307692308,-3.23076923076923 3.23076923076923,-3.38461538461538 3.38461538461538,-3.53846153846154 3.53846153846154,-3.69230769230769 3.69230769230769,-3.84615384615385 3.84615384615385,-4 4,-4.15384615384615 4.15384615384615,-4.30769230769231 4.30769230769231,-4.46153846153846 4.46153846153846,-4.61538461538462 4.61538461538462,-4.76923076923077 4.76923076923077,-4.92307692307692 4.92307692307692,-5.07692307692308 5.07692307692308,-5.23076923076923 5.23076923076923,-5.38461538461538 5.38461538461538,-5.53846153846154 5.53846153846154,-5.69230769230769 5.69230769230769,-5.84615384615385 5.84615384615385,-6.0 6.0,-6.15384615384615 6.15384615384615,-6.30769230769231 6.30769230769231,-6.46153846153846 6.46153846153846,-6.61538461538462 6.61538461538462,-6.76923076923077 6.76923076923077,-6.92307692307692 6.92307692307692,-7.07692307692308 7.07692307692308,-7.23076923076923 7.23076923076923,-7.38461538461539 7.38461538461539,-7.53846153846154 7.53846153846154,-7.69230769230769 7.69230769230769,-7.84615384615385 7.84615384615385,-8 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-2 2,-2.15384615384615 2.15384615384615,-2.30769230769231 2.30769230769231,-2.46153846153846 2.46153846153846,-2.61538461538461 2.61538461538461,-2.76923076923077 2.76923076923077,-2.92307692307692 2.92307692307692,-3.07692307692308 3.07692307692308,-3.23076923076923 3.23076923076923,-3.38461538461538 3.38461538461538,-3.53846153846154 3.53846153846154,-3.69230769230769 3.69230769230769,-3.84615384615385 3.84615384615385,-4 4,-4.15384615384615 4.15384615384615,-4.30769230769231 4.30769230769231,-4.46153846153846 4.46153846153846,-4.61538461538462 4.61538461538462,-4.76923076923077 4.76923076923077,-4.92307692307692 4.92307692307692,-5.07692307692308 5.07692307692308,-5.23076923076923 5.23076923076923,-5.38461538461538 5.38461538461538,-5.53846153846154 5.53846153846154,-5.69230769230769 5.69230769230769,-5.84615384615385 5.84615384615385,-6.0 6.0,-6.15384615384615 6.15384615384615,-6.30769230769231 6.30769230769231,-6.46153846153846 6.46153846153846,-6.61538461538462 6.61538461538462,-6.76923076923077 6.76923076923077,-6.92307692307692 6.92307692307692,-7.07692307692308 7.07692307692308,-7.23076923076923 7.23076923076923,-7.38461538461539 7.38461538461539,-7.53846153846154 7.53846153846154,-7.69230769230769 7.69230769230769,-7.84615384615385 7.84615384615385,-8 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-2 2,-2.15384615384615 2.15384615384615,-2.30769230769231 2.30769230769231,-2.46153846153846 2.46153846153846,-2.61538461538461 2.61538461538461,-2.76923076923077 2.76923076923077,-2.92307692307692 2.92307692307692,-3.07692307692308 3.07692307692308,-3.23076923076923 3.23076923076923,-3.38461538461538 3.38461538461538,-3.53846153846154 3.53846153846154,-3.69230769230769 3.69230769230769,-3.84615384615385 3.84615384615385,-4 4,-4.15384615384615 4.15384615384615,-4.30769230769231 4.30769230769231,-4.46153846153846 4.46153846153846,-4.61538461538462 4.61538461538462,-4.76923076923077 4.76923076923077,-4.92307692307692 4.92307692307692,-5.07692307692308 5.07692307692308,-5.23076923076923 5.23076923076923,-5.38461538461538 5.38461538461538,-5.53846153846154 5.53846153846154,-5.69230769230769 5.69230769230769,-5.84615384615385 5.84615384615385,-6.0 6.0,-6.15384615384615 6.15384615384615,-6.30769230769231 6.30769230769231,-6.46153846153846 6.46153846153846,-6.61538461538462 6.61538461538462,-6.76923076923077 6.76923076923077,-6.92307692307692 6.92307692307692,-7.07692307692308 7.07692307692308,-7.23076923076923 7.23076923076923,-7.38461538461539 7.38461538461539,-7.53846153846154 7.53846153846154,-7.69230769230769 7.69230769230769,-7.84615384615385 7.84615384615385,-8 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):24 -# EntityHandle (String) = 213 -# LINESTRING (-8 1,-7.62837370825536 0.987348067229724,-7.25775889681215 0.975707614760869,-6.88916704597178 0.966090122894857,-6.52360963603567 0.959507071933107,-6.16209814730525 0.956969942177043,-5.80564406008193 0.959490213928084,-5.45525885466714 0.968079367487651,-5.11195401136229 0.983748883157167,-4.77674101046882 1.00751024123805,-4.45063133228814 1.04037492203173,-4.13463645712167 1.08335440583961,-3.82976786527082 1.13746017296313,-3.53703703703704 1.2037037037037,-3.25745545272173 1.28309647836275,-2.99203459262631 1.37664997724169,-2.74178593705221 1.48537568064195,-2.50772096630085 1.61028506886495,-2.29085116067365 1.75238962221211,-2.09218800047203 1.91270082098484,-1.91270082098485 2.09218800047202,-1.75238962221211 2.29085116067364,-1.61028506886495 2.50772096630085,-1.48537568064195 2.74178593705221,-1.37664997724169 2.99203459262631,-1.28309647836275 3.25745545272172,-1.2037037037037 3.53703703703703,-1.13746017296313 3.82976786527082,-1.08335440583961 4.13463645712166,-1.04037492203173 4.45063133228814,-1.00751024123805 4.77674101046882,-0.983748883157167 5.11195401136229,-0.968079367487652 5.45525885466714,-0.959490213928084 5.80564406008193,-0.956969942177043 6.16209814730525,-0.959507071933108 6.52360963603567,-0.966090122894857 6.88916704597178,-0.975707614760869 7.25775889681216,-0.987348067229724 7.62837370825537,-1 8) + # OGRFeature(entities):24 + # EntityHandle (String) = 213 + # LINESTRING (-8 1,-7.62837370825536 0.987348067229724,-7.25775889681215 0.975707614760869,-6.88916704597178 0.966090122894857,-6.52360963603567 0.959507071933107,-6.16209814730525 0.956969942177043,-5.80564406008193 0.959490213928084,-5.45525885466714 0.968079367487651,-5.11195401136229 0.983748883157167,-4.77674101046882 1.00751024123805,-4.45063133228814 1.04037492203173,-4.13463645712167 1.08335440583961,-3.82976786527082 1.13746017296313,-3.53703703703704 1.2037037037037,-3.25745545272173 1.28309647836275,-2.99203459262631 1.37664997724169,-2.74178593705221 1.48537568064195,-2.50772096630085 1.61028506886495,-2.29085116067365 1.75238962221211,-2.09218800047203 1.91270082098484,-1.91270082098485 2.09218800047202,-1.75238962221211 2.29085116067364,-1.61028506886495 2.50772096630085,-1.48537568064195 2.74178593705221,-1.37664997724169 2.99203459262631,-1.28309647836275 3.25745545272172,-1.2037037037037 3.53703703703703,-1.13746017296313 3.82976786527082,-1.08335440583961 4.13463645712166,-1.04037492203173 4.45063133228814,-1.00751024123805 4.77674101046882,-0.983748883157167 5.11195401136229,-0.968079367487652 5.45525885466714,-0.959490213928084 5.80564406008193,-0.956969942177043 6.16209814730525,-0.959507071933108 6.52360963603567,-0.966090122894857 6.88916704597178,-0.975707614760869 7.25775889681216,-0.987348067229724 7.62837370825537,-1 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-8 1,-7.62837370825536 0.987348067229724,-7.25775889681215 0.975707614760869,-6.88916704597178 0.966090122894857,-6.52360963603567 0.959507071933107,-6.16209814730525 0.956969942177043,-5.80564406008193 0.959490213928084,-5.45525885466714 0.968079367487651,-5.11195401136229 0.983748883157167,-4.77674101046882 1.00751024123805,-4.45063133228814 1.04037492203173,-4.13463645712167 1.08335440583961,-3.82976786527082 1.13746017296313,-3.53703703703704 1.2037037037037,-3.25745545272173 1.28309647836275,-2.99203459262631 1.37664997724169,-2.74178593705221 1.48537568064195,-2.50772096630085 1.61028506886495,-2.29085116067365 1.75238962221211,-2.09218800047203 1.91270082098484,-1.91270082098485 2.09218800047202,-1.75238962221211 2.29085116067364,-1.61028506886495 2.50772096630085,-1.48537568064195 2.74178593705221,-1.37664997724169 2.99203459262631,-1.28309647836275 3.25745545272172,-1.2037037037037 3.53703703703703,-1.13746017296313 3.82976786527082,-1.08335440583961 4.13463645712166,-1.04037492203173 4.45063133228814,-1.00751024123805 4.77674101046882,-0.983748883157167 5.11195401136229,-0.968079367487652 5.45525885466714,-0.959490213928084 5.80564406008193,-0.956969942177043 6.16209814730525,-0.959507071933108 6.52360963603567,-0.966090122894857 6.88916704597178,-0.975707614760869 7.25775889681216,-0.987348067229724 7.62837370825537,-1 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-8 1,-7.62837370825536 0.987348067229724,-7.25775889681215 0.975707614760869,-6.88916704597178 0.966090122894857,-6.52360963603567 0.959507071933107,-6.16209814730525 0.956969942177043,-5.80564406008193 0.959490213928084,-5.45525885466714 0.968079367487651,-5.11195401136229 0.983748883157167,-4.77674101046882 1.00751024123805,-4.45063133228814 1.04037492203173,-4.13463645712167 1.08335440583961,-3.82976786527082 1.13746017296313,-3.53703703703704 1.2037037037037,-3.25745545272173 1.28309647836275,-2.99203459262631 1.37664997724169,-2.74178593705221 1.48537568064195,-2.50772096630085 1.61028506886495,-2.29085116067365 1.75238962221211,-2.09218800047203 1.91270082098484,-1.91270082098485 2.09218800047202,-1.75238962221211 2.29085116067364,-1.61028506886495 2.50772096630085,-1.48537568064195 2.74178593705221,-1.37664997724169 2.99203459262631,-1.28309647836275 3.25745545272172,-1.2037037037037 3.53703703703703,-1.13746017296313 3.82976786527082,-1.08335440583961 4.13463645712166,-1.04037492203173 4.45063133228814,-1.00751024123805 4.77674101046882,-0.983748883157167 5.11195401136229,-0.968079367487652 5.45525885466714,-0.959490213928084 5.80564406008193,-0.956969942177043 6.16209814730525,-0.959507071933108 6.52360963603567,-0.966090122894857 6.88916704597178,-0.975707614760869 7.25775889681216,-0.987348067229724 7.62837370825537,-1 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):25 -# EntityHandle (String) = 214 -# POINT Z (-7 7 -7e-16) + # OGRFeature(entities):25 + # EntityHandle (String) = 214 + # POINT Z (-7 7 -7e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-7 7 -7e-16)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-7 7 -7e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):26 -# EntityHandle (String) = 215 -# POINT Z (-4 -4 -1e-15) + # OGRFeature(entities):26 + # EntityHandle (String) = 215 + # POINT Z (-4 -4 -1e-15) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-4 -4 -1e-15)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-4 -4 -1e-15)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):27 -# EntityHandle (String) = 216 -# LINESTRING Z (0 0 -2e-16,-1 -1 -5e-16) + # OGRFeature(entities):27 + # EntityHandle (String) = 216 + # LINESTRING Z (0 0 -2e-16,-1 -1 -5e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 -2e-16,-1 -1 -5e-16)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (0 0 -2e-16,-1 -1 -5e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):28 -# EntityHandle (String) = 217 -# LINESTRING (-1 -1,-2 -1,-1 -2,-1 -1) + # OGRFeature(entities):28 + # EntityHandle (String) = 217 + # LINESTRING (-1 -1,-2 -1,-1 -2,-1 -1) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-1 -1,-2 -1,-1 -2,-1 -1)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING (-1 -1,-2 -1,-1 -2,-1 -1)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):29 -# EntityHandle (String) = 218 -# LINESTRING Z (-1 -1 -2e-16,-1 -2 -4e-16,-2 -2 -5e-16,-1 -1 -2e-16) + # OGRFeature(entities):29 + # EntityHandle (String) = 218 + # LINESTRING Z (-1 -1 -2e-16,-1 -2 -4e-16,-2 -2 -5e-16,-1 -1 -2e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1 -1 -2e-16,-1 -2 -4e-16,-2 -2 -5e-16,-1 -1 -2e-16)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-1 -1 -2e-16,-1 -2 -4e-16,-2 -2 -5e-16,-1 -1 -2e-16)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):30 -# EntityHandle (String) = 21D -# LINESTRING Z (-2 -4 0,-2.00487189948035 -4.13951294748825 0,-2.01946386251686 -4.27834620192013 0,-2.04370479853239 -4.41582338163552 0,-2.07747660812336 -4.551274711634 0,-2.12061475842818 -4.68404028665134 0,-2.1729090847148 -4.8134732861516 0,-2.23410481428215 -4.93894312557178 0,-2.30390380768715 -5.05983852846641 0,-2.38196601125011 -5.17557050458495 0,-2.46791111376204 -5.28557521937308 0,-2.5613203993227 -5.38931674091799 0,-2.66173878728228 -5.48628965095479 0,-2.76867704934868 -5.57602150721344 0,-2.88161419305851 -5.65807514511008 0,-3.0 -5.73205080756888 0,-3.12325770642185 -5.79758809259833 0,-3.25078681316818 -5.85436770913357 0,-3.38196601125011 -5.90211303259031 0,-3.51615620880066 -5.94059145255199 0,-3.65270364466614 -5.96961550602442 0,-3.79094307346469 -5.98904379073655 0,-3.930201006595 -5.99878165403819 0,-4.069798993405 -5.99878165403819 0,-4.20905692653531 -5.98904379073655 0,-4.34729635533386 -5.96961550602442 0,-4.48384379119934 -5.94059145255199 0,-4.61803398874989 -5.90211303259031 0,-4.74921318683182 -5.85436770913357 0,-4.87674229357815 -5.79758809259833 0,-5.0 -5.73205080756888 0,-5.11838580694149 -5.65807514511008 0,-5.23132295065132 -5.57602150721344 0,-5.33826121271772 -5.48628965095479 0,-5.4386796006773 -5.38931674091799 0,-5.53208888623796 -5.28557521937308 0,-5.61803398874989 -5.17557050458495 0,-5.69609619231285 -5.05983852846641 0,-5.76589518571785 -4.93894312557178 0,-5.8270909152852 -4.8134732861516 0,-5.87938524157182 -4.68404028665134 0,-5.92252339187664 -4.551274711634 0,-5.95629520146761 -4.41582338163552 0,-5.98053613748314 -4.27834620192013 0,-5.99512810051965 -4.13951294748825 0,-6 -4 0,-5.99512810051965 -3.86048705251175 0,-5.98053613748314 -3.72165379807987 0,-5.95629520146761 -3.58417661836448 0,-5.92252339187664 -3.448725288366 0,-5.87938524157182 -3.31595971334866 0,-5.8270909152852 -3.1865267138484 0,-5.76589518571785 -3.06105687442822 0,-5.69609619231285 -2.94016147153359 0,-5.61803398874989 -2.82442949541505 0,-5.53208888623796 -2.71442478062692 0,-5.4386796006773 -2.61068325908201 0,-5.33826121271772 -2.51371034904521 0,-5.23132295065132 -2.42397849278656 0,-5.11838580694149 -2.34192485488992 0,-5.0 -2.26794919243112 0,-4.87674229357816 -2.20241190740167 0,-4.74921318683182 -2.14563229086643 0,-4.61803398874989 -2.09788696740969 0,-4.48384379119934 -2.05940854744801 0,-4.34729635533386 -2.03038449397558 0,-4.20905692653531 -2.01095620926345 0,-4.069798993405 -2.00121834596181 0,-3.930201006595 -2.00121834596181 0,-3.79094307346469 -2.01095620926345 0,-3.65270364466614 -2.03038449397558 0,-3.51615620880067 -2.05940854744801 0,-3.38196601125011 -2.09788696740969 0,-3.25078681316818 -2.14563229086643 0,-3.12325770642185 -2.20241190740167 0,-3.0 -2.26794919243112 0,-2.88161419305851 -2.34192485488992 0,-2.76867704934868 -2.42397849278656 0,-2.66173878728228 -2.51371034904521 0,-2.5613203993227 -2.610683259082 0,-2.46791111376204 -2.71442478062692 0,-2.38196601125011 -2.82442949541505 0,-2.30390380768715 -2.94016147153359 0,-2.23410481428215 -3.06105687442822 0,-2.1729090847148 -3.1865267138484 0,-2.12061475842818 -3.31595971334866 0,-2.07747660812336 -3.448725288366 0,-2.04370479853239 -3.58417661836448 0,-2.01946386251686 -3.72165379807987 0,-2.00487189948035 -3.86048705251175 0,-2.0 -4.0 0) + # OGRFeature(entities):30 + # EntityHandle (String) = 21D + # LINESTRING Z (-2 -4 0,-2.00487189948035 -4.13951294748825 0,-2.01946386251686 -4.27834620192013 0,-2.04370479853239 -4.41582338163552 0,-2.07747660812336 -4.551274711634 0,-2.12061475842818 -4.68404028665134 0,-2.1729090847148 -4.8134732861516 0,-2.23410481428215 -4.93894312557178 0,-2.30390380768715 -5.05983852846641 0,-2.38196601125011 -5.17557050458495 0,-2.46791111376204 -5.28557521937308 0,-2.5613203993227 -5.38931674091799 0,-2.66173878728228 -5.48628965095479 0,-2.76867704934868 -5.57602150721344 0,-2.88161419305851 -5.65807514511008 0,-3.0 -5.73205080756888 0,-3.12325770642185 -5.79758809259833 0,-3.25078681316818 -5.85436770913357 0,-3.38196601125011 -5.90211303259031 0,-3.51615620880066 -5.94059145255199 0,-3.65270364466614 -5.96961550602442 0,-3.79094307346469 -5.98904379073655 0,-3.930201006595 -5.99878165403819 0,-4.069798993405 -5.99878165403819 0,-4.20905692653531 -5.98904379073655 0,-4.34729635533386 -5.96961550602442 0,-4.48384379119934 -5.94059145255199 0,-4.61803398874989 -5.90211303259031 0,-4.74921318683182 -5.85436770913357 0,-4.87674229357815 -5.79758809259833 0,-5.0 -5.73205080756888 0,-5.11838580694149 -5.65807514511008 0,-5.23132295065132 -5.57602150721344 0,-5.33826121271772 -5.48628965095479 0,-5.4386796006773 -5.38931674091799 0,-5.53208888623796 -5.28557521937308 0,-5.61803398874989 -5.17557050458495 0,-5.69609619231285 -5.05983852846641 0,-5.76589518571785 -4.93894312557178 0,-5.8270909152852 -4.8134732861516 0,-5.87938524157182 -4.68404028665134 0,-5.92252339187664 -4.551274711634 0,-5.95629520146761 -4.41582338163552 0,-5.98053613748314 -4.27834620192013 0,-5.99512810051965 -4.13951294748825 0,-6 -4 0,-5.99512810051965 -3.86048705251175 0,-5.98053613748314 -3.72165379807987 0,-5.95629520146761 -3.58417661836448 0,-5.92252339187664 -3.448725288366 0,-5.87938524157182 -3.31595971334866 0,-5.8270909152852 -3.1865267138484 0,-5.76589518571785 -3.06105687442822 0,-5.69609619231285 -2.94016147153359 0,-5.61803398874989 -2.82442949541505 0,-5.53208888623796 -2.71442478062692 0,-5.4386796006773 -2.61068325908201 0,-5.33826121271772 -2.51371034904521 0,-5.23132295065132 -2.42397849278656 0,-5.11838580694149 -2.34192485488992 0,-5.0 -2.26794919243112 0,-4.87674229357816 -2.20241190740167 0,-4.74921318683182 -2.14563229086643 0,-4.61803398874989 -2.09788696740969 0,-4.48384379119934 -2.05940854744801 0,-4.34729635533386 -2.03038449397558 0,-4.20905692653531 -2.01095620926345 0,-4.069798993405 -2.00121834596181 0,-3.930201006595 -2.00121834596181 0,-3.79094307346469 -2.01095620926345 0,-3.65270364466614 -2.03038449397558 0,-3.51615620880067 -2.05940854744801 0,-3.38196601125011 -2.09788696740969 0,-3.25078681316818 -2.14563229086643 0,-3.12325770642185 -2.20241190740167 0,-3.0 -2.26794919243112 0,-2.88161419305851 -2.34192485488992 0,-2.76867704934868 -2.42397849278656 0,-2.66173878728228 -2.51371034904521 0,-2.5613203993227 -2.610683259082 0,-2.46791111376204 -2.71442478062692 0,-2.38196601125011 -2.82442949541505 0,-2.30390380768715 -2.94016147153359 0,-2.23410481428215 -3.06105687442822 0,-2.1729090847148 -3.1865267138484 0,-2.12061475842818 -3.31595971334866 0,-2.07747660812336 -3.448725288366 0,-2.04370479853239 -3.58417661836448 0,-2.01946386251686 -3.72165379807987 0,-2.00487189948035 -3.86048705251175 0,-2.0 -4.0 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2 -4 0,-2.00487189948035 -4.13951294748825 0,-2.01946386251686 -4.27834620192013 0,-2.04370479853239 -4.41582338163552 0,-2.07747660812336 -4.551274711634 0,-2.12061475842818 -4.68404028665134 0,-2.1729090847148 -4.8134732861516 0,-2.23410481428215 -4.93894312557178 0,-2.30390380768715 -5.05983852846641 0,-2.38196601125011 -5.17557050458495 0,-2.46791111376204 -5.28557521937308 0,-2.5613203993227 -5.38931674091799 0,-2.66173878728228 -5.48628965095479 0,-2.76867704934868 -5.57602150721344 0,-2.88161419305851 -5.65807514511008 0,-3.0 -5.73205080756888 0,-3.12325770642185 -5.79758809259833 0,-3.25078681316818 -5.85436770913357 0,-3.38196601125011 -5.90211303259031 0,-3.51615620880066 -5.94059145255199 0,-3.65270364466614 -5.96961550602442 0,-3.79094307346469 -5.98904379073655 0,-3.930201006595 -5.99878165403819 0,-4.069798993405 -5.99878165403819 0,-4.20905692653531 -5.98904379073655 0,-4.34729635533386 -5.96961550602442 0,-4.48384379119934 -5.94059145255199 0,-4.61803398874989 -5.90211303259031 0,-4.74921318683182 -5.85436770913357 0,-4.87674229357815 -5.79758809259833 0,-5.0 -5.73205080756888 0,-5.11838580694149 -5.65807514511008 0,-5.23132295065132 -5.57602150721344 0,-5.33826121271772 -5.48628965095479 0,-5.4386796006773 -5.38931674091799 0,-5.53208888623796 -5.28557521937308 0,-5.61803398874989 -5.17557050458495 0,-5.69609619231285 -5.05983852846641 0,-5.76589518571785 -4.93894312557178 0,-5.8270909152852 -4.8134732861516 0,-5.87938524157182 -4.68404028665134 0,-5.92252339187664 -4.551274711634 0,-5.95629520146761 -4.41582338163552 0,-5.98053613748314 -4.27834620192013 0,-5.99512810051965 -4.13951294748825 0,-6 -4 0,-5.99512810051965 -3.86048705251175 0,-5.98053613748314 -3.72165379807987 0,-5.95629520146761 -3.58417661836448 0,-5.92252339187664 -3.448725288366 0,-5.87938524157182 -3.31595971334866 0,-5.8270909152852 -3.1865267138484 0,-5.76589518571785 -3.06105687442822 0,-5.69609619231285 -2.94016147153359 0,-5.61803398874989 -2.82442949541505 0,-5.53208888623796 -2.71442478062692 0,-5.4386796006773 -2.61068325908201 0,-5.33826121271772 -2.51371034904521 0,-5.23132295065132 -2.42397849278656 0,-5.11838580694149 -2.34192485488992 0,-5.0 -2.26794919243112 0,-4.87674229357816 -2.20241190740167 0,-4.74921318683182 -2.14563229086643 0,-4.61803398874989 -2.09788696740969 0,-4.48384379119934 -2.05940854744801 0,-4.34729635533386 -2.03038449397558 0,-4.20905692653531 -2.01095620926345 0,-4.069798993405 -2.00121834596181 0,-3.930201006595 -2.00121834596181 0,-3.79094307346469 -2.01095620926345 0,-3.65270364466614 -2.03038449397558 0,-3.51615620880067 -2.05940854744801 0,-3.38196601125011 -2.09788696740969 0,-3.25078681316818 -2.14563229086643 0,-3.12325770642185 -2.20241190740167 0,-3.0 -2.26794919243112 0,-2.88161419305851 -2.34192485488992 0,-2.76867704934868 -2.42397849278656 0,-2.66173878728228 -2.51371034904521 0,-2.5613203993227 -2.610683259082 0,-2.46791111376204 -2.71442478062692 0,-2.38196601125011 -2.82442949541505 0,-2.30390380768715 -2.94016147153359 0,-2.23410481428215 -3.06105687442822 0,-2.1729090847148 -3.1865267138484 0,-2.12061475842818 -3.31595971334866 0,-2.07747660812336 -3.448725288366 0,-2.04370479853239 -3.58417661836448 0,-2.01946386251686 -3.72165379807987 0,-2.00487189948035 -3.86048705251175 0,-2.0 -4.0 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2 -4 0,-2.00487189948035 -4.13951294748825 0,-2.01946386251686 -4.27834620192013 0,-2.04370479853239 -4.41582338163552 0,-2.07747660812336 -4.551274711634 0,-2.12061475842818 -4.68404028665134 0,-2.1729090847148 -4.8134732861516 0,-2.23410481428215 -4.93894312557178 0,-2.30390380768715 -5.05983852846641 0,-2.38196601125011 -5.17557050458495 0,-2.46791111376204 -5.28557521937308 0,-2.5613203993227 -5.38931674091799 0,-2.66173878728228 -5.48628965095479 0,-2.76867704934868 -5.57602150721344 0,-2.88161419305851 -5.65807514511008 0,-3.0 -5.73205080756888 0,-3.12325770642185 -5.79758809259833 0,-3.25078681316818 -5.85436770913357 0,-3.38196601125011 -5.90211303259031 0,-3.51615620880066 -5.94059145255199 0,-3.65270364466614 -5.96961550602442 0,-3.79094307346469 -5.98904379073655 0,-3.930201006595 -5.99878165403819 0,-4.069798993405 -5.99878165403819 0,-4.20905692653531 -5.98904379073655 0,-4.34729635533386 -5.96961550602442 0,-4.48384379119934 -5.94059145255199 0,-4.61803398874989 -5.90211303259031 0,-4.74921318683182 -5.85436770913357 0,-4.87674229357815 -5.79758809259833 0,-5.0 -5.73205080756888 0,-5.11838580694149 -5.65807514511008 0,-5.23132295065132 -5.57602150721344 0,-5.33826121271772 -5.48628965095479 0,-5.4386796006773 -5.38931674091799 0,-5.53208888623796 -5.28557521937308 0,-5.61803398874989 -5.17557050458495 0,-5.69609619231285 -5.05983852846641 0,-5.76589518571785 -4.93894312557178 0,-5.8270909152852 -4.8134732861516 0,-5.87938524157182 -4.68404028665134 0,-5.92252339187664 -4.551274711634 0,-5.95629520146761 -4.41582338163552 0,-5.98053613748314 -4.27834620192013 0,-5.99512810051965 -4.13951294748825 0,-6 -4 0,-5.99512810051965 -3.86048705251175 0,-5.98053613748314 -3.72165379807987 0,-5.95629520146761 -3.58417661836448 0,-5.92252339187664 -3.448725288366 0,-5.87938524157182 -3.31595971334866 0,-5.8270909152852 -3.1865267138484 0,-5.76589518571785 -3.06105687442822 0,-5.69609619231285 -2.94016147153359 0,-5.61803398874989 -2.82442949541505 0,-5.53208888623796 -2.71442478062692 0,-5.4386796006773 -2.61068325908201 0,-5.33826121271772 -2.51371034904521 0,-5.23132295065132 -2.42397849278656 0,-5.11838580694149 -2.34192485488992 0,-5.0 -2.26794919243112 0,-4.87674229357816 -2.20241190740167 0,-4.74921318683182 -2.14563229086643 0,-4.61803398874989 -2.09788696740969 0,-4.48384379119934 -2.05940854744801 0,-4.34729635533386 -2.03038449397558 0,-4.20905692653531 -2.01095620926345 0,-4.069798993405 -2.00121834596181 0,-3.930201006595 -2.00121834596181 0,-3.79094307346469 -2.01095620926345 0,-3.65270364466614 -2.03038449397558 0,-3.51615620880067 -2.05940854744801 0,-3.38196601125011 -2.09788696740969 0,-3.25078681316818 -2.14563229086643 0,-3.12325770642185 -2.20241190740167 0,-3.0 -2.26794919243112 0,-2.88161419305851 -2.34192485488992 0,-2.76867704934868 -2.42397849278656 0,-2.66173878728228 -2.51371034904521 0,-2.5613203993227 -2.610683259082 0,-2.46791111376204 -2.71442478062692 0,-2.38196601125011 -2.82442949541505 0,-2.30390380768715 -2.94016147153359 0,-2.23410481428215 -3.06105687442822 0,-2.1729090847148 -3.1865267138484 0,-2.12061475842818 -3.31595971334866 0,-2.07747660812336 -3.448725288366 0,-2.04370479853239 -3.58417661836448 0,-2.01946386251686 -3.72165379807987 0,-2.00487189948035 -3.86048705251175 0,-2.0 -4.0 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):31 -# EntityHandle (String) = 21E -# LINESTRING Z (-2 -4 -8e-16,-2.00487189948035 -4.06975647374412 -8.07462837322448e-16,-2.01946386251686 -4.13917310096007 -8.15863696347693e-16,-2.04370479853239 -4.20791169081776 -8.25161648935015e-16,-2.07747660812336 -4.275637355817 -8.35311396394036e-16,-2.12061475842818 -4.34202014332567 -8.46263490175385e-16,-2.1729090847148 -4.4067366430758 -8.5796457277906e-16,-2.23410481428215 -4.46947156278589 -8.70357637706804e-16,-2.30390380768715 -4.52991926423321 -8.83382307192036e-16,-2.38196601125011 -4.58778525229247 -8.96975126354258e-16,-2.46791111376204 -4.64278760968654 -9.11069872344859e-16,-2.5613203993227 -4.694658370459 -9.2559787697817e-16,-2.66173878728228 -4.74314482547739 -9.40488361275968e-16,-2.76867704934868 -4.78801075360672 -9.5566878029554e-16,-2.88161419305851 -4.82903757255504 -9.71065176561355e-16,-3.0 -4.86602540378444 -9.86602540378444e-16,-3.12325770642185 -4.89879404629917 -1.0022051752721e-15,-3.25078681316818 -4.92718385456679 -1.0177970667735e-15,-3.38196601125011 -4.95105651629515 -1.03330225275453e-15,-3.51615620880067 -4.970295726276 -1.04864519350767e-15,-3.65270364466614 -4.98480775301221 -1.06375113976783e-15,-3.79094307346469 -4.99452189536827 -1.0785464968833e-15,-3.930201006595 -4.9993908270191 -1.09295918336141e-15,-4.069798993405 -4.9993908270191 -1.10691898204241e-15,-4.20905692653531 -4.99452189536827 -1.12035788219036e-15,-4.34729635533386 -4.98480775301221 -1.13321041083461e-15,-4.48384379119934 -4.970295726276 -1.14541395174753e-15,-4.61803398874989 -4.95105651629515 -1.1569090505045e-15,-4.74921318683182 -4.92718385456679 -1.16763970413986e-15,-4.87674229357816 -4.89879404629917 -1.17755363398773e-15,-5.0 -4.86602540378444 -1.18660254037844e-15,-5.11838580694149 -4.82903757255504 -1.19474233794965e-15,-5.23132295065132 -4.78801075360672 -1.2019333704258e-15,-5.33826121271772 -4.74314482547739 -1.20814060381951e-15,-5.4386796006773 -4.694658370459 -1.21333379711363e-15,-5.53208888623796 -4.64278760968654 -1.21748764959245e-15,-5.61803398874989 -4.58778525229247 -1.22058192410424e-15,-5.69609619231285 -4.5299192642332 -1.22260154565461e-15,-5.76589518571785 -4.46947156278589 -1.22353667485037e-15,-5.8270909152852 -4.4067366430758 -1.2233827558361e-15,-5.87938524157182 -4.34202014332567 -1.22214053848975e-15,-5.92252339187664 -4.275637355817 -1.21981607476936e-15,-5.95629520146761 -4.20791169081776 -1.21642068922854e-15,-5.98053613748314 -4.13917310096007 -1.21197092384432e-15,-5.99512810051965 -4.06975647374412 -1.20648845742638e-15,-6 -4 -1.2e-15,-5.99512810051965 -3.93024352625587 -1.19253716267755e-15, -# -5.98053613748314 -3.86082689903993 -1.18413630365231e-15,-5.95629520146761 -3.79208830918224 -1.17483835106499e-15,-5.92252339187664 -3.724362644183 -1.16468860360596e-15,-5.87938524157182 -3.65797985667433 -1.15373650982461e-15,-5.8270909152852 -3.5932633569242 -1.14203542722094e-15,-5.76589518571785 -3.53052843721411 -1.1296423622932e-15,-5.69609619231285 -3.4700807357668 -1.11661769280796e-15,-5.61803398874989 -3.41221474770753 -1.10302487364574e-15,-5.53208888623796 -3.35721239031346 -1.08893012765514e-15,-5.4386796006773 -3.305341629541 -1.07440212302183e-15,-5.33826121271772 -3.25685517452261 -1.05951163872403e-15,-5.23132295065132 -3.21198924639328 -1.04433121970446e-15,-5.11838580694149 -3.17096242744496 -1.02893482343865e-15,-5.0 -3.13397459621556 -1.01339745962156e-15,-4.87674229357815 -3.10120595370083 -9.97794824727899e-16,-4.74921318683182 -3.07281614543321 -9.82202933226504e-16,-4.61803398874989 -3.04894348370485 -9.66697747245474e-16,-4.48384379119934 -3.029704273724 -9.51354806492334e-16,-4.34729635533386 -3.01519224698779 -9.36248860232165e-16,-4.20905692653531 -3.00547810463173 -9.21453503116703e-16,-4.069798993405 -3.0006091729809 -9.07040816638591e-16,-3.930201006595 -3.0006091729809 -8.9308101795759e-16,-3.79094307346469 -3.00547810463173 -8.79642117809642e-16,-3.65270364466614 -3.01519224698779 -8.66789589165393e-16,-3.51615620880066 -3.029704273724 -8.54586048252467e-16,-3.38196601125011 -3.04894348370485 -8.43090949495495e-16,-3.25078681316818 -3.07281614543321 -8.32360295860139e-16,-3.12325770642185 -3.10120595370083 -8.22446366012268e-16,-3.0 -3.13397459621556 -8.13397459621556e-16,-2.88161419305851 -3.17096242744496 -8.05257662050347e-16,-2.76867704934868 -3.21198924639328 -7.98066629574196e-16,-2.66173878728228 -3.25685517452261 -7.91859396180489e-16,-2.5613203993227 -3.305341629541 -7.8666620288637e-16,-2.46791111376204 -3.35721239031346 -7.82512350407551e-16,-2.38196601125011 -3.41221474770753 -7.79418075895763e-16,-2.30390380768715 -3.4700807357668 -7.77398454345394e-16,-2.23410481428215 -3.53052843721411 -7.76463325149626e-16,-2.1729090847148 -3.5932633569242 -7.766172441639e-16,-2.12061475842818 -3.65797985667433 -7.77859461510252e-16,-2.07747660812336 -3.724362644183 -7.80183925230636e-16,-2.04370479853239 -3.79208830918224 -7.83579310771463e-16,-2.01946386251686 -3.86082689903993 -7.88029076155679e-16,-2.00487189948035 -3.93024352625587 -7.93511542573623e-16,-2 -4 -8e-16) + # OGRFeature(entities):31 + # EntityHandle (String) = 21E + # LINESTRING Z (-2 -4 -8e-16,-2.00487189948035 -4.06975647374412 -8.07462837322448e-16,-2.01946386251686 -4.13917310096007 -8.15863696347693e-16,-2.04370479853239 -4.20791169081776 -8.25161648935015e-16,-2.07747660812336 -4.275637355817 -8.35311396394036e-16,-2.12061475842818 -4.34202014332567 -8.46263490175385e-16,-2.1729090847148 -4.4067366430758 -8.5796457277906e-16,-2.23410481428215 -4.46947156278589 -8.70357637706804e-16,-2.30390380768715 -4.52991926423321 -8.83382307192036e-16,-2.38196601125011 -4.58778525229247 -8.96975126354258e-16,-2.46791111376204 -4.64278760968654 -9.11069872344859e-16,-2.5613203993227 -4.694658370459 -9.2559787697817e-16,-2.66173878728228 -4.74314482547739 -9.40488361275968e-16,-2.76867704934868 -4.78801075360672 -9.5566878029554e-16,-2.88161419305851 -4.82903757255504 -9.71065176561355e-16,-3.0 -4.86602540378444 -9.86602540378444e-16,-3.12325770642185 -4.89879404629917 -1.0022051752721e-15,-3.25078681316818 -4.92718385456679 -1.0177970667735e-15,-3.38196601125011 -4.95105651629515 -1.03330225275453e-15,-3.51615620880067 -4.970295726276 -1.04864519350767e-15,-3.65270364466614 -4.98480775301221 -1.06375113976783e-15,-3.79094307346469 -4.99452189536827 -1.0785464968833e-15,-3.930201006595 -4.9993908270191 -1.09295918336141e-15,-4.069798993405 -4.9993908270191 -1.10691898204241e-15,-4.20905692653531 -4.99452189536827 -1.12035788219036e-15,-4.34729635533386 -4.98480775301221 -1.13321041083461e-15,-4.48384379119934 -4.970295726276 -1.14541395174753e-15,-4.61803398874989 -4.95105651629515 -1.1569090505045e-15,-4.74921318683182 -4.92718385456679 -1.16763970413986e-15,-4.87674229357816 -4.89879404629917 -1.17755363398773e-15,-5.0 -4.86602540378444 -1.18660254037844e-15,-5.11838580694149 -4.82903757255504 -1.19474233794965e-15,-5.23132295065132 -4.78801075360672 -1.2019333704258e-15,-5.33826121271772 -4.74314482547739 -1.20814060381951e-15,-5.4386796006773 -4.694658370459 -1.21333379711363e-15,-5.53208888623796 -4.64278760968654 -1.21748764959245e-15,-5.61803398874989 -4.58778525229247 -1.22058192410424e-15,-5.69609619231285 -4.5299192642332 -1.22260154565461e-15,-5.76589518571785 -4.46947156278589 -1.22353667485037e-15,-5.8270909152852 -4.4067366430758 -1.2233827558361e-15,-5.87938524157182 -4.34202014332567 -1.22214053848975e-15,-5.92252339187664 -4.275637355817 -1.21981607476936e-15,-5.95629520146761 -4.20791169081776 -1.21642068922854e-15,-5.98053613748314 -4.13917310096007 -1.21197092384432e-15,-5.99512810051965 -4.06975647374412 -1.20648845742638e-15,-6 -4 -1.2e-15,-5.99512810051965 -3.93024352625587 -1.19253716267755e-15, + # -5.98053613748314 -3.86082689903993 -1.18413630365231e-15,-5.95629520146761 -3.79208830918224 -1.17483835106499e-15,-5.92252339187664 -3.724362644183 -1.16468860360596e-15,-5.87938524157182 -3.65797985667433 -1.15373650982461e-15,-5.8270909152852 -3.5932633569242 -1.14203542722094e-15,-5.76589518571785 -3.53052843721411 -1.1296423622932e-15,-5.69609619231285 -3.4700807357668 -1.11661769280796e-15,-5.61803398874989 -3.41221474770753 -1.10302487364574e-15,-5.53208888623796 -3.35721239031346 -1.08893012765514e-15,-5.4386796006773 -3.305341629541 -1.07440212302183e-15,-5.33826121271772 -3.25685517452261 -1.05951163872403e-15,-5.23132295065132 -3.21198924639328 -1.04433121970446e-15,-5.11838580694149 -3.17096242744496 -1.02893482343865e-15,-5.0 -3.13397459621556 -1.01339745962156e-15,-4.87674229357815 -3.10120595370083 -9.97794824727899e-16,-4.74921318683182 -3.07281614543321 -9.82202933226504e-16,-4.61803398874989 -3.04894348370485 -9.66697747245474e-16,-4.48384379119934 -3.029704273724 -9.51354806492334e-16,-4.34729635533386 -3.01519224698779 -9.36248860232165e-16,-4.20905692653531 -3.00547810463173 -9.21453503116703e-16,-4.069798993405 -3.0006091729809 -9.07040816638591e-16,-3.930201006595 -3.0006091729809 -8.9308101795759e-16,-3.79094307346469 -3.00547810463173 -8.79642117809642e-16,-3.65270364466614 -3.01519224698779 -8.66789589165393e-16,-3.51615620880066 -3.029704273724 -8.54586048252467e-16,-3.38196601125011 -3.04894348370485 -8.43090949495495e-16,-3.25078681316818 -3.07281614543321 -8.32360295860139e-16,-3.12325770642185 -3.10120595370083 -8.22446366012268e-16,-3.0 -3.13397459621556 -8.13397459621556e-16,-2.88161419305851 -3.17096242744496 -8.05257662050347e-16,-2.76867704934868 -3.21198924639328 -7.98066629574196e-16,-2.66173878728228 -3.25685517452261 -7.91859396180489e-16,-2.5613203993227 -3.305341629541 -7.8666620288637e-16,-2.46791111376204 -3.35721239031346 -7.82512350407551e-16,-2.38196601125011 -3.41221474770753 -7.79418075895763e-16,-2.30390380768715 -3.4700807357668 -7.77398454345394e-16,-2.23410481428215 -3.53052843721411 -7.76463325149626e-16,-2.1729090847148 -3.5932633569242 -7.766172441639e-16,-2.12061475842818 -3.65797985667433 -7.77859461510252e-16,-2.07747660812336 -3.724362644183 -7.80183925230636e-16,-2.04370479853239 -3.79208830918224 -7.83579310771463e-16,-2.01946386251686 -3.86082689903993 -7.88029076155679e-16,-2.00487189948035 -3.93024352625587 -7.93511542573623e-16,-2 -4 -8e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2 -4 -8e-16,-2.00487189948035 -4.06975647374412 -8.07462837322448e-16,-2.01946386251686 -4.13917310096007 -8.15863696347693e-16,-2.04370479853239 -4.20791169081776 -8.25161648935015e-16,-2.07747660812336 -4.275637355817 -8.35311396394036e-16,-2.12061475842818 -4.34202014332567 -8.46263490175385e-16,-2.1729090847148 -4.4067366430758 -8.5796457277906e-16,-2.23410481428215 -4.46947156278589 -8.70357637706804e-16,-2.30390380768715 -4.52991926423321 -8.83382307192036e-16,-2.38196601125011 -4.58778525229247 -8.96975126354258e-16,-2.46791111376204 -4.64278760968654 -9.11069872344859e-16,-2.5613203993227 -4.694658370459 -9.2559787697817e-16,-2.66173878728228 -4.74314482547739 -9.40488361275968e-16,-2.76867704934868 -4.78801075360672 -9.5566878029554e-16,-2.88161419305851 -4.82903757255504 -9.71065176561355e-16,-3.0 -4.86602540378444 -9.86602540378444e-16,-3.12325770642185 -4.89879404629917 -1.0022051752721e-15,-3.25078681316818 -4.92718385456679 -1.0177970667735e-15,-3.38196601125011 -4.95105651629515 -1.03330225275453e-15,-3.51615620880067 -4.970295726276 -1.04864519350767e-15,-3.65270364466614 -4.98480775301221 -1.06375113976783e-15,-3.79094307346469 -4.99452189536827 -1.0785464968833e-15,-3.930201006595 -4.9993908270191 -1.09295918336141e-15,-4.069798993405 -4.9993908270191 -1.10691898204241e-15,-4.20905692653531 -4.99452189536827 -1.12035788219036e-15,-4.34729635533386 -4.98480775301221 -1.13321041083461e-15,-4.48384379119934 -4.970295726276 -1.14541395174753e-15,-4.61803398874989 -4.95105651629515 -1.1569090505045e-15,-4.74921318683182 -4.92718385456679 -1.16763970413986e-15,-4.87674229357816 -4.89879404629917 -1.17755363398773e-15,-5.0 -4.86602540378444 -1.18660254037844e-15,-5.11838580694149 -4.82903757255504 -1.19474233794965e-15,-5.23132295065132 -4.78801075360672 -1.2019333704258e-15,-5.33826121271772 -4.74314482547739 -1.20814060381951e-15,-5.4386796006773 -4.694658370459 -1.21333379711363e-15,-5.53208888623796 -4.64278760968654 -1.21748764959245e-15,-5.61803398874989 -4.58778525229247 -1.22058192410424e-15,-5.69609619231285 -4.5299192642332 -1.22260154565461e-15,-5.76589518571785 -4.46947156278589 -1.22353667485037e-15,-5.8270909152852 -4.4067366430758 -1.2233827558361e-15,-5.87938524157182 -4.34202014332567 -1.22214053848975e-15,-5.92252339187664 -4.275637355817 -1.21981607476936e-15,-5.95629520146761 -4.20791169081776 -1.21642068922854e-15,-5.98053613748314 -4.13917310096007 -1.21197092384432e-15,-5.99512810051965 -4.06975647374412 -1.20648845742638e-15,-6 -4 -1.2e-15,-5.99512810051965 -3.93024352625587 -1.19253716267755e-15,' + - '-5.98053613748314 -3.86082689903993 -1.18413630365231e-15,-5.95629520146761 -3.79208830918224 -1.17483835106499e-15,-5.92252339187664 -3.724362644183 -1.16468860360596e-15,-5.87938524157182 -3.65797985667433 -1.15373650982461e-15,-5.8270909152852 -3.5932633569242 -1.14203542722094e-15,-5.76589518571785 -3.53052843721411 -1.1296423622932e-15,-5.69609619231285 -3.4700807357668 -1.11661769280796e-15,-5.61803398874989 -3.41221474770753 -1.10302487364574e-15,-5.53208888623796 -3.35721239031346 -1.08893012765514e-15,-5.4386796006773 -3.305341629541 -1.07440212302183e-15,-5.33826121271772 -3.25685517452261 -1.05951163872403e-15,-5.23132295065132 -3.21198924639328 -1.04433121970446e-15,-5.11838580694149 -3.17096242744496 -1.02893482343865e-15,-5.0 -3.13397459621556 -1.01339745962156e-15,-4.87674229357815 -3.10120595370083 -9.97794824727899e-16,-4.74921318683182 -3.07281614543321 -9.82202933226504e-16,-4.61803398874989 -3.04894348370485 -9.66697747245474e-16,-4.48384379119934 -3.029704273724 -9.51354806492334e-16,-4.34729635533386 -3.01519224698779 -9.36248860232165e-16,-4.20905692653531 -3.00547810463173 -9.21453503116703e-16,-4.069798993405 -3.0006091729809 -9.07040816638591e-16,-3.930201006595 -3.0006091729809 -8.9308101795759e-16,-3.79094307346469 -3.00547810463173 -8.79642117809642e-16,-3.65270364466614 -3.01519224698779 -8.66789589165393e-16,-3.51615620880066 -3.029704273724 -8.54586048252467e-16,-3.38196601125011 -3.04894348370485 -8.43090949495495e-16,-3.25078681316818 -3.07281614543321 -8.32360295860139e-16,-3.12325770642185 -3.10120595370083 -8.22446366012268e-16,-3.0 -3.13397459621556 -8.13397459621556e-16,-2.88161419305851 -3.17096242744496 -8.05257662050347e-16,-2.76867704934868 -3.21198924639328 -7.98066629574196e-16,-2.66173878728228 -3.25685517452261 -7.91859396180489e-16,-2.5613203993227 -3.305341629541 -7.8666620288637e-16,-2.46791111376204 -3.35721239031346 -7.82512350407551e-16,-2.38196601125011 -3.41221474770753 -7.79418075895763e-16,-2.30390380768715 -3.4700807357668 -7.77398454345394e-16,-2.23410481428215 -3.53052843721411 -7.76463325149626e-16,-2.1729090847148 -3.5932633569242 -7.766172441639e-16,-2.12061475842818 -3.65797985667433 -7.77859461510252e-16,-2.07747660812336 -3.724362644183 -7.80183925230636e-16,-2.04370479853239 -3.79208830918224 -7.83579310771463e-16,-2.01946386251686 -3.86082689903993 -7.88029076155679e-16,-2.00487189948035 -3.93024352625587 -7.93511542573623e-16,-2 -4 -8e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2 -4 -8e-16,-2.00487189948035 -4.06975647374412 -8.07462837322448e-16,-2.01946386251686 -4.13917310096007 -8.15863696347693e-16,-2.04370479853239 -4.20791169081776 -8.25161648935015e-16,-2.07747660812336 -4.275637355817 -8.35311396394036e-16,-2.12061475842818 -4.34202014332567 -8.46263490175385e-16,-2.1729090847148 -4.4067366430758 -8.5796457277906e-16,-2.23410481428215 -4.46947156278589 -8.70357637706804e-16,-2.30390380768715 -4.52991926423321 -8.83382307192036e-16,-2.38196601125011 -4.58778525229247 -8.96975126354258e-16,-2.46791111376204 -4.64278760968654 -9.11069872344859e-16,-2.5613203993227 -4.694658370459 -9.2559787697817e-16,-2.66173878728228 -4.74314482547739 -9.40488361275968e-16,-2.76867704934868 -4.78801075360672 -9.5566878029554e-16,-2.88161419305851 -4.82903757255504 -9.71065176561355e-16,-3.0 -4.86602540378444 -9.86602540378444e-16,-3.12325770642185 -4.89879404629917 -1.0022051752721e-15,-3.25078681316818 -4.92718385456679 -1.0177970667735e-15,-3.38196601125011 -4.95105651629515 -1.03330225275453e-15,-3.51615620880067 -4.970295726276 -1.04864519350767e-15,-3.65270364466614 -4.98480775301221 -1.06375113976783e-15,-3.79094307346469 -4.99452189536827 -1.0785464968833e-15,-3.930201006595 -4.9993908270191 -1.09295918336141e-15,-4.069798993405 -4.9993908270191 -1.10691898204241e-15,-4.20905692653531 -4.99452189536827 -1.12035788219036e-15,-4.34729635533386 -4.98480775301221 -1.13321041083461e-15,-4.48384379119934 -4.970295726276 -1.14541395174753e-15,-4.61803398874989 -4.95105651629515 -1.1569090505045e-15,-4.74921318683182 -4.92718385456679 -1.16763970413986e-15,-4.87674229357816 -4.89879404629917 -1.17755363398773e-15,-5.0 -4.86602540378444 -1.18660254037844e-15,-5.11838580694149 -4.82903757255504 -1.19474233794965e-15,-5.23132295065132 -4.78801075360672 -1.2019333704258e-15,-5.33826121271772 -4.74314482547739 -1.20814060381951e-15,-5.4386796006773 -4.694658370459 -1.21333379711363e-15,-5.53208888623796 -4.64278760968654 -1.21748764959245e-15,-5.61803398874989 -4.58778525229247 -1.22058192410424e-15,-5.69609619231285 -4.5299192642332 -1.22260154565461e-15,-5.76589518571785 -4.46947156278589 -1.22353667485037e-15,-5.8270909152852 -4.4067366430758 -1.2233827558361e-15,-5.87938524157182 -4.34202014332567 -1.22214053848975e-15,-5.92252339187664 -4.275637355817 -1.21981607476936e-15,-5.95629520146761 -4.20791169081776 -1.21642068922854e-15,-5.98053613748314 -4.13917310096007 -1.21197092384432e-15,-5.99512810051965 -4.06975647374412 -1.20648845742638e-15,-6 -4 -1.2e-15,-5.99512810051965 -3.93024352625587 -1.19253716267755e-15," + + "-5.98053613748314 -3.86082689903993 -1.18413630365231e-15,-5.95629520146761 -3.79208830918224 -1.17483835106499e-15,-5.92252339187664 -3.724362644183 -1.16468860360596e-15,-5.87938524157182 -3.65797985667433 -1.15373650982461e-15,-5.8270909152852 -3.5932633569242 -1.14203542722094e-15,-5.76589518571785 -3.53052843721411 -1.1296423622932e-15,-5.69609619231285 -3.4700807357668 -1.11661769280796e-15,-5.61803398874989 -3.41221474770753 -1.10302487364574e-15,-5.53208888623796 -3.35721239031346 -1.08893012765514e-15,-5.4386796006773 -3.305341629541 -1.07440212302183e-15,-5.33826121271772 -3.25685517452261 -1.05951163872403e-15,-5.23132295065132 -3.21198924639328 -1.04433121970446e-15,-5.11838580694149 -3.17096242744496 -1.02893482343865e-15,-5.0 -3.13397459621556 -1.01339745962156e-15,-4.87674229357815 -3.10120595370083 -9.97794824727899e-16,-4.74921318683182 -3.07281614543321 -9.82202933226504e-16,-4.61803398874989 -3.04894348370485 -9.66697747245474e-16,-4.48384379119934 -3.029704273724 -9.51354806492334e-16,-4.34729635533386 -3.01519224698779 -9.36248860232165e-16,-4.20905692653531 -3.00547810463173 -9.21453503116703e-16,-4.069798993405 -3.0006091729809 -9.07040816638591e-16,-3.930201006595 -3.0006091729809 -8.9308101795759e-16,-3.79094307346469 -3.00547810463173 -8.79642117809642e-16,-3.65270364466614 -3.01519224698779 -8.66789589165393e-16,-3.51615620880066 -3.029704273724 -8.54586048252467e-16,-3.38196601125011 -3.04894348370485 -8.43090949495495e-16,-3.25078681316818 -3.07281614543321 -8.32360295860139e-16,-3.12325770642185 -3.10120595370083 -8.22446366012268e-16,-3.0 -3.13397459621556 -8.13397459621556e-16,-2.88161419305851 -3.17096242744496 -8.05257662050347e-16,-2.76867704934868 -3.21198924639328 -7.98066629574196e-16,-2.66173878728228 -3.25685517452261 -7.91859396180489e-16,-2.5613203993227 -3.305341629541 -7.8666620288637e-16,-2.46791111376204 -3.35721239031346 -7.82512350407551e-16,-2.38196601125011 -3.41221474770753 -7.79418075895763e-16,-2.30390380768715 -3.4700807357668 -7.77398454345394e-16,-2.23410481428215 -3.53052843721411 -7.76463325149626e-16,-2.1729090847148 -3.5932633569242 -7.766172441639e-16,-2.12061475842818 -3.65797985667433 -7.77859461510252e-16,-2.07747660812336 -3.724362644183 -7.80183925230636e-16,-2.04370479853239 -3.79208830918224 -7.83579310771463e-16,-2.01946386251686 -3.86082689903993 -7.88029076155679e-16,-2.00487189948035 -3.93024352625587 -7.93511542573623e-16,-2 -4 -8e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):32 -# EntityHandle (String) = 21F -# LINESTRING Z (-2 -2 0,-1.96657794502105 -2.03582232791524 0,-1.93571660708646 -2.07387296203834 0,-1.90756413746468 -2.11396923855472 0,-1.88225568337755 -2.15591867344963 0,-1.85991273921989 -2.19951988653655 0,-1.84064256332004 -2.24456356819194 0,-1.8245376630414 -2.29083348415575 0,-1.81167535069652 -2.33810751357387 0,-1.80211737240583 -2.38615871529951 0,-1.79590961168258 -2.43475641733454 0,-1.79308186916688 -2.48366732418105 0,-1.79364771956639 -2.53265663678705 0,-1.79760444649032 -2.58148917971011 0,-1.80493305548955 -2.62993053008786 0,-1.81559836524041 -2.67774814299567 0,-1.8295491764342 -2.72471246778926 0,-1.84671851756181 -2.7705980500731 0,-1.86702396641357 -2.81518461400453 0,-1.89036804575079 -2.85825811973811 0,-1.91663869124976 -2.89961179093367 0,-1.94570978947168 -2.93904710739563 0,-1.97744178327594 -2.97637475807832 0,-2.01168234177068 -3.01141554988232 0,-2.04826709158413 -3.04400126787917 0,-2.08702040594658 -3.07397548283483 0,-2.12775624779472 -3.10119430215541 0,-2.1702790628511 -3.12552706065018 0,-2.2143847183914 -3.14685694779575 0,-2.25986148319297 -3.16508156849045 0,-2.30649104396024 -3.18011343460661 0,-2.35404955334774 -3.1918803849814 0,-2.40230870454951 -3.20032593182975 0,-2.45103682729644 -3.2054095319166 0,-2.5 -3.20710678118655 0,-2.54896317270356 -3.2054095319166 0,-2.59769129545049 -3.20032593182975 0,-2.64595044665226 -3.1918803849814 0,-2.69350895603976 -3.18011343460661 0,-2.74013851680703 -3.16508156849045 0,-2.7856152816086 -3.14685694779575 0,-2.8297209371489 -3.12552706065018 0,-2.87224375220528 -3.10119430215541 0,-2.91297959405342 -3.07397548283483 0,-2.95173290841587 -3.04400126787917 0,-2.98831765822932 -3.01141554988232 0,-3.02255821672406 -2.97637475807832 0,-3.05429021052832 -2.93904710739563 0,-3.08336130875024 -2.89961179093367 0,-3.10963195424921 -2.85825811973811 0,-3.13297603358643 -2.81518461400453 0,-3.15328148243819 -2.7705980500731 0,-3.1704508235658 -2.72471246778926 0,-3.18440163475959 -2.67774814299567 0,-3.19506694451045 -2.62993053008786 0,-3.20239555350968 -2.58148917971011 0,-3.20635228043361 -2.53265663678705 0,-3.20691813083312 -2.48366732418105 0,-3.20409038831742 -2.43475641733454 0,-3.19788262759417 -2.38615871529951 0,-3.18832464930348 -2.33810751357387 0,-3.1754623369586 -2.29083348415575 0,-3.15935743667996 -2.24456356819194 0,-3.14008726078011 -2.19951988653655 0,-3.11774431662245 -2.15591867344963 0,-3.09243586253532 -2.11396923855472 0,-3.06428339291354 -2.07387296203834 0,-3.03342205497895 -2.03582232791524 0,-3 -2 0) + # OGRFeature(entities):32 + # EntityHandle (String) = 21F + # LINESTRING Z (-2 -2 0,-1.96657794502105 -2.03582232791524 0,-1.93571660708646 -2.07387296203834 0,-1.90756413746468 -2.11396923855472 0,-1.88225568337755 -2.15591867344963 0,-1.85991273921989 -2.19951988653655 0,-1.84064256332004 -2.24456356819194 0,-1.8245376630414 -2.29083348415575 0,-1.81167535069652 -2.33810751357387 0,-1.80211737240583 -2.38615871529951 0,-1.79590961168258 -2.43475641733454 0,-1.79308186916688 -2.48366732418105 0,-1.79364771956639 -2.53265663678705 0,-1.79760444649032 -2.58148917971011 0,-1.80493305548955 -2.62993053008786 0,-1.81559836524041 -2.67774814299567 0,-1.8295491764342 -2.72471246778926 0,-1.84671851756181 -2.7705980500731 0,-1.86702396641357 -2.81518461400453 0,-1.89036804575079 -2.85825811973811 0,-1.91663869124976 -2.89961179093367 0,-1.94570978947168 -2.93904710739563 0,-1.97744178327594 -2.97637475807832 0,-2.01168234177068 -3.01141554988232 0,-2.04826709158413 -3.04400126787917 0,-2.08702040594658 -3.07397548283483 0,-2.12775624779472 -3.10119430215541 0,-2.1702790628511 -3.12552706065018 0,-2.2143847183914 -3.14685694779575 0,-2.25986148319297 -3.16508156849045 0,-2.30649104396024 -3.18011343460661 0,-2.35404955334774 -3.1918803849814 0,-2.40230870454951 -3.20032593182975 0,-2.45103682729644 -3.2054095319166 0,-2.5 -3.20710678118655 0,-2.54896317270356 -3.2054095319166 0,-2.59769129545049 -3.20032593182975 0,-2.64595044665226 -3.1918803849814 0,-2.69350895603976 -3.18011343460661 0,-2.74013851680703 -3.16508156849045 0,-2.7856152816086 -3.14685694779575 0,-2.8297209371489 -3.12552706065018 0,-2.87224375220528 -3.10119430215541 0,-2.91297959405342 -3.07397548283483 0,-2.95173290841587 -3.04400126787917 0,-2.98831765822932 -3.01141554988232 0,-3.02255821672406 -2.97637475807832 0,-3.05429021052832 -2.93904710739563 0,-3.08336130875024 -2.89961179093367 0,-3.10963195424921 -2.85825811973811 0,-3.13297603358643 -2.81518461400453 0,-3.15328148243819 -2.7705980500731 0,-3.1704508235658 -2.72471246778926 0,-3.18440163475959 -2.67774814299567 0,-3.19506694451045 -2.62993053008786 0,-3.20239555350968 -2.58148917971011 0,-3.20635228043361 -2.53265663678705 0,-3.20691813083312 -2.48366732418105 0,-3.20409038831742 -2.43475641733454 0,-3.19788262759417 -2.38615871529951 0,-3.18832464930348 -2.33810751357387 0,-3.1754623369586 -2.29083348415575 0,-3.15935743667996 -2.24456356819194 0,-3.14008726078011 -2.19951988653655 0,-3.11774431662245 -2.15591867344963 0,-3.09243586253532 -2.11396923855472 0,-3.06428339291354 -2.07387296203834 0,-3.03342205497895 -2.03582232791524 0,-3 -2 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2 -2 0,-1.96657794502105 -2.03582232791524 0,-1.93571660708646 -2.07387296203834 0,-1.90756413746468 -2.11396923855472 0,-1.88225568337755 -2.15591867344963 0,-1.85991273921989 -2.19951988653655 0,-1.84064256332004 -2.24456356819194 0,-1.8245376630414 -2.29083348415575 0,-1.81167535069652 -2.33810751357387 0,-1.80211737240583 -2.38615871529951 0,-1.79590961168258 -2.43475641733454 0,-1.79308186916688 -2.48366732418105 0,-1.79364771956639 -2.53265663678705 0,-1.79760444649032 -2.58148917971011 0,-1.80493305548955 -2.62993053008786 0,-1.81559836524041 -2.67774814299567 0,-1.8295491764342 -2.72471246778926 0,-1.84671851756181 -2.7705980500731 0,-1.86702396641357 -2.81518461400453 0,-1.89036804575079 -2.85825811973811 0,-1.91663869124976 -2.89961179093367 0,-1.94570978947168 -2.93904710739563 0,-1.97744178327594 -2.97637475807832 0,-2.01168234177068 -3.01141554988232 0,-2.04826709158413 -3.04400126787917 0,-2.08702040594658 -3.07397548283483 0,-2.12775624779472 -3.10119430215541 0,-2.1702790628511 -3.12552706065018 0,-2.2143847183914 -3.14685694779575 0,-2.25986148319297 -3.16508156849045 0,-2.30649104396024 -3.18011343460661 0,-2.35404955334774 -3.1918803849814 0,-2.40230870454951 -3.20032593182975 0,-2.45103682729644 -3.2054095319166 0,-2.5 -3.20710678118655 0,-2.54896317270356 -3.2054095319166 0,-2.59769129545049 -3.20032593182975 0,-2.64595044665226 -3.1918803849814 0,-2.69350895603976 -3.18011343460661 0,-2.74013851680703 -3.16508156849045 0,-2.7856152816086 -3.14685694779575 0,-2.8297209371489 -3.12552706065018 0,-2.87224375220528 -3.10119430215541 0,-2.91297959405342 -3.07397548283483 0,-2.95173290841587 -3.04400126787917 0,-2.98831765822932 -3.01141554988232 0,-3.02255821672406 -2.97637475807832 0,-3.05429021052832 -2.93904710739563 0,-3.08336130875024 -2.89961179093367 0,-3.10963195424921 -2.85825811973811 0,-3.13297603358643 -2.81518461400453 0,-3.15328148243819 -2.7705980500731 0,-3.1704508235658 -2.72471246778926 0,-3.18440163475959 -2.67774814299567 0,-3.19506694451045 -2.62993053008786 0,-3.20239555350968 -2.58148917971011 0,-3.20635228043361 -2.53265663678705 0,-3.20691813083312 -2.48366732418105 0,-3.20409038831742 -2.43475641733454 0,-3.19788262759417 -2.38615871529951 0,-3.18832464930348 -2.33810751357387 0,-3.1754623369586 -2.29083348415575 0,-3.15935743667996 -2.24456356819194 0,-3.14008726078011 -2.19951988653655 0,-3.11774431662245 -2.15591867344963 0,-3.09243586253532 -2.11396923855472 0,-3.06428339291354 -2.07387296203834 0,-3.03342205497895 -2.03582232791524 0,-3 -2 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2 -2 0,-1.96657794502105 -2.03582232791524 0,-1.93571660708646 -2.07387296203834 0,-1.90756413746468 -2.11396923855472 0,-1.88225568337755 -2.15591867344963 0,-1.85991273921989 -2.19951988653655 0,-1.84064256332004 -2.24456356819194 0,-1.8245376630414 -2.29083348415575 0,-1.81167535069652 -2.33810751357387 0,-1.80211737240583 -2.38615871529951 0,-1.79590961168258 -2.43475641733454 0,-1.79308186916688 -2.48366732418105 0,-1.79364771956639 -2.53265663678705 0,-1.79760444649032 -2.58148917971011 0,-1.80493305548955 -2.62993053008786 0,-1.81559836524041 -2.67774814299567 0,-1.8295491764342 -2.72471246778926 0,-1.84671851756181 -2.7705980500731 0,-1.86702396641357 -2.81518461400453 0,-1.89036804575079 -2.85825811973811 0,-1.91663869124976 -2.89961179093367 0,-1.94570978947168 -2.93904710739563 0,-1.97744178327594 -2.97637475807832 0,-2.01168234177068 -3.01141554988232 0,-2.04826709158413 -3.04400126787917 0,-2.08702040594658 -3.07397548283483 0,-2.12775624779472 -3.10119430215541 0,-2.1702790628511 -3.12552706065018 0,-2.2143847183914 -3.14685694779575 0,-2.25986148319297 -3.16508156849045 0,-2.30649104396024 -3.18011343460661 0,-2.35404955334774 -3.1918803849814 0,-2.40230870454951 -3.20032593182975 0,-2.45103682729644 -3.2054095319166 0,-2.5 -3.20710678118655 0,-2.54896317270356 -3.2054095319166 0,-2.59769129545049 -3.20032593182975 0,-2.64595044665226 -3.1918803849814 0,-2.69350895603976 -3.18011343460661 0,-2.74013851680703 -3.16508156849045 0,-2.7856152816086 -3.14685694779575 0,-2.8297209371489 -3.12552706065018 0,-2.87224375220528 -3.10119430215541 0,-2.91297959405342 -3.07397548283483 0,-2.95173290841587 -3.04400126787917 0,-2.98831765822932 -3.01141554988232 0,-3.02255821672406 -2.97637475807832 0,-3.05429021052832 -2.93904710739563 0,-3.08336130875024 -2.89961179093367 0,-3.10963195424921 -2.85825811973811 0,-3.13297603358643 -2.81518461400453 0,-3.15328148243819 -2.7705980500731 0,-3.1704508235658 -2.72471246778926 0,-3.18440163475959 -2.67774814299567 0,-3.19506694451045 -2.62993053008786 0,-3.20239555350968 -2.58148917971011 0,-3.20635228043361 -2.53265663678705 0,-3.20691813083312 -2.48366732418105 0,-3.20409038831742 -2.43475641733454 0,-3.19788262759417 -2.38615871529951 0,-3.18832464930348 -2.33810751357387 0,-3.1754623369586 -2.29083348415575 0,-3.15935743667996 -2.24456356819194 0,-3.14008726078011 -2.19951988653655 0,-3.11774431662245 -2.15591867344963 0,-3.09243586253532 -2.11396923855472 0,-3.06428339291354 -2.07387296203834 0,-3.03342205497895 -2.03582232791524 0,-3 -2 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):33 -# EntityHandle (String) = 220 -# POLYGON Z ((-1 -2 -4e-16,-1 -3 -5e-16,-2 -3 -6e-16,-2 -2 -5e-16,-1 -2 -4e-16)) + # OGRFeature(entities):33 + # EntityHandle (String) = 220 + # POLYGON Z ((-1 -2 -4e-16,-1 -3 -5e-16,-2 -3 -6e-16,-2 -2 -5e-16,-1 -2 -4e-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-1 -2 -4e-16,-1 -3 -5e-16,-2 -3 -6e-16,-2 -2 -5e-16,-1 -2 -4e-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-1 -2 -4e-16,-1 -3 -5e-16,-2 -3 -6e-16,-2 -2 -5e-16,-1 -2 -4e-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):34 -# EntityHandle (String) = 221 -# POLYGON ((-3 -4,-4 -4,-4 -3,-3 -3,-3 -4)) + # OGRFeature(entities):34 + # EntityHandle (String) = 221 + # POLYGON ((-3 -4,-4 -4,-4 -3,-3 -3,-3 -4)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((-3 -4,-4 -4,-4 -3,-3 -3,-3 -4))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON ((-3 -4,-4 -4,-4 -3,-3 -3,-3 -4))" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):35 -# EntityHandle (String) = 223 -# POLYGON Z ((-8 -8 -1.6E-15,-9 -8 -1.7E-15,-9 -9 -1.8E-15,-8 -9 -1.7E-15,-8 -8 -1.6E-15)) + # OGRFeature(entities):35 + # EntityHandle (String) = 223 + # POLYGON Z ((-8 -8 -1.6E-15,-9 -8 -1.7E-15,-9 -9 -1.8E-15,-8 -9 -1.7E-15,-8 -8 -1.6E-15)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-8 -8 -1.6E-15,-9 -8 -1.7E-15,-9 -9 -1.8E-15,-8 -9 -1.7E-15,-8 -8 -1.6E-15))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-8 -8 -1.6E-15,-9 -8 -1.7E-15,-9 -9 -1.8E-15,-8 -9 -1.7E-15,-8 -8 -1.6E-15))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):36 -# EntityHandle (String) = 224 -# LINESTRING (-2 -2,-2.15384615384615 -2.15384615384615,-2.30769230769231 -2.30769230769231,-2.46153846153846 -2.46153846153846,-2.61538461538461 -2.61538461538461,-2.76923076923077 -2.76923076923077,-2.92307692307692 -2.92307692307692,-3.07692307692308 -3.07692307692308,-3.23076923076923 -3.23076923076923,-3.38461538461538 -3.38461538461538,-3.53846153846154 -3.53846153846154,-3.69230769230769 -3.69230769230769,-3.84615384615385 -3.84615384615385,-4 -4,-4.15384615384615 -4.15384615384615,-4.30769230769231 -4.30769230769231,-4.46153846153846 -4.46153846153846,-4.61538461538462 -4.61538461538462,-4.76923076923077 -4.76923076923077,-4.92307692307692 -4.92307692307692,-5.07692307692308 -5.07692307692308,-5.23076923076923 -5.23076923076923,-5.38461538461538 -5.38461538461538,-5.53846153846154 -5.53846153846154,-5.69230769230769 -5.69230769230769,-5.84615384615385 -5.84615384615385,-6.0 -6.0,-6.15384615384615 -6.15384615384615,-6.30769230769231 -6.30769230769231,-6.46153846153846 -6.46153846153846,-6.61538461538462 -6.61538461538462,-6.76923076923077 -6.76923076923077,-6.92307692307692 -6.92307692307692,-7.07692307692308 -7.07692307692308,-7.23076923076923 -7.23076923076923,-7.38461538461539 -7.38461538461539,-7.53846153846154 -7.53846153846154,-7.69230769230769 -7.69230769230769,-7.84615384615385 -7.84615384615385,-8 -8) + # OGRFeature(entities):36 + # EntityHandle (String) = 224 + # LINESTRING (-2 -2,-2.15384615384615 -2.15384615384615,-2.30769230769231 -2.30769230769231,-2.46153846153846 -2.46153846153846,-2.61538461538461 -2.61538461538461,-2.76923076923077 -2.76923076923077,-2.92307692307692 -2.92307692307692,-3.07692307692308 -3.07692307692308,-3.23076923076923 -3.23076923076923,-3.38461538461538 -3.38461538461538,-3.53846153846154 -3.53846153846154,-3.69230769230769 -3.69230769230769,-3.84615384615385 -3.84615384615385,-4 -4,-4.15384615384615 -4.15384615384615,-4.30769230769231 -4.30769230769231,-4.46153846153846 -4.46153846153846,-4.61538461538462 -4.61538461538462,-4.76923076923077 -4.76923076923077,-4.92307692307692 -4.92307692307692,-5.07692307692308 -5.07692307692308,-5.23076923076923 -5.23076923076923,-5.38461538461538 -5.38461538461538,-5.53846153846154 -5.53846153846154,-5.69230769230769 -5.69230769230769,-5.84615384615385 -5.84615384615385,-6.0 -6.0,-6.15384615384615 -6.15384615384615,-6.30769230769231 -6.30769230769231,-6.46153846153846 -6.46153846153846,-6.61538461538462 -6.61538461538462,-6.76923076923077 -6.76923076923077,-6.92307692307692 -6.92307692307692,-7.07692307692308 -7.07692307692308,-7.23076923076923 -7.23076923076923,-7.38461538461539 -7.38461538461539,-7.53846153846154 -7.53846153846154,-7.69230769230769 -7.69230769230769,-7.84615384615385 -7.84615384615385,-8 -8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-2 -2,-2.15384615384615 -2.15384615384615,-2.30769230769231 -2.30769230769231,-2.46153846153846 -2.46153846153846,-2.61538461538461 -2.61538461538461,-2.76923076923077 -2.76923076923077,-2.92307692307692 -2.92307692307692,-3.07692307692308 -3.07692307692308,-3.23076923076923 -3.23076923076923,-3.38461538461538 -3.38461538461538,-3.53846153846154 -3.53846153846154,-3.69230769230769 -3.69230769230769,-3.84615384615385 -3.84615384615385,-4 -4,-4.15384615384615 -4.15384615384615,-4.30769230769231 -4.30769230769231,-4.46153846153846 -4.46153846153846,-4.61538461538462 -4.61538461538462,-4.76923076923077 -4.76923076923077,-4.92307692307692 -4.92307692307692,-5.07692307692308 -5.07692307692308,-5.23076923076923 -5.23076923076923,-5.38461538461538 -5.38461538461538,-5.53846153846154 -5.53846153846154,-5.69230769230769 -5.69230769230769,-5.84615384615385 -5.84615384615385,-6.0 -6.0,-6.15384615384615 -6.15384615384615,-6.30769230769231 -6.30769230769231,-6.46153846153846 -6.46153846153846,-6.61538461538462 -6.61538461538462,-6.76923076923077 -6.76923076923077,-6.92307692307692 -6.92307692307692,-7.07692307692308 -7.07692307692308,-7.23076923076923 -7.23076923076923,-7.38461538461539 -7.38461538461539,-7.53846153846154 -7.53846153846154,-7.69230769230769 -7.69230769230769,-7.84615384615385 -7.84615384615385,-8 -8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-2 -2,-2.15384615384615 -2.15384615384615,-2.30769230769231 -2.30769230769231,-2.46153846153846 -2.46153846153846,-2.61538461538461 -2.61538461538461,-2.76923076923077 -2.76923076923077,-2.92307692307692 -2.92307692307692,-3.07692307692308 -3.07692307692308,-3.23076923076923 -3.23076923076923,-3.38461538461538 -3.38461538461538,-3.53846153846154 -3.53846153846154,-3.69230769230769 -3.69230769230769,-3.84615384615385 -3.84615384615385,-4 -4,-4.15384615384615 -4.15384615384615,-4.30769230769231 -4.30769230769231,-4.46153846153846 -4.46153846153846,-4.61538461538462 -4.61538461538462,-4.76923076923077 -4.76923076923077,-4.92307692307692 -4.92307692307692,-5.07692307692308 -5.07692307692308,-5.23076923076923 -5.23076923076923,-5.38461538461538 -5.38461538461538,-5.53846153846154 -5.53846153846154,-5.69230769230769 -5.69230769230769,-5.84615384615385 -5.84615384615385,-6.0 -6.0,-6.15384615384615 -6.15384615384615,-6.30769230769231 -6.30769230769231,-6.46153846153846 -6.46153846153846,-6.61538461538462 -6.61538461538462,-6.76923076923077 -6.76923076923077,-6.92307692307692 -6.92307692307692,-7.07692307692308 -7.07692307692308,-7.23076923076923 -7.23076923076923,-7.38461538461539 -7.38461538461539,-7.53846153846154 -7.53846153846154,-7.69230769230769 -7.69230769230769,-7.84615384615385 -7.84615384615385,-8 -8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):37 -# EntityHandle (String) = 225 -# LINESTRING (-8 -1,-7.62837370825536 -0.987348067229724,-7.25775889681215 -0.975707614760869,-6.88916704597178 -0.966090122894857,-6.52360963603567 -0.959507071933107,-6.16209814730525 -0.956969942177043,-5.80564406008193 -0.959490213928084,-5.45525885466714 -0.968079367487651,-5.11195401136229 -0.983748883157167,-4.77674101046882 -1.00751024123805,-4.45063133228814 -1.04037492203173,-4.13463645712167 -1.08335440583961,-3.82976786527082 -1.13746017296313,-3.53703703703704 -1.2037037037037,-3.25745545272173 -1.28309647836275,-2.99203459262631 -1.37664997724169,-2.74178593705221 -1.48537568064195,-2.50772096630085 -1.61028506886495,-2.29085116067365 -1.75238962221211,-2.09218800047203 -1.91270082098484,-1.91270082098485 -2.09218800047202,-1.75238962221211 -2.29085116067364,-1.61028506886495 -2.50772096630085,-1.48537568064195 -2.74178593705221,-1.37664997724169 -2.99203459262631,-1.28309647836275 -3.25745545272172,-1.2037037037037 -3.53703703703703,-1.13746017296313 -3.82976786527082,-1.08335440583961 -4.13463645712166,-1.04037492203173 -4.45063133228814,-1.00751024123805 -4.77674101046882,-0.983748883157167 -5.11195401136229,-0.968079367487652 -5.45525885466714,-0.959490213928084 -5.80564406008193,-0.956969942177043 -6.16209814730525,-0.959507071933108 -6.52360963603567,-0.966090122894857 -6.88916704597178,-0.975707614760869 -7.25775889681216,-0.987348067229724 -7.62837370825537,-1 -8) + # OGRFeature(entities):37 + # EntityHandle (String) = 225 + # LINESTRING (-8 -1,-7.62837370825536 -0.987348067229724,-7.25775889681215 -0.975707614760869,-6.88916704597178 -0.966090122894857,-6.52360963603567 -0.959507071933107,-6.16209814730525 -0.956969942177043,-5.80564406008193 -0.959490213928084,-5.45525885466714 -0.968079367487651,-5.11195401136229 -0.983748883157167,-4.77674101046882 -1.00751024123805,-4.45063133228814 -1.04037492203173,-4.13463645712167 -1.08335440583961,-3.82976786527082 -1.13746017296313,-3.53703703703704 -1.2037037037037,-3.25745545272173 -1.28309647836275,-2.99203459262631 -1.37664997724169,-2.74178593705221 -1.48537568064195,-2.50772096630085 -1.61028506886495,-2.29085116067365 -1.75238962221211,-2.09218800047203 -1.91270082098484,-1.91270082098485 -2.09218800047202,-1.75238962221211 -2.29085116067364,-1.61028506886495 -2.50772096630085,-1.48537568064195 -2.74178593705221,-1.37664997724169 -2.99203459262631,-1.28309647836275 -3.25745545272172,-1.2037037037037 -3.53703703703703,-1.13746017296313 -3.82976786527082,-1.08335440583961 -4.13463645712166,-1.04037492203173 -4.45063133228814,-1.00751024123805 -4.77674101046882,-0.983748883157167 -5.11195401136229,-0.968079367487652 -5.45525885466714,-0.959490213928084 -5.80564406008193,-0.956969942177043 -6.16209814730525,-0.959507071933108 -6.52360963603567,-0.966090122894857 -6.88916704597178,-0.975707614760869 -7.25775889681216,-0.987348067229724 -7.62837370825537,-1 -8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-8 -1,-7.62837370825536 -0.987348067229724,-7.25775889681215 -0.975707614760869,-6.88916704597178 -0.966090122894857,-6.52360963603567 -0.959507071933107,-6.16209814730525 -0.956969942177043,-5.80564406008193 -0.959490213928084,-5.45525885466714 -0.968079367487651,-5.11195401136229 -0.983748883157167,-4.77674101046882 -1.00751024123805,-4.45063133228814 -1.04037492203173,-4.13463645712167 -1.08335440583961,-3.82976786527082 -1.13746017296313,-3.53703703703704 -1.2037037037037,-3.25745545272173 -1.28309647836275,-2.99203459262631 -1.37664997724169,-2.74178593705221 -1.48537568064195,-2.50772096630085 -1.61028506886495,-2.29085116067365 -1.75238962221211,-2.09218800047203 -1.91270082098484,-1.91270082098485 -2.09218800047202,-1.75238962221211 -2.29085116067364,-1.61028506886495 -2.50772096630085,-1.48537568064195 -2.74178593705221,-1.37664997724169 -2.99203459262631,-1.28309647836275 -3.25745545272172,-1.2037037037037 -3.53703703703703,-1.13746017296313 -3.82976786527082,-1.08335440583961 -4.13463645712166,-1.04037492203173 -4.45063133228814,-1.00751024123805 -4.77674101046882,-0.983748883157167 -5.11195401136229,-0.968079367487652 -5.45525885466714,-0.959490213928084 -5.80564406008193,-0.956969942177043 -6.16209814730525,-0.959507071933108 -6.52360963603567,-0.966090122894857 -6.88916704597178,-0.975707614760869 -7.25775889681216,-0.987348067229724 -7.62837370825537,-1 -8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-8 -1,-7.62837370825536 -0.987348067229724,-7.25775889681215 -0.975707614760869,-6.88916704597178 -0.966090122894857,-6.52360963603567 -0.959507071933107,-6.16209814730525 -0.956969942177043,-5.80564406008193 -0.959490213928084,-5.45525885466714 -0.968079367487651,-5.11195401136229 -0.983748883157167,-4.77674101046882 -1.00751024123805,-4.45063133228814 -1.04037492203173,-4.13463645712167 -1.08335440583961,-3.82976786527082 -1.13746017296313,-3.53703703703704 -1.2037037037037,-3.25745545272173 -1.28309647836275,-2.99203459262631 -1.37664997724169,-2.74178593705221 -1.48537568064195,-2.50772096630085 -1.61028506886495,-2.29085116067365 -1.75238962221211,-2.09218800047203 -1.91270082098484,-1.91270082098485 -2.09218800047202,-1.75238962221211 -2.29085116067364,-1.61028506886495 -2.50772096630085,-1.48537568064195 -2.74178593705221,-1.37664997724169 -2.99203459262631,-1.28309647836275 -3.25745545272172,-1.2037037037037 -3.53703703703703,-1.13746017296313 -3.82976786527082,-1.08335440583961 -4.13463645712166,-1.04037492203173 -4.45063133228814,-1.00751024123805 -4.77674101046882,-0.983748883157167 -5.11195401136229,-0.968079367487652 -5.45525885466714,-0.959490213928084 -5.80564406008193,-0.956969942177043 -6.16209814730525,-0.959507071933108 -6.52360963603567,-0.966090122894857 -6.88916704597178,-0.975707614760869 -7.25775889681216,-0.987348067229724 -7.62837370825537,-1 -8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):38 -# EntityHandle (String) = 226 -# POINT Z (-7 -7 0) + # OGRFeature(entities):38 + # EntityHandle (String) = 226 + # POINT Z (-7 -7 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-7 -7 0)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-7 -7 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):39 -# EntityHandle (String) = 227 -# POINT Z (4 -4 -5e-16) + # OGRFeature(entities):39 + # EntityHandle (String) = 227 + # POINT Z (4 -4 -5e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (4 -4 -5e-16)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (4 -4 -5e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):40 -# EntityHandle (String) = 228 -# LINESTRING Z (0 0 0,1 -1 -1e-16) + # OGRFeature(entities):40 + # EntityHandle (String) = 228 + # LINESTRING Z (0 0 0,1 -1 -1e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,1 -1 -1e-16)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (0 0 0,1 -1 -1e-16)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):41 -# EntityHandle (String) = 229 -# LINESTRING Z (1 -1 -1E-16,2 -1 -1E-16,1 -2 -2E-16,1 -1 -1E-16) + # OGRFeature(entities):41 + # EntityHandle (String) = 229 + # LINESTRING Z (1 -1 -1E-16,2 -1 -1E-16,1 -2 -2E-16,1 -1 -1E-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1 -1 -1E-16,2 -1 -1E-16,1 -2 -2E-16,1 -1 -1E-16)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (1 -1 -1E-16,2 -1 -1E-16,1 -2 -2E-16,1 -1 -1E-16)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):42 -# EntityHandle (String) = 22A -# LINESTRING Z (1 -1 -1e-16,1 -2 -2e-16,2 -2 -2e-16,1 -1 -1e-16) + # OGRFeature(entities):42 + # EntityHandle (String) = 22A + # LINESTRING Z (1 -1 -1e-16,1 -2 -2e-16,2 -2 -2e-16,1 -1 -1e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1 -1 -1e-16,1 -2 -2e-16,2 -2 -2e-16,1 -1 -1e-16)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (1 -1 -1e-16,1 -2 -2e-16,2 -2 -2e-16,1 -1 -1e-16)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):43 -# EntityHandle (String) = 22F -# LINESTRING Z (2 -4 -4e-16,2.00487189948035 -4.13951294748825 -4.13951294748825e-16,2.01946386251686 -4.27834620192013 -4.27834620192013e-16,2.04370479853239 -4.41582338163552 -4.41582338163552e-16,2.07747660812336 -4.551274711634 -4.551274711634e-16,2.12061475842818 -4.68404028665134 -4.68404028665134e-16,2.1729090847148 -4.8134732861516 -4.8134732861516e-16,2.23410481428215 -4.93894312557178 -4.93894312557178e-16,2.30390380768715 -5.05983852846641 -5.05983852846641e-16,2.38196601125011 -5.17557050458495 -5.17557050458495e-16,2.46791111376204 -5.28557521937308 -5.28557521937308e-16,2.5613203993227 -5.38931674091799 -5.38931674091799e-16,2.66173878728228 -5.48628965095479 -5.48628965095479e-16,2.76867704934868 -5.57602150721344 -5.57602150721344e-16,2.88161419305851 -5.65807514511008 -5.65807514511008e-16,3.0 -5.73205080756888 -5.73205080756888e-16,3.12325770642185 -5.79758809259833 -5.79758809259833e-16,3.25078681316818 -5.85436770913357 -5.85436770913357e-16,3.38196601125011 -5.90211303259031 -5.90211303259031e-16,3.51615620880066 -5.94059145255199 -5.94059145255199e-16,3.65270364466614 -5.96961550602442 -5.96961550602442e-16,3.79094307346469 -5.98904379073655 -5.98904379073655e-16,3.930201006595 -5.99878165403819 -5.99878165403819e-16,4.069798993405 -5.99878165403819 -5.99878165403819e-16,4.20905692653531 -5.98904379073655 -5.98904379073655e-16,4.34729635533386 -5.96961550602442 -5.96961550602442e-16,4.48384379119934 -5.94059145255199 -5.94059145255199e-16,4.61803398874989 -5.90211303259031 -5.90211303259031e-16,4.74921318683182 -5.85436770913357 -5.85436770913357e-16,4.87674229357815 -5.79758809259833 -5.79758809259833e-16,5.0 -5.73205080756888 -5.73205080756888e-16,5.11838580694149 -5.65807514511008 -5.65807514511008e-16,5.23132295065132 -5.57602150721344 -5.57602150721344e-16,5.33826121271772 -5.48628965095479 -5.48628965095479e-16,5.4386796006773 -5.38931674091799 -5.38931674091799e-16,5.53208888623796 -5.28557521937308 -5.28557521937308e-16,5.61803398874989 -5.17557050458495 -5.17557050458495e-16,5.69609619231285 -5.05983852846641 -5.05983852846641e-16,5.76589518571785 -4.93894312557178 -4.93894312557178e-16,5.8270909152852 -4.8134732861516 -4.8134732861516e-16,5.87938524157182 -4.68404028665134 -4.68404028665134e-16,5.92252339187664 -4.551274711634 -4.551274711634e-16,5.95629520146761 -4.41582338163552 -4.41582338163552e-16,5.98053613748314 -4.27834620192013 -4.27834620192013e-16,5.99512810051965 -4.13951294748825 -4.13951294748825e-16,6 -4 -4e-16,5.99512810051965 -3.86048705251175 -3.86048705251175e-16,5.98053613748314 -3.72165379807987 -3.72165379807987e-16,5.95629520146761 -3.58417661836448 -3.58417661836448e-16,5.92252339187664 -3.448725288366 -3.448725288366e-16, -# 5.87938524157182 -3.31595971334866 -3.31595971334866e-16,5.8270909152852 -3.1865267138484 -3.1865267138484e-16,5.76589518571785 -3.06105687442822 -3.06105687442822e-16,5.69609619231285 -2.94016147153359 -2.94016147153359e-16,5.61803398874989 -2.82442949541505 -2.82442949541505e-16,5.53208888623796 -2.71442478062692 -2.71442478062692e-16,5.4386796006773 -2.61068325908201 -2.61068325908201e-16,5.33826121271772 -2.51371034904521 -2.51371034904521e-16,5.23132295065132 -2.42397849278656 -2.42397849278656e-16,5.11838580694149 -2.34192485488992 -2.34192485488992e-16,5.0 -2.26794919243112 -2.26794919243112e-16,4.87674229357816 -2.20241190740167 -2.20241190740167e-16,4.74921318683182 -2.14563229086643 -2.14563229086643e-16,4.61803398874989 -2.09788696740969 -2.09788696740969e-16,4.48384379119934 -2.05940854744801 -2.05940854744801e-16,4.34729635533386 -2.03038449397558 -2.03038449397558e-16,4.20905692653531 -2.01095620926345 -2.01095620926345e-16,4.069798993405 -2.00121834596181 -2.00121834596181e-16,3.930201006595 -2.00121834596181 -2.00121834596181e-16,3.79094307346469 -2.01095620926345 -2.01095620926345e-16,3.65270364466614 -2.03038449397558 -2.03038449397558e-16,3.51615620880067 -2.05940854744801 -2.05940854744801e-16,3.38196601125011 -2.09788696740969 -2.09788696740969e-16,3.25078681316818 -2.14563229086643 -2.14563229086643e-16,3.12325770642185 -2.20241190740167 -2.20241190740167e-16,3.0 -2.26794919243112 -2.26794919243112e-16,2.88161419305851 -2.34192485488992 -2.34192485488992e-16,2.76867704934868 -2.42397849278656 -2.42397849278656e-16,2.66173878728228 -2.51371034904521 -2.51371034904521e-16,2.5613203993227 -2.610683259082 -2.610683259082e-16,2.46791111376204 -2.71442478062692 -2.71442478062692e-16,2.38196601125011 -2.82442949541505 -2.82442949541505e-16,2.30390380768715 -2.94016147153359 -2.94016147153359e-16,2.23410481428215 -3.06105687442822 -3.06105687442822e-16,2.1729090847148 -3.1865267138484 -3.1865267138484e-16,2.12061475842818 -3.31595971334866 -3.31595971334866e-16,2.07747660812336 -3.448725288366 -3.448725288366e-16,2.04370479853239 -3.58417661836448 -3.58417661836448e-16,2.01946386251686 -3.72165379807987 -3.72165379807987e-16,2.00487189948035 -3.86048705251175 -3.86048705251175e-16,2.0 -4.0 -4e-16) + # OGRFeature(entities):43 + # EntityHandle (String) = 22F + # LINESTRING Z (2 -4 -4e-16,2.00487189948035 -4.13951294748825 -4.13951294748825e-16,2.01946386251686 -4.27834620192013 -4.27834620192013e-16,2.04370479853239 -4.41582338163552 -4.41582338163552e-16,2.07747660812336 -4.551274711634 -4.551274711634e-16,2.12061475842818 -4.68404028665134 -4.68404028665134e-16,2.1729090847148 -4.8134732861516 -4.8134732861516e-16,2.23410481428215 -4.93894312557178 -4.93894312557178e-16,2.30390380768715 -5.05983852846641 -5.05983852846641e-16,2.38196601125011 -5.17557050458495 -5.17557050458495e-16,2.46791111376204 -5.28557521937308 -5.28557521937308e-16,2.5613203993227 -5.38931674091799 -5.38931674091799e-16,2.66173878728228 -5.48628965095479 -5.48628965095479e-16,2.76867704934868 -5.57602150721344 -5.57602150721344e-16,2.88161419305851 -5.65807514511008 -5.65807514511008e-16,3.0 -5.73205080756888 -5.73205080756888e-16,3.12325770642185 -5.79758809259833 -5.79758809259833e-16,3.25078681316818 -5.85436770913357 -5.85436770913357e-16,3.38196601125011 -5.90211303259031 -5.90211303259031e-16,3.51615620880066 -5.94059145255199 -5.94059145255199e-16,3.65270364466614 -5.96961550602442 -5.96961550602442e-16,3.79094307346469 -5.98904379073655 -5.98904379073655e-16,3.930201006595 -5.99878165403819 -5.99878165403819e-16,4.069798993405 -5.99878165403819 -5.99878165403819e-16,4.20905692653531 -5.98904379073655 -5.98904379073655e-16,4.34729635533386 -5.96961550602442 -5.96961550602442e-16,4.48384379119934 -5.94059145255199 -5.94059145255199e-16,4.61803398874989 -5.90211303259031 -5.90211303259031e-16,4.74921318683182 -5.85436770913357 -5.85436770913357e-16,4.87674229357815 -5.79758809259833 -5.79758809259833e-16,5.0 -5.73205080756888 -5.73205080756888e-16,5.11838580694149 -5.65807514511008 -5.65807514511008e-16,5.23132295065132 -5.57602150721344 -5.57602150721344e-16,5.33826121271772 -5.48628965095479 -5.48628965095479e-16,5.4386796006773 -5.38931674091799 -5.38931674091799e-16,5.53208888623796 -5.28557521937308 -5.28557521937308e-16,5.61803398874989 -5.17557050458495 -5.17557050458495e-16,5.69609619231285 -5.05983852846641 -5.05983852846641e-16,5.76589518571785 -4.93894312557178 -4.93894312557178e-16,5.8270909152852 -4.8134732861516 -4.8134732861516e-16,5.87938524157182 -4.68404028665134 -4.68404028665134e-16,5.92252339187664 -4.551274711634 -4.551274711634e-16,5.95629520146761 -4.41582338163552 -4.41582338163552e-16,5.98053613748314 -4.27834620192013 -4.27834620192013e-16,5.99512810051965 -4.13951294748825 -4.13951294748825e-16,6 -4 -4e-16,5.99512810051965 -3.86048705251175 -3.86048705251175e-16,5.98053613748314 -3.72165379807987 -3.72165379807987e-16,5.95629520146761 -3.58417661836448 -3.58417661836448e-16,5.92252339187664 -3.448725288366 -3.448725288366e-16, + # 5.87938524157182 -3.31595971334866 -3.31595971334866e-16,5.8270909152852 -3.1865267138484 -3.1865267138484e-16,5.76589518571785 -3.06105687442822 -3.06105687442822e-16,5.69609619231285 -2.94016147153359 -2.94016147153359e-16,5.61803398874989 -2.82442949541505 -2.82442949541505e-16,5.53208888623796 -2.71442478062692 -2.71442478062692e-16,5.4386796006773 -2.61068325908201 -2.61068325908201e-16,5.33826121271772 -2.51371034904521 -2.51371034904521e-16,5.23132295065132 -2.42397849278656 -2.42397849278656e-16,5.11838580694149 -2.34192485488992 -2.34192485488992e-16,5.0 -2.26794919243112 -2.26794919243112e-16,4.87674229357816 -2.20241190740167 -2.20241190740167e-16,4.74921318683182 -2.14563229086643 -2.14563229086643e-16,4.61803398874989 -2.09788696740969 -2.09788696740969e-16,4.48384379119934 -2.05940854744801 -2.05940854744801e-16,4.34729635533386 -2.03038449397558 -2.03038449397558e-16,4.20905692653531 -2.01095620926345 -2.01095620926345e-16,4.069798993405 -2.00121834596181 -2.00121834596181e-16,3.930201006595 -2.00121834596181 -2.00121834596181e-16,3.79094307346469 -2.01095620926345 -2.01095620926345e-16,3.65270364466614 -2.03038449397558 -2.03038449397558e-16,3.51615620880067 -2.05940854744801 -2.05940854744801e-16,3.38196601125011 -2.09788696740969 -2.09788696740969e-16,3.25078681316818 -2.14563229086643 -2.14563229086643e-16,3.12325770642185 -2.20241190740167 -2.20241190740167e-16,3.0 -2.26794919243112 -2.26794919243112e-16,2.88161419305851 -2.34192485488992 -2.34192485488992e-16,2.76867704934868 -2.42397849278656 -2.42397849278656e-16,2.66173878728228 -2.51371034904521 -2.51371034904521e-16,2.5613203993227 -2.610683259082 -2.610683259082e-16,2.46791111376204 -2.71442478062692 -2.71442478062692e-16,2.38196601125011 -2.82442949541505 -2.82442949541505e-16,2.30390380768715 -2.94016147153359 -2.94016147153359e-16,2.23410481428215 -3.06105687442822 -3.06105687442822e-16,2.1729090847148 -3.1865267138484 -3.1865267138484e-16,2.12061475842818 -3.31595971334866 -3.31595971334866e-16,2.07747660812336 -3.448725288366 -3.448725288366e-16,2.04370479853239 -3.58417661836448 -3.58417661836448e-16,2.01946386251686 -3.72165379807987 -3.72165379807987e-16,2.00487189948035 -3.86048705251175 -3.86048705251175e-16,2.0 -4.0 -4e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 -4 -4e-16,2.00487189948035 -4.13951294748825 -4.13951294748825e-16,2.01946386251686 -4.27834620192013 -4.27834620192013e-16,2.04370479853239 -4.41582338163552 -4.41582338163552e-16,2.07747660812336 -4.551274711634 -4.551274711634e-16,2.12061475842818 -4.68404028665134 -4.68404028665134e-16,2.1729090847148 -4.8134732861516 -4.8134732861516e-16,2.23410481428215 -4.93894312557178 -4.93894312557178e-16,2.30390380768715 -5.05983852846641 -5.05983852846641e-16,2.38196601125011 -5.17557050458495 -5.17557050458495e-16,2.46791111376204 -5.28557521937308 -5.28557521937308e-16,2.5613203993227 -5.38931674091799 -5.38931674091799e-16,2.66173878728228 -5.48628965095479 -5.48628965095479e-16,2.76867704934868 -5.57602150721344 -5.57602150721344e-16,2.88161419305851 -5.65807514511008 -5.65807514511008e-16,3.0 -5.73205080756888 -5.73205080756888e-16,3.12325770642185 -5.79758809259833 -5.79758809259833e-16,3.25078681316818 -5.85436770913357 -5.85436770913357e-16,3.38196601125011 -5.90211303259031 -5.90211303259031e-16,3.51615620880066 -5.94059145255199 -5.94059145255199e-16,3.65270364466614 -5.96961550602442 -5.96961550602442e-16,3.79094307346469 -5.98904379073655 -5.98904379073655e-16,3.930201006595 -5.99878165403819 -5.99878165403819e-16,4.069798993405 -5.99878165403819 -5.99878165403819e-16,4.20905692653531 -5.98904379073655 -5.98904379073655e-16,4.34729635533386 -5.96961550602442 -5.96961550602442e-16,4.48384379119934 -5.94059145255199 -5.94059145255199e-16,4.61803398874989 -5.90211303259031 -5.90211303259031e-16,4.74921318683182 -5.85436770913357 -5.85436770913357e-16,4.87674229357815 -5.79758809259833 -5.79758809259833e-16,5.0 -5.73205080756888 -5.73205080756888e-16,5.11838580694149 -5.65807514511008 -5.65807514511008e-16,5.23132295065132 -5.57602150721344 -5.57602150721344e-16,5.33826121271772 -5.48628965095479 -5.48628965095479e-16,5.4386796006773 -5.38931674091799 -5.38931674091799e-16,5.53208888623796 -5.28557521937308 -5.28557521937308e-16,5.61803398874989 -5.17557050458495 -5.17557050458495e-16,5.69609619231285 -5.05983852846641 -5.05983852846641e-16,5.76589518571785 -4.93894312557178 -4.93894312557178e-16,5.8270909152852 -4.8134732861516 -4.8134732861516e-16,5.87938524157182 -4.68404028665134 -4.68404028665134e-16,5.92252339187664 -4.551274711634 -4.551274711634e-16,5.95629520146761 -4.41582338163552 -4.41582338163552e-16,5.98053613748314 -4.27834620192013 -4.27834620192013e-16,5.99512810051965 -4.13951294748825 -4.13951294748825e-16,6 -4 -4e-16,5.99512810051965 -3.86048705251175 -3.86048705251175e-16,5.98053613748314 -3.72165379807987 -3.72165379807987e-16,5.95629520146761 -3.58417661836448 -3.58417661836448e-16,5.92252339187664 -3.448725288366 -3.448725288366e-16,5.87938524157182 -3.31595971334866 -3.31595971334866e-16,5.8270909152852 -3.1865267138484 -3.1865267138484e-16,5.76589518571785 -3.06105687442822 -3.06105687442822e-16,5.69609619231285 -2.94016147153359 -2.94016147153359e-16,5.61803398874989 -2.82442949541505 -2.82442949541505e-16,5.53208888623796 -2.71442478062692 -2.71442478062692e-16,5.4386796006773 -2.61068325908201 -2.61068325908201e-16,5.33826121271772 -2.51371034904521 -2.51371034904521e-16,' + - '5.23132295065132 -2.42397849278656 -2.42397849278656e-16,5.11838580694149 -2.34192485488992 -2.34192485488992e-16,5.0 -2.26794919243112 -2.26794919243112e-16,4.87674229357816 -2.20241190740167 -2.20241190740167e-16,4.74921318683182 -2.14563229086643 -2.14563229086643e-16,4.61803398874989 -2.09788696740969 -2.09788696740969e-16,4.48384379119934 -2.05940854744801 -2.05940854744801e-16,4.34729635533386 -2.03038449397558 -2.03038449397558e-16,4.20905692653531 -2.01095620926345 -2.01095620926345e-16,4.069798993405 -2.00121834596181 -2.00121834596181e-16,3.930201006595 -2.00121834596181 -2.00121834596181e-16,3.79094307346469 -2.01095620926345 -2.01095620926345e-16,3.65270364466614 -2.03038449397558 -2.03038449397558e-16,3.51615620880067 -2.05940854744801 -2.05940854744801e-16,3.38196601125011 -2.09788696740969 -2.09788696740969e-16,3.25078681316818 -2.14563229086643 -2.14563229086643e-16,3.12325770642185 -2.20241190740167 -2.20241190740167e-16,3.0 -2.26794919243112 -2.26794919243112e-16,2.88161419305851 -2.34192485488992 -2.34192485488992e-16,2.76867704934868 -2.42397849278656 -2.42397849278656e-16,2.66173878728228 -2.51371034904521 -2.51371034904521e-16,2.5613203993227 -2.610683259082 -2.610683259082e-16,2.46791111376204 -2.71442478062692 -2.71442478062692e-16,2.38196601125011 -2.82442949541505 -2.82442949541505e-16,2.30390380768715 -2.94016147153359 -2.94016147153359e-16,2.23410481428215 -3.06105687442822 -3.06105687442822e-16,2.1729090847148 -3.1865267138484 -3.1865267138484e-16,2.12061475842818 -3.31595971334866 -3.31595971334866e-16,2.07747660812336 -3.448725288366 -3.448725288366e-16,2.04370479853239 -3.58417661836448 -3.58417661836448e-16,2.01946386251686 -3.72165379807987 -3.72165379807987e-16,2.00487189948035 -3.86048705251175 -3.86048705251175e-16,2.0 -4.0 -4e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2 -4 -4e-16,2.00487189948035 -4.13951294748825 -4.13951294748825e-16,2.01946386251686 -4.27834620192013 -4.27834620192013e-16,2.04370479853239 -4.41582338163552 -4.41582338163552e-16,2.07747660812336 -4.551274711634 -4.551274711634e-16,2.12061475842818 -4.68404028665134 -4.68404028665134e-16,2.1729090847148 -4.8134732861516 -4.8134732861516e-16,2.23410481428215 -4.93894312557178 -4.93894312557178e-16,2.30390380768715 -5.05983852846641 -5.05983852846641e-16,2.38196601125011 -5.17557050458495 -5.17557050458495e-16,2.46791111376204 -5.28557521937308 -5.28557521937308e-16,2.5613203993227 -5.38931674091799 -5.38931674091799e-16,2.66173878728228 -5.48628965095479 -5.48628965095479e-16,2.76867704934868 -5.57602150721344 -5.57602150721344e-16,2.88161419305851 -5.65807514511008 -5.65807514511008e-16,3.0 -5.73205080756888 -5.73205080756888e-16,3.12325770642185 -5.79758809259833 -5.79758809259833e-16,3.25078681316818 -5.85436770913357 -5.85436770913357e-16,3.38196601125011 -5.90211303259031 -5.90211303259031e-16,3.51615620880066 -5.94059145255199 -5.94059145255199e-16,3.65270364466614 -5.96961550602442 -5.96961550602442e-16,3.79094307346469 -5.98904379073655 -5.98904379073655e-16,3.930201006595 -5.99878165403819 -5.99878165403819e-16,4.069798993405 -5.99878165403819 -5.99878165403819e-16,4.20905692653531 -5.98904379073655 -5.98904379073655e-16,4.34729635533386 -5.96961550602442 -5.96961550602442e-16,4.48384379119934 -5.94059145255199 -5.94059145255199e-16,4.61803398874989 -5.90211303259031 -5.90211303259031e-16,4.74921318683182 -5.85436770913357 -5.85436770913357e-16,4.87674229357815 -5.79758809259833 -5.79758809259833e-16,5.0 -5.73205080756888 -5.73205080756888e-16,5.11838580694149 -5.65807514511008 -5.65807514511008e-16,5.23132295065132 -5.57602150721344 -5.57602150721344e-16,5.33826121271772 -5.48628965095479 -5.48628965095479e-16,5.4386796006773 -5.38931674091799 -5.38931674091799e-16,5.53208888623796 -5.28557521937308 -5.28557521937308e-16,5.61803398874989 -5.17557050458495 -5.17557050458495e-16,5.69609619231285 -5.05983852846641 -5.05983852846641e-16,5.76589518571785 -4.93894312557178 -4.93894312557178e-16,5.8270909152852 -4.8134732861516 -4.8134732861516e-16,5.87938524157182 -4.68404028665134 -4.68404028665134e-16,5.92252339187664 -4.551274711634 -4.551274711634e-16,5.95629520146761 -4.41582338163552 -4.41582338163552e-16,5.98053613748314 -4.27834620192013 -4.27834620192013e-16,5.99512810051965 -4.13951294748825 -4.13951294748825e-16,6 -4 -4e-16,5.99512810051965 -3.86048705251175 -3.86048705251175e-16,5.98053613748314 -3.72165379807987 -3.72165379807987e-16,5.95629520146761 -3.58417661836448 -3.58417661836448e-16,5.92252339187664 -3.448725288366 -3.448725288366e-16,5.87938524157182 -3.31595971334866 -3.31595971334866e-16,5.8270909152852 -3.1865267138484 -3.1865267138484e-16,5.76589518571785 -3.06105687442822 -3.06105687442822e-16,5.69609619231285 -2.94016147153359 -2.94016147153359e-16,5.61803398874989 -2.82442949541505 -2.82442949541505e-16,5.53208888623796 -2.71442478062692 -2.71442478062692e-16,5.4386796006773 -2.61068325908201 -2.61068325908201e-16,5.33826121271772 -2.51371034904521 -2.51371034904521e-16," + + "5.23132295065132 -2.42397849278656 -2.42397849278656e-16,5.11838580694149 -2.34192485488992 -2.34192485488992e-16,5.0 -2.26794919243112 -2.26794919243112e-16,4.87674229357816 -2.20241190740167 -2.20241190740167e-16,4.74921318683182 -2.14563229086643 -2.14563229086643e-16,4.61803398874989 -2.09788696740969 -2.09788696740969e-16,4.48384379119934 -2.05940854744801 -2.05940854744801e-16,4.34729635533386 -2.03038449397558 -2.03038449397558e-16,4.20905692653531 -2.01095620926345 -2.01095620926345e-16,4.069798993405 -2.00121834596181 -2.00121834596181e-16,3.930201006595 -2.00121834596181 -2.00121834596181e-16,3.79094307346469 -2.01095620926345 -2.01095620926345e-16,3.65270364466614 -2.03038449397558 -2.03038449397558e-16,3.51615620880067 -2.05940854744801 -2.05940854744801e-16,3.38196601125011 -2.09788696740969 -2.09788696740969e-16,3.25078681316818 -2.14563229086643 -2.14563229086643e-16,3.12325770642185 -2.20241190740167 -2.20241190740167e-16,3.0 -2.26794919243112 -2.26794919243112e-16,2.88161419305851 -2.34192485488992 -2.34192485488992e-16,2.76867704934868 -2.42397849278656 -2.42397849278656e-16,2.66173878728228 -2.51371034904521 -2.51371034904521e-16,2.5613203993227 -2.610683259082 -2.610683259082e-16,2.46791111376204 -2.71442478062692 -2.71442478062692e-16,2.38196601125011 -2.82442949541505 -2.82442949541505e-16,2.30390380768715 -2.94016147153359 -2.94016147153359e-16,2.23410481428215 -3.06105687442822 -3.06105687442822e-16,2.1729090847148 -3.1865267138484 -3.1865267138484e-16,2.12061475842818 -3.31595971334866 -3.31595971334866e-16,2.07747660812336 -3.448725288366 -3.448725288366e-16,2.04370479853239 -3.58417661836448 -3.58417661836448e-16,2.01946386251686 -3.72165379807987 -3.72165379807987e-16,2.00487189948035 -3.86048705251175 -3.86048705251175e-16,2.0 -4.0 -4e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):44 -# EntityHandle (String) = 230 -# LINESTRING Z (2 -4 -5e-16,2.00487189948035 -4.06975647374412 -5.06975647374413e-16,2.01946386251686 -4.13917310096007 -5.13917310096007e-16,2.04370479853239 -4.20791169081776 -5.20791169081776e-16,2.07747660812336 -4.275637355817 -5.275637355817e-16,2.12061475842818 -4.34202014332567 -5.34202014332567e-16,2.1729090847148 -4.4067366430758 -5.4067366430758e-16,2.23410481428215 -4.46947156278589 -5.46947156278589e-16,2.30390380768715 -4.52991926423321 -5.52991926423321e-16,2.38196601125011 -4.58778525229247 -5.58778525229247e-16,2.46791111376204 -4.64278760968654 -5.64278760968654e-16,2.5613203993227 -4.694658370459 -5.694658370459e-16,2.66173878728228 -4.74314482547739 -5.7431448254774e-16,2.76867704934868 -4.78801075360672 -5.78801075360672e-16,2.88161419305851 -4.82903757255504 -5.82903757255504e-16,3.0 -4.86602540378444 -5.86602540378444e-16,3.12325770642185 -4.89879404629917 -5.89879404629917e-16,3.25078681316818 -4.92718385456679 -5.92718385456679e-16,3.38196601125011 -4.95105651629515 -5.95105651629515e-16,3.51615620880067 -4.970295726276 -5.970295726276e-16,3.65270364466614 -4.98480775301221 -5.98480775301221e-16,3.79094307346469 -4.99452189536827 -5.99452189536827e-16,3.930201006595 -4.9993908270191 -5.9993908270191e-16,4.069798993405 -4.9993908270191 -5.9993908270191e-16,4.20905692653531 -4.99452189536827 -5.99452189536827e-16,4.34729635533386 -4.98480775301221 -5.98480775301221e-16,4.48384379119934 -4.970295726276 -5.970295726276e-16,4.61803398874989 -4.95105651629515 -5.95105651629515e-16,4.74921318683182 -4.92718385456679 -5.92718385456679e-16,4.87674229357816 -4.89879404629917 -5.89879404629917e-16,5.0 -4.86602540378444 -5.86602540378444e-16,5.11838580694149 -4.82903757255504 -5.82903757255504e-16,5.23132295065132 -4.78801075360672 -5.78801075360672e-16,5.33826121271772 -4.74314482547739 -5.74314482547739e-16,5.4386796006773 -4.694658370459 -5.694658370459e-16,5.53208888623796 -4.64278760968654 -5.64278760968654e-16,5.61803398874989 -4.58778525229247 -5.58778525229247e-16,5.69609619231285 -4.5299192642332 -5.52991926423321e-16,5.76589518571785 -4.46947156278589 -5.46947156278589e-16,5.8270909152852 -4.4067366430758 -5.4067366430758e-16,5.87938524157182 -4.34202014332567 -5.34202014332567e-16,5.92252339187664 -4.275637355817 -5.275637355817e-16,5.95629520146761 -4.20791169081776 -5.20791169081776e-16,5.98053613748314 -4.13917310096007 -5.13917310096007e-16,5.99512810051965 -4.06975647374412 -5.06975647374413e-16,6 -4 -5e-16,5.99512810051965 -3.93024352625587 -4.93024352625588e-16,5.98053613748314 -3.86082689903993 -4.86082689903993e-16,5.95629520146761 -3.79208830918224 -4.79208830918224e-16,5.92252339187664 -3.724362644183 -4.724362644183e-16,5.87938524157182 -3.65797985667433 -4.65797985667433e-16,5.8270909152852 -3.5932633569242 -4.5932633569242e-16,5.76589518571785 -3.53052843721411 -4.53052843721411e-16, -# 5.69609619231285 -3.4700807357668 -4.4700807357668e-16,5.61803398874989 -3.41221474770753 -4.41221474770753e-16,5.53208888623796 -3.35721239031346 -4.35721239031346e-16,5.4386796006773 -3.305341629541 -4.305341629541e-16,5.33826121271772 -3.25685517452261 -4.25685517452261e-16,5.23132295065132 -3.21198924639328 -4.21198924639328e-16,5.11838580694149 -3.17096242744496 -4.17096242744496e-16,5.0 -3.13397459621556 -4.13397459621556e-16,4.87674229357815 -3.10120595370083 -4.10120595370083e-16,4.74921318683182 -3.07281614543321 -4.07281614543321e-16,4.61803398874989 -3.04894348370485 -4.04894348370485e-16,4.48384379119934 -3.029704273724 -4.029704273724e-16,4.34729635533386 -3.01519224698779 -4.01519224698779e-16,4.20905692653531 -3.00547810463173 -4.00547810463173e-16,4.069798993405 -3.0006091729809 -4.0006091729809e-16,3.930201006595 -3.0006091729809 -4.0006091729809e-16,3.79094307346469 -3.00547810463173 -4.00547810463173e-16,3.65270364466614 -3.01519224698779 -4.01519224698779e-16,3.51615620880066 -3.029704273724 -4.029704273724e-16,3.38196601125011 -3.04894348370485 -4.04894348370485e-16,3.25078681316818 -3.07281614543321 -4.07281614543321e-16,3.12325770642185 -3.10120595370083 -4.10120595370083e-16,3.0 -3.13397459621556 -4.13397459621556e-16,2.88161419305851 -3.17096242744496 -4.17096242744496e-16,2.76867704934868 -3.21198924639328 -4.21198924639328e-16,2.66173878728228 -3.25685517452261 -4.25685517452261e-16,2.5613203993227 -3.305341629541 -4.305341629541e-16,2.46791111376204 -3.35721239031346 -4.35721239031346e-16,2.38196601125011 -3.41221474770753 -4.41221474770753e-16,2.30390380768715 -3.4700807357668 -4.4700807357668e-16,2.23410481428215 -3.53052843721411 -4.53052843721411e-16,2.1729090847148 -3.5932633569242 -4.5932633569242e-16,2.12061475842818 -3.65797985667433 -4.65797985667433e-16,2.07747660812336 -3.724362644183 -4.724362644183e-16,2.04370479853239 -3.79208830918224 -4.79208830918224e-16,2.01946386251686 -3.86082689903993 -4.86082689903993e-16,2.00487189948035 -3.93024352625587 -4.93024352625588e-16,2 -4 -5e-16) + # OGRFeature(entities):44 + # EntityHandle (String) = 230 + # LINESTRING Z (2 -4 -5e-16,2.00487189948035 -4.06975647374412 -5.06975647374413e-16,2.01946386251686 -4.13917310096007 -5.13917310096007e-16,2.04370479853239 -4.20791169081776 -5.20791169081776e-16,2.07747660812336 -4.275637355817 -5.275637355817e-16,2.12061475842818 -4.34202014332567 -5.34202014332567e-16,2.1729090847148 -4.4067366430758 -5.4067366430758e-16,2.23410481428215 -4.46947156278589 -5.46947156278589e-16,2.30390380768715 -4.52991926423321 -5.52991926423321e-16,2.38196601125011 -4.58778525229247 -5.58778525229247e-16,2.46791111376204 -4.64278760968654 -5.64278760968654e-16,2.5613203993227 -4.694658370459 -5.694658370459e-16,2.66173878728228 -4.74314482547739 -5.7431448254774e-16,2.76867704934868 -4.78801075360672 -5.78801075360672e-16,2.88161419305851 -4.82903757255504 -5.82903757255504e-16,3.0 -4.86602540378444 -5.86602540378444e-16,3.12325770642185 -4.89879404629917 -5.89879404629917e-16,3.25078681316818 -4.92718385456679 -5.92718385456679e-16,3.38196601125011 -4.95105651629515 -5.95105651629515e-16,3.51615620880067 -4.970295726276 -5.970295726276e-16,3.65270364466614 -4.98480775301221 -5.98480775301221e-16,3.79094307346469 -4.99452189536827 -5.99452189536827e-16,3.930201006595 -4.9993908270191 -5.9993908270191e-16,4.069798993405 -4.9993908270191 -5.9993908270191e-16,4.20905692653531 -4.99452189536827 -5.99452189536827e-16,4.34729635533386 -4.98480775301221 -5.98480775301221e-16,4.48384379119934 -4.970295726276 -5.970295726276e-16,4.61803398874989 -4.95105651629515 -5.95105651629515e-16,4.74921318683182 -4.92718385456679 -5.92718385456679e-16,4.87674229357816 -4.89879404629917 -5.89879404629917e-16,5.0 -4.86602540378444 -5.86602540378444e-16,5.11838580694149 -4.82903757255504 -5.82903757255504e-16,5.23132295065132 -4.78801075360672 -5.78801075360672e-16,5.33826121271772 -4.74314482547739 -5.74314482547739e-16,5.4386796006773 -4.694658370459 -5.694658370459e-16,5.53208888623796 -4.64278760968654 -5.64278760968654e-16,5.61803398874989 -4.58778525229247 -5.58778525229247e-16,5.69609619231285 -4.5299192642332 -5.52991926423321e-16,5.76589518571785 -4.46947156278589 -5.46947156278589e-16,5.8270909152852 -4.4067366430758 -5.4067366430758e-16,5.87938524157182 -4.34202014332567 -5.34202014332567e-16,5.92252339187664 -4.275637355817 -5.275637355817e-16,5.95629520146761 -4.20791169081776 -5.20791169081776e-16,5.98053613748314 -4.13917310096007 -5.13917310096007e-16,5.99512810051965 -4.06975647374412 -5.06975647374413e-16,6 -4 -5e-16,5.99512810051965 -3.93024352625587 -4.93024352625588e-16,5.98053613748314 -3.86082689903993 -4.86082689903993e-16,5.95629520146761 -3.79208830918224 -4.79208830918224e-16,5.92252339187664 -3.724362644183 -4.724362644183e-16,5.87938524157182 -3.65797985667433 -4.65797985667433e-16,5.8270909152852 -3.5932633569242 -4.5932633569242e-16,5.76589518571785 -3.53052843721411 -4.53052843721411e-16, + # 5.69609619231285 -3.4700807357668 -4.4700807357668e-16,5.61803398874989 -3.41221474770753 -4.41221474770753e-16,5.53208888623796 -3.35721239031346 -4.35721239031346e-16,5.4386796006773 -3.305341629541 -4.305341629541e-16,5.33826121271772 -3.25685517452261 -4.25685517452261e-16,5.23132295065132 -3.21198924639328 -4.21198924639328e-16,5.11838580694149 -3.17096242744496 -4.17096242744496e-16,5.0 -3.13397459621556 -4.13397459621556e-16,4.87674229357815 -3.10120595370083 -4.10120595370083e-16,4.74921318683182 -3.07281614543321 -4.07281614543321e-16,4.61803398874989 -3.04894348370485 -4.04894348370485e-16,4.48384379119934 -3.029704273724 -4.029704273724e-16,4.34729635533386 -3.01519224698779 -4.01519224698779e-16,4.20905692653531 -3.00547810463173 -4.00547810463173e-16,4.069798993405 -3.0006091729809 -4.0006091729809e-16,3.930201006595 -3.0006091729809 -4.0006091729809e-16,3.79094307346469 -3.00547810463173 -4.00547810463173e-16,3.65270364466614 -3.01519224698779 -4.01519224698779e-16,3.51615620880066 -3.029704273724 -4.029704273724e-16,3.38196601125011 -3.04894348370485 -4.04894348370485e-16,3.25078681316818 -3.07281614543321 -4.07281614543321e-16,3.12325770642185 -3.10120595370083 -4.10120595370083e-16,3.0 -3.13397459621556 -4.13397459621556e-16,2.88161419305851 -3.17096242744496 -4.17096242744496e-16,2.76867704934868 -3.21198924639328 -4.21198924639328e-16,2.66173878728228 -3.25685517452261 -4.25685517452261e-16,2.5613203993227 -3.305341629541 -4.305341629541e-16,2.46791111376204 -3.35721239031346 -4.35721239031346e-16,2.38196601125011 -3.41221474770753 -4.41221474770753e-16,2.30390380768715 -3.4700807357668 -4.4700807357668e-16,2.23410481428215 -3.53052843721411 -4.53052843721411e-16,2.1729090847148 -3.5932633569242 -4.5932633569242e-16,2.12061475842818 -3.65797985667433 -4.65797985667433e-16,2.07747660812336 -3.724362644183 -4.724362644183e-16,2.04370479853239 -3.79208830918224 -4.79208830918224e-16,2.01946386251686 -3.86082689903993 -4.86082689903993e-16,2.00487189948035 -3.93024352625587 -4.93024352625588e-16,2 -4 -5e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 -4 -5e-16,2.00487189948035 -4.06975647374412 -5.06975647374413e-16,2.01946386251686 -4.13917310096007 -5.13917310096007e-16,2.04370479853239 -4.20791169081776 -5.20791169081776e-16,2.07747660812336 -4.275637355817 -5.275637355817e-16,2.12061475842818 -4.34202014332567 -5.34202014332567e-16,2.1729090847148 -4.4067366430758 -5.4067366430758e-16,2.23410481428215 -4.46947156278589 -5.46947156278589e-16,2.30390380768715 -4.52991926423321 -5.52991926423321e-16,2.38196601125011 -4.58778525229247 -5.58778525229247e-16,2.46791111376204 -4.64278760968654 -5.64278760968654e-16,2.5613203993227 -4.694658370459 -5.694658370459e-16,2.66173878728228 -4.74314482547739 -5.7431448254774e-16,2.76867704934868 -4.78801075360672 -5.78801075360672e-16,2.88161419305851 -4.82903757255504 -5.82903757255504e-16,3.0 -4.86602540378444 -5.86602540378444e-16,3.12325770642185 -4.89879404629917 -5.89879404629917e-16,3.25078681316818 -4.92718385456679 -5.92718385456679e-16,3.38196601125011 -4.95105651629515 -5.95105651629515e-16,3.51615620880067 -4.970295726276 -5.970295726276e-16,3.65270364466614 -4.98480775301221 -5.98480775301221e-16,3.79094307346469 -4.99452189536827 -5.99452189536827e-16,3.930201006595 -4.9993908270191 -5.9993908270191e-16,4.069798993405 -4.9993908270191 -5.9993908270191e-16,4.20905692653531 -4.99452189536827 -5.99452189536827e-16,4.34729635533386 -4.98480775301221 -5.98480775301221e-16,4.48384379119934 -4.970295726276 -5.970295726276e-16,4.61803398874989 -4.95105651629515 -5.95105651629515e-16,4.74921318683182 -4.92718385456679 -5.92718385456679e-16,4.87674229357816 -4.89879404629917 -5.89879404629917e-16,5.0 -4.86602540378444 -5.86602540378444e-16,5.11838580694149 -4.82903757255504 -5.82903757255504e-16,5.23132295065132 -4.78801075360672 -5.78801075360672e-16,5.33826121271772 -4.74314482547739 -5.74314482547739e-16,5.4386796006773 -4.694658370459 -5.694658370459e-16,5.53208888623796 -4.64278760968654 -5.64278760968654e-16,5.61803398874989 -4.58778525229247 -5.58778525229247e-16,5.69609619231285 -4.5299192642332 -5.52991926423321e-16,5.76589518571785 -4.46947156278589 -5.46947156278589e-16,5.8270909152852 -4.4067366430758 -5.4067366430758e-16,5.87938524157182 -4.34202014332567 -5.34202014332567e-16,5.92252339187664 -4.275637355817 -5.275637355817e-16,5.95629520146761 -4.20791169081776 -5.20791169081776e-16,5.98053613748314 -4.13917310096007 -5.13917310096007e-16,5.99512810051965 -4.06975647374412 -5.06975647374413e-16,6 -4 -5e-16,5.99512810051965 -3.93024352625587 -4.93024352625588e-16,5.98053613748314 -3.86082689903993 -4.86082689903993e-16,5.95629520146761 -3.79208830918224 -4.79208830918224e-16,5.92252339187664 -3.724362644183 -4.724362644183e-16,5.87938524157182 -3.65797985667433 -4.65797985667433e-16,5.8270909152852 -3.5932633569242 -4.5932633569242e-16,5.76589518571785 -3.53052843721411 -4.53052843721411e-16,5.69609619231285 -3.4700807357668 -4.4700807357668e-16,5.61803398874989 -3.41221474770753 -4.41221474770753e-16,' + - '5.53208888623796 -3.35721239031346 -4.35721239031346e-16,5.4386796006773 -3.305341629541 -4.305341629541e-16,5.33826121271772 -3.25685517452261 -4.25685517452261e-16,5.23132295065132 -3.21198924639328 -4.21198924639328e-16,5.11838580694149 -3.17096242744496 -4.17096242744496e-16,5.0 -3.13397459621556 -4.13397459621556e-16,4.87674229357815 -3.10120595370083 -4.10120595370083e-16,4.74921318683182 -3.07281614543321 -4.07281614543321e-16,4.61803398874989 -3.04894348370485 -4.04894348370485e-16,4.48384379119934 -3.029704273724 -4.029704273724e-16,4.34729635533386 -3.01519224698779 -4.01519224698779e-16,4.20905692653531 -3.00547810463173 -4.00547810463173e-16,4.069798993405 -3.0006091729809 -4.0006091729809e-16,3.930201006595 -3.0006091729809 -4.0006091729809e-16,3.79094307346469 -3.00547810463173 -4.00547810463173e-16,3.65270364466614 -3.01519224698779 -4.01519224698779e-16,3.51615620880066 -3.029704273724 -4.029704273724e-16,3.38196601125011 -3.04894348370485 -4.04894348370485e-16,3.25078681316818 -3.07281614543321 -4.07281614543321e-16,3.12325770642185 -3.10120595370083 -4.10120595370083e-16,3.0 -3.13397459621556 -4.13397459621556e-16,2.88161419305851 -3.17096242744496 -4.17096242744496e-16,2.76867704934868 -3.21198924639328 -4.21198924639328e-16,2.66173878728228 -3.25685517452261 -4.25685517452261e-16,2.5613203993227 -3.305341629541 -4.305341629541e-16,2.46791111376204 -3.35721239031346 -4.35721239031346e-16,2.38196601125011 -3.41221474770753 -4.41221474770753e-16,2.30390380768715 -3.4700807357668 -4.4700807357668e-16,2.23410481428215 -3.53052843721411 -4.53052843721411e-16,2.1729090847148 -3.5932633569242 -4.5932633569242e-16,2.12061475842818 -3.65797985667433 -4.65797985667433e-16,2.07747660812336 -3.724362644183 -4.724362644183e-16,2.04370479853239 -3.79208830918224 -4.79208830918224e-16,2.01946386251686 -3.86082689903993 -4.86082689903993e-16,2.00487189948035 -3.93024352625587 -4.93024352625588e-16,2 -4 -5e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2 -4 -5e-16,2.00487189948035 -4.06975647374412 -5.06975647374413e-16,2.01946386251686 -4.13917310096007 -5.13917310096007e-16,2.04370479853239 -4.20791169081776 -5.20791169081776e-16,2.07747660812336 -4.275637355817 -5.275637355817e-16,2.12061475842818 -4.34202014332567 -5.34202014332567e-16,2.1729090847148 -4.4067366430758 -5.4067366430758e-16,2.23410481428215 -4.46947156278589 -5.46947156278589e-16,2.30390380768715 -4.52991926423321 -5.52991926423321e-16,2.38196601125011 -4.58778525229247 -5.58778525229247e-16,2.46791111376204 -4.64278760968654 -5.64278760968654e-16,2.5613203993227 -4.694658370459 -5.694658370459e-16,2.66173878728228 -4.74314482547739 -5.7431448254774e-16,2.76867704934868 -4.78801075360672 -5.78801075360672e-16,2.88161419305851 -4.82903757255504 -5.82903757255504e-16,3.0 -4.86602540378444 -5.86602540378444e-16,3.12325770642185 -4.89879404629917 -5.89879404629917e-16,3.25078681316818 -4.92718385456679 -5.92718385456679e-16,3.38196601125011 -4.95105651629515 -5.95105651629515e-16,3.51615620880067 -4.970295726276 -5.970295726276e-16,3.65270364466614 -4.98480775301221 -5.98480775301221e-16,3.79094307346469 -4.99452189536827 -5.99452189536827e-16,3.930201006595 -4.9993908270191 -5.9993908270191e-16,4.069798993405 -4.9993908270191 -5.9993908270191e-16,4.20905692653531 -4.99452189536827 -5.99452189536827e-16,4.34729635533386 -4.98480775301221 -5.98480775301221e-16,4.48384379119934 -4.970295726276 -5.970295726276e-16,4.61803398874989 -4.95105651629515 -5.95105651629515e-16,4.74921318683182 -4.92718385456679 -5.92718385456679e-16,4.87674229357816 -4.89879404629917 -5.89879404629917e-16,5.0 -4.86602540378444 -5.86602540378444e-16,5.11838580694149 -4.82903757255504 -5.82903757255504e-16,5.23132295065132 -4.78801075360672 -5.78801075360672e-16,5.33826121271772 -4.74314482547739 -5.74314482547739e-16,5.4386796006773 -4.694658370459 -5.694658370459e-16,5.53208888623796 -4.64278760968654 -5.64278760968654e-16,5.61803398874989 -4.58778525229247 -5.58778525229247e-16,5.69609619231285 -4.5299192642332 -5.52991926423321e-16,5.76589518571785 -4.46947156278589 -5.46947156278589e-16,5.8270909152852 -4.4067366430758 -5.4067366430758e-16,5.87938524157182 -4.34202014332567 -5.34202014332567e-16,5.92252339187664 -4.275637355817 -5.275637355817e-16,5.95629520146761 -4.20791169081776 -5.20791169081776e-16,5.98053613748314 -4.13917310096007 -5.13917310096007e-16,5.99512810051965 -4.06975647374412 -5.06975647374413e-16,6 -4 -5e-16,5.99512810051965 -3.93024352625587 -4.93024352625588e-16,5.98053613748314 -3.86082689903993 -4.86082689903993e-16,5.95629520146761 -3.79208830918224 -4.79208830918224e-16,5.92252339187664 -3.724362644183 -4.724362644183e-16,5.87938524157182 -3.65797985667433 -4.65797985667433e-16,5.8270909152852 -3.5932633569242 -4.5932633569242e-16,5.76589518571785 -3.53052843721411 -4.53052843721411e-16,5.69609619231285 -3.4700807357668 -4.4700807357668e-16,5.61803398874989 -3.41221474770753 -4.41221474770753e-16," + + "5.53208888623796 -3.35721239031346 -4.35721239031346e-16,5.4386796006773 -3.305341629541 -4.305341629541e-16,5.33826121271772 -3.25685517452261 -4.25685517452261e-16,5.23132295065132 -3.21198924639328 -4.21198924639328e-16,5.11838580694149 -3.17096242744496 -4.17096242744496e-16,5.0 -3.13397459621556 -4.13397459621556e-16,4.87674229357815 -3.10120595370083 -4.10120595370083e-16,4.74921318683182 -3.07281614543321 -4.07281614543321e-16,4.61803398874989 -3.04894348370485 -4.04894348370485e-16,4.48384379119934 -3.029704273724 -4.029704273724e-16,4.34729635533386 -3.01519224698779 -4.01519224698779e-16,4.20905692653531 -3.00547810463173 -4.00547810463173e-16,4.069798993405 -3.0006091729809 -4.0006091729809e-16,3.930201006595 -3.0006091729809 -4.0006091729809e-16,3.79094307346469 -3.00547810463173 -4.00547810463173e-16,3.65270364466614 -3.01519224698779 -4.01519224698779e-16,3.51615620880066 -3.029704273724 -4.029704273724e-16,3.38196601125011 -3.04894348370485 -4.04894348370485e-16,3.25078681316818 -3.07281614543321 -4.07281614543321e-16,3.12325770642185 -3.10120595370083 -4.10120595370083e-16,3.0 -3.13397459621556 -4.13397459621556e-16,2.88161419305851 -3.17096242744496 -4.17096242744496e-16,2.76867704934868 -3.21198924639328 -4.21198924639328e-16,2.66173878728228 -3.25685517452261 -4.25685517452261e-16,2.5613203993227 -3.305341629541 -4.305341629541e-16,2.46791111376204 -3.35721239031346 -4.35721239031346e-16,2.38196601125011 -3.41221474770753 -4.41221474770753e-16,2.30390380768715 -3.4700807357668 -4.4700807357668e-16,2.23410481428215 -3.53052843721411 -4.53052843721411e-16,2.1729090847148 -3.5932633569242 -4.5932633569242e-16,2.12061475842818 -3.65797985667433 -4.65797985667433e-16,2.07747660812336 -3.724362644183 -4.724362644183e-16,2.04370479853239 -3.79208830918224 -4.79208830918224e-16,2.01946386251686 -3.86082689903993 -4.86082689903993e-16,2.00487189948035 -3.93024352625587 -4.93024352625588e-16,2 -4 -5e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):45 -# EntityHandle (String) = 231 -# LINESTRING Z (2 -2 -2e-16,1.96657794502105 -2.03582232791524 -2.03582232791524e-16,1.93571660708646 -2.07387296203834 -2.07387296203834e-16,1.90756413746468 -2.11396923855472 -2.11396923855472e-16,1.88225568337755 -2.15591867344963 -2.15591867344963e-16,1.85991273921989 -2.19951988653655 -2.19951988653655e-16,1.84064256332004 -2.24456356819194 -2.24456356819194e-16,1.8245376630414 -2.29083348415575 -2.29083348415575e-16,1.81167535069652 -2.33810751357387 -2.33810751357387e-16,1.80211737240583 -2.38615871529951 -2.38615871529951e-16,1.79590961168258 -2.43475641733454 -2.43475641733454e-16,1.79308186916688 -2.48366732418105 -2.48366732418105e-16,1.79364771956639 -2.53265663678705 -2.53265663678705e-16,1.79760444649032 -2.58148917971011 -2.58148917971011e-16,1.80493305548955 -2.62993053008786 -2.62993053008786e-16,1.81559836524041 -2.67774814299567 -2.67774814299567e-16,1.8295491764342 -2.72471246778926 -2.72471246778926e-16,1.84671851756181 -2.7705980500731 -2.7705980500731e-16,1.86702396641357 -2.81518461400453 -2.81518461400453e-16,1.89036804575079 -2.85825811973811 -2.85825811973811e-16,1.91663869124976 -2.89961179093367 -2.89961179093367e-16,1.94570978947168 -2.93904710739563 -2.93904710739563e-16,1.97744178327594 -2.97637475807832 -2.97637475807832e-16,2.01168234177068 -3.01141554988232 -3.01141554988232e-16,2.04826709158413 -3.04400126787917 -3.04400126787917e-16,2.08702040594658 -3.07397548283483 -3.07397548283483e-16,2.12775624779472 -3.10119430215541 -3.10119430215541e-16,2.1702790628511 -3.12552706065018 -3.12552706065018e-16,2.2143847183914 -3.14685694779575 -3.14685694779575e-16,2.25986148319297 -3.16508156849045 -3.16508156849045e-16,2.30649104396024 -3.18011343460661 -3.18011343460661e-16,2.35404955334774 -3.1918803849814 -3.1918803849814e-16,2.40230870454951 -3.20032593182975 -3.20032593182975e-16,2.45103682729644 -3.2054095319166 -3.2054095319166e-16,2.5 -3.20710678118655 -3.20710678118655e-16,2.54896317270356 -3.2054095319166 -3.2054095319166e-16,2.59769129545049 -3.20032593182975 -3.20032593182975e-16,2.64595044665226 -3.1918803849814 -3.1918803849814e-16,2.69350895603976 -3.18011343460661 -3.18011343460661e-16,2.74013851680703 -3.16508156849045 -3.16508156849045e-16,2.7856152816086 -3.14685694779575 -3.14685694779575e-16,2.8297209371489 -3.12552706065018 -3.12552706065018e-16,2.87224375220528 -3.10119430215541 -3.10119430215541e-16,2.91297959405342 -3.07397548283483 -3.07397548283483e-16,2.95173290841587 -3.04400126787917 -3.04400126787917e-16,2.98831765822932 -3.01141554988232 -3.01141554988232e-16,3.02255821672406 -2.97637475807832 -2.97637475807832e-16,3.05429021052832 -2.93904710739563 -2.93904710739563e-16,3.08336130875024 -2.89961179093367 -2.89961179093367e-16,3.10963195424921 -2.85825811973811 -2.85825811973811e-16,3.13297603358643 -2.81518461400453 -2.81518461400453e-16,3.15328148243819 -2.7705980500731 -2.7705980500731e-16,3.1704508235658 -2.72471246778926 -2.72471246778926e-16,3.18440163475959 -2.67774814299567 -2.67774814299567e-16,3.19506694451045 -2.62993053008786 -2.62993053008786e-16,3.20239555350968 -2.58148917971011 -2.58148917971011e-16,3.20635228043361 -2.53265663678705 -2.53265663678705e-16,3.20691813083312 -2.48366732418105 -2.48366732418105e-16,3.20409038831742 -2.43475641733454 -2.43475641733454e-16,3.19788262759417 -2.38615871529951 -2.38615871529951e-16,3.18832464930348 -2.33810751357387 -2.33810751357387e-16,3.1754623369586 -2.29083348415575 -2.29083348415575e-16,3.15935743667996 -2.24456356819194 -2.24456356819194e-16,3.14008726078011 -2.19951988653655 -2.19951988653655e-16,3.11774431662245 -2.15591867344963 -2.15591867344963e-16,3.09243586253532 -2.11396923855472 -2.11396923855471e-16,3.06428339291354 -2.07387296203834 -2.07387296203834e-16,3.03342205497895 -2.03582232791524 -2.03582232791524e-16,3 -2 -2e-16) + # OGRFeature(entities):45 + # EntityHandle (String) = 231 + # LINESTRING Z (2 -2 -2e-16,1.96657794502105 -2.03582232791524 -2.03582232791524e-16,1.93571660708646 -2.07387296203834 -2.07387296203834e-16,1.90756413746468 -2.11396923855472 -2.11396923855472e-16,1.88225568337755 -2.15591867344963 -2.15591867344963e-16,1.85991273921989 -2.19951988653655 -2.19951988653655e-16,1.84064256332004 -2.24456356819194 -2.24456356819194e-16,1.8245376630414 -2.29083348415575 -2.29083348415575e-16,1.81167535069652 -2.33810751357387 -2.33810751357387e-16,1.80211737240583 -2.38615871529951 -2.38615871529951e-16,1.79590961168258 -2.43475641733454 -2.43475641733454e-16,1.79308186916688 -2.48366732418105 -2.48366732418105e-16,1.79364771956639 -2.53265663678705 -2.53265663678705e-16,1.79760444649032 -2.58148917971011 -2.58148917971011e-16,1.80493305548955 -2.62993053008786 -2.62993053008786e-16,1.81559836524041 -2.67774814299567 -2.67774814299567e-16,1.8295491764342 -2.72471246778926 -2.72471246778926e-16,1.84671851756181 -2.7705980500731 -2.7705980500731e-16,1.86702396641357 -2.81518461400453 -2.81518461400453e-16,1.89036804575079 -2.85825811973811 -2.85825811973811e-16,1.91663869124976 -2.89961179093367 -2.89961179093367e-16,1.94570978947168 -2.93904710739563 -2.93904710739563e-16,1.97744178327594 -2.97637475807832 -2.97637475807832e-16,2.01168234177068 -3.01141554988232 -3.01141554988232e-16,2.04826709158413 -3.04400126787917 -3.04400126787917e-16,2.08702040594658 -3.07397548283483 -3.07397548283483e-16,2.12775624779472 -3.10119430215541 -3.10119430215541e-16,2.1702790628511 -3.12552706065018 -3.12552706065018e-16,2.2143847183914 -3.14685694779575 -3.14685694779575e-16,2.25986148319297 -3.16508156849045 -3.16508156849045e-16,2.30649104396024 -3.18011343460661 -3.18011343460661e-16,2.35404955334774 -3.1918803849814 -3.1918803849814e-16,2.40230870454951 -3.20032593182975 -3.20032593182975e-16,2.45103682729644 -3.2054095319166 -3.2054095319166e-16,2.5 -3.20710678118655 -3.20710678118655e-16,2.54896317270356 -3.2054095319166 -3.2054095319166e-16,2.59769129545049 -3.20032593182975 -3.20032593182975e-16,2.64595044665226 -3.1918803849814 -3.1918803849814e-16,2.69350895603976 -3.18011343460661 -3.18011343460661e-16,2.74013851680703 -3.16508156849045 -3.16508156849045e-16,2.7856152816086 -3.14685694779575 -3.14685694779575e-16,2.8297209371489 -3.12552706065018 -3.12552706065018e-16,2.87224375220528 -3.10119430215541 -3.10119430215541e-16,2.91297959405342 -3.07397548283483 -3.07397548283483e-16,2.95173290841587 -3.04400126787917 -3.04400126787917e-16,2.98831765822932 -3.01141554988232 -3.01141554988232e-16,3.02255821672406 -2.97637475807832 -2.97637475807832e-16,3.05429021052832 -2.93904710739563 -2.93904710739563e-16,3.08336130875024 -2.89961179093367 -2.89961179093367e-16,3.10963195424921 -2.85825811973811 -2.85825811973811e-16,3.13297603358643 -2.81518461400453 -2.81518461400453e-16,3.15328148243819 -2.7705980500731 -2.7705980500731e-16,3.1704508235658 -2.72471246778926 -2.72471246778926e-16,3.18440163475959 -2.67774814299567 -2.67774814299567e-16,3.19506694451045 -2.62993053008786 -2.62993053008786e-16,3.20239555350968 -2.58148917971011 -2.58148917971011e-16,3.20635228043361 -2.53265663678705 -2.53265663678705e-16,3.20691813083312 -2.48366732418105 -2.48366732418105e-16,3.20409038831742 -2.43475641733454 -2.43475641733454e-16,3.19788262759417 -2.38615871529951 -2.38615871529951e-16,3.18832464930348 -2.33810751357387 -2.33810751357387e-16,3.1754623369586 -2.29083348415575 -2.29083348415575e-16,3.15935743667996 -2.24456356819194 -2.24456356819194e-16,3.14008726078011 -2.19951988653655 -2.19951988653655e-16,3.11774431662245 -2.15591867344963 -2.15591867344963e-16,3.09243586253532 -2.11396923855472 -2.11396923855471e-16,3.06428339291354 -2.07387296203834 -2.07387296203834e-16,3.03342205497895 -2.03582232791524 -2.03582232791524e-16,3 -2 -2e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 -2 -2e-16,1.96657794502105 -2.03582232791524 -2.03582232791524e-16,1.93571660708646 -2.07387296203834 -2.07387296203834e-16,1.90756413746468 -2.11396923855472 -2.11396923855472e-16,1.88225568337755 -2.15591867344963 -2.15591867344963e-16,1.85991273921989 -2.19951988653655 -2.19951988653655e-16,1.84064256332004 -2.24456356819194 -2.24456356819194e-16,1.8245376630414 -2.29083348415575 -2.29083348415575e-16,1.81167535069652 -2.33810751357387 -2.33810751357387e-16,1.80211737240583 -2.38615871529951 -2.38615871529951e-16,1.79590961168258 -2.43475641733454 -2.43475641733454e-16,1.79308186916688 -2.48366732418105 -2.48366732418105e-16,1.79364771956639 -2.53265663678705 -2.53265663678705e-16,1.79760444649032 -2.58148917971011 -2.58148917971011e-16,1.80493305548955 -2.62993053008786 -2.62993053008786e-16,1.81559836524041 -2.67774814299567 -2.67774814299567e-16,1.8295491764342 -2.72471246778926 -2.72471246778926e-16,1.84671851756181 -2.7705980500731 -2.7705980500731e-16,1.86702396641357 -2.81518461400453 -2.81518461400453e-16,1.89036804575079 -2.85825811973811 -2.85825811973811e-16,1.91663869124976 -2.89961179093367 -2.89961179093367e-16,1.94570978947168 -2.93904710739563 -2.93904710739563e-16,1.97744178327594 -2.97637475807832 -2.97637475807832e-16,2.01168234177068 -3.01141554988232 -3.01141554988232e-16,2.04826709158413 -3.04400126787917 -3.04400126787917e-16,2.08702040594658 -3.07397548283483 -3.07397548283483e-16,2.12775624779472 -3.10119430215541 -3.10119430215541e-16,2.1702790628511 -3.12552706065018 -3.12552706065018e-16,2.2143847183914 -3.14685694779575 -3.14685694779575e-16,2.25986148319297 -3.16508156849045 -3.16508156849045e-16,2.30649104396024 -3.18011343460661 -3.18011343460661e-16,2.35404955334774 -3.1918803849814 -3.1918803849814e-16,2.40230870454951 -3.20032593182975 -3.20032593182975e-16,2.45103682729644 -3.2054095319166 -3.2054095319166e-16,2.5 -3.20710678118655 -3.20710678118655e-16,2.54896317270356 -3.2054095319166 -3.2054095319166e-16,2.59769129545049 -3.20032593182975 -3.20032593182975e-16,2.64595044665226 -3.1918803849814 -3.1918803849814e-16,2.69350895603976 -3.18011343460661 -3.18011343460661e-16,2.74013851680703 -3.16508156849045 -3.16508156849045e-16,2.7856152816086 -3.14685694779575 -3.14685694779575e-16,2.8297209371489 -3.12552706065018 -3.12552706065018e-16,2.87224375220528 -3.10119430215541 -3.10119430215541e-16,2.91297959405342 -3.07397548283483 -3.07397548283483e-16,2.95173290841587 -3.04400126787917 -3.04400126787917e-16,2.98831765822932 -3.01141554988232 -3.01141554988232e-16,3.02255821672406 -2.97637475807832 -2.97637475807832e-16,3.05429021052832 -2.93904710739563 -2.93904710739563e-16,3.08336130875024 -2.89961179093367 -2.89961179093367e-16,3.10963195424921 -2.85825811973811 -2.85825811973811e-16,3.13297603358643 -2.81518461400453 -2.81518461400453e-16,3.15328148243819 -2.7705980500731 -2.7705980500731e-16,3.1704508235658 -2.72471246778926 -2.72471246778926e-16,3.18440163475959 -2.67774814299567 -2.67774814299567e-16,3.19506694451045 -2.62993053008786 -2.62993053008786e-16,3.20239555350968 -2.58148917971011 -2.58148917971011e-16,3.20635228043361 -2.53265663678705 -2.53265663678705e-16,3.20691813083312 -2.48366732418105 -2.48366732418105e-16,3.20409038831742 -2.43475641733454 -2.43475641733454e-16,3.19788262759417 -2.38615871529951 -2.38615871529951e-16,3.18832464930348 -2.33810751357387 -2.33810751357387e-16,3.1754623369586 -2.29083348415575 -2.29083348415575e-16,3.15935743667996 -2.24456356819194 -2.24456356819194e-16,3.14008726078011 -2.19951988653655 -2.19951988653655e-16,3.11774431662245 -2.15591867344963 -2.15591867344963e-16,3.09243586253532 -2.11396923855472 -2.11396923855471e-16,3.06428339291354 -2.07387296203834 -2.07387296203834e-16,3.03342205497895 -2.03582232791524 -2.03582232791524e-16,3 -2 -2e-16)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2 -2 -2e-16,1.96657794502105 -2.03582232791524 -2.03582232791524e-16,1.93571660708646 -2.07387296203834 -2.07387296203834e-16,1.90756413746468 -2.11396923855472 -2.11396923855472e-16,1.88225568337755 -2.15591867344963 -2.15591867344963e-16,1.85991273921989 -2.19951988653655 -2.19951988653655e-16,1.84064256332004 -2.24456356819194 -2.24456356819194e-16,1.8245376630414 -2.29083348415575 -2.29083348415575e-16,1.81167535069652 -2.33810751357387 -2.33810751357387e-16,1.80211737240583 -2.38615871529951 -2.38615871529951e-16,1.79590961168258 -2.43475641733454 -2.43475641733454e-16,1.79308186916688 -2.48366732418105 -2.48366732418105e-16,1.79364771956639 -2.53265663678705 -2.53265663678705e-16,1.79760444649032 -2.58148917971011 -2.58148917971011e-16,1.80493305548955 -2.62993053008786 -2.62993053008786e-16,1.81559836524041 -2.67774814299567 -2.67774814299567e-16,1.8295491764342 -2.72471246778926 -2.72471246778926e-16,1.84671851756181 -2.7705980500731 -2.7705980500731e-16,1.86702396641357 -2.81518461400453 -2.81518461400453e-16,1.89036804575079 -2.85825811973811 -2.85825811973811e-16,1.91663869124976 -2.89961179093367 -2.89961179093367e-16,1.94570978947168 -2.93904710739563 -2.93904710739563e-16,1.97744178327594 -2.97637475807832 -2.97637475807832e-16,2.01168234177068 -3.01141554988232 -3.01141554988232e-16,2.04826709158413 -3.04400126787917 -3.04400126787917e-16,2.08702040594658 -3.07397548283483 -3.07397548283483e-16,2.12775624779472 -3.10119430215541 -3.10119430215541e-16,2.1702790628511 -3.12552706065018 -3.12552706065018e-16,2.2143847183914 -3.14685694779575 -3.14685694779575e-16,2.25986148319297 -3.16508156849045 -3.16508156849045e-16,2.30649104396024 -3.18011343460661 -3.18011343460661e-16,2.35404955334774 -3.1918803849814 -3.1918803849814e-16,2.40230870454951 -3.20032593182975 -3.20032593182975e-16,2.45103682729644 -3.2054095319166 -3.2054095319166e-16,2.5 -3.20710678118655 -3.20710678118655e-16,2.54896317270356 -3.2054095319166 -3.2054095319166e-16,2.59769129545049 -3.20032593182975 -3.20032593182975e-16,2.64595044665226 -3.1918803849814 -3.1918803849814e-16,2.69350895603976 -3.18011343460661 -3.18011343460661e-16,2.74013851680703 -3.16508156849045 -3.16508156849045e-16,2.7856152816086 -3.14685694779575 -3.14685694779575e-16,2.8297209371489 -3.12552706065018 -3.12552706065018e-16,2.87224375220528 -3.10119430215541 -3.10119430215541e-16,2.91297959405342 -3.07397548283483 -3.07397548283483e-16,2.95173290841587 -3.04400126787917 -3.04400126787917e-16,2.98831765822932 -3.01141554988232 -3.01141554988232e-16,3.02255821672406 -2.97637475807832 -2.97637475807832e-16,3.05429021052832 -2.93904710739563 -2.93904710739563e-16,3.08336130875024 -2.89961179093367 -2.89961179093367e-16,3.10963195424921 -2.85825811973811 -2.85825811973811e-16,3.13297603358643 -2.81518461400453 -2.81518461400453e-16,3.15328148243819 -2.7705980500731 -2.7705980500731e-16,3.1704508235658 -2.72471246778926 -2.72471246778926e-16,3.18440163475959 -2.67774814299567 -2.67774814299567e-16,3.19506694451045 -2.62993053008786 -2.62993053008786e-16,3.20239555350968 -2.58148917971011 -2.58148917971011e-16,3.20635228043361 -2.53265663678705 -2.53265663678705e-16,3.20691813083312 -2.48366732418105 -2.48366732418105e-16,3.20409038831742 -2.43475641733454 -2.43475641733454e-16,3.19788262759417 -2.38615871529951 -2.38615871529951e-16,3.18832464930348 -2.33810751357387 -2.33810751357387e-16,3.1754623369586 -2.29083348415575 -2.29083348415575e-16,3.15935743667996 -2.24456356819194 -2.24456356819194e-16,3.14008726078011 -2.19951988653655 -2.19951988653655e-16,3.11774431662245 -2.15591867344963 -2.15591867344963e-16,3.09243586253532 -2.11396923855472 -2.11396923855471e-16,3.06428339291354 -2.07387296203834 -2.07387296203834e-16,3.03342205497895 -2.03582232791524 -2.03582232791524e-16,3 -2 -2e-16)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):46 -# EntityHandle (String) = 232 -# POLYGON Z ((1 -2 -2e-16,1 -3 -4e-16,2 -3 -4e-16,2 -2 -2e-16,1 -2 -2e-16)) + # OGRFeature(entities):46 + # EntityHandle (String) = 232 + # POLYGON Z ((1 -2 -2e-16,1 -3 -4e-16,2 -3 -4e-16,2 -2 -2e-16,1 -2 -2e-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((1 -2 -2e-16,1 -3 -4e-16,2 -3 -4e-16,2 -2 -2e-16,1 -2 -2e-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((1 -2 -2e-16,1 -3 -4e-16,2 -3 -4e-16,2 -2 -2e-16,1 -2 -2e-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):47 -# EntityHandle (String) = 233 -# POLYGON Z ((3 -4 -4E-16,4 -4 -4E-16,4 -3 -3E-16,3 -3 -3E-16,3 -4 -4E-16)) + # OGRFeature(entities):47 + # EntityHandle (String) = 233 + # POLYGON Z ((3 -4 -4E-16,4 -4 -4E-16,4 -3 -3E-16,3 -3 -3E-16,3 -4 -4E-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((3 -4 -4E-16,4 -4 -4E-16,4 -3 -3E-16,3 -3 -3E-16,3 -4 -4E-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((3 -4 -4E-16,4 -4 -4E-16,4 -3 -3E-16,3 -3 -3E-16,3 -4 -4E-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):48 -# EntityHandle (String) = 235 -# POLYGON Z ((8 -8 -8E-16,9 -8 -8E-16,9 -9 -9E-16,8 -9 -9E-16,8 -8 -8E-16)) + # OGRFeature(entities):48 + # EntityHandle (String) = 235 + # POLYGON Z ((8 -8 -8E-16,9 -8 -8E-16,9 -9 -9E-16,8 -9 -9E-16,8 -8 -8E-16)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((8 -8 -8E-16,9 -8 -8E-16,9 -9 -9E-16,8 -9 -9E-16,8 -8 -8E-16))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((8 -8 -8E-16,9 -8 -8E-16,9 -9 -9E-16,8 -9 -9E-16,8 -8 -8E-16))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):49 -# EntityHandle (String) = 236 -# LINESTRING (2 -2,2.15384615384615 -2.15384615384615,2.30769230769231 -2.30769230769231,2.46153846153846 -2.46153846153846,2.61538461538461 -2.61538461538461,2.76923076923077 -2.76923076923077,2.92307692307692 -2.92307692307692,3.07692307692308 -3.07692307692308,3.23076923076923 -3.23076923076923,3.38461538461538 -3.38461538461538,3.53846153846154 -3.53846153846154,3.69230769230769 -3.69230769230769,3.84615384615385 -3.84615384615385,4 -4,4.15384615384615 -4.15384615384615,4.30769230769231 -4.30769230769231,4.46153846153846 -4.46153846153846,4.61538461538462 -4.61538461538462,4.76923076923077 -4.76923076923077,4.92307692307692 -4.92307692307692,5.07692307692308 -5.07692307692308,5.23076923076923 -5.23076923076923,5.38461538461538 -5.38461538461538,5.53846153846154 -5.53846153846154,5.69230769230769 -5.69230769230769,5.84615384615385 -5.84615384615385,6.0 -6.0,6.15384615384615 -6.15384615384615,6.30769230769231 -6.30769230769231,6.46153846153846 -6.46153846153846,6.61538461538462 -6.61538461538462,6.76923076923077 -6.76923076923077,6.92307692307692 -6.92307692307692,7.07692307692308 -7.07692307692308,7.23076923076923 -7.23076923076923,7.38461538461539 -7.38461538461539,7.53846153846154 -7.53846153846154,7.69230769230769 -7.69230769230769,7.84615384615385 -7.84615384615385,8 -8) + # OGRFeature(entities):49 + # EntityHandle (String) = 236 + # LINESTRING (2 -2,2.15384615384615 -2.15384615384615,2.30769230769231 -2.30769230769231,2.46153846153846 -2.46153846153846,2.61538461538461 -2.61538461538461,2.76923076923077 -2.76923076923077,2.92307692307692 -2.92307692307692,3.07692307692308 -3.07692307692308,3.23076923076923 -3.23076923076923,3.38461538461538 -3.38461538461538,3.53846153846154 -3.53846153846154,3.69230769230769 -3.69230769230769,3.84615384615385 -3.84615384615385,4 -4,4.15384615384615 -4.15384615384615,4.30769230769231 -4.30769230769231,4.46153846153846 -4.46153846153846,4.61538461538462 -4.61538461538462,4.76923076923077 -4.76923076923077,4.92307692307692 -4.92307692307692,5.07692307692308 -5.07692307692308,5.23076923076923 -5.23076923076923,5.38461538461538 -5.38461538461538,5.53846153846154 -5.53846153846154,5.69230769230769 -5.69230769230769,5.84615384615385 -5.84615384615385,6.0 -6.0,6.15384615384615 -6.15384615384615,6.30769230769231 -6.30769230769231,6.46153846153846 -6.46153846153846,6.61538461538462 -6.61538461538462,6.76923076923077 -6.76923076923077,6.92307692307692 -6.92307692307692,7.07692307692308 -7.07692307692308,7.23076923076923 -7.23076923076923,7.38461538461539 -7.38461538461539,7.53846153846154 -7.53846153846154,7.69230769230769 -7.69230769230769,7.84615384615385 -7.84615384615385,8 -8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 -2,2.15384615384615 -2.15384615384615,2.30769230769231 -2.30769230769231,2.46153846153846 -2.46153846153846,2.61538461538461 -2.61538461538461,2.76923076923077 -2.76923076923077,2.92307692307692 -2.92307692307692,3.07692307692308 -3.07692307692308,3.23076923076923 -3.23076923076923,3.38461538461538 -3.38461538461538,3.53846153846154 -3.53846153846154,3.69230769230769 -3.69230769230769,3.84615384615385 -3.84615384615385,4 -4,4.15384615384615 -4.15384615384615,4.30769230769231 -4.30769230769231,4.46153846153846 -4.46153846153846,4.61538461538462 -4.61538461538462,4.76923076923077 -4.76923076923077,4.92307692307692 -4.92307692307692,5.07692307692308 -5.07692307692308,5.23076923076923 -5.23076923076923,5.38461538461538 -5.38461538461538,5.53846153846154 -5.53846153846154,5.69230769230769 -5.69230769230769,5.84615384615385 -5.84615384615385,6.0 -6.0,6.15384615384615 -6.15384615384615,6.30769230769231 -6.30769230769231,6.46153846153846 -6.46153846153846,6.61538461538462 -6.61538461538462,6.76923076923077 -6.76923076923077,6.92307692307692 -6.92307692307692,7.07692307692308 -7.07692307692308,7.23076923076923 -7.23076923076923,7.38461538461539 -7.38461538461539,7.53846153846154 -7.53846153846154,7.69230769230769 -7.69230769230769,7.84615384615385 -7.84615384615385,8 -8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 -2,2.15384615384615 -2.15384615384615,2.30769230769231 -2.30769230769231,2.46153846153846 -2.46153846153846,2.61538461538461 -2.61538461538461,2.76923076923077 -2.76923076923077,2.92307692307692 -2.92307692307692,3.07692307692308 -3.07692307692308,3.23076923076923 -3.23076923076923,3.38461538461538 -3.38461538461538,3.53846153846154 -3.53846153846154,3.69230769230769 -3.69230769230769,3.84615384615385 -3.84615384615385,4 -4,4.15384615384615 -4.15384615384615,4.30769230769231 -4.30769230769231,4.46153846153846 -4.46153846153846,4.61538461538462 -4.61538461538462,4.76923076923077 -4.76923076923077,4.92307692307692 -4.92307692307692,5.07692307692308 -5.07692307692308,5.23076923076923 -5.23076923076923,5.38461538461538 -5.38461538461538,5.53846153846154 -5.53846153846154,5.69230769230769 -5.69230769230769,5.84615384615385 -5.84615384615385,6.0 -6.0,6.15384615384615 -6.15384615384615,6.30769230769231 -6.30769230769231,6.46153846153846 -6.46153846153846,6.61538461538462 -6.61538461538462,6.76923076923077 -6.76923076923077,6.92307692307692 -6.92307692307692,7.07692307692308 -7.07692307692308,7.23076923076923 -7.23076923076923,7.38461538461539 -7.38461538461539,7.53846153846154 -7.53846153846154,7.69230769230769 -7.69230769230769,7.84615384615385 -7.84615384615385,8 -8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):50 -# EntityHandle (String) = 237 -# LINESTRING (8 -1,7.62837370825536 -0.987348067229724,7.25775889681215 -0.975707614760869,6.88916704597178 -0.966090122894857,6.52360963603567 -0.959507071933107,6.16209814730525 -0.956969942177043,5.80564406008193 -0.959490213928084,5.45525885466714 -0.968079367487651,5.11195401136229 -0.983748883157167,4.77674101046882 -1.00751024123805,4.45063133228814 -1.04037492203173,4.13463645712167 -1.08335440583961,3.82976786527082 -1.13746017296313,3.53703703703704 -1.2037037037037,3.25745545272173 -1.28309647836275,2.99203459262631 -1.37664997724169,2.74178593705221 -1.48537568064195,2.50772096630085 -1.61028506886495,2.29085116067365 -1.75238962221211,2.09218800047203 -1.91270082098484,1.91270082098485 -2.09218800047202,1.75238962221211 -2.29085116067364,1.61028506886495 -2.50772096630085,1.48537568064195 -2.74178593705221,1.37664997724169 -2.99203459262631,1.28309647836275 -3.25745545272172,1.2037037037037 -3.53703703703703,1.13746017296313 -3.82976786527082,1.08335440583961 -4.13463645712166,1.04037492203173 -4.45063133228814,1.00751024123805 -4.77674101046882,0.983748883157167 -5.11195401136229,0.968079367487652 -5.45525885466714,0.959490213928084 -5.80564406008193,0.956969942177043 -6.16209814730525,0.959507071933108 -6.52360963603567,0.966090122894857 -6.88916704597178,0.975707614760869 -7.25775889681216,0.987348067229724 -7.62837370825537,1 -8) + # OGRFeature(entities):50 + # EntityHandle (String) = 237 + # LINESTRING (8 -1,7.62837370825536 -0.987348067229724,7.25775889681215 -0.975707614760869,6.88916704597178 -0.966090122894857,6.52360963603567 -0.959507071933107,6.16209814730525 -0.956969942177043,5.80564406008193 -0.959490213928084,5.45525885466714 -0.968079367487651,5.11195401136229 -0.983748883157167,4.77674101046882 -1.00751024123805,4.45063133228814 -1.04037492203173,4.13463645712167 -1.08335440583961,3.82976786527082 -1.13746017296313,3.53703703703704 -1.2037037037037,3.25745545272173 -1.28309647836275,2.99203459262631 -1.37664997724169,2.74178593705221 -1.48537568064195,2.50772096630085 -1.61028506886495,2.29085116067365 -1.75238962221211,2.09218800047203 -1.91270082098484,1.91270082098485 -2.09218800047202,1.75238962221211 -2.29085116067364,1.61028506886495 -2.50772096630085,1.48537568064195 -2.74178593705221,1.37664997724169 -2.99203459262631,1.28309647836275 -3.25745545272172,1.2037037037037 -3.53703703703703,1.13746017296313 -3.82976786527082,1.08335440583961 -4.13463645712166,1.04037492203173 -4.45063133228814,1.00751024123805 -4.77674101046882,0.983748883157167 -5.11195401136229,0.968079367487652 -5.45525885466714,0.959490213928084 -5.80564406008193,0.956969942177043 -6.16209814730525,0.959507071933108 -6.52360963603567,0.966090122894857 -6.88916704597178,0.975707614760869 -7.25775889681216,0.987348067229724 -7.62837370825537,1 -8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (8 -1,7.62837370825536 -0.987348067229724,7.25775889681215 -0.975707614760869,6.88916704597178 -0.966090122894857,6.52360963603567 -0.959507071933107,6.16209814730525 -0.956969942177043,5.80564406008193 -0.959490213928084,5.45525885466714 -0.968079367487651,5.11195401136229 -0.983748883157167,4.77674101046882 -1.00751024123805,4.45063133228814 -1.04037492203173,4.13463645712167 -1.08335440583961,3.82976786527082 -1.13746017296313,3.53703703703704 -1.2037037037037,3.25745545272173 -1.28309647836275,2.99203459262631 -1.37664997724169,2.74178593705221 -1.48537568064195,2.50772096630085 -1.61028506886495,2.29085116067365 -1.75238962221211,2.09218800047203 -1.91270082098484,1.91270082098485 -2.09218800047202,1.75238962221211 -2.29085116067364,1.61028506886495 -2.50772096630085,1.48537568064195 -2.74178593705221,1.37664997724169 -2.99203459262631,1.28309647836275 -3.25745545272172,1.2037037037037 -3.53703703703703,1.13746017296313 -3.82976786527082,1.08335440583961 -4.13463645712166,1.04037492203173 -4.45063133228814,1.00751024123805 -4.77674101046882,0.983748883157167 -5.11195401136229,0.968079367487652 -5.45525885466714,0.959490213928084 -5.80564406008193,0.956969942177043 -6.16209814730525,0.959507071933108 -6.52360963603567,0.966090122894857 -6.88916704597178,0.975707614760869 -7.25775889681216,0.987348067229724 -7.62837370825537,1 -8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (8 -1,7.62837370825536 -0.987348067229724,7.25775889681215 -0.975707614760869,6.88916704597178 -0.966090122894857,6.52360963603567 -0.959507071933107,6.16209814730525 -0.956969942177043,5.80564406008193 -0.959490213928084,5.45525885466714 -0.968079367487651,5.11195401136229 -0.983748883157167,4.77674101046882 -1.00751024123805,4.45063133228814 -1.04037492203173,4.13463645712167 -1.08335440583961,3.82976786527082 -1.13746017296313,3.53703703703704 -1.2037037037037,3.25745545272173 -1.28309647836275,2.99203459262631 -1.37664997724169,2.74178593705221 -1.48537568064195,2.50772096630085 -1.61028506886495,2.29085116067365 -1.75238962221211,2.09218800047203 -1.91270082098484,1.91270082098485 -2.09218800047202,1.75238962221211 -2.29085116067364,1.61028506886495 -2.50772096630085,1.48537568064195 -2.74178593705221,1.37664997724169 -2.99203459262631,1.28309647836275 -3.25745545272172,1.2037037037037 -3.53703703703703,1.13746017296313 -3.82976786527082,1.08335440583961 -4.13463645712166,1.04037492203173 -4.45063133228814,1.00751024123805 -4.77674101046882,0.983748883157167 -5.11195401136229,0.968079367487652 -5.45525885466714,0.959490213928084 -5.80564406008193,0.956969942177043 -6.16209814730525,0.959507071933108 -6.52360963603567,0.966090122894857 -6.88916704597178,0.975707614760869 -7.25775889681216,0.987348067229724 -7.62837370825537,1 -8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):51 -# EntityHandle (String) = 238 -# POINT Z (7 -7 -7e-16) + # OGRFeature(entities):51 + # EntityHandle (String) = 238 + # POINT Z (7 -7 -7e-16) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (7 -7 -7e-16)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (7 -7 -7e-16)"): feat.DumpReadable() pytest.fail() @@ -1701,568 +2017,715 @@ def test_ogr_dxf_31(): def test_ogr_dxf_32(): - gdal.SetConfigOption('DXF_INCLUDE_RAW_CODE_VALUES', 'TRUE') - ds = ogr.Open('data/dxf/ocs2wcs2.dxf') - gdal.SetConfigOption('DXF_INCLUDE_RAW_CODE_VALUES', None) + gdal.SetConfigOption("DXF_INCLUDE_RAW_CODE_VALUES", "TRUE") + ds = ogr.Open("data/dxf/ocs2wcs2.dxf") + gdal.SetConfigOption("DXF_INCLUDE_RAW_CODE_VALUES", None) lyr = ds.GetLayer(0) -# INFO: Open of `ocs2wcs2.dxf' using driver `DXF' successful. + # INFO: Open of `ocs2wcs2.dxf' using driver `DXF' successful. -# OGRFeature(entities):0 -# EntityHandle (String) = 1B1 -# POINT Z (4 4 0) + # OGRFeature(entities):0 + # EntityHandle (String) = 1B1 + # POINT Z (4 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (4 4 0)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (4 4 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):1 -# EntityHandle (String) = 1B2 -# LINESTRING Z (0 0 0,1 1 0) + # OGRFeature(entities):1 + # EntityHandle (String) = 1B2 + # LINESTRING Z (0 0 0,1 1 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,1 1 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (0 0 0,1 1 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):2 -# EntityHandle (String) = 1B3 -# LINESTRING (1 1,2 1,1 2,1 1) + # OGRFeature(entities):2 + # EntityHandle (String) = 1B3 + # LINESTRING (1 1,2 1,1 2,1 1) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (1 1,2 1,1 2,1 1)') \ - or feat.GetField('RawCodeValues') != ['330 1F','43 0.0']: + if ogrtest.check_feature_geometry( + feat, "LINESTRING (1 1,2 1,1 2,1 1)" + ) or feat.GetField("RawCodeValues") != ["330 1F", "43 0.0"]: feat.DumpReadable() pytest.fail() -# OGRFeature(entities):3 -# EntityHandle (String) = 1B4 -# LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0) + # OGRFeature(entities):3 + # EntityHandle (String) = 1B4 + # LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0)') \ - or feat.GetField('RawCodeValues') != ['330 1F','66 1','10 0.0','20 0.0','30 0.0']: + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (1 1 0,1 2 0,2 2 0,1 1 0)" + ) or feat.GetField("RawCodeValues") != [ + "330 1F", + "66 1", + "10 0.0", + "20 0.0", + "30 0.0", + ]: feat.DumpReadable() pytest.fail() -# OGRFeature(entities):4 -# EntityHandle (String) = 1B9 -# LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0) + # OGRFeature(entities):4 + # EntityHandle (String) = 1B9 + # LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (6 4 0,5.99512810051965 3.86048705251175 0,5.98053613748314 3.72165379807987 0,5.95629520146761 3.58417661836448 0,5.92252339187664 3.448725288366 0,5.87938524157182 3.31595971334866 0,5.8270909152852 3.1865267138484 0,5.76589518571785 3.06105687442822 0,5.69609619231285 2.94016147153359 0,5.61803398874989 2.82442949541505 0,5.53208888623796 2.71442478062692 0,5.4386796006773 2.61068325908201 0,5.33826121271772 2.51371034904521 0,5.23132295065132 2.42397849278656 0,5.11838580694149 2.34192485488992 0,5.0 2.26794919243112 0,4.87674229357815 2.20241190740167 0,4.74921318683182 2.14563229086643 0,4.61803398874989 2.09788696740969 0,4.48384379119934 2.05940854744801 0,4.34729635533386 2.03038449397558 0,4.20905692653531 2.01095620926345 0,4.069798993405 2.00121834596181 0,3.930201006595 2.00121834596181 0,3.79094307346469 2.01095620926345 0,3.65270364466614 2.03038449397558 0,3.51615620880066 2.05940854744801 0,3.38196601125011 2.09788696740969 0,3.25078681316818 2.14563229086643 0,3.12325770642185 2.20241190740167 0,3.0 2.26794919243112 0,2.88161419305851 2.34192485488992 0,2.76867704934868 2.42397849278656 0,2.66173878728228 2.51371034904521 0,2.5613203993227 2.61068325908201 0,2.46791111376204 2.71442478062692 0,2.38196601125011 2.82442949541505 0,2.30390380768715 2.94016147153359 0,2.23410481428215 3.06105687442822 0,2.1729090847148 3.1865267138484 0,2.12061475842818 3.31595971334866 0,2.07747660812336 3.448725288366 0,2.04370479853239 3.58417661836448 0,2.01946386251686 3.72165379807987 0,2.00487189948035 3.86048705251175 0,2.0 4.0 0,2.00487189948035 4.13951294748825 0,2.01946386251686 4.27834620192013 0,2.04370479853239 4.41582338163552 0,2.07747660812336 4.551274711634 0,2.12061475842818 4.68404028665134 0,2.1729090847148 4.8134732861516 0,2.23410481428215 4.93894312557178 0,2.30390380768715 5.05983852846641 0,2.38196601125011 5.17557050458495 0,2.46791111376204 5.28557521937308 0,2.5613203993227 5.38931674091799 0,2.66173878728228 5.48628965095479 0,2.76867704934868 5.57602150721344 0,2.88161419305851 5.65807514511008 0,3.0 5.73205080756888 0,3.12325770642184 5.79758809259833 0,3.25078681316818 5.85436770913357 0,3.38196601125011 5.90211303259031 0,3.51615620880066 5.94059145255199 0,3.65270364466614 5.96961550602442 0,3.79094307346469 5.98904379073655 0,3.930201006595 5.99878165403819 0,4.069798993405 5.99878165403819 0,4.20905692653531 5.98904379073655 0,4.34729635533386 5.96961550602442 0,4.48384379119933 5.94059145255199 0,4.61803398874989 5.90211303259031 0,4.74921318683182 5.85436770913357 0,4.87674229357815 5.79758809259833 0,5.0 5.73205080756888 0,5.11838580694149 5.65807514511008 0,5.23132295065132 5.57602150721344 0,5.33826121271772 5.48628965095479 0,5.4386796006773 5.389316740918 0,5.53208888623796 5.28557521937308 0,5.61803398874989 5.17557050458495 0,5.69609619231285 5.05983852846641 0,5.76589518571785 4.93894312557178 0,5.8270909152852 4.8134732861516 0,5.87938524157182 4.68404028665134 0,5.92252339187664 4.551274711634 0,5.95629520146761 4.41582338163552 0,5.98053613748314 4.27834620192013 0,5.99512810051965 4.13951294748825 0,6.0 4.0 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):5 -# EntityHandle (String) = 1BA -# LINESTRING Z (2 4 0,4 4 0) + # OGRFeature(entities):5 + # EntityHandle (String) = 1BA + # LINESTRING Z (2 4 0,4 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 4 0,4 4 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (2 4 0,4 4 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):6 -# EntityHandle (String) = 1BB -# LINESTRING Z (4 4 0,6 4 0) + # OGRFeature(entities):6 + # EntityHandle (String) = 1BB + # LINESTRING Z (4 4 0,6 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4 4 0,6 4 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (4 4 0,6 4 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):7 -# EntityHandle (String) = 1BC -# LINESTRING Z (4 3 0,4 4 0) + # OGRFeature(entities):7 + # EntityHandle (String) = 1BC + # LINESTRING Z (4 3 0,4 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4 3 0,4 4 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (4 3 0,4 4 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):8 -# EntityHandle (String) = 1BD -# LINESTRING Z (4 4 0,4 5 0) + # OGRFeature(entities):8 + # EntityHandle (String) = 1BD + # LINESTRING Z (4 4 0,4 5 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4 4 0,4 5 0)'): + if ogrtest.check_feature_geometry(feat, "LINESTRING Z (4 4 0,4 5 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):9 -# EntityHandle (String) = 1BE -# LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0) + # OGRFeature(entities):9 + # EntityHandle (String) = 1BE + # LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2 4 0,2.00487189948035 4.06975647374412 0,2.01946386251686 4.13917310096007 0,2.04370479853239 4.20791169081776 0,2.07747660812336 4.275637355817 0,2.12061475842818 4.34202014332567 0,2.1729090847148 4.4067366430758 0,2.23410481428215 4.46947156278589 0,2.30390380768715 4.52991926423321 0,2.38196601125011 4.58778525229247 0,2.46791111376204 4.64278760968654 0,2.5613203993227 4.694658370459 0,2.66173878728228 4.74314482547739 0,2.76867704934868 4.78801075360672 0,2.88161419305851 4.82903757255504 0,3.0 4.86602540378444 0,3.12325770642185 4.89879404629917 0,3.25078681316818 4.92718385456679 0,3.38196601125011 4.95105651629515 0,3.51615620880067 4.970295726276 0,3.65270364466614 4.98480775301221 0,3.79094307346469 4.99452189536827 0,3.930201006595 4.9993908270191 0,4.069798993405 4.9993908270191 0,4.20905692653531 4.99452189536827 0,4.34729635533386 4.98480775301221 0,4.48384379119934 4.970295726276 0,4.61803398874989 4.95105651629515 0,4.74921318683182 4.92718385456679 0,4.87674229357816 4.89879404629917 0,5.0 4.86602540378444 0,5.11838580694149 4.82903757255504 0,5.23132295065132 4.78801075360672 0,5.33826121271772 4.74314482547739 0,5.4386796006773 4.694658370459 0,5.53208888623796 4.64278760968654 0,5.61803398874989 4.58778525229247 0,5.69609619231285 4.5299192642332 0,5.76589518571785 4.46947156278589 0,5.8270909152852 4.4067366430758 0,5.87938524157182 4.34202014332567 0,5.92252339187664 4.275637355817 0,5.95629520146761 4.20791169081776 0,5.98053613748314 4.13917310096006 0,5.99512810051965 4.06975647374412 0,6.0 4.0 0,5.99512810051965 3.93024352625587 0,5.98053613748314 3.86082689903993 0,5.95629520146761 3.79208830918224 0,5.92252339187664 3.724362644183 0,5.87938524157182 3.65797985667433 0,5.8270909152852 3.5932633569242 0,5.76589518571785 3.53052843721411 0,5.69609619231285 3.4700807357668 0,5.61803398874989 3.41221474770753 0,5.53208888623796 3.35721239031346 0,5.4386796006773 3.305341629541 0,5.33826121271772 3.25685517452261 0,5.23132295065132 3.21198924639328 0,5.11838580694149 3.17096242744496 0,5.0 3.13397459621556 0,4.87674229357815 3.10120595370083 0,4.74921318683182 3.07281614543321 0,4.61803398874989 3.04894348370485 0,4.48384379119934 3.029704273724 0,4.34729635533386 3.01519224698779 0,4.20905692653531 3.00547810463173 0,4.069798993405 3.0006091729809 0,3.930201006595 3.0006091729809 0,3.79094307346469 3.00547810463173 0,3.65270364466614 3.01519224698779 0,3.51615620880066 3.029704273724 0,3.38196601125011 3.04894348370485 0,3.25078681316818 3.07281614543321 0,3.12325770642185 3.10120595370083 0,3.0 3.13397459621556 0,2.88161419305851 3.17096242744496 0,2.76867704934868 3.21198924639328 0,2.66173878728228 3.25685517452261 0,2.5613203993227 3.305341629541 0,2.46791111376204 3.35721239031346 0,2.38196601125011 3.41221474770753 0,2.30390380768715 3.4700807357668 0,2.23410481428215 3.53052843721411 0,2.1729090847148 3.5932633569242 0,2.12061475842818 3.65797985667433 0,2.07747660812336 3.724362644183 0,2.04370479853239 3.79208830918224 0,2.01946386251686 3.86082689903993 0,2.00487189948035 3.93024352625587 0,2 4 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):10 -# EntityHandle (String) = 1BF -# LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0) + # OGRFeature(entities):10 + # EntityHandle (String) = 1BF + # LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2.0 2.0 0,1.96657794502105 2.03582232791524 0,1.93571660708646 2.07387296203834 0,1.90756413746468 2.11396923855471 0,1.88225568337755 2.15591867344963 0,1.85991273921989 2.19951988653655 0,1.84064256332004 2.24456356819194 0,1.8245376630414 2.29083348415575 0,1.81167535069652 2.33810751357387 0,1.80211737240583 2.38615871529951 0,1.79590961168258 2.43475641733454 0,1.79308186916688 2.48366732418105 0,1.79364771956639 2.53265663678705 0,1.79760444649032 2.58148917971011 0,1.80493305548955 2.62993053008785 0,1.81559836524041 2.67774814299566 0,1.8295491764342 2.72471246778926 0,1.84671851756181 2.7705980500731 0,1.86702396641357 2.81518461400453 0,1.89036804575079 2.85825811973811 0,1.91663869124976 2.89961179093366 0,1.94570978947168 2.93904710739563 0,1.97744178327594 2.97637475807832 0,2.01168234177068 3.01141554988232 0,2.04826709158413 3.04400126787917 0,2.08702040594658 3.07397548283483 0,2.12775624779472 3.10119430215541 0,2.17027906285109 3.12552706065018 0,2.2143847183914 3.14685694779575 0,2.25986148319297 3.16508156849045 0,2.30649104396024 3.18011343460661 0,2.35404955334774 3.1918803849814 0,2.40230870454951 3.20032593182975 0,2.45103682729644 3.2054095319166 0,2.5 3.20710678118655 0,2.54896317270356 3.2054095319166 0,2.59769129545049 3.20032593182975 0,2.64595044665226 3.1918803849814 0,2.69350895603976 3.18011343460661 0,2.74013851680703 3.16508156849045 0,2.7856152816086 3.14685694779575 0,2.8297209371489 3.12552706065018 0,2.87224375220528 3.10119430215541 0,2.91297959405342 3.07397548283483 0,2.95173290841587 3.04400126787917 0,2.98831765822932 3.01141554988232 0,3.02255821672406 2.97637475807832 0,3.05429021052832 2.93904710739563 0,3.08336130875024 2.89961179093367 0,3.10963195424921 2.85825811973811 0,3.13297603358643 2.81518461400453 0,3.15328148243819 2.7705980500731 0,3.1704508235658 2.72471246778926 0,3.18440163475959 2.67774814299567 0,3.19506694451045 2.62993053008786 0,3.20239555350968 2.58148917971011 0,3.20635228043361 2.53265663678705 0,3.20691813083312 2.48366732418105 0,3.20409038831742 2.43475641733454 0,3.19788262759417 2.38615871529951 0,3.18832464930348 2.33810751357387 0,3.1754623369586 2.29083348415575 0,3.15935743667996 2.24456356819194 0,3.14008726078011 2.19951988653655 0,3.11774431662245 2.15591867344963 0,3.09243586253532 2.11396923855472 0,3.06428339291354 2.07387296203834 0,3.03342205497895 2.03582232791524 0,3 2 0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):11 -# EntityHandle (String) = 1C0 -# POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0)) + # OGRFeature(entities):11 + # EntityHandle (String) = 1C0 + # POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON Z ((1 2 0,1 3 0,2 3 0,2 2 0,1 2 0))" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):12 -# EntityHandle (String) = 1C1 -# POLYGON ((3 4,4 4,4 3,3 3,3 4)) + # OGRFeature(entities):12 + # EntityHandle (String) = 1C1 + # POLYGON ((3 4,4 4,4 3,3 3,3 4)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((3 4,4 4,4 3,3 3,3 4))'): + if ogrtest.check_feature_geometry(feat, "POLYGON ((3 4,4 4,4 3,3 3,3 4))"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):13 -# EntityHandle (String) = 1C3 -# POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0)) + # OGRFeature(entities):13 + # EntityHandle (String) = 1C3 + # POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0))'): + if ogrtest.check_feature_geometry( + feat, "POLYGON Z ((8 8 0,9 8 0,9 9 0,8 9 0,8 8 0))" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):14 -# EntityHandle (String) = 1C6 -# LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8) + # OGRFeature(entities):14 + # EntityHandle (String) = 1C6 + # LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2 2,2.15384615384615 2.15384615384615,2.30769230769231 2.30769230769231,2.46153846153846 2.46153846153846,2.61538461538461 2.61538461538461,2.76923076923077 2.76923076923077,2.92307692307692 2.92307692307692,3.07692307692308 3.07692307692308,3.23076923076923 3.23076923076923,3.38461538461538 3.38461538461538,3.53846153846154 3.53846153846154,3.69230769230769 3.69230769230769,3.84615384615385 3.84615384615385,4 4,4.15384615384615 4.15384615384615,4.30769230769231 4.30769230769231,4.46153846153846 4.46153846153846,4.61538461538462 4.61538461538462,4.76923076923077 4.76923076923077,4.92307692307692 4.92307692307692,5.07692307692308 5.07692307692308,5.23076923076923 5.23076923076923,5.38461538461538 5.38461538461538,5.53846153846154 5.53846153846154,5.69230769230769 5.69230769230769,5.84615384615385 5.84615384615385,6.0 6.0,6.15384615384615 6.15384615384615,6.30769230769231 6.30769230769231,6.46153846153846 6.46153846153846,6.61538461538462 6.61538461538462,6.76923076923077 6.76923076923077,6.92307692307692 6.92307692307692,7.07692307692308 7.07692307692308,7.23076923076923 7.23076923076923,7.38461538461539 7.38461538461539,7.53846153846154 7.53846153846154,7.69230769230769 7.69230769230769,7.84615384615385 7.84615384615385,8 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):15 -# EntityHandle (String) = 1C7 -# LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8) + # OGRFeature(entities):15 + # EntityHandle (String) = 1C7 + # LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (8 1,7.62837370825536 0.987348067229724,7.25775889681215 0.975707614760869,6.88916704597178 0.966090122894857,6.52360963603567 0.959507071933107,6.16209814730525 0.956969942177043,5.80564406008193 0.959490213928084,5.45525885466714 0.968079367487651,5.11195401136229 0.983748883157167,4.77674101046882 1.00751024123805,4.45063133228814 1.04037492203173,4.13463645712167 1.08335440583961,3.82976786527082 1.13746017296313,3.53703703703704 1.2037037037037,3.25745545272173 1.28309647836275,2.99203459262631 1.37664997724169,2.74178593705221 1.48537568064195,2.50772096630085 1.61028506886495,2.29085116067365 1.75238962221211,2.09218800047203 1.91270082098484,1.91270082098485 2.09218800047202,1.75238962221211 2.29085116067364,1.61028506886495 2.50772096630085,1.48537568064195 2.74178593705221,1.37664997724169 2.99203459262631,1.28309647836275 3.25745545272172,1.2037037037037 3.53703703703703,1.13746017296313 3.82976786527082,1.08335440583961 4.13463645712166,1.04037492203173 4.45063133228814,1.00751024123805 4.77674101046882,0.983748883157167 5.11195401136229,0.968079367487652 5.45525885466714,0.959490213928084 5.80564406008193,0.956969942177043 6.16209814730525,0.959507071933108 6.52360963603567,0.966090122894857 6.88916704597178,0.975707614760869 7.25775889681216,0.987348067229724 7.62837370825537,1 8)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):16 -# EntityHandle (String) = 1C8 -# POINT Z (7 7 0) + # OGRFeature(entities):16 + # EntityHandle (String) = 1C8 + # POINT Z (7 7 0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (7 7 0)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (7 7 0)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):17 -# EntityHandle (String) = 1C9 -# POINT Z (-2.0 4.0 -3.46410161513775) + # OGRFeature(entities):17 + # EntityHandle (String) = 1C9 + # POINT Z (-2.0 4.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-2.0 4.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-2.0 4.0 -3.46410161513775)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):18 -# EntityHandle (String) = 1CA -# LINESTRING Z (0 0 0,-0.5 1.0 -0.866025403784439) + # OGRFeature(entities):18 + # EntityHandle (String) = 1CA + # LINESTRING Z (0 0 0,-0.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,-0.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (0 0 0,-0.5 1.0 -0.866025403784439)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):19 -# EntityHandle (String) = 1CB -# LINESTRING Z (-0.5 1.0 -0.866025403784439,-1.0 1.0 -1.73205080756888,-0.5 2.0 -0.866025403784439,-0.5 1.0 -0.866025403784439) + # OGRFeature(entities):19 + # EntityHandle (String) = 1CB + # LINESTRING Z (-0.5 1.0 -0.866025403784439,-1.0 1.0 -1.73205080756888,-0.5 2.0 -0.866025403784439,-0.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-0.5 1.0 -0.866025403784439,-1.0 1.0 -1.73205080756888,-0.5 2.0 -0.866025403784439,-0.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-0.5 1.0 -0.866025403784439,-1.0 1.0 -1.73205080756888,-0.5 2.0 -0.866025403784439,-0.5 1.0 -0.866025403784439)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):20 -# EntityHandle (String) = 1CC -# LINESTRING Z (-0.5 1.0 -0.866025403784439,-0.5 2.0 -0.866025403784439,-1.0 2.0 -1.73205080756888,-0.5 1.0 -0.866025403784439) + # OGRFeature(entities):20 + # EntityHandle (String) = 1CC + # LINESTRING Z (-0.5 1.0 -0.866025403784439,-0.5 2.0 -0.866025403784439,-1.0 2.0 -1.73205080756888,-0.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-0.5 1.0 -0.866025403784439,-0.5 2.0 -0.866025403784439,-1.0 2.0 -1.73205080756888,-0.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-0.5 1.0 -0.866025403784439,-0.5 2.0 -0.866025403784439,-1.0 2.0 -1.73205080756888,-0.5 1.0 -0.866025403784439)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):21 -# EntityHandle (String) = 1D1 -# LINESTRING Z (-2.0 6.0 -3.46410161513776,-2.06975647374412 5.99512810051965 -3.58492337181942,-2.13917310096006 5.98053613748314 -3.7051564970475,-2.20791169081776 5.95629520146761 -3.82421522712167,-2.275637355817 5.92252339187664 -3.94151951987674,-2.34202014332567 5.87938524157182 -4.0564978805898,-2.4067366430758 5.8270909152852 -4.16859014624505,-2.46947156278589 5.76589518571785 -4.27725021459168,-2.5299192642332 5.69609619231285 -4.38194870469918,-2.58778525229247 5.61803398874989 -4.48217553604801,-2.64278760968654 5.53208888623796 -4.57744241359059,-2.694658370459 5.4386796006773 -4.66728520667574,-2.74314482547739 5.33826121271772 -4.75126621024651,-2.78801075360672 5.23132295065132 -4.82897627729524,-2.82903757255504 5.11838580694149 -4.90003681218666,-2.86602540378444 5.0 -4.96410161513776,-2.89879404629917 4.87674229357815 -5.02085856886833,-2.92718385456679 4.74921318683182 -5.07003115920498,-2.95105651629515 4.61803398874989 -5.11137982223042,-2.970295726276 4.48384379119934 -5.14470311141473,-2.98480775301221 4.34729635533386 -5.16983867904264,-2.99452189536827 4.20905692653531 -5.1866640671553,-2.99939082701909 4.069798993405 -5.19509730415311,-2.99939082701909 3.930201006595 -5.19509730415311,-2.99452189536827 3.79094307346469 -5.1866640671553,-2.98480775301221 3.65270364466614 -5.16983867904264,-2.970295726276 3.51615620880066 -5.14470311141473,-2.95105651629515 3.38196601125011 -5.11137982223042,-2.92718385456679 3.25078681316818 -5.07003115920498,-2.89879404629917 3.12325770642185 -5.02085856886833,-2.86602540378444 3.0 -4.96410161513776,-2.82903757255504 2.88161419305851 -4.90003681218666,-2.78801075360672 2.76867704934868 -4.82897627729524,-2.74314482547739 2.66173878728228 -4.75126621024651,-2.694658370459 2.5613203993227 -4.66728520667574,-2.64278760968654 2.46791111376204 -4.5774424135906,-2.58778525229247 2.38196601125011 -4.48217553604801,-2.5299192642332 2.30390380768715 -4.38194870469918,-2.46947156278589 2.23410481428215 -4.27725021459168,-2.4067366430758 2.1729090847148 -4.16859014624505,-2.34202014332567 2.12061475842818 -4.0564978805898,-2.275637355817 2.07747660812336 -3.94151951987674,-2.20791169081776 2.04370479853239 -3.82421522712167,-2.13917310096006 2.01946386251686 -3.7051564970475,-2.06975647374412 2.00487189948035 -3.58492337181943,-2.0 2.0 -3.46410161513776,-1.93024352625587 2.00487189948035 -3.34327985845609,-1.86082689903993 2.01946386251686 -3.22304673322801,-1.79208830918224 2.04370479853239 -3.10398800315384,-1.724362644183 2.07747660812336 -2.98668371039877,-1.65797985667433 2.12061475842818 -2.87170534968571,-1.5932633569242 2.1729090847148 -2.75961308403046,-1.53052843721411 2.23410481428215 -2.65095301568383, -# -1.47008073576679 2.30390380768715 -2.54625452557633,-1.41221474770753 2.38196601125011 -2.4460276942275,-1.35721239031346 2.46791111376204 -2.35076081668492,-1.305341629541 2.5613203993227 -2.26091802359977,-1.25685517452261 2.66173878728228 -2.176937020029,-1.21198924639328 2.76867704934868 -2.09922695298027,-1.17096242744496 2.88161419305851 -2.02816641808885,-1.13397459621556 3.0 -1.96410161513776,-1.10120595370083 3.12325770642184 -1.90734466140718,-1.07281614543321 3.25078681316818 -1.85817207107053,-1.04894348370485 3.38196601125011 -1.81682340804509,-1.029704273724 3.51615620880066 -1.78350011886079,-1.01519224698779 3.65270364466614 -1.75836455123287,-1.00547810463173 3.79094307346469 -1.74153916312021,-1.0006091729809 3.930201006595 -1.7331059261224,-1.0006091729809 4.069798993405 -1.7331059261224,-1.00547810463173 4.20905692653531 -1.74153916312021,-1.01519224698779 4.34729635533386 -1.75836455123287,-1.029704273724 4.48384379119933 -1.78350011886078,-1.04894348370485 4.61803398874989 -1.81682340804509,-1.07281614543321 4.74921318683182 -1.85817207107053,-1.10120595370083 4.87674229357815 -1.90734466140718,-1.13397459621556 5.0 -1.96410161513776,-1.17096242744496 5.11838580694149 -2.02816641808885,-1.21198924639328 5.23132295065132 -2.09922695298027,-1.25685517452261 5.33826121271772 -2.176937020029,-1.305341629541 5.4386796006773 -2.26091802359977,-1.35721239031346 5.53208888623796 -2.35076081668492,-1.41221474770753 5.61803398874989 -2.4460276942275,-1.47008073576679 5.69609619231285 -2.54625452557633,-1.53052843721411 5.76589518571785 -2.65095301568383,-1.5932633569242 5.8270909152852 -2.75961308403046,-1.65797985667433 5.87938524157182 -2.87170534968571,-1.724362644183 5.92252339187664 -2.98668371039877,-1.79208830918224 5.95629520146761 -3.10398800315384,-1.86082689903993 5.98053613748314 -3.22304673322801,-1.93024352625587 5.99512810051965 -3.34327985845609,-2.0 6.0 -3.46410161513775) + # OGRFeature(entities):21 + # EntityHandle (String) = 1D1 + # LINESTRING Z (-2.0 6.0 -3.46410161513776,-2.06975647374412 5.99512810051965 -3.58492337181942,-2.13917310096006 5.98053613748314 -3.7051564970475,-2.20791169081776 5.95629520146761 -3.82421522712167,-2.275637355817 5.92252339187664 -3.94151951987674,-2.34202014332567 5.87938524157182 -4.0564978805898,-2.4067366430758 5.8270909152852 -4.16859014624505,-2.46947156278589 5.76589518571785 -4.27725021459168,-2.5299192642332 5.69609619231285 -4.38194870469918,-2.58778525229247 5.61803398874989 -4.48217553604801,-2.64278760968654 5.53208888623796 -4.57744241359059,-2.694658370459 5.4386796006773 -4.66728520667574,-2.74314482547739 5.33826121271772 -4.75126621024651,-2.78801075360672 5.23132295065132 -4.82897627729524,-2.82903757255504 5.11838580694149 -4.90003681218666,-2.86602540378444 5.0 -4.96410161513776,-2.89879404629917 4.87674229357815 -5.02085856886833,-2.92718385456679 4.74921318683182 -5.07003115920498,-2.95105651629515 4.61803398874989 -5.11137982223042,-2.970295726276 4.48384379119934 -5.14470311141473,-2.98480775301221 4.34729635533386 -5.16983867904264,-2.99452189536827 4.20905692653531 -5.1866640671553,-2.99939082701909 4.069798993405 -5.19509730415311,-2.99939082701909 3.930201006595 -5.19509730415311,-2.99452189536827 3.79094307346469 -5.1866640671553,-2.98480775301221 3.65270364466614 -5.16983867904264,-2.970295726276 3.51615620880066 -5.14470311141473,-2.95105651629515 3.38196601125011 -5.11137982223042,-2.92718385456679 3.25078681316818 -5.07003115920498,-2.89879404629917 3.12325770642185 -5.02085856886833,-2.86602540378444 3.0 -4.96410161513776,-2.82903757255504 2.88161419305851 -4.90003681218666,-2.78801075360672 2.76867704934868 -4.82897627729524,-2.74314482547739 2.66173878728228 -4.75126621024651,-2.694658370459 2.5613203993227 -4.66728520667574,-2.64278760968654 2.46791111376204 -4.5774424135906,-2.58778525229247 2.38196601125011 -4.48217553604801,-2.5299192642332 2.30390380768715 -4.38194870469918,-2.46947156278589 2.23410481428215 -4.27725021459168,-2.4067366430758 2.1729090847148 -4.16859014624505,-2.34202014332567 2.12061475842818 -4.0564978805898,-2.275637355817 2.07747660812336 -3.94151951987674,-2.20791169081776 2.04370479853239 -3.82421522712167,-2.13917310096006 2.01946386251686 -3.7051564970475,-2.06975647374412 2.00487189948035 -3.58492337181943,-2.0 2.0 -3.46410161513776,-1.93024352625587 2.00487189948035 -3.34327985845609,-1.86082689903993 2.01946386251686 -3.22304673322801,-1.79208830918224 2.04370479853239 -3.10398800315384,-1.724362644183 2.07747660812336 -2.98668371039877,-1.65797985667433 2.12061475842818 -2.87170534968571,-1.5932633569242 2.1729090847148 -2.75961308403046,-1.53052843721411 2.23410481428215 -2.65095301568383, + # -1.47008073576679 2.30390380768715 -2.54625452557633,-1.41221474770753 2.38196601125011 -2.4460276942275,-1.35721239031346 2.46791111376204 -2.35076081668492,-1.305341629541 2.5613203993227 -2.26091802359977,-1.25685517452261 2.66173878728228 -2.176937020029,-1.21198924639328 2.76867704934868 -2.09922695298027,-1.17096242744496 2.88161419305851 -2.02816641808885,-1.13397459621556 3.0 -1.96410161513776,-1.10120595370083 3.12325770642184 -1.90734466140718,-1.07281614543321 3.25078681316818 -1.85817207107053,-1.04894348370485 3.38196601125011 -1.81682340804509,-1.029704273724 3.51615620880066 -1.78350011886079,-1.01519224698779 3.65270364466614 -1.75836455123287,-1.00547810463173 3.79094307346469 -1.74153916312021,-1.0006091729809 3.930201006595 -1.7331059261224,-1.0006091729809 4.069798993405 -1.7331059261224,-1.00547810463173 4.20905692653531 -1.74153916312021,-1.01519224698779 4.34729635533386 -1.75836455123287,-1.029704273724 4.48384379119933 -1.78350011886078,-1.04894348370485 4.61803398874989 -1.81682340804509,-1.07281614543321 4.74921318683182 -1.85817207107053,-1.10120595370083 4.87674229357815 -1.90734466140718,-1.13397459621556 5.0 -1.96410161513776,-1.17096242744496 5.11838580694149 -2.02816641808885,-1.21198924639328 5.23132295065132 -2.09922695298027,-1.25685517452261 5.33826121271772 -2.176937020029,-1.305341629541 5.4386796006773 -2.26091802359977,-1.35721239031346 5.53208888623796 -2.35076081668492,-1.41221474770753 5.61803398874989 -2.4460276942275,-1.47008073576679 5.69609619231285 -2.54625452557633,-1.53052843721411 5.76589518571785 -2.65095301568383,-1.5932633569242 5.8270909152852 -2.75961308403046,-1.65797985667433 5.87938524157182 -2.87170534968571,-1.724362644183 5.92252339187664 -2.98668371039877,-1.79208830918224 5.95629520146761 -3.10398800315384,-1.86082689903993 5.98053613748314 -3.22304673322801,-1.93024352625587 5.99512810051965 -3.34327985845609,-2.0 6.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2.0 6.0 -3.46410161513776,-2.06975647374412 5.99512810051965 -3.58492337181942,-2.13917310096006 5.98053613748314 -3.7051564970475,-2.20791169081776 5.95629520146761 -3.82421522712167,-2.275637355817 5.92252339187664 -3.94151951987674,-2.34202014332567 5.87938524157182 -4.0564978805898,-2.4067366430758 5.8270909152852 -4.16859014624505,-2.46947156278589 5.76589518571785 -4.27725021459168,-2.5299192642332 5.69609619231285 -4.38194870469918,-2.58778525229247 5.61803398874989 -4.48217553604801,-2.64278760968654 5.53208888623796 -4.57744241359059,-2.694658370459 5.4386796006773 -4.66728520667574,-2.74314482547739 5.33826121271772 -4.75126621024651,-2.78801075360672 5.23132295065132 -4.82897627729524,-2.82903757255504 5.11838580694149 -4.90003681218666,-2.86602540378444 5.0 -4.96410161513776,-2.89879404629917 4.87674229357815 -5.02085856886833,-2.92718385456679 4.74921318683182 -5.07003115920498,-2.95105651629515 4.61803398874989 -5.11137982223042,-2.970295726276 4.48384379119934 -5.14470311141473,-2.98480775301221 4.34729635533386 -5.16983867904264,-2.99452189536827 4.20905692653531 -5.1866640671553,-2.99939082701909 4.069798993405 -5.19509730415311,-2.99939082701909 3.930201006595 -5.19509730415311,-2.99452189536827 3.79094307346469 -5.1866640671553,-2.98480775301221 3.65270364466614 -5.16983867904264,-2.970295726276 3.51615620880066 -5.14470311141473,-2.95105651629515 3.38196601125011 -5.11137982223042,-2.92718385456679 3.25078681316818 -5.07003115920498,-2.89879404629917 3.12325770642185 -5.02085856886833,-2.86602540378444 3.0 -4.96410161513776,-2.82903757255504 2.88161419305851 -4.90003681218666,-2.78801075360672 2.76867704934868 -4.82897627729524,-2.74314482547739 2.66173878728228 -4.75126621024651,-2.694658370459 2.5613203993227 -4.66728520667574,-2.64278760968654 2.46791111376204 -4.5774424135906,-2.58778525229247 2.38196601125011 -4.48217553604801,-2.5299192642332 2.30390380768715 -4.38194870469918,-2.46947156278589 2.23410481428215 -4.27725021459168,-2.4067366430758 2.1729090847148 -4.16859014624505,-2.34202014332567 2.12061475842818 -4.0564978805898,-2.275637355817 2.07747660812336 -3.94151951987674,-2.20791169081776 2.04370479853239 -3.82421522712167,-2.13917310096006 2.01946386251686 -3.7051564970475,-2.06975647374412 2.00487189948035 -3.58492337181943,-2.0 2.0 -3.46410161513776,-1.93024352625587 2.00487189948035 -3.34327985845609,-1.86082689903993 2.01946386251686 -3.22304673322801,-1.79208830918224 2.04370479853239 -3.10398800315384,-1.724362644183 2.07747660812336 -2.98668371039877,' + - '-1.65797985667433 2.12061475842818 -2.87170534968571,-1.5932633569242 2.1729090847148 -2.75961308403046,-1.53052843721411 2.23410481428215 -2.65095301568383,-1.47008073576679 2.30390380768715 -2.54625452557633,-1.41221474770753 2.38196601125011 -2.4460276942275,-1.35721239031346 2.46791111376204 -2.35076081668492,-1.305341629541 2.5613203993227 -2.26091802359977,-1.25685517452261 2.66173878728228 -2.176937020029,-1.21198924639328 2.76867704934868 -2.09922695298027,-1.17096242744496 2.88161419305851 -2.02816641808885,-1.13397459621556 3.0 -1.96410161513776,-1.10120595370083 3.12325770642184 -1.90734466140718,-1.07281614543321 3.25078681316818 -1.85817207107053,-1.04894348370485 3.38196601125011 -1.81682340804509,-1.029704273724 3.51615620880066 -1.78350011886079,-1.01519224698779 3.65270364466614 -1.75836455123287,-1.00547810463173 3.79094307346469 -1.74153916312021,-1.0006091729809 3.930201006595 -1.7331059261224,-1.0006091729809 4.069798993405 -1.7331059261224,-1.00547810463173 4.20905692653531 -1.74153916312021,-1.01519224698779 4.34729635533386 -1.75836455123287,-1.029704273724 4.48384379119933 -1.78350011886078,-1.04894348370485 4.61803398874989 -1.81682340804509,-1.07281614543321 4.74921318683182 -1.85817207107053,-1.10120595370083 4.87674229357815 -1.90734466140718,-1.13397459621556 5.0 -1.96410161513776,-1.17096242744496 5.11838580694149 -2.02816641808885,-1.21198924639328 5.23132295065132 -2.09922695298027,-1.25685517452261 5.33826121271772 -2.176937020029,-1.305341629541 5.4386796006773 -2.26091802359977,-1.35721239031346 5.53208888623796 -2.35076081668492,-1.41221474770753 5.61803398874989 -2.4460276942275,-1.47008073576679 5.69609619231285 -2.54625452557633,-1.53052843721411 5.76589518571785 -2.65095301568383,-1.5932633569242 5.8270909152852 -2.75961308403046,-1.65797985667433 5.87938524157182 -2.87170534968571,-1.724362644183 5.92252339187664 -2.98668371039877,-1.79208830918224 5.95629520146761 -3.10398800315384,-1.86082689903993 5.98053613748314 -3.22304673322801,-1.93024352625587 5.99512810051965 -3.34327985845609,-2.0 6.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-2.0 6.0 -3.46410161513776,-2.06975647374412 5.99512810051965 -3.58492337181942,-2.13917310096006 5.98053613748314 -3.7051564970475,-2.20791169081776 5.95629520146761 -3.82421522712167,-2.275637355817 5.92252339187664 -3.94151951987674,-2.34202014332567 5.87938524157182 -4.0564978805898,-2.4067366430758 5.8270909152852 -4.16859014624505,-2.46947156278589 5.76589518571785 -4.27725021459168,-2.5299192642332 5.69609619231285 -4.38194870469918,-2.58778525229247 5.61803398874989 -4.48217553604801,-2.64278760968654 5.53208888623796 -4.57744241359059,-2.694658370459 5.4386796006773 -4.66728520667574,-2.74314482547739 5.33826121271772 -4.75126621024651,-2.78801075360672 5.23132295065132 -4.82897627729524,-2.82903757255504 5.11838580694149 -4.90003681218666,-2.86602540378444 5.0 -4.96410161513776,-2.89879404629917 4.87674229357815 -5.02085856886833,-2.92718385456679 4.74921318683182 -5.07003115920498,-2.95105651629515 4.61803398874989 -5.11137982223042,-2.970295726276 4.48384379119934 -5.14470311141473,-2.98480775301221 4.34729635533386 -5.16983867904264,-2.99452189536827 4.20905692653531 -5.1866640671553,-2.99939082701909 4.069798993405 -5.19509730415311,-2.99939082701909 3.930201006595 -5.19509730415311,-2.99452189536827 3.79094307346469 -5.1866640671553,-2.98480775301221 3.65270364466614 -5.16983867904264,-2.970295726276 3.51615620880066 -5.14470311141473,-2.95105651629515 3.38196601125011 -5.11137982223042,-2.92718385456679 3.25078681316818 -5.07003115920498,-2.89879404629917 3.12325770642185 -5.02085856886833,-2.86602540378444 3.0 -4.96410161513776,-2.82903757255504 2.88161419305851 -4.90003681218666,-2.78801075360672 2.76867704934868 -4.82897627729524,-2.74314482547739 2.66173878728228 -4.75126621024651,-2.694658370459 2.5613203993227 -4.66728520667574,-2.64278760968654 2.46791111376204 -4.5774424135906,-2.58778525229247 2.38196601125011 -4.48217553604801,-2.5299192642332 2.30390380768715 -4.38194870469918,-2.46947156278589 2.23410481428215 -4.27725021459168,-2.4067366430758 2.1729090847148 -4.16859014624505,-2.34202014332567 2.12061475842818 -4.0564978805898,-2.275637355817 2.07747660812336 -3.94151951987674,-2.20791169081776 2.04370479853239 -3.82421522712167,-2.13917310096006 2.01946386251686 -3.7051564970475,-2.06975647374412 2.00487189948035 -3.58492337181943,-2.0 2.0 -3.46410161513776,-1.93024352625587 2.00487189948035 -3.34327985845609,-1.86082689903993 2.01946386251686 -3.22304673322801,-1.79208830918224 2.04370479853239 -3.10398800315384,-1.724362644183 2.07747660812336 -2.98668371039877," + + "-1.65797985667433 2.12061475842818 -2.87170534968571,-1.5932633569242 2.1729090847148 -2.75961308403046,-1.53052843721411 2.23410481428215 -2.65095301568383,-1.47008073576679 2.30390380768715 -2.54625452557633,-1.41221474770753 2.38196601125011 -2.4460276942275,-1.35721239031346 2.46791111376204 -2.35076081668492,-1.305341629541 2.5613203993227 -2.26091802359977,-1.25685517452261 2.66173878728228 -2.176937020029,-1.21198924639328 2.76867704934868 -2.09922695298027,-1.17096242744496 2.88161419305851 -2.02816641808885,-1.13397459621556 3.0 -1.96410161513776,-1.10120595370083 3.12325770642184 -1.90734466140718,-1.07281614543321 3.25078681316818 -1.85817207107053,-1.04894348370485 3.38196601125011 -1.81682340804509,-1.029704273724 3.51615620880066 -1.78350011886079,-1.01519224698779 3.65270364466614 -1.75836455123287,-1.00547810463173 3.79094307346469 -1.74153916312021,-1.0006091729809 3.930201006595 -1.7331059261224,-1.0006091729809 4.069798993405 -1.7331059261224,-1.00547810463173 4.20905692653531 -1.74153916312021,-1.01519224698779 4.34729635533386 -1.75836455123287,-1.029704273724 4.48384379119933 -1.78350011886078,-1.04894348370485 4.61803398874989 -1.81682340804509,-1.07281614543321 4.74921318683182 -1.85817207107053,-1.10120595370083 4.87674229357815 -1.90734466140718,-1.13397459621556 5.0 -1.96410161513776,-1.17096242744496 5.11838580694149 -2.02816641808885,-1.21198924639328 5.23132295065132 -2.09922695298027,-1.25685517452261 5.33826121271772 -2.176937020029,-1.305341629541 5.4386796006773 -2.26091802359977,-1.35721239031346 5.53208888623796 -2.35076081668492,-1.41221474770753 5.61803398874989 -2.4460276942275,-1.47008073576679 5.69609619231285 -2.54625452557633,-1.53052843721411 5.76589518571785 -2.65095301568383,-1.5932633569242 5.8270909152852 -2.75961308403046,-1.65797985667433 5.87938524157182 -2.87170534968571,-1.724362644183 5.92252339187664 -2.98668371039877,-1.79208830918224 5.95629520146761 -3.10398800315384,-1.86082689903993 5.98053613748314 -3.22304673322801,-1.93024352625587 5.99512810051965 -3.34327985845609,-2.0 6.0 -3.46410161513775)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):22 -# EntityHandle (String) = 1D2 -# LINESTRING Z (-1.0 4.0 -1.73205080756888,-2.0 4.0 -3.46410161513775) + # OGRFeature(entities):22 + # EntityHandle (String) = 1D2 + # LINESTRING Z (-1.0 4.0 -1.73205080756888,-2.0 4.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1.0 4.0 -1.73205080756888,-2.0 4.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-1.0 4.0 -1.73205080756888,-2.0 4.0 -3.46410161513775)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):23 -# EntityHandle (String) = 1D3 -# LINESTRING Z (-2.0 4.0 -3.46410161513775,-3.0 4.0 -5.19615242270663) + # OGRFeature(entities):23 + # EntityHandle (String) = 1D3 + # LINESTRING Z (-2.0 4.0 -3.46410161513775,-3.0 4.0 -5.19615242270663) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2.0 4.0 -3.46410161513775,-3.0 4.0 -5.19615242270663)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-2.0 4.0 -3.46410161513775,-3.0 4.0 -5.19615242270663)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):24 -# EntityHandle (String) = 1D4 -# LINESTRING Z (-2.0 3.0 -3.46410161513775,-2.0 4.0 -3.46410161513775) + # OGRFeature(entities):24 + # EntityHandle (String) = 1D4 + # LINESTRING Z (-2.0 3.0 -3.46410161513775,-2.0 4.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2.0 3.0 -3.46410161513775,-2.0 4.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-2.0 3.0 -3.46410161513775,-2.0 4.0 -3.46410161513775)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):25 -# EntityHandle (String) = 1D5 -# LINESTRING Z (-2.0 4.0 -3.46410161513775,-2.0 5.0 -3.46410161513775) + # OGRFeature(entities):25 + # EntityHandle (String) = 1D5 + # LINESTRING Z (-2.0 4.0 -3.46410161513775,-2.0 5.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-2.0 4.0 -3.46410161513775,-2.0 5.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (-2.0 4.0 -3.46410161513775,-2.0 5.0 -3.46410161513775)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):26 -# EntityHandle (String) = 1D6 -# LINESTRING Z (-1.0 4.0 -1.73205080756888,-1.00243594974018 4.06975647374412 -1.73626999628355,-1.00973193125843 4.13917310096007 -1.74890700696425,-1.02185239926619 4.20791169081776 -1.76990027336521,-1.03873830406168 4.275637355817 -1.79914751840276,-1.06030737921409 4.34202014332567 -1.83650625243901,-1.0864545423574 4.4067366430758 -1.88179446747701,-1.11705240714107 4.46947156278589 -1.93479152388545,-1.15195190384357 4.52991926423321 -1.99523922533277,-1.19098300562505 4.58778525229247 -2.06284307669368,-1.23395555688102 4.64278760968654 -2.13727371879988,-1.28066019966135 4.694658370459 -2.21816853304476,-1.33086939364114 4.74314482547739 -2.30513340802484,-1.38433852467434 4.78801075360672 -2.3977446596109,-1.44080709652925 4.82903757255504 -2.49555109509446,-1.5 4.86602540378444 -2.59807621135332,-1.56162885321092 4.89879404629917 -2.70482051632684,-1.62539340658409 4.92718385456679 -2.8152639624911,-1.69098300562505 4.95105651629515 -2.92886848047812,-1.75807810440033 4.970295726276 -3.04508060049576,-1.82635182233307 4.98480775301221 -3.16333414877688,-1.89547153673235 4.99452189536827 -3.28305300592108,-1.9651005032975 4.99939082701909 -3.40365391369044,-2.0348994967025 4.99939082701909 -3.52454931658507,-2.10452846326765 4.99452189536827 -3.64515022435443,-2.17364817766693 4.98480775301221 -3.76486908149863,-2.24192189559967 4.970295726276 -3.88312262977975,-2.30901699437495 4.95105651629515 -3.99933474979739,-2.37460659341591 4.92718385456679 -4.11293926778441,-2.43837114678908 4.89879404629917 -4.22338271394867,-2.5 4.86602540378444 -4.33012701892219,-2.55919290347075 4.82903757255504 -4.43265213518105,-2.61566147532566 4.78801075360672 -4.53045857066461,-2.66913060635886 4.74314482547739 -4.62306982225067,-2.71933980033865 4.694658370459 -4.71003469723075,-2.76604444311898 4.64278760968654 -4.79092951147563,-2.80901699437495 4.58778525229247 -4.86536015358183,-2.84804809615642 4.5299192642332 -4.93296400494274,-2.88294759285893 4.46947156278589 -4.99341170639005,-2.9135454576426 4.4067366430758 -5.0464087627985,-2.93969262078591 4.34202014332567 -5.0916969778365,-2.96126169593832 4.275637355817 -5.12905571187275,-2.9781476007338 4.20791169081776 -5.1583029569103,-2.99026806874157 4.13917310096007 -5.17929622331126,-2.99756405025982 4.06975647374412 -5.19193323399196,-3.0 4.0 -5.19615242270663,-2.99756405025982 3.93024352625587 -5.19193323399196,-2.99026806874157 3.86082689903993 -5.17929622331126,-2.9781476007338 3.79208830918224 -5.1583029569103,-2.96126169593832 3.724362644183 -5.12905571187275, -# -2.93969262078591 3.65797985667433 -5.0916969778365,-2.9135454576426 3.5932633569242 -5.0464087627985,-2.88294759285893 3.53052843721411 -4.99341170639005,-2.84804809615642 3.4700807357668 -4.93296400494274,-2.80901699437495 3.41221474770753 -4.86536015358183,-2.76604444311898 3.35721239031346 -4.79092951147563,-2.71933980033865 3.305341629541 -4.71003469723075,-2.66913060635886 3.25685517452261 -4.62306982225067,-2.61566147532566 3.21198924639328 -4.53045857066461,-2.55919290347075 3.17096242744496 -4.43265213518105,-2.5 3.13397459621556 -4.33012701892219,-2.43837114678908 3.10120595370083 -4.22338271394867,-2.37460659341591 3.07281614543321 -4.11293926778441,-2.30901699437495 3.04894348370485 -3.99933474979739,-2.24192189559967 3.029704273724 -3.88312262977975,-2.17364817766693 3.01519224698779 -3.76486908149863,-2.10452846326765 3.00547810463173 -3.64515022435443,-2.0348994967025 3.0006091729809 -3.52454931658507,-1.9651005032975 3.0006091729809 -3.40365391369044,-1.89547153673235 3.00547810463173 -3.28305300592108,-1.82635182233307 3.01519224698779 -3.16333414877688,-1.75807810440033 3.029704273724 -3.04508060049576,-1.69098300562505 3.04894348370485 -2.92886848047812,-1.62539340658409 3.07281614543321 -2.8152639624911,-1.56162885321092 3.10120595370083 -2.70482051632684,-1.5 3.13397459621556 -2.59807621135332,-1.44080709652925 3.17096242744496 -2.49555109509446,-1.38433852467434 3.21198924639328 -2.3977446596109,-1.33086939364114 3.25685517452261 -2.30513340802484,-1.28066019966135 3.305341629541 -2.21816853304476,-1.23395555688102 3.35721239031346 -2.13727371879988,-1.19098300562505 3.41221474770753 -2.06284307669368,-1.15195190384357 3.4700807357668 -1.99523922533277,-1.11705240714107 3.53052843721411 -1.93479152388545,-1.0864545423574 3.5932633569242 -1.88179446747701,-1.06030737921409 3.65797985667433 -1.83650625243901,-1.03873830406168 3.724362644183 -1.79914751840276,-1.02185239926619 3.79208830918224 -1.76990027336521,-1.00973193125843 3.86082689903993 -1.74890700696425,-1.00243594974018 3.93024352625587 -1.73626999628355,-1.0 4.0 -1.73205080756888) + # OGRFeature(entities):26 + # EntityHandle (String) = 1D6 + # LINESTRING Z (-1.0 4.0 -1.73205080756888,-1.00243594974018 4.06975647374412 -1.73626999628355,-1.00973193125843 4.13917310096007 -1.74890700696425,-1.02185239926619 4.20791169081776 -1.76990027336521,-1.03873830406168 4.275637355817 -1.79914751840276,-1.06030737921409 4.34202014332567 -1.83650625243901,-1.0864545423574 4.4067366430758 -1.88179446747701,-1.11705240714107 4.46947156278589 -1.93479152388545,-1.15195190384357 4.52991926423321 -1.99523922533277,-1.19098300562505 4.58778525229247 -2.06284307669368,-1.23395555688102 4.64278760968654 -2.13727371879988,-1.28066019966135 4.694658370459 -2.21816853304476,-1.33086939364114 4.74314482547739 -2.30513340802484,-1.38433852467434 4.78801075360672 -2.3977446596109,-1.44080709652925 4.82903757255504 -2.49555109509446,-1.5 4.86602540378444 -2.59807621135332,-1.56162885321092 4.89879404629917 -2.70482051632684,-1.62539340658409 4.92718385456679 -2.8152639624911,-1.69098300562505 4.95105651629515 -2.92886848047812,-1.75807810440033 4.970295726276 -3.04508060049576,-1.82635182233307 4.98480775301221 -3.16333414877688,-1.89547153673235 4.99452189536827 -3.28305300592108,-1.9651005032975 4.99939082701909 -3.40365391369044,-2.0348994967025 4.99939082701909 -3.52454931658507,-2.10452846326765 4.99452189536827 -3.64515022435443,-2.17364817766693 4.98480775301221 -3.76486908149863,-2.24192189559967 4.970295726276 -3.88312262977975,-2.30901699437495 4.95105651629515 -3.99933474979739,-2.37460659341591 4.92718385456679 -4.11293926778441,-2.43837114678908 4.89879404629917 -4.22338271394867,-2.5 4.86602540378444 -4.33012701892219,-2.55919290347075 4.82903757255504 -4.43265213518105,-2.61566147532566 4.78801075360672 -4.53045857066461,-2.66913060635886 4.74314482547739 -4.62306982225067,-2.71933980033865 4.694658370459 -4.71003469723075,-2.76604444311898 4.64278760968654 -4.79092951147563,-2.80901699437495 4.58778525229247 -4.86536015358183,-2.84804809615642 4.5299192642332 -4.93296400494274,-2.88294759285893 4.46947156278589 -4.99341170639005,-2.9135454576426 4.4067366430758 -5.0464087627985,-2.93969262078591 4.34202014332567 -5.0916969778365,-2.96126169593832 4.275637355817 -5.12905571187275,-2.9781476007338 4.20791169081776 -5.1583029569103,-2.99026806874157 4.13917310096007 -5.17929622331126,-2.99756405025982 4.06975647374412 -5.19193323399196,-3.0 4.0 -5.19615242270663,-2.99756405025982 3.93024352625587 -5.19193323399196,-2.99026806874157 3.86082689903993 -5.17929622331126,-2.9781476007338 3.79208830918224 -5.1583029569103,-2.96126169593832 3.724362644183 -5.12905571187275, + # -2.93969262078591 3.65797985667433 -5.0916969778365,-2.9135454576426 3.5932633569242 -5.0464087627985,-2.88294759285893 3.53052843721411 -4.99341170639005,-2.84804809615642 3.4700807357668 -4.93296400494274,-2.80901699437495 3.41221474770753 -4.86536015358183,-2.76604444311898 3.35721239031346 -4.79092951147563,-2.71933980033865 3.305341629541 -4.71003469723075,-2.66913060635886 3.25685517452261 -4.62306982225067,-2.61566147532566 3.21198924639328 -4.53045857066461,-2.55919290347075 3.17096242744496 -4.43265213518105,-2.5 3.13397459621556 -4.33012701892219,-2.43837114678908 3.10120595370083 -4.22338271394867,-2.37460659341591 3.07281614543321 -4.11293926778441,-2.30901699437495 3.04894348370485 -3.99933474979739,-2.24192189559967 3.029704273724 -3.88312262977975,-2.17364817766693 3.01519224698779 -3.76486908149863,-2.10452846326765 3.00547810463173 -3.64515022435443,-2.0348994967025 3.0006091729809 -3.52454931658507,-1.9651005032975 3.0006091729809 -3.40365391369044,-1.89547153673235 3.00547810463173 -3.28305300592108,-1.82635182233307 3.01519224698779 -3.16333414877688,-1.75807810440033 3.029704273724 -3.04508060049576,-1.69098300562505 3.04894348370485 -2.92886848047812,-1.62539340658409 3.07281614543321 -2.8152639624911,-1.56162885321092 3.10120595370083 -2.70482051632684,-1.5 3.13397459621556 -2.59807621135332,-1.44080709652925 3.17096242744496 -2.49555109509446,-1.38433852467434 3.21198924639328 -2.3977446596109,-1.33086939364114 3.25685517452261 -2.30513340802484,-1.28066019966135 3.305341629541 -2.21816853304476,-1.23395555688102 3.35721239031346 -2.13727371879988,-1.19098300562505 3.41221474770753 -2.06284307669368,-1.15195190384357 3.4700807357668 -1.99523922533277,-1.11705240714107 3.53052843721411 -1.93479152388545,-1.0864545423574 3.5932633569242 -1.88179446747701,-1.06030737921409 3.65797985667433 -1.83650625243901,-1.03873830406168 3.724362644183 -1.79914751840276,-1.02185239926619 3.79208830918224 -1.76990027336521,-1.00973193125843 3.86082689903993 -1.74890700696425,-1.00243594974018 3.93024352625587 -1.73626999628355,-1.0 4.0 -1.73205080756888) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1.0 4.0 -1.73205080756888,-1.00243594974018 4.06975647374412 -1.73626999628355,-1.00973193125843 4.13917310096007 -1.74890700696425,-1.02185239926619 4.20791169081776 -1.76990027336521,-1.03873830406168 4.275637355817 -1.79914751840276,-1.06030737921409 4.34202014332567 -1.83650625243901,-1.0864545423574 4.4067366430758 -1.88179446747701,-1.11705240714107 4.46947156278589 -1.93479152388545,-1.15195190384357 4.52991926423321 -1.99523922533277,-1.19098300562505 4.58778525229247 -2.06284307669368,-1.23395555688102 4.64278760968654 -2.13727371879988,-1.28066019966135 4.694658370459 -2.21816853304476,-1.33086939364114 4.74314482547739 -2.30513340802484,-1.38433852467434 4.78801075360672 -2.3977446596109,-1.44080709652925 4.82903757255504 -2.49555109509446,-1.5 4.86602540378444 -2.59807621135332,-1.56162885321092 4.89879404629917 -2.70482051632684,-1.62539340658409 4.92718385456679 -2.8152639624911,-1.69098300562505 4.95105651629515 -2.92886848047812,-1.75807810440033 4.970295726276 -3.04508060049576,-1.82635182233307 4.98480775301221 -3.16333414877688,-1.89547153673235 4.99452189536827 -3.28305300592108,-1.9651005032975 4.99939082701909 -3.40365391369044,-2.0348994967025 4.99939082701909 -3.52454931658507,-2.10452846326765 4.99452189536827 -3.64515022435443,-2.17364817766693 4.98480775301221 -3.76486908149863,-2.24192189559967 4.970295726276 -3.88312262977975,-2.30901699437495 4.95105651629515 -3.99933474979739,-2.37460659341591 4.92718385456679 -4.11293926778441,-2.43837114678908 4.89879404629917 -4.22338271394867,-2.5 4.86602540378444 -4.33012701892219,-2.55919290347075 4.82903757255504 -4.43265213518105,-2.61566147532566 4.78801075360672 -4.53045857066461,-2.66913060635886 4.74314482547739 -4.62306982225067,-2.71933980033865 4.694658370459 -4.71003469723075,-2.76604444311898 4.64278760968654 -4.79092951147563,-2.80901699437495 4.58778525229247 -4.86536015358183,-2.84804809615642 4.5299192642332 -4.93296400494274,-2.88294759285893 4.46947156278589 -4.99341170639005,-2.9135454576426 4.4067366430758 -5.0464087627985,-2.93969262078591 4.34202014332567 -5.0916969778365,-2.96126169593832 4.275637355817 -5.12905571187275,-2.9781476007338 4.20791169081776 -5.1583029569103,-2.99026806874157 4.13917310096007 -5.17929622331126,-2.99756405025982 4.06975647374412 -5.19193323399196,-3.0 4.0 -5.19615242270663,-2.99756405025982 3.93024352625587 -5.19193323399196,-2.99026806874157 3.86082689903993 -5.17929622331126,-2.9781476007338 3.79208830918224 -5.1583029569103,-2.96126169593832 3.724362644183 -5.12905571187275,' + - '-2.93969262078591 3.65797985667433 -5.0916969778365,-2.9135454576426 3.5932633569242 -5.0464087627985,-2.88294759285893 3.53052843721411 -4.99341170639005,-2.84804809615642 3.4700807357668 -4.93296400494274,-2.80901699437495 3.41221474770753 -4.86536015358183,-2.76604444311898 3.35721239031346 -4.79092951147563,-2.71933980033865 3.305341629541 -4.71003469723075,-2.66913060635886 3.25685517452261 -4.62306982225067,-2.61566147532566 3.21198924639328 -4.53045857066461,-2.55919290347075 3.17096242744496 -4.43265213518105,-2.5 3.13397459621556 -4.33012701892219,-2.43837114678908 3.10120595370083 -4.22338271394867,-2.37460659341591 3.07281614543321 -4.11293926778441,-2.30901699437495 3.04894348370485 -3.99933474979739,-2.24192189559967 3.029704273724 -3.88312262977975,-2.17364817766693 3.01519224698779 -3.76486908149863,-2.10452846326765 3.00547810463173 -3.64515022435443,-2.0348994967025 3.0006091729809 -3.52454931658507,-1.9651005032975 3.0006091729809 -3.40365391369044,-1.89547153673235 3.00547810463173 -3.28305300592108,-1.82635182233307 3.01519224698779 -3.16333414877688,-1.75807810440033 3.029704273724 -3.04508060049576,-1.69098300562505 3.04894348370485 -2.92886848047812,-1.62539340658409 3.07281614543321 -2.8152639624911,-1.56162885321092 3.10120595370083 -2.70482051632684,-1.5 3.13397459621556 -2.59807621135332,-1.44080709652925 3.17096242744496 -2.49555109509446,-1.38433852467434 3.21198924639328 -2.3977446596109,-1.33086939364114 3.25685517452261 -2.30513340802484,-1.28066019966135 3.305341629541 -2.21816853304476,-1.23395555688102 3.35721239031346 -2.13727371879988,-1.19098300562505 3.41221474770753 -2.06284307669368,-1.15195190384357 3.4700807357668 -1.99523922533277,-1.11705240714107 3.53052843721411 -1.93479152388545,-1.0864545423574 3.5932633569242 -1.88179446747701,-1.06030737921409 3.65797985667433 -1.83650625243901,-1.03873830406168 3.724362644183 -1.79914751840276,-1.02185239926619 3.79208830918224 -1.76990027336521,-1.00973193125843 3.86082689903993 -1.74890700696425,-1.00243594974018 3.93024352625587 -1.73626999628355,-1.0 4.0 -1.73205080756888)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-1.0 4.0 -1.73205080756888,-1.00243594974018 4.06975647374412 -1.73626999628355,-1.00973193125843 4.13917310096007 -1.74890700696425,-1.02185239926619 4.20791169081776 -1.76990027336521,-1.03873830406168 4.275637355817 -1.79914751840276,-1.06030737921409 4.34202014332567 -1.83650625243901,-1.0864545423574 4.4067366430758 -1.88179446747701,-1.11705240714107 4.46947156278589 -1.93479152388545,-1.15195190384357 4.52991926423321 -1.99523922533277,-1.19098300562505 4.58778525229247 -2.06284307669368,-1.23395555688102 4.64278760968654 -2.13727371879988,-1.28066019966135 4.694658370459 -2.21816853304476,-1.33086939364114 4.74314482547739 -2.30513340802484,-1.38433852467434 4.78801075360672 -2.3977446596109,-1.44080709652925 4.82903757255504 -2.49555109509446,-1.5 4.86602540378444 -2.59807621135332,-1.56162885321092 4.89879404629917 -2.70482051632684,-1.62539340658409 4.92718385456679 -2.8152639624911,-1.69098300562505 4.95105651629515 -2.92886848047812,-1.75807810440033 4.970295726276 -3.04508060049576,-1.82635182233307 4.98480775301221 -3.16333414877688,-1.89547153673235 4.99452189536827 -3.28305300592108,-1.9651005032975 4.99939082701909 -3.40365391369044,-2.0348994967025 4.99939082701909 -3.52454931658507,-2.10452846326765 4.99452189536827 -3.64515022435443,-2.17364817766693 4.98480775301221 -3.76486908149863,-2.24192189559967 4.970295726276 -3.88312262977975,-2.30901699437495 4.95105651629515 -3.99933474979739,-2.37460659341591 4.92718385456679 -4.11293926778441,-2.43837114678908 4.89879404629917 -4.22338271394867,-2.5 4.86602540378444 -4.33012701892219,-2.55919290347075 4.82903757255504 -4.43265213518105,-2.61566147532566 4.78801075360672 -4.53045857066461,-2.66913060635886 4.74314482547739 -4.62306982225067,-2.71933980033865 4.694658370459 -4.71003469723075,-2.76604444311898 4.64278760968654 -4.79092951147563,-2.80901699437495 4.58778525229247 -4.86536015358183,-2.84804809615642 4.5299192642332 -4.93296400494274,-2.88294759285893 4.46947156278589 -4.99341170639005,-2.9135454576426 4.4067366430758 -5.0464087627985,-2.93969262078591 4.34202014332567 -5.0916969778365,-2.96126169593832 4.275637355817 -5.12905571187275,-2.9781476007338 4.20791169081776 -5.1583029569103,-2.99026806874157 4.13917310096007 -5.17929622331126,-2.99756405025982 4.06975647374412 -5.19193323399196,-3.0 4.0 -5.19615242270663,-2.99756405025982 3.93024352625587 -5.19193323399196,-2.99026806874157 3.86082689903993 -5.17929622331126,-2.9781476007338 3.79208830918224 -5.1583029569103,-2.96126169593832 3.724362644183 -5.12905571187275," + + "-2.93969262078591 3.65797985667433 -5.0916969778365,-2.9135454576426 3.5932633569242 -5.0464087627985,-2.88294759285893 3.53052843721411 -4.99341170639005,-2.84804809615642 3.4700807357668 -4.93296400494274,-2.80901699437495 3.41221474770753 -4.86536015358183,-2.76604444311898 3.35721239031346 -4.79092951147563,-2.71933980033865 3.305341629541 -4.71003469723075,-2.66913060635886 3.25685517452261 -4.62306982225067,-2.61566147532566 3.21198924639328 -4.53045857066461,-2.55919290347075 3.17096242744496 -4.43265213518105,-2.5 3.13397459621556 -4.33012701892219,-2.43837114678908 3.10120595370083 -4.22338271394867,-2.37460659341591 3.07281614543321 -4.11293926778441,-2.30901699437495 3.04894348370485 -3.99933474979739,-2.24192189559967 3.029704273724 -3.88312262977975,-2.17364817766693 3.01519224698779 -3.76486908149863,-2.10452846326765 3.00547810463173 -3.64515022435443,-2.0348994967025 3.0006091729809 -3.52454931658507,-1.9651005032975 3.0006091729809 -3.40365391369044,-1.89547153673235 3.00547810463173 -3.28305300592108,-1.82635182233307 3.01519224698779 -3.16333414877688,-1.75807810440033 3.029704273724 -3.04508060049576,-1.69098300562505 3.04894348370485 -2.92886848047812,-1.62539340658409 3.07281614543321 -2.8152639624911,-1.56162885321092 3.10120595370083 -2.70482051632684,-1.5 3.13397459621556 -2.59807621135332,-1.44080709652925 3.17096242744496 -2.49555109509446,-1.38433852467434 3.21198924639328 -2.3977446596109,-1.33086939364114 3.25685517452261 -2.30513340802484,-1.28066019966135 3.305341629541 -2.21816853304476,-1.23395555688102 3.35721239031346 -2.13727371879988,-1.19098300562505 3.41221474770753 -2.06284307669368,-1.15195190384357 3.4700807357668 -1.99523922533277,-1.11705240714107 3.53052843721411 -1.93479152388545,-1.0864545423574 3.5932633569242 -1.88179446747701,-1.06030737921409 3.65797985667433 -1.83650625243901,-1.03873830406168 3.724362644183 -1.79914751840276,-1.02185239926619 3.79208830918224 -1.76990027336521,-1.00973193125843 3.86082689903993 -1.74890700696425,-1.00243594974018 3.93024352625587 -1.73626999628355,-1.0 4.0 -1.73205080756888)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):27 -# EntityHandle (String) = 1D7 -# LINESTRING Z (-1.0 2.0 -1.73205080756888,-0.983288972510522 2.03582232791524 -1.70310645891042,-0.967858303543227 2.07387296203834 -1.67637975626429,-0.953782068732337 2.11396923855472 -1.65199900239256,-0.941127841688774 2.15591867344963 -1.6300812382226,-0.929956369609942 2.19951988653655 -1.61073168098672,-0.92032128166002 2.24456356819194 -1.59404321912206,-0.912268831520699 2.29083348415575 -1.58009596635534,-0.905837675348257 2.33810751357387 -1.56895687711326,-0.901058686202915 2.38615871529951 -1.56067942510471,-0.89795480584129 2.43475641733454 -1.55530334661776,-0.896540934583439 2.48366732418105 -1.5528544497638,-0.896823859783196 2.53265663678705 -1.55334449058452,-0.898802223245158 2.58148917971011 -1.55677111661648,-0.902466527744776 2.62993053008786 -1.56311787818422,-0.907799182620207 2.67774814299567 -1.5723543073677,-0.9147745882171 2.72471246778926 -1.58443606426492,-0.923359258780906 2.7705980500731 -1.59930514984767,-0.933511983206783 2.81518461400453 -1.61689018438853,-0.945184022875394 2.85825811973811 -1.63710675012253,-0.958319345624882 2.89961179093367 -1.65985779649846,-0.972854894735838 2.93904710739563 -1.68503410607454,-0.988720891637972 2.97637475807832 -1.71251481882177,-1.00584117088534 3.01141554988232 -1.74216801231798,-1.02413354579207 3.04400126787917 -1.77385133504753,-1.04351020297329 3.07397548283483 -1.80741268976625,-1.06387812389736 3.10119430215541 -1.84269096365129,-1.08513953142555 3.12552706065018 -1.87951680173053,-1.1071923591957 3.14685694779575 -1.917713419879,-1.12993074159648 3.16508156849045 -1.95709745347909,-1.15324552198012 3.18011343460661 -1.99747983767086,-1.17702477667387 3.1918803849814 -2.03866671496655,-1.20115435227475 3.20032593182975 -2.08046036587236,-1.22551841364822 3.2054095319166 -2.12266015804993,-1.25 3.20710678118655 -2.1650635094611,-1.27448158635178 3.2054095319166 -2.20746686087227,-1.29884564772525 3.20032593182975 -2.24966665304983,-1.32297522332613 3.1918803849814 -2.29146030395564,-1.34675447801988 3.18011343460661 -2.33264718125133,-1.37006925840352 3.16508156849045 -2.3730295654431,-1.3928076408043 3.14685694779575 -2.41241359904319,-1.41486046857445 3.12552706065018 -2.45061021719166,-1.43612187610264 3.10119430215541 -2.48743605527091,-1.45648979702671 3.07397548283483 -2.52271432915594,-1.47586645420793 3.04400126787917 -2.55627568387467,-1.49415882911466 3.01141554988232 -2.58795900660421,-1.51127910836203 2.97637475807832 -2.61761220010042,-1.52714510526416 2.93904710739563 -2.64509291284765,-1.54168065437512 2.89961179093367 -2.67026922242374,-1.55481597712461 2.85825811973811 -2.69302026879967,-1.56648801679322 2.81518461400453 -2.71323683453366,-1.57664074121909 2.7705980500731 -2.73082186907453,-1.5852254117829 2.72471246778926 -2.74569095465728,-1.59220081737979 2.67774814299567 -2.7577727115545,-1.59753347225522 2.62993053008785 -2.76700914073797,-1.60119777675484 2.58148917971011 -2.77335590230571,-1.6031761402168 2.53265663678705 -2.77678252833767,-1.60345906541656 2.48366732418105 -2.77727256915839,-1.60204519415871 2.43475641733454 -2.77482367230443,-1.59894131379708 2.38615871529951 -2.76944759381748,-1.59416232465174 2.33810751357387 -2.76117014180893,-1.5877311684793 2.29083348415575 -2.75003105256685,-1.57967871833998 2.24456356819194 -2.73608379980013,-1.57004363039006 2.19951988653655 -2.71939533793547,-1.55887215831123 2.15591867344963 -2.7000457806996,-1.54621793126766 2.11396923855472 -2.67812801652963,-1.53214169645677 2.07387296203834 -2.6537472626579,-1.51671102748948 2.03582232791524 -2.62702056001177,-1.5 2.0 -2.59807621135332) + # OGRFeature(entities):27 + # EntityHandle (String) = 1D7 + # LINESTRING Z (-1.0 2.0 -1.73205080756888,-0.983288972510522 2.03582232791524 -1.70310645891042,-0.967858303543227 2.07387296203834 -1.67637975626429,-0.953782068732337 2.11396923855472 -1.65199900239256,-0.941127841688774 2.15591867344963 -1.6300812382226,-0.929956369609942 2.19951988653655 -1.61073168098672,-0.92032128166002 2.24456356819194 -1.59404321912206,-0.912268831520699 2.29083348415575 -1.58009596635534,-0.905837675348257 2.33810751357387 -1.56895687711326,-0.901058686202915 2.38615871529951 -1.56067942510471,-0.89795480584129 2.43475641733454 -1.55530334661776,-0.896540934583439 2.48366732418105 -1.5528544497638,-0.896823859783196 2.53265663678705 -1.55334449058452,-0.898802223245158 2.58148917971011 -1.55677111661648,-0.902466527744776 2.62993053008786 -1.56311787818422,-0.907799182620207 2.67774814299567 -1.5723543073677,-0.9147745882171 2.72471246778926 -1.58443606426492,-0.923359258780906 2.7705980500731 -1.59930514984767,-0.933511983206783 2.81518461400453 -1.61689018438853,-0.945184022875394 2.85825811973811 -1.63710675012253,-0.958319345624882 2.89961179093367 -1.65985779649846,-0.972854894735838 2.93904710739563 -1.68503410607454,-0.988720891637972 2.97637475807832 -1.71251481882177,-1.00584117088534 3.01141554988232 -1.74216801231798,-1.02413354579207 3.04400126787917 -1.77385133504753,-1.04351020297329 3.07397548283483 -1.80741268976625,-1.06387812389736 3.10119430215541 -1.84269096365129,-1.08513953142555 3.12552706065018 -1.87951680173053,-1.1071923591957 3.14685694779575 -1.917713419879,-1.12993074159648 3.16508156849045 -1.95709745347909,-1.15324552198012 3.18011343460661 -1.99747983767086,-1.17702477667387 3.1918803849814 -2.03866671496655,-1.20115435227475 3.20032593182975 -2.08046036587236,-1.22551841364822 3.2054095319166 -2.12266015804993,-1.25 3.20710678118655 -2.1650635094611,-1.27448158635178 3.2054095319166 -2.20746686087227,-1.29884564772525 3.20032593182975 -2.24966665304983,-1.32297522332613 3.1918803849814 -2.29146030395564,-1.34675447801988 3.18011343460661 -2.33264718125133,-1.37006925840352 3.16508156849045 -2.3730295654431,-1.3928076408043 3.14685694779575 -2.41241359904319,-1.41486046857445 3.12552706065018 -2.45061021719166,-1.43612187610264 3.10119430215541 -2.48743605527091,-1.45648979702671 3.07397548283483 -2.52271432915594,-1.47586645420793 3.04400126787917 -2.55627568387467,-1.49415882911466 3.01141554988232 -2.58795900660421,-1.51127910836203 2.97637475807832 -2.61761220010042,-1.52714510526416 2.93904710739563 -2.64509291284765,-1.54168065437512 2.89961179093367 -2.67026922242374,-1.55481597712461 2.85825811973811 -2.69302026879967,-1.56648801679322 2.81518461400453 -2.71323683453366,-1.57664074121909 2.7705980500731 -2.73082186907453,-1.5852254117829 2.72471246778926 -2.74569095465728,-1.59220081737979 2.67774814299567 -2.7577727115545,-1.59753347225522 2.62993053008785 -2.76700914073797,-1.60119777675484 2.58148917971011 -2.77335590230571,-1.6031761402168 2.53265663678705 -2.77678252833767,-1.60345906541656 2.48366732418105 -2.77727256915839,-1.60204519415871 2.43475641733454 -2.77482367230443,-1.59894131379708 2.38615871529951 -2.76944759381748,-1.59416232465174 2.33810751357387 -2.76117014180893,-1.5877311684793 2.29083348415575 -2.75003105256685,-1.57967871833998 2.24456356819194 -2.73608379980013,-1.57004363039006 2.19951988653655 -2.71939533793547,-1.55887215831123 2.15591867344963 -2.7000457806996,-1.54621793126766 2.11396923855472 -2.67812801652963,-1.53214169645677 2.07387296203834 -2.6537472626579,-1.51671102748948 2.03582232791524 -2.62702056001177,-1.5 2.0 -2.59807621135332) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (-1.0 2.0 -1.73205080756888,-0.983288972510522 2.03582232791524 -1.70310645891042,-0.967858303543227 2.07387296203834 -1.67637975626429,-0.953782068732337 2.11396923855472 -1.65199900239256,-0.941127841688774 2.15591867344963 -1.6300812382226,-0.929956369609942 2.19951988653655 -1.61073168098672,-0.92032128166002 2.24456356819194 -1.59404321912206,-0.912268831520699 2.29083348415575 -1.58009596635534,-0.905837675348257 2.33810751357387 -1.56895687711326,-0.901058686202915 2.38615871529951 -1.56067942510471,-0.89795480584129 2.43475641733454 -1.55530334661776,-0.896540934583439 2.48366732418105 -1.5528544497638,-0.896823859783196 2.53265663678705 -1.55334449058452,-0.898802223245158 2.58148917971011 -1.55677111661648,-0.902466527744776 2.62993053008786 -1.56311787818422,-0.907799182620207 2.67774814299567 -1.5723543073677,-0.9147745882171 2.72471246778926 -1.58443606426492,-0.923359258780906 2.7705980500731 -1.59930514984767,-0.933511983206783 2.81518461400453 -1.61689018438853,-0.945184022875394 2.85825811973811 -1.63710675012253,-0.958319345624882 2.89961179093367 -1.65985779649846,-0.972854894735838 2.93904710739563 -1.68503410607454,-0.988720891637972 2.97637475807832 -1.71251481882177,-1.00584117088534 3.01141554988232 -1.74216801231798,-1.02413354579207 3.04400126787917 -1.77385133504753,-1.04351020297329 3.07397548283483 -1.80741268976625,-1.06387812389736 3.10119430215541 -1.84269096365129,-1.08513953142555 3.12552706065018 -1.87951680173053,-1.1071923591957 3.14685694779575 -1.917713419879,-1.12993074159648 3.16508156849045 -1.95709745347909,-1.15324552198012 3.18011343460661 -1.99747983767086,-1.17702477667387 3.1918803849814 -2.03866671496655,-1.20115435227475 3.20032593182975 -2.08046036587236,-1.22551841364822 3.2054095319166 -2.12266015804993,-1.25 3.20710678118655 -2.1650635094611,-1.27448158635178 3.2054095319166 -2.20746686087227,-1.29884564772525 3.20032593182975 -2.24966665304983,-1.32297522332613 3.1918803849814 -2.29146030395564,-1.34675447801988 3.18011343460661 -2.33264718125133,-1.37006925840352 3.16508156849045 -2.3730295654431,-1.3928076408043 3.14685694779575 -2.41241359904319,-1.41486046857445 3.12552706065018 -2.45061021719166,-1.43612187610264 3.10119430215541 -2.48743605527091,-1.45648979702671 3.07397548283483 -2.52271432915594,-1.47586645420793 3.04400126787917 -2.55627568387467,-1.49415882911466 3.01141554988232 -2.58795900660421,-1.51127910836203 2.97637475807832 -2.61761220010042,-1.52714510526416 2.93904710739563 -2.64509291284765,-1.54168065437512 2.89961179093367 -2.67026922242374,-1.55481597712461 2.85825811973811 -2.69302026879967,-1.56648801679322 2.81518461400453 -2.71323683453366,-1.57664074121909 2.7705980500731 -2.73082186907453,-1.5852254117829 2.72471246778926 -2.74569095465728,-1.59220081737979 2.67774814299567 -2.7577727115545,-1.59753347225522 2.62993053008785 -2.76700914073797,-1.60119777675484 2.58148917971011 -2.77335590230571,-1.6031761402168 2.53265663678705 -2.77678252833767,-1.60345906541656 2.48366732418105 -2.77727256915839,-1.60204519415871 2.43475641733454 -2.77482367230443,-1.59894131379708 2.38615871529951 -2.76944759381748,-1.59416232465174 2.33810751357387 -2.76117014180893,-1.5877311684793 2.29083348415575 -2.75003105256685,-1.57967871833998 2.24456356819194 -2.73608379980013,-1.57004363039006 2.19951988653655 -2.71939533793547,-1.55887215831123 2.15591867344963 -2.7000457806996,-1.54621793126766 2.11396923855472 -2.67812801652963,-1.53214169645677 2.07387296203834 -2.6537472626579,-1.51671102748948 2.03582232791524 -2.62702056001177,-1.5 2.0 -2.59807621135332)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (-1.0 2.0 -1.73205080756888,-0.983288972510522 2.03582232791524 -1.70310645891042,-0.967858303543227 2.07387296203834 -1.67637975626429,-0.953782068732337 2.11396923855472 -1.65199900239256,-0.941127841688774 2.15591867344963 -1.6300812382226,-0.929956369609942 2.19951988653655 -1.61073168098672,-0.92032128166002 2.24456356819194 -1.59404321912206,-0.912268831520699 2.29083348415575 -1.58009596635534,-0.905837675348257 2.33810751357387 -1.56895687711326,-0.901058686202915 2.38615871529951 -1.56067942510471,-0.89795480584129 2.43475641733454 -1.55530334661776,-0.896540934583439 2.48366732418105 -1.5528544497638,-0.896823859783196 2.53265663678705 -1.55334449058452,-0.898802223245158 2.58148917971011 -1.55677111661648,-0.902466527744776 2.62993053008786 -1.56311787818422,-0.907799182620207 2.67774814299567 -1.5723543073677,-0.9147745882171 2.72471246778926 -1.58443606426492,-0.923359258780906 2.7705980500731 -1.59930514984767,-0.933511983206783 2.81518461400453 -1.61689018438853,-0.945184022875394 2.85825811973811 -1.63710675012253,-0.958319345624882 2.89961179093367 -1.65985779649846,-0.972854894735838 2.93904710739563 -1.68503410607454,-0.988720891637972 2.97637475807832 -1.71251481882177,-1.00584117088534 3.01141554988232 -1.74216801231798,-1.02413354579207 3.04400126787917 -1.77385133504753,-1.04351020297329 3.07397548283483 -1.80741268976625,-1.06387812389736 3.10119430215541 -1.84269096365129,-1.08513953142555 3.12552706065018 -1.87951680173053,-1.1071923591957 3.14685694779575 -1.917713419879,-1.12993074159648 3.16508156849045 -1.95709745347909,-1.15324552198012 3.18011343460661 -1.99747983767086,-1.17702477667387 3.1918803849814 -2.03866671496655,-1.20115435227475 3.20032593182975 -2.08046036587236,-1.22551841364822 3.2054095319166 -2.12266015804993,-1.25 3.20710678118655 -2.1650635094611,-1.27448158635178 3.2054095319166 -2.20746686087227,-1.29884564772525 3.20032593182975 -2.24966665304983,-1.32297522332613 3.1918803849814 -2.29146030395564,-1.34675447801988 3.18011343460661 -2.33264718125133,-1.37006925840352 3.16508156849045 -2.3730295654431,-1.3928076408043 3.14685694779575 -2.41241359904319,-1.41486046857445 3.12552706065018 -2.45061021719166,-1.43612187610264 3.10119430215541 -2.48743605527091,-1.45648979702671 3.07397548283483 -2.52271432915594,-1.47586645420793 3.04400126787917 -2.55627568387467,-1.49415882911466 3.01141554988232 -2.58795900660421,-1.51127910836203 2.97637475807832 -2.61761220010042,-1.52714510526416 2.93904710739563 -2.64509291284765,-1.54168065437512 2.89961179093367 -2.67026922242374,-1.55481597712461 2.85825811973811 -2.69302026879967,-1.56648801679322 2.81518461400453 -2.71323683453366,-1.57664074121909 2.7705980500731 -2.73082186907453,-1.5852254117829 2.72471246778926 -2.74569095465728,-1.59220081737979 2.67774814299567 -2.7577727115545,-1.59753347225522 2.62993053008785 -2.76700914073797,-1.60119777675484 2.58148917971011 -2.77335590230571,-1.6031761402168 2.53265663678705 -2.77678252833767,-1.60345906541656 2.48366732418105 -2.77727256915839,-1.60204519415871 2.43475641733454 -2.77482367230443,-1.59894131379708 2.38615871529951 -2.76944759381748,-1.59416232465174 2.33810751357387 -2.76117014180893,-1.5877311684793 2.29083348415575 -2.75003105256685,-1.57967871833998 2.24456356819194 -2.73608379980013,-1.57004363039006 2.19951988653655 -2.71939533793547,-1.55887215831123 2.15591867344963 -2.7000457806996,-1.54621793126766 2.11396923855472 -2.67812801652963,-1.53214169645677 2.07387296203834 -2.6537472626579,-1.51671102748948 2.03582232791524 -2.62702056001177,-1.5 2.0 -2.59807621135332)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):28 -# EntityHandle (String) = 1D8 -# POLYGON Z ((-0.5 2.0 -0.866025403784439,-0.5 3.0 -0.866025403784439,-1.0 3.0 -1.73205080756888,-1.0 2.0 -1.73205080756888,-0.5 2.0 -0.866025403784439)) + # OGRFeature(entities):28 + # EntityHandle (String) = 1D8 + # POLYGON Z ((-0.5 2.0 -0.866025403784439,-0.5 3.0 -0.866025403784439,-1.0 3.0 -1.73205080756888,-1.0 2.0 -1.73205080756888,-0.5 2.0 -0.866025403784439)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-0.5 2.0 -0.866025403784439,-0.5 3.0 -0.866025403784439,-1.0 3.0 -1.73205080756888,-1.0 2.0 -1.73205080756888,-0.5 2.0 -0.866025403784439))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-0.5 2.0 -0.866025403784439,-0.5 3.0 -0.866025403784439,-1.0 3.0 -1.73205080756888,-1.0 2.0 -1.73205080756888,-0.5 2.0 -0.866025403784439))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):29 -# EntityHandle (String) = 1D9 -# POLYGON Z ((-1.5 4.0 -2.59807621135332,-2.0 4.0 -3.46410161513776,-2.0 3.0 -3.46410161513776,-1.5 3.0 -2.59807621135332,-1.5 4.0 -2.59807621135332)) + # OGRFeature(entities):29 + # EntityHandle (String) = 1D9 + # POLYGON Z ((-1.5 4.0 -2.59807621135332,-2.0 4.0 -3.46410161513776,-2.0 3.0 -3.46410161513776,-1.5 3.0 -2.59807621135332,-1.5 4.0 -2.59807621135332)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON ((-1.5 4.0 -2.59807621135332,-2.0 4.0 -3.46410161513776,-2.0 3.0 -3.46410161513776,-1.5 3.0 -2.59807621135332,-1.5 4.0 -2.59807621135332))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON ((-1.5 4.0 -2.59807621135332,-2.0 4.0 -3.46410161513776,-2.0 3.0 -3.46410161513776,-1.5 3.0 -2.59807621135332,-1.5 4.0 -2.59807621135332))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):30 -# EntityHandle (String) = 1DB -# POLYGON Z ((-4.0 8.0 -6.92820323027551,-4.5 8.0 -7.79422863405995,-4.5 9.0 -7.79422863405995,-4.0 9.0 -6.92820323027551,-4.0 8.0 -6.92820323027551)) + # OGRFeature(entities):30 + # EntityHandle (String) = 1DB + # POLYGON Z ((-4.0 8.0 -6.92820323027551,-4.5 8.0 -7.79422863405995,-4.5 9.0 -7.79422863405995,-4.0 9.0 -6.92820323027551,-4.0 8.0 -6.92820323027551)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((-4.0 8.0 -6.92820323027551,-4.5 8.0 -7.79422863405995,-4.5 9.0 -7.79422863405995,-4.0 9.0 -6.92820323027551,-4.0 8.0 -6.92820323027551))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((-4.0 8.0 -6.92820323027551,-4.5 8.0 -7.79422863405995,-4.5 9.0 -7.79422863405995,-4.0 9.0 -6.92820323027551,-4.0 8.0 -6.92820323027551))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):31 -# EntityHandle (String) = 1DC -# LINESTRING (-1.0 2.0,-1.07692307692308 2.15384615384615,-1.15384615384615 2.30769230769231,-1.23076923076923 2.46153846153846,-1.30769230769231 2.61538461538461,-1.38461538461538 2.76923076923077,-1.46153846153846 2.92307692307692,-1.53846153846154 3.07692307692308,-1.61538461538461 3.23076923076923,-1.69230769230769 3.38461538461538,-1.76923076923077 3.53846153846154,-1.84615384615384 3.69230769230769,-1.92307692307692 3.84615384615385,-2.0 4.0,-2.07692307692307 4.15384615384615,-2.15384615384615 4.30769230769231,-2.23076923076923 4.46153846153846,-2.30769230769231 4.61538461538462,-2.38461538461538 4.76923076923077,-2.46153846153846 4.92307692307692,-2.53846153846154 5.07692307692308,-2.61538461538461 5.23076923076923,-2.69230769230769 5.38461538461538,-2.76923076923077 5.53846153846154,-2.84615384615384 5.69230769230769,-2.92307692307692 5.84615384615385,-3.0 6.0,-3.07692307692308 6.15384615384615,-3.15384615384615 6.30769230769231,-3.23076923076923 6.46153846153846,-3.30769230769231 6.61538461538462,-3.38461538461538 6.76923076923077,-3.46153846153846 6.92307692307692,-3.53846153846154 7.07692307692308,-3.61538461538461 7.23076923076923,-3.69230769230769 7.38461538461539,-3.76923076923077 7.53846153846154,-3.84615384615384 7.69230769230769,-3.92307692307692 7.84615384615385,-4.0 8.0) + # OGRFeature(entities):31 + # EntityHandle (String) = 1DC + # LINESTRING (-1.0 2.0,-1.07692307692308 2.15384615384615,-1.15384615384615 2.30769230769231,-1.23076923076923 2.46153846153846,-1.30769230769231 2.61538461538461,-1.38461538461538 2.76923076923077,-1.46153846153846 2.92307692307692,-1.53846153846154 3.07692307692308,-1.61538461538461 3.23076923076923,-1.69230769230769 3.38461538461538,-1.76923076923077 3.53846153846154,-1.84615384615384 3.69230769230769,-1.92307692307692 3.84615384615385,-2.0 4.0,-2.07692307692307 4.15384615384615,-2.15384615384615 4.30769230769231,-2.23076923076923 4.46153846153846,-2.30769230769231 4.61538461538462,-2.38461538461538 4.76923076923077,-2.46153846153846 4.92307692307692,-2.53846153846154 5.07692307692308,-2.61538461538461 5.23076923076923,-2.69230769230769 5.38461538461538,-2.76923076923077 5.53846153846154,-2.84615384615384 5.69230769230769,-2.92307692307692 5.84615384615385,-3.0 6.0,-3.07692307692308 6.15384615384615,-3.15384615384615 6.30769230769231,-3.23076923076923 6.46153846153846,-3.30769230769231 6.61538461538462,-3.38461538461538 6.76923076923077,-3.46153846153846 6.92307692307692,-3.53846153846154 7.07692307692308,-3.61538461538461 7.23076923076923,-3.69230769230769 7.38461538461539,-3.76923076923077 7.53846153846154,-3.84615384615384 7.69230769230769,-3.92307692307692 7.84615384615385,-4.0 8.0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-1.0 2.0,-1.07692307692308 2.15384615384615,-1.15384615384615 2.30769230769231,-1.23076923076923 2.46153846153846,-1.30769230769231 2.61538461538461,-1.38461538461538 2.76923076923077,-1.46153846153846 2.92307692307692,-1.53846153846154 3.07692307692308,-1.61538461538461 3.23076923076923,-1.69230769230769 3.38461538461538,-1.76923076923077 3.53846153846154,-1.84615384615384 3.69230769230769,-1.92307692307692 3.84615384615385,-2.0 4.0,-2.07692307692307 4.15384615384615,-2.15384615384615 4.30769230769231,-2.23076923076923 4.46153846153846,-2.30769230769231 4.61538461538462,-2.38461538461538 4.76923076923077,-2.46153846153846 4.92307692307692,-2.53846153846154 5.07692307692308,-2.61538461538461 5.23076923076923,-2.69230769230769 5.38461538461538,-2.76923076923077 5.53846153846154,-2.84615384615384 5.69230769230769,-2.92307692307692 5.84615384615385,-3.0 6.0,-3.07692307692308 6.15384615384615,-3.15384615384615 6.30769230769231,-3.23076923076923 6.46153846153846,-3.30769230769231 6.61538461538462,-3.38461538461538 6.76923076923077,-3.46153846153846 6.92307692307692,-3.53846153846154 7.07692307692308,-3.61538461538461 7.23076923076923,-3.69230769230769 7.38461538461539,-3.76923076923077 7.53846153846154,-3.84615384615384 7.69230769230769,-3.92307692307692 7.84615384615385,-4.0 8.0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-1.0 2.0,-1.07692307692308 2.15384615384615,-1.15384615384615 2.30769230769231,-1.23076923076923 2.46153846153846,-1.30769230769231 2.61538461538461,-1.38461538461538 2.76923076923077,-1.46153846153846 2.92307692307692,-1.53846153846154 3.07692307692308,-1.61538461538461 3.23076923076923,-1.69230769230769 3.38461538461538,-1.76923076923077 3.53846153846154,-1.84615384615384 3.69230769230769,-1.92307692307692 3.84615384615385,-2.0 4.0,-2.07692307692307 4.15384615384615,-2.15384615384615 4.30769230769231,-2.23076923076923 4.46153846153846,-2.30769230769231 4.61538461538462,-2.38461538461538 4.76923076923077,-2.46153846153846 4.92307692307692,-2.53846153846154 5.07692307692308,-2.61538461538461 5.23076923076923,-2.69230769230769 5.38461538461538,-2.76923076923077 5.53846153846154,-2.84615384615384 5.69230769230769,-2.92307692307692 5.84615384615385,-3.0 6.0,-3.07692307692308 6.15384615384615,-3.15384615384615 6.30769230769231,-3.23076923076923 6.46153846153846,-3.30769230769231 6.61538461538462,-3.38461538461538 6.76923076923077,-3.46153846153846 6.92307692307692,-3.53846153846154 7.07692307692308,-3.61538461538461 7.23076923076923,-3.69230769230769 7.38461538461539,-3.76923076923077 7.53846153846154,-3.84615384615384 7.69230769230769,-3.92307692307692 7.84615384615385,-4.0 8.0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):32 -# EntityHandle (String) = 1DD -# LINESTRING (-4.0 1.0,-3.81418685412768 0.987348067229724,-3.62887944840607 0.975707614760869,-3.44458352298589 0.966090122894857,-3.26180481801783 0.959507071933107,-3.08104907365262 0.956969942177043,-2.90282203004096 0.959490213928084,-2.72762942733357 0.968079367487651,-2.55597700568115 0.983748883157167,-2.38837050523441 1.00751024123805,-2.22531566614407 1.04037492203173,-2.06731822856083 1.08335440583961,-1.91488393263541 1.13746017296313,-1.76851851851852 1.2037037037037,-1.62872772636086 1.28309647836275,-1.49601729631315 1.37664997724169,-1.3708929685261 1.48537568064195,-1.25386048315042 1.61028506886495,-1.14542558033682 1.75238962221211,-1.04609400023601 1.91270082098484,-0.956350410492422 2.09218800047202,-0.876194811106054 2.29085116067364,-0.805142534432475 2.50772096630085,-0.742687840320977 2.74178593705221,-0.688324988620847 2.99203459262631,-0.641548239181376 3.25745545272172,-0.601851851851852 3.53703703703703,-0.568730086481566 3.82976786527082,-0.541677202919806 4.13463645712166,-0.520187461015863 4.45063133228814,-0.503755120619026 4.77674101046882,-0.491874441578583 5.11195401136229,-0.484039683743826 5.45525885466714,-0.479745106964042 5.80564406008193,-0.478484971088521 6.16209814730525,-0.479753535966554 6.52360963603567,-0.483045061447428 6.88916704597178,-0.487853807380435 7.25775889681216,-0.493674033614862 7.62837370825537,-0.5 8.0) + # OGRFeature(entities):32 + # EntityHandle (String) = 1DD + # LINESTRING (-4.0 1.0,-3.81418685412768 0.987348067229724,-3.62887944840607 0.975707614760869,-3.44458352298589 0.966090122894857,-3.26180481801783 0.959507071933107,-3.08104907365262 0.956969942177043,-2.90282203004096 0.959490213928084,-2.72762942733357 0.968079367487651,-2.55597700568115 0.983748883157167,-2.38837050523441 1.00751024123805,-2.22531566614407 1.04037492203173,-2.06731822856083 1.08335440583961,-1.91488393263541 1.13746017296313,-1.76851851851852 1.2037037037037,-1.62872772636086 1.28309647836275,-1.49601729631315 1.37664997724169,-1.3708929685261 1.48537568064195,-1.25386048315042 1.61028506886495,-1.14542558033682 1.75238962221211,-1.04609400023601 1.91270082098484,-0.956350410492422 2.09218800047202,-0.876194811106054 2.29085116067364,-0.805142534432475 2.50772096630085,-0.742687840320977 2.74178593705221,-0.688324988620847 2.99203459262631,-0.641548239181376 3.25745545272172,-0.601851851851852 3.53703703703703,-0.568730086481566 3.82976786527082,-0.541677202919806 4.13463645712166,-0.520187461015863 4.45063133228814,-0.503755120619026 4.77674101046882,-0.491874441578583 5.11195401136229,-0.484039683743826 5.45525885466714,-0.479745106964042 5.80564406008193,-0.478484971088521 6.16209814730525,-0.479753535966554 6.52360963603567,-0.483045061447428 6.88916704597178,-0.487853807380435 7.25775889681216,-0.493674033614862 7.62837370825537,-0.5 8.0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-4.0 1.0,-3.81418685412768 0.987348067229724,-3.62887944840607 0.975707614760869,-3.44458352298589 0.966090122894857,-3.26180481801783 0.959507071933107,-3.08104907365262 0.956969942177043,-2.90282203004096 0.959490213928084,-2.72762942733357 0.968079367487651,-2.55597700568115 0.983748883157167,-2.38837050523441 1.00751024123805,-2.22531566614407 1.04037492203173,-2.06731822856083 1.08335440583961,-1.91488393263541 1.13746017296313,-1.76851851851852 1.2037037037037,-1.62872772636086 1.28309647836275,-1.49601729631315 1.37664997724169,-1.3708929685261 1.48537568064195,-1.25386048315042 1.61028506886495,-1.14542558033682 1.75238962221211,-1.04609400023601 1.91270082098484,-0.956350410492422 2.09218800047202,-0.876194811106054 2.29085116067364,-0.805142534432475 2.50772096630085,-0.742687840320977 2.74178593705221,-0.688324988620847 2.99203459262631,-0.641548239181376 3.25745545272172,-0.601851851851852 3.53703703703703,-0.568730086481566 3.82976786527082,-0.541677202919806 4.13463645712166,-0.520187461015863 4.45063133228814,-0.503755120619026 4.77674101046882,-0.491874441578583 5.11195401136229,-0.484039683743826 5.45525885466714,-0.479745106964042 5.80564406008193,-0.478484971088521 6.16209814730525,-0.479753535966554 6.52360963603567,-0.483045061447428 6.88916704597178,-0.487853807380435 7.25775889681216,-0.493674033614862 7.62837370825537,-0.5 8.0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-4.0 1.0,-3.81418685412768 0.987348067229724,-3.62887944840607 0.975707614760869,-3.44458352298589 0.966090122894857,-3.26180481801783 0.959507071933107,-3.08104907365262 0.956969942177043,-2.90282203004096 0.959490213928084,-2.72762942733357 0.968079367487651,-2.55597700568115 0.983748883157167,-2.38837050523441 1.00751024123805,-2.22531566614407 1.04037492203173,-2.06731822856083 1.08335440583961,-1.91488393263541 1.13746017296313,-1.76851851851852 1.2037037037037,-1.62872772636086 1.28309647836275,-1.49601729631315 1.37664997724169,-1.3708929685261 1.48537568064195,-1.25386048315042 1.61028506886495,-1.14542558033682 1.75238962221211,-1.04609400023601 1.91270082098484,-0.956350410492422 2.09218800047202,-0.876194811106054 2.29085116067364,-0.805142534432475 2.50772096630085,-0.742687840320977 2.74178593705221,-0.688324988620847 2.99203459262631,-0.641548239181376 3.25745545272172,-0.601851851851852 3.53703703703703,-0.568730086481566 3.82976786527082,-0.541677202919806 4.13463645712166,-0.520187461015863 4.45063133228814,-0.503755120619026 4.77674101046882,-0.491874441578583 5.11195401136229,-0.484039683743826 5.45525885466714,-0.479745106964042 5.80564406008193,-0.478484971088521 6.16209814730525,-0.479753535966554 6.52360963603567,-0.483045061447428 6.88916704597178,-0.487853807380435 7.25775889681216,-0.493674033614862 7.62837370825537,-0.5 8.0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):33 -# EntityHandle (String) = 1DE -# POINT Z (-3.5 7.0 -6.06217782649107) + # OGRFeature(entities):33 + # EntityHandle (String) = 1DE + # POINT Z (-3.5 7.0 -6.06217782649107) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (-3.5 7.0 -6.06217782649107)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (-3.5 7.0 -6.06217782649107)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):34 -# EntityHandle (String) = 1DF -# POINT Z (1.0 -2.0 -5.19615242270663) + # OGRFeature(entities):34 + # EntityHandle (String) = 1DF + # POINT Z (1.0 -2.0 -5.19615242270663) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (1.0 -2.0 -5.19615242270663)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (1.0 -2.0 -5.19615242270663)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):35 -# EntityHandle (String) = 1E0 -# LINESTRING Z (0 0 0,0.25 -0.5 -1.29903810567666) + # OGRFeature(entities):35 + # EntityHandle (String) = 1E0 + # LINESTRING Z (0 0 0,0.25 -0.5 -1.29903810567666) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,0.25 -0.5 -1.29903810567666)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (0 0 0,0.25 -0.5 -1.29903810567666)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):36 -# EntityHandle (String) = 1E1 -# LINESTRING Z (0.25 -0.5 -1.29903810567666,-0.25 -0.5 -2.1650635094611,1.0 -1.0 -1.73205080756888,0.25 -0.5 -1.29903810567666) + # OGRFeature(entities):36 + # EntityHandle (String) = 1E1 + # LINESTRING Z (0.25 -0.5 -1.29903810567666,-0.25 -0.5 -2.1650635094611,1.0 -1.0 -1.73205080756888,0.25 -0.5 -1.29903810567666) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0.25 -0.5 -1.29903810567666,-0.25 -0.5 -2.1650635094611,1.0 -1.0 -1.73205080756888,0.25 -0.5 -1.29903810567666)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (0.25 -0.5 -1.29903810567666,-0.25 -0.5 -2.1650635094611,1.0 -1.0 -1.73205080756888,0.25 -0.5 -1.29903810567666)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):37 -# EntityHandle (String) = 1E2 -# LINESTRING Z (0.25 -0.5 -1.29903810567666,1 -1 -1.73205080756888,0.5 -1.0 -2.59807621135332,0.25 -0.5 -1.29903810567666) + # OGRFeature(entities):37 + # EntityHandle (String) = 1E2 + # LINESTRING Z (0.25 -0.5 -1.29903810567666,1 -1 -1.73205080756888,0.5 -1.0 -2.59807621135332,0.25 -0.5 -1.29903810567666) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0.25 -0.5 -1.29903810567666,1 -1 -1.73205080756888,0.5 -1.0 -2.59807621135332,0.25 -0.5 -1.29903810567666)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (0.25 -0.5 -1.29903810567666,1 -1 -1.73205080756888,0.5 -1.0 -2.59807621135332,0.25 -0.5 -1.29903810567666)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):38 -# EntityHandle (String) = 1E7 -# LINESTRING Z (2.78885438199983 -2.89442719099992 -5.19615242270663,2.76889880091653 -2.9234444547489 -5.33123525325721,2.74032532268425 -2.94796278993866 -5.46565997383582,2.70327315441675 -2.96786274570473 -5.59877168071614,2.65792281055334 -2.98304737146295 -5.72992186704258,2.60449523341074 -2.99344268924297 -5.85847158229053,2.54325071677425 -2.99899805410152 -5.98379454516908,2.47448763777266 -2.99968640085941 -6.1052801948005,2.39854100321483 -2.99550437596044 -6.22233666531148,2.31578081747018 -2.98647235380955 -6.33439366934417,2.22661027984464 -2.97263433751074 -6.44090527643885,2.13146382023413 -2.95405774448845 -6.54135257275227,2.03080498262578 -2.93083307803656 -6.63524618915372,1.92512416675824 -2.90307348639549 -6.72212868538223,1.81493623894341 -2.87091421150532 -6.80157677864958,1.70077802368955 -2.8345119301207 -6.87320340583148,1.58320568834623 -2.79404399049737 -6.93665960920016,1.46279203351292 -2.74970754836936 -6.99163623651142,1.34012370241203 -2.70171860642604 -7.03786544716322,1.21579832282211 -2.65031096196872 -7.07512201708822,1.09042159549536 -2.59573506787371 -7.10322443602275,0.964604343244512 -2.5382568124111 -7.12203579180661,0.838959535075416 -2.47815622386382 -7.13146443740534,0.714099299863701 -2.41572610625796 -7.13146443740534,0.590631944124412 -2.35127061285105 -7.12203579180661,0.469158988403815 -2.28510376432794 -7.10322443602275,0.350272236731764 -2.21754791892355 -7.07512201708822,0.234550893411949 -2.148932201926 -7.03786544716322,0.122558741196756 -2.07959090221128 -6.99163623651142,0.014841394594365 -2.00986184362144 -6.93665960920016,-0.088076358310285 -1.94008473912078 -6.87320340583148,-0.185693112570302 -1.87059953574847 -6.80157677864958,-0.277533289171331 -1.8017447584307 -6.72212868538223,-0.363149452004714 -1.73385586072131 -6.63524618915372,-0.442124487731234 -1.66726359050577 -6.54135257275227,-0.514073637915374 -1.60229237863074 -6.44090527643885,-0.57864637352974 -1.53925875830959 -6.33439366934417,-0.635528102697248 -1.47846982300441 -6.22233666531148,-0.684441703351125 -1.42022173029752 -6.1052801948005,-0.725148873345763 -1.36479825904151 -5.98379454516908,-0.757451291440819 -1.31246942681719 -5.85847158229053,-0.781191583502361 -1.2634901744351 -5.72992186704258,-0.796254089213832 -1.21809912388944 -5.59877168071614,-0.802565425561482 -1.1765174158158 -5.46565997383582,-0.80009484434904 -1.13894763211612 -5.33123525325721,-0.788854381999831 -1.10557280900008 -5.19615242270663,-0.768898800916532 -1.0765555452511 -5.06106959215606,-0.740325322684253 -1.05203721006134 -4.92664487157745,-0.703273154416746 -1.03213725429527 -4.79353316469713, -# -0.65792281055334 -1.01695262853705 -4.66238297837069,-0.604495233410736 -1.00655731075703 -4.53383326312274,-0.543250716774252 -1.00100194589848 -4.40851030024419,-0.474487637772662 -1.00031359914059 -4.28702465061277,-0.398541003214825 -1.00449562403956 -4.16996818010179,-0.315780817470174 -1.01352764619045 -4.0579111760691,-0.226610279844633 -1.02736566248926 -3.95139956897441,-0.131463820234124 -1.04594225551155 -3.85095227266099,-0.03080498262578 -1.06916692196344 -3.75705865625955,0.074875833241763 -1.09692651360451 -3.67017616003104,0.185063761056595 -1.12908578849468 -3.59072806676368,0.299221976310455 -1.1654880698793 -3.51910143958179,0.416794311653771 -1.20595600950263 -3.45564523621311,0.537207966487078 -1.25029245163064 -3.40066860890185,0.659876297587969 -1.29828139357396 -3.35443939825005,0.784201677177895 -1.34968903803128 -3.31718282832505,0.909578404504639 -1.40426493212629 -3.28908040939052,1.03539565675549 -1.4617431875889 -3.27026905360665,1.16104046492459 -1.52184377613619 -3.26084040800793,1.2859007001363 -1.58427389374204 -3.26084040800793,1.40936805587559 -1.64872938714895 -3.27026905360665,1.53084101159619 -1.71489623567206 -3.28908040939052,1.64972776326824 -1.78245208107646 -3.31718282832505,1.76544910658805 -1.851067798074 -3.35443939825005,1.87744125880325 -1.92040909778872 -3.40066860890185,1.98515860540564 -1.99013815637856 -3.45564523621311,2.08807635831029 -2.05991526087922 -3.51910143958179,2.1856931125703 -2.12940046425153 -3.59072806676368,2.27753328917133 -2.1982552415693 -3.67017616003104,2.36314945200472 -2.26614413927869 -3.75705865625955,2.44212448773124 -2.33273640949423 -3.85095227266099,2.51407363791538 -2.39770762136926 -3.95139956897441,2.57864637352974 -2.46074124169041 -4.0579111760691,2.63552810269725 -2.52153017699559 -4.16996818010179,2.68444170335113 -2.57977826970249 -4.28702465061277,2.72514887334576 -2.63520174095849 -4.40851030024419,2.75745129144082 -2.68753057318281 -4.53383326312274,2.78119158350236 -2.7365098255649 -4.66238297837069,2.79625408921383 -2.78190087611056 -4.79353316469713,2.80256542556148 -2.82348258418421 -4.92664487157744,2.80009484434904 -2.86105236788389 -5.06106959215606,2.78885438199983 -2.89442719099992 -5.19615242270663) + # OGRFeature(entities):38 + # EntityHandle (String) = 1E7 + # LINESTRING Z (2.78885438199983 -2.89442719099992 -5.19615242270663,2.76889880091653 -2.9234444547489 -5.33123525325721,2.74032532268425 -2.94796278993866 -5.46565997383582,2.70327315441675 -2.96786274570473 -5.59877168071614,2.65792281055334 -2.98304737146295 -5.72992186704258,2.60449523341074 -2.99344268924297 -5.85847158229053,2.54325071677425 -2.99899805410152 -5.98379454516908,2.47448763777266 -2.99968640085941 -6.1052801948005,2.39854100321483 -2.99550437596044 -6.22233666531148,2.31578081747018 -2.98647235380955 -6.33439366934417,2.22661027984464 -2.97263433751074 -6.44090527643885,2.13146382023413 -2.95405774448845 -6.54135257275227,2.03080498262578 -2.93083307803656 -6.63524618915372,1.92512416675824 -2.90307348639549 -6.72212868538223,1.81493623894341 -2.87091421150532 -6.80157677864958,1.70077802368955 -2.8345119301207 -6.87320340583148,1.58320568834623 -2.79404399049737 -6.93665960920016,1.46279203351292 -2.74970754836936 -6.99163623651142,1.34012370241203 -2.70171860642604 -7.03786544716322,1.21579832282211 -2.65031096196872 -7.07512201708822,1.09042159549536 -2.59573506787371 -7.10322443602275,0.964604343244512 -2.5382568124111 -7.12203579180661,0.838959535075416 -2.47815622386382 -7.13146443740534,0.714099299863701 -2.41572610625796 -7.13146443740534,0.590631944124412 -2.35127061285105 -7.12203579180661,0.469158988403815 -2.28510376432794 -7.10322443602275,0.350272236731764 -2.21754791892355 -7.07512201708822,0.234550893411949 -2.148932201926 -7.03786544716322,0.122558741196756 -2.07959090221128 -6.99163623651142,0.014841394594365 -2.00986184362144 -6.93665960920016,-0.088076358310285 -1.94008473912078 -6.87320340583148,-0.185693112570302 -1.87059953574847 -6.80157677864958,-0.277533289171331 -1.8017447584307 -6.72212868538223,-0.363149452004714 -1.73385586072131 -6.63524618915372,-0.442124487731234 -1.66726359050577 -6.54135257275227,-0.514073637915374 -1.60229237863074 -6.44090527643885,-0.57864637352974 -1.53925875830959 -6.33439366934417,-0.635528102697248 -1.47846982300441 -6.22233666531148,-0.684441703351125 -1.42022173029752 -6.1052801948005,-0.725148873345763 -1.36479825904151 -5.98379454516908,-0.757451291440819 -1.31246942681719 -5.85847158229053,-0.781191583502361 -1.2634901744351 -5.72992186704258,-0.796254089213832 -1.21809912388944 -5.59877168071614,-0.802565425561482 -1.1765174158158 -5.46565997383582,-0.80009484434904 -1.13894763211612 -5.33123525325721,-0.788854381999831 -1.10557280900008 -5.19615242270663,-0.768898800916532 -1.0765555452511 -5.06106959215606,-0.740325322684253 -1.05203721006134 -4.92664487157745,-0.703273154416746 -1.03213725429527 -4.79353316469713, + # -0.65792281055334 -1.01695262853705 -4.66238297837069,-0.604495233410736 -1.00655731075703 -4.53383326312274,-0.543250716774252 -1.00100194589848 -4.40851030024419,-0.474487637772662 -1.00031359914059 -4.28702465061277,-0.398541003214825 -1.00449562403956 -4.16996818010179,-0.315780817470174 -1.01352764619045 -4.0579111760691,-0.226610279844633 -1.02736566248926 -3.95139956897441,-0.131463820234124 -1.04594225551155 -3.85095227266099,-0.03080498262578 -1.06916692196344 -3.75705865625955,0.074875833241763 -1.09692651360451 -3.67017616003104,0.185063761056595 -1.12908578849468 -3.59072806676368,0.299221976310455 -1.1654880698793 -3.51910143958179,0.416794311653771 -1.20595600950263 -3.45564523621311,0.537207966487078 -1.25029245163064 -3.40066860890185,0.659876297587969 -1.29828139357396 -3.35443939825005,0.784201677177895 -1.34968903803128 -3.31718282832505,0.909578404504639 -1.40426493212629 -3.28908040939052,1.03539565675549 -1.4617431875889 -3.27026905360665,1.16104046492459 -1.52184377613619 -3.26084040800793,1.2859007001363 -1.58427389374204 -3.26084040800793,1.40936805587559 -1.64872938714895 -3.27026905360665,1.53084101159619 -1.71489623567206 -3.28908040939052,1.64972776326824 -1.78245208107646 -3.31718282832505,1.76544910658805 -1.851067798074 -3.35443939825005,1.87744125880325 -1.92040909778872 -3.40066860890185,1.98515860540564 -1.99013815637856 -3.45564523621311,2.08807635831029 -2.05991526087922 -3.51910143958179,2.1856931125703 -2.12940046425153 -3.59072806676368,2.27753328917133 -2.1982552415693 -3.67017616003104,2.36314945200472 -2.26614413927869 -3.75705865625955,2.44212448773124 -2.33273640949423 -3.85095227266099,2.51407363791538 -2.39770762136926 -3.95139956897441,2.57864637352974 -2.46074124169041 -4.0579111760691,2.63552810269725 -2.52153017699559 -4.16996818010179,2.68444170335113 -2.57977826970249 -4.28702465061277,2.72514887334576 -2.63520174095849 -4.40851030024419,2.75745129144082 -2.68753057318281 -4.53383326312274,2.78119158350236 -2.7365098255649 -4.66238297837069,2.79625408921383 -2.78190087611056 -4.79353316469713,2.80256542556148 -2.82348258418421 -4.92664487157744,2.80009484434904 -2.86105236788389 -5.06106959215606,2.78885438199983 -2.89442719099992 -5.19615242270663) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.78885438199983 -2.89442719099992 -5.19615242270663,2.76889880091653 -2.9234444547489 -5.33123525325721,2.74032532268425 -2.94796278993866 -5.46565997383582,2.70327315441675 -2.96786274570473 -5.59877168071614,2.65792281055334 -2.98304737146295 -5.72992186704258,2.60449523341074 -2.99344268924297 -5.85847158229053,2.54325071677425 -2.99899805410152 -5.98379454516908,2.47448763777266 -2.99968640085941 -6.1052801948005,2.39854100321483 -2.99550437596044 -6.22233666531148,2.31578081747018 -2.98647235380955 -6.33439366934417,2.22661027984464 -2.97263433751074 -6.44090527643885,2.13146382023413 -2.95405774448845 -6.54135257275227,2.03080498262578 -2.93083307803656 -6.63524618915372,1.92512416675824 -2.90307348639549 -6.72212868538223,1.81493623894341 -2.87091421150532 -6.80157677864958,1.70077802368955 -2.8345119301207 -6.87320340583148,1.58320568834623 -2.79404399049737 -6.93665960920016,1.46279203351292 -2.74970754836936 -6.99163623651142,1.34012370241203 -2.70171860642604 -7.03786544716322,1.21579832282211 -2.65031096196872 -7.07512201708822,1.09042159549536 -2.59573506787371 -7.10322443602275,0.964604343244512 -2.5382568124111 -7.12203579180661,0.838959535075416 -2.47815622386382 -7.13146443740534,0.714099299863701 -2.41572610625796 -7.13146443740534,0.590631944124412 -2.35127061285105 -7.12203579180661,0.469158988403815 -2.28510376432794 -7.10322443602275,0.350272236731764 -2.21754791892355 -7.07512201708822,0.234550893411949 -2.148932201926 -7.03786544716322,0.122558741196756 -2.07959090221128 -6.99163623651142,0.014841394594365 -2.00986184362144 -6.93665960920016,-0.088076358310285 -1.94008473912078 -6.87320340583148,-0.185693112570302 -1.87059953574847 -6.80157677864958,-0.277533289171331 -1.8017447584307 -6.72212868538223,-0.363149452004714 -1.73385586072131 -6.63524618915372,-0.442124487731234 -1.66726359050577 -6.54135257275227,-0.514073637915374 -1.60229237863074 -6.44090527643885,-0.57864637352974 -1.53925875830959 -6.33439366934417,-0.635528102697248 -1.47846982300441 -6.22233666531148,-0.684441703351125 -1.42022173029752 -6.1052801948005,-0.725148873345763 -1.36479825904151 -5.98379454516908,-0.757451291440819 -1.31246942681719 -5.85847158229053,-0.781191583502361 -1.2634901744351 -5.72992186704258,-0.796254089213832 -1.21809912388944 -5.59877168071614,-0.802565425561482 -1.1765174158158 -5.46565997383582,-0.80009484434904 -1.13894763211612 -5.33123525325721,-0.788854381999831 -1.10557280900008 -5.19615242270663,-0.768898800916532 -1.0765555452511 -5.06106959215606,-0.740325322684253 -1.05203721006134 -4.92664487157745,-0.703273154416746 -1.03213725429527 -4.79353316469713,-0.65792281055334 -1.01695262853705 -4.66238297837069,-0.604495233410736 -1.00655731075703 -4.53383326312274,-0.543250716774252 -1.00100194589848 -4.40851030024419,-0.474487637772662 -1.00031359914059 -4.28702465061277,-0.398541003214825 -1.00449562403956 -4.16996818010179,-0.315780817470174 -1.01352764619045 -4.0579111760691,' + - '-0.226610279844633 -1.02736566248926 -3.95139956897441,-0.131463820234124 -1.04594225551155 -3.85095227266099,-0.03080498262578 -1.06916692196344 -3.75705865625955,0.074875833241763 -1.09692651360451 -3.67017616003104,0.185063761056595 -1.12908578849468 -3.59072806676368,0.299221976310455 -1.1654880698793 -3.51910143958179,0.416794311653771 -1.20595600950263 -3.45564523621311,0.537207966487078 -1.25029245163064 -3.40066860890185,0.659876297587969 -1.29828139357396 -3.35443939825005,0.784201677177895 -1.34968903803128 -3.31718282832505,0.909578404504639 -1.40426493212629 -3.28908040939052,1.03539565675549 -1.4617431875889 -3.27026905360665,1.16104046492459 -1.52184377613619 -3.26084040800793,1.2859007001363 -1.58427389374204 -3.26084040800793,1.40936805587559 -1.64872938714895 -3.27026905360665,1.53084101159619 -1.71489623567206 -3.28908040939052,1.64972776326824 -1.78245208107646 -3.31718282832505,1.76544910658805 -1.851067798074 -3.35443939825005,1.87744125880325 -1.92040909778872 -3.40066860890185,1.98515860540564 -1.99013815637856 -3.45564523621311,2.08807635831029 -2.05991526087922 -3.51910143958179,2.1856931125703 -2.12940046425153 -3.59072806676368,2.27753328917133 -2.1982552415693 -3.67017616003104,2.36314945200472 -2.26614413927869 -3.75705865625955,2.44212448773124 -2.33273640949423 -3.85095227266099,2.51407363791538 -2.39770762136926 -3.95139956897441,2.57864637352974 -2.46074124169041 -4.0579111760691,2.63552810269725 -2.52153017699559 -4.16996818010179,2.68444170335113 -2.57977826970249 -4.28702465061277,2.72514887334576 -2.63520174095849 -4.40851030024419,2.75745129144082 -2.68753057318281 -4.53383326312274,2.78119158350236 -2.7365098255649 -4.66238297837069,2.79625408921383 -2.78190087611056 -4.79353316469713,2.80256542556148 -2.82348258418421 -4.92664487157744,2.80009484434904 -2.86105236788389 -5.06106959215606,2.78885438199983 -2.89442719099992 -5.19615242270663)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2.78885438199983 -2.89442719099992 -5.19615242270663,2.76889880091653 -2.9234444547489 -5.33123525325721,2.74032532268425 -2.94796278993866 -5.46565997383582,2.70327315441675 -2.96786274570473 -5.59877168071614,2.65792281055334 -2.98304737146295 -5.72992186704258,2.60449523341074 -2.99344268924297 -5.85847158229053,2.54325071677425 -2.99899805410152 -5.98379454516908,2.47448763777266 -2.99968640085941 -6.1052801948005,2.39854100321483 -2.99550437596044 -6.22233666531148,2.31578081747018 -2.98647235380955 -6.33439366934417,2.22661027984464 -2.97263433751074 -6.44090527643885,2.13146382023413 -2.95405774448845 -6.54135257275227,2.03080498262578 -2.93083307803656 -6.63524618915372,1.92512416675824 -2.90307348639549 -6.72212868538223,1.81493623894341 -2.87091421150532 -6.80157677864958,1.70077802368955 -2.8345119301207 -6.87320340583148,1.58320568834623 -2.79404399049737 -6.93665960920016,1.46279203351292 -2.74970754836936 -6.99163623651142,1.34012370241203 -2.70171860642604 -7.03786544716322,1.21579832282211 -2.65031096196872 -7.07512201708822,1.09042159549536 -2.59573506787371 -7.10322443602275,0.964604343244512 -2.5382568124111 -7.12203579180661,0.838959535075416 -2.47815622386382 -7.13146443740534,0.714099299863701 -2.41572610625796 -7.13146443740534,0.590631944124412 -2.35127061285105 -7.12203579180661,0.469158988403815 -2.28510376432794 -7.10322443602275,0.350272236731764 -2.21754791892355 -7.07512201708822,0.234550893411949 -2.148932201926 -7.03786544716322,0.122558741196756 -2.07959090221128 -6.99163623651142,0.014841394594365 -2.00986184362144 -6.93665960920016,-0.088076358310285 -1.94008473912078 -6.87320340583148,-0.185693112570302 -1.87059953574847 -6.80157677864958,-0.277533289171331 -1.8017447584307 -6.72212868538223,-0.363149452004714 -1.73385586072131 -6.63524618915372,-0.442124487731234 -1.66726359050577 -6.54135257275227,-0.514073637915374 -1.60229237863074 -6.44090527643885,-0.57864637352974 -1.53925875830959 -6.33439366934417,-0.635528102697248 -1.47846982300441 -6.22233666531148,-0.684441703351125 -1.42022173029752 -6.1052801948005,-0.725148873345763 -1.36479825904151 -5.98379454516908,-0.757451291440819 -1.31246942681719 -5.85847158229053,-0.781191583502361 -1.2634901744351 -5.72992186704258,-0.796254089213832 -1.21809912388944 -5.59877168071614,-0.802565425561482 -1.1765174158158 -5.46565997383582,-0.80009484434904 -1.13894763211612 -5.33123525325721,-0.788854381999831 -1.10557280900008 -5.19615242270663,-0.768898800916532 -1.0765555452511 -5.06106959215606,-0.740325322684253 -1.05203721006134 -4.92664487157745,-0.703273154416746 -1.03213725429527 -4.79353316469713,-0.65792281055334 -1.01695262853705 -4.66238297837069,-0.604495233410736 -1.00655731075703 -4.53383326312274,-0.543250716774252 -1.00100194589848 -4.40851030024419,-0.474487637772662 -1.00031359914059 -4.28702465061277,-0.398541003214825 -1.00449562403956 -4.16996818010179,-0.315780817470174 -1.01352764619045 -4.0579111760691," + + "-0.226610279844633 -1.02736566248926 -3.95139956897441,-0.131463820234124 -1.04594225551155 -3.85095227266099,-0.03080498262578 -1.06916692196344 -3.75705865625955,0.074875833241763 -1.09692651360451 -3.67017616003104,0.185063761056595 -1.12908578849468 -3.59072806676368,0.299221976310455 -1.1654880698793 -3.51910143958179,0.416794311653771 -1.20595600950263 -3.45564523621311,0.537207966487078 -1.25029245163064 -3.40066860890185,0.659876297587969 -1.29828139357396 -3.35443939825005,0.784201677177895 -1.34968903803128 -3.31718282832505,0.909578404504639 -1.40426493212629 -3.28908040939052,1.03539565675549 -1.4617431875889 -3.27026905360665,1.16104046492459 -1.52184377613619 -3.26084040800793,1.2859007001363 -1.58427389374204 -3.26084040800793,1.40936805587559 -1.64872938714895 -3.27026905360665,1.53084101159619 -1.71489623567206 -3.28908040939052,1.64972776326824 -1.78245208107646 -3.31718282832505,1.76544910658805 -1.851067798074 -3.35443939825005,1.87744125880325 -1.92040909778872 -3.40066860890185,1.98515860540564 -1.99013815637856 -3.45564523621311,2.08807635831029 -2.05991526087922 -3.51910143958179,2.1856931125703 -2.12940046425153 -3.59072806676368,2.27753328917133 -2.1982552415693 -3.67017616003104,2.36314945200472 -2.26614413927869 -3.75705865625955,2.44212448773124 -2.33273640949423 -3.85095227266099,2.51407363791538 -2.39770762136926 -3.95139956897441,2.57864637352974 -2.46074124169041 -4.0579111760691,2.63552810269725 -2.52153017699559 -4.16996818010179,2.68444170335113 -2.57977826970249 -4.28702465061277,2.72514887334576 -2.63520174095849 -4.40851030024419,2.75745129144082 -2.68753057318281 -4.53383326312274,2.78119158350236 -2.7365098255649 -4.66238297837069,2.79625408921383 -2.78190087611056 -4.79353316469713,2.80256542556148 -2.82348258418421 -4.92664487157744,2.80009484434904 -2.86105236788389 -5.06106959215606,2.78885438199983 -2.89442719099992 -5.19615242270663)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):39 -# EntityHandle (String) = 1E8 -# LINESTRING Z (2.0 -2.0 -3.46410161513775,1.0 -2.0 -5.19615242270663) + # OGRFeature(entities):39 + # EntityHandle (String) = 1E8 + # LINESTRING Z (2.0 -2.0 -3.46410161513775,1.0 -2.0 -5.19615242270663) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.0 -2.0 -3.46410161513775,1.0 -2.0 -5.19615242270663)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (2.0 -2.0 -3.46410161513775,1.0 -2.0 -5.19615242270663)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):40 -# EntityHandle (String) = 1E9 -# LINESTRING Z (1.0 -2.0 -5.19615242270663,0.0 -2.0 -6.92820323027551) + # OGRFeature(entities):40 + # EntityHandle (String) = 1E9 + # LINESTRING Z (1.0 -2.0 -5.19615242270663,0.0 -2.0 -6.92820323027551) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1.0 -2.0 -5.19615242270663,0.0 -2.0 -6.92820323027551)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (1.0 -2.0 -5.19615242270663,0.0 -2.0 -6.92820323027551)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):41 -# EntityHandle (String) = 1EA -# LINESTRING Z (0.25 -1.5 -4.76313972081441,1.0 -2.0 -5.19615242270663) + # OGRFeature(entities):41 + # EntityHandle (String) = 1EA + # LINESTRING Z (0.25 -1.5 -4.76313972081441,1.0 -2.0 -5.19615242270663) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0.25 -1.5 -4.76313972081441,1.0 -2.0 -5.19615242270663)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (0.25 -1.5 -4.76313972081441,1.0 -2.0 -5.19615242270663)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):42 -# EntityHandle (String) = 1EB -# LINESTRING Z (1.0 -2.0 -5.19615242270663,1.75 -2.5 -5.62916512459885) + # OGRFeature(entities):42 + # EntityHandle (String) = 1EB + # LINESTRING Z (1.0 -2.0 -5.19615242270663,1.75 -2.5 -5.62916512459885) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1.0 -2.0 -5.19615242270663,1.75 -2.5 -5.62916512459885)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (1.0 -2.0 -5.19615242270663,1.75 -2.5 -5.62916512459885)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):43 -# EntityHandle (String) = 1EC -# LINESTRING Z (2.0 -2.0 -3.46410161513775,2.04988140556792 -2.03487823687206 -3.49852624302284,2.09464789446162 -2.06958655048003 -3.54122153501056,2.13408136884713 -2.10395584540888 -3.59197948393006,2.16798971280107 -2.1378186779085 -3.65055280215638,2.19620772828016 -2.17101007166283 -3.7166561263709,2.21859793994945 -2.2033683215379 -3.78996740782271,2.23505126494835 -2.23473578139294 -3.87012948131781,2.24548754433133 -2.2649596321166 -3.956751805292,2.2498559335943 -2.29389262614624 -4.04941236449012,2.24813515038388 -2.32139380484327 -4.14765972598196,2.2403335781829 -2.3473291852295 -4.25101523849813,2.2264892254669 -2.3715724127387 -4.35897536437091,2.2066695405307 -2.39400537680336 -4.47101413271915,2.18097108288703 -2.41451878627752 -4.58658570192556,2.14951905283833 -2.43301270189222 -4.70512701892219,2.11246668151345 -2.44939702314958 -4.82606056232836,2.069994484341 -2.46359192728339 -4.94879715607678,2.02230938159631 -2.47552825814758 -5.07273883982016,1.96964369030667 -2.485147863138 -5.19728178213388,1.91225399242609 -2.4924038765061 -5.32181922232198,1.85041988479386 -2.49726094768414 -5.44574442649435,1.78444261696682 -2.49969541350955 -5.56845364351315,1.71464362356182 -2.49969541350955 -5.68934904640778,1.64136295825855 -2.49726094768414 -5.80784164492769,1.56495763709223 -2.4924038765061 -5.92335415504372,1.48579989910733 -2.485147863138 -6.03532381141787,1.40427539284642 -2.47552825814758 -6.14320510913943,1.32078129750918 -2.46359192728339 -6.24647246137009,1.2357243879353 -2.44939702314958 -6.34462275995019,1.14951905283833 -2.43301270189222 -6.43717782649107,1.06258527594554 -2.41451878627752 -6.52368674201215,0.975346589879385 -2.39400537680336 -6.60372804377285,0.888228012749189 -2.3715724127387 -6.67691177859673,0.801653977505599 -2.3473291852295 -6.74288140268412,0.716046264145928 -2.32139380484327 -6.80131551865772,0.631821944844409 -2.29389262614623 -6.85192944137827,0.549391352018479 -2.2649596321166 -6.89447658490197,0.469156079230493 -2.23473578139294 -6.92874966382241,0.391507024664251 -2.2033683215379 -6.9545817031442,0.316822486708345 -2.17101007166283 -6.97184685176839,0.245466320924432 -2.1378186779085 -6.98046099562637,0.177786167379516 -2.10395584540888 -6.98038216747516,0.114111756978481 -2.06958655048003 -6.97161075135758,0.054753305048271 -2.03487823687206 -6.95418948073126,0.0 -2.0 -6.92820323027551,-0.049881405567917 -1.96512176312794 -6.89377860239042,-0.094647894461618 -1.93041344951997 -6.8510833104027,-0.134081368847123 -1.89604415459112 -6.8003253614832,-0.167989712801067 -1.8621813220915 -6.74175204325688,-0.196207728280158 -1.82898992833716 -6.67564871904237,-0.218597939949449 -1.7966316784621 -6.60233743759055,-0.235051264948343 -1.76526421860705 -6.52217536409545, -# -0.245487544331328 -1.7350403678834 -6.43555304012126,-0.2498559335943 -1.70610737385376 -6.34289248092314,-0.248135150383881 -1.67860619515673 -6.2446451194313,-0.240333578182897 -1.6526708147705 -6.14128960691513,-0.226489225466902 -1.6284275872613 -6.03332948104236,-0.206669540530698 -1.60599462319664 -5.92129071269411,-0.180971082887026 -1.58548121372248 -5.8057191434877,-0.149519052838327 -1.56698729810778 -5.68717782649107,-0.112466681513451 -1.55060297685042 -5.5662442830849,-0.069994484341001 -1.5364080727166 -5.44350768933648,-0.022309381596311 -1.52447174185242 -5.3195660055931,0.030356309693336 -1.514852136862 -5.19502306327939,0.087746007573915 -1.50759612349389 -5.07048562309128,0.149580115206143 -1.50273905231586 -4.94656041891892,0.215557383033179 -1.50030458649045 -4.82385120190011,0.28535637643818 -1.50030458649045 -4.70295579900548,0.35863704174145 -1.50273905231586 -4.58446320048557,0.435042362907775 -1.50759612349389 -4.46895069036954,0.514200100892672 -1.514852136862 -4.35698103399539,0.595724607153583 -1.52447174185242 -4.24909973627383,0.679218702490823 -1.5364080727166 -4.14583238404317,0.764275612064703 -1.55060297685042 -4.04768208546307,0.850480947161672 -1.56698729810778 -3.95512701892219,0.937414724054466 -1.58548121372248 -3.86861810340111,1.02465341012062 -1.60599462319664 -3.78857680164041,1.11177198725081 -1.6284275872613 -3.71539306681653,1.1983460224944 -1.6526708147705 -3.64942344272914,1.28395373585407 -1.67860619515673 -3.59098932675554,1.36817805515559 -1.70610737385376 -3.54037540403499,1.45060864798152 -1.7350403678834 -3.49782826051129,1.53084392076951 -1.76526421860705 -3.46355518159085,1.60849297533575 -1.7966316784621 -3.43772314226906,1.68317751329166 -1.82898992833716 -3.42045799364487,1.75453367907557 -1.8621813220915 -3.41184384978689,1.82221383262049 -1.89604415459112 -3.4119226779381,1.88588824302152 -1.93041344951997 -3.42069409405568,1.94524669495173 -1.96512176312794 -3.438115364682,2.0 -2.0 -3.46410161513775) + # OGRFeature(entities):43 + # EntityHandle (String) = 1EC + # LINESTRING Z (2.0 -2.0 -3.46410161513775,2.04988140556792 -2.03487823687206 -3.49852624302284,2.09464789446162 -2.06958655048003 -3.54122153501056,2.13408136884713 -2.10395584540888 -3.59197948393006,2.16798971280107 -2.1378186779085 -3.65055280215638,2.19620772828016 -2.17101007166283 -3.7166561263709,2.21859793994945 -2.2033683215379 -3.78996740782271,2.23505126494835 -2.23473578139294 -3.87012948131781,2.24548754433133 -2.2649596321166 -3.956751805292,2.2498559335943 -2.29389262614624 -4.04941236449012,2.24813515038388 -2.32139380484327 -4.14765972598196,2.2403335781829 -2.3473291852295 -4.25101523849813,2.2264892254669 -2.3715724127387 -4.35897536437091,2.2066695405307 -2.39400537680336 -4.47101413271915,2.18097108288703 -2.41451878627752 -4.58658570192556,2.14951905283833 -2.43301270189222 -4.70512701892219,2.11246668151345 -2.44939702314958 -4.82606056232836,2.069994484341 -2.46359192728339 -4.94879715607678,2.02230938159631 -2.47552825814758 -5.07273883982016,1.96964369030667 -2.485147863138 -5.19728178213388,1.91225399242609 -2.4924038765061 -5.32181922232198,1.85041988479386 -2.49726094768414 -5.44574442649435,1.78444261696682 -2.49969541350955 -5.56845364351315,1.71464362356182 -2.49969541350955 -5.68934904640778,1.64136295825855 -2.49726094768414 -5.80784164492769,1.56495763709223 -2.4924038765061 -5.92335415504372,1.48579989910733 -2.485147863138 -6.03532381141787,1.40427539284642 -2.47552825814758 -6.14320510913943,1.32078129750918 -2.46359192728339 -6.24647246137009,1.2357243879353 -2.44939702314958 -6.34462275995019,1.14951905283833 -2.43301270189222 -6.43717782649107,1.06258527594554 -2.41451878627752 -6.52368674201215,0.975346589879385 -2.39400537680336 -6.60372804377285,0.888228012749189 -2.3715724127387 -6.67691177859673,0.801653977505599 -2.3473291852295 -6.74288140268412,0.716046264145928 -2.32139380484327 -6.80131551865772,0.631821944844409 -2.29389262614623 -6.85192944137827,0.549391352018479 -2.2649596321166 -6.89447658490197,0.469156079230493 -2.23473578139294 -6.92874966382241,0.391507024664251 -2.2033683215379 -6.9545817031442,0.316822486708345 -2.17101007166283 -6.97184685176839,0.245466320924432 -2.1378186779085 -6.98046099562637,0.177786167379516 -2.10395584540888 -6.98038216747516,0.114111756978481 -2.06958655048003 -6.97161075135758,0.054753305048271 -2.03487823687206 -6.95418948073126,0.0 -2.0 -6.92820323027551,-0.049881405567917 -1.96512176312794 -6.89377860239042,-0.094647894461618 -1.93041344951997 -6.8510833104027,-0.134081368847123 -1.89604415459112 -6.8003253614832,-0.167989712801067 -1.8621813220915 -6.74175204325688,-0.196207728280158 -1.82898992833716 -6.67564871904237,-0.218597939949449 -1.7966316784621 -6.60233743759055,-0.235051264948343 -1.76526421860705 -6.52217536409545, + # -0.245487544331328 -1.7350403678834 -6.43555304012126,-0.2498559335943 -1.70610737385376 -6.34289248092314,-0.248135150383881 -1.67860619515673 -6.2446451194313,-0.240333578182897 -1.6526708147705 -6.14128960691513,-0.226489225466902 -1.6284275872613 -6.03332948104236,-0.206669540530698 -1.60599462319664 -5.92129071269411,-0.180971082887026 -1.58548121372248 -5.8057191434877,-0.149519052838327 -1.56698729810778 -5.68717782649107,-0.112466681513451 -1.55060297685042 -5.5662442830849,-0.069994484341001 -1.5364080727166 -5.44350768933648,-0.022309381596311 -1.52447174185242 -5.3195660055931,0.030356309693336 -1.514852136862 -5.19502306327939,0.087746007573915 -1.50759612349389 -5.07048562309128,0.149580115206143 -1.50273905231586 -4.94656041891892,0.215557383033179 -1.50030458649045 -4.82385120190011,0.28535637643818 -1.50030458649045 -4.70295579900548,0.35863704174145 -1.50273905231586 -4.58446320048557,0.435042362907775 -1.50759612349389 -4.46895069036954,0.514200100892672 -1.514852136862 -4.35698103399539,0.595724607153583 -1.52447174185242 -4.24909973627383,0.679218702490823 -1.5364080727166 -4.14583238404317,0.764275612064703 -1.55060297685042 -4.04768208546307,0.850480947161672 -1.56698729810778 -3.95512701892219,0.937414724054466 -1.58548121372248 -3.86861810340111,1.02465341012062 -1.60599462319664 -3.78857680164041,1.11177198725081 -1.6284275872613 -3.71539306681653,1.1983460224944 -1.6526708147705 -3.64942344272914,1.28395373585407 -1.67860619515673 -3.59098932675554,1.36817805515559 -1.70610737385376 -3.54037540403499,1.45060864798152 -1.7350403678834 -3.49782826051129,1.53084392076951 -1.76526421860705 -3.46355518159085,1.60849297533575 -1.7966316784621 -3.43772314226906,1.68317751329166 -1.82898992833716 -3.42045799364487,1.75453367907557 -1.8621813220915 -3.41184384978689,1.82221383262049 -1.89604415459112 -3.4119226779381,1.88588824302152 -1.93041344951997 -3.42069409405568,1.94524669495173 -1.96512176312794 -3.438115364682,2.0 -2.0 -3.46410161513775) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.0 -2.0 -3.46410161513775,2.04988140556792 -2.03487823687206 -3.49852624302284,2.09464789446162 -2.06958655048003 -3.54122153501056,2.13408136884713 -2.10395584540888 -3.59197948393006,2.16798971280107 -2.1378186779085 -3.65055280215638,2.19620772828016 -2.17101007166283 -3.7166561263709,2.21859793994945 -2.2033683215379 -3.78996740782271,2.23505126494835 -2.23473578139294 -3.87012948131781,2.24548754433133 -2.2649596321166 -3.956751805292,2.2498559335943 -2.29389262614624 -4.04941236449012,2.24813515038388 -2.32139380484327 -4.14765972598196,2.2403335781829 -2.3473291852295 -4.25101523849813,2.2264892254669 -2.3715724127387 -4.35897536437091,2.2066695405307 -2.39400537680336 -4.47101413271915,2.18097108288703 -2.41451878627752 -4.58658570192556,2.14951905283833 -2.43301270189222 -4.70512701892219,2.11246668151345 -2.44939702314958 -4.82606056232836,2.069994484341 -2.46359192728339 -4.94879715607678,2.02230938159631 -2.47552825814758 -5.07273883982016,1.96964369030667 -2.485147863138 -5.19728178213388,1.91225399242609 -2.4924038765061 -5.32181922232198,1.85041988479386 -2.49726094768414 -5.44574442649435,1.78444261696682 -2.49969541350955 -5.56845364351315,1.71464362356182 -2.49969541350955 -5.68934904640778,1.64136295825855 -2.49726094768414 -5.80784164492769,1.56495763709223 -2.4924038765061 -5.92335415504372,1.48579989910733 -2.485147863138 -6.03532381141787,1.40427539284642 -2.47552825814758 -6.14320510913943,1.32078129750918 -2.46359192728339 -6.24647246137009,1.2357243879353 -2.44939702314958 -6.34462275995019,1.14951905283833 -2.43301270189222 -6.43717782649107,1.06258527594554 -2.41451878627752 -6.52368674201215,0.975346589879385 -2.39400537680336 -6.60372804377285,0.888228012749189 -2.3715724127387 -6.67691177859673,0.801653977505599 -2.3473291852295 -6.74288140268412,0.716046264145928 -2.32139380484327 -6.80131551865772,0.631821944844409 -2.29389262614623 -6.85192944137827,0.549391352018479 -2.2649596321166 -6.89447658490197,0.469156079230493 -2.23473578139294 -6.92874966382241,0.391507024664251 -2.2033683215379 -6.9545817031442,0.316822486708345 -2.17101007166283 -6.97184685176839,0.245466320924432 -2.1378186779085 -6.98046099562637,0.177786167379516 -2.10395584540888 -6.98038216747516,0.114111756978481 -2.06958655048003 -6.97161075135758,0.054753305048271 -2.03487823687206 -6.95418948073126,0.0 -2.0 -6.92820323027551,-0.049881405567917 -1.96512176312794 -6.89377860239042,-0.094647894461618 -1.93041344951997 -6.8510833104027,-0.134081368847123 -1.89604415459112 -6.8003253614832,-0.167989712801067 -1.8621813220915 -6.74175204325688,-0.196207728280158 -1.82898992833716 -6.67564871904237,-0.218597939949449 -1.7966316784621 -6.60233743759055,' + - '-0.235051264948343 -1.76526421860705 -6.52217536409545,-0.245487544331328 -1.7350403678834 -6.43555304012126,-0.2498559335943 -1.70610737385376 -6.34289248092314,-0.248135150383881 -1.67860619515673 -6.2446451194313,-0.240333578182897 -1.6526708147705 -6.14128960691513,-0.226489225466902 -1.6284275872613 -6.03332948104236,-0.206669540530698 -1.60599462319664 -5.92129071269411,-0.180971082887026 -1.58548121372248 -5.8057191434877,-0.149519052838327 -1.56698729810778 -5.68717782649107,-0.112466681513451 -1.55060297685042 -5.5662442830849,-0.069994484341001 -1.5364080727166 -5.44350768933648,-0.022309381596311 -1.52447174185242 -5.3195660055931,0.030356309693336 -1.514852136862 -5.19502306327939,0.087746007573915 -1.50759612349389 -5.07048562309128,0.149580115206143 -1.50273905231586 -4.94656041891892,0.215557383033179 -1.50030458649045 -4.82385120190011,0.28535637643818 -1.50030458649045 -4.70295579900548,0.35863704174145 -1.50273905231586 -4.58446320048557,0.435042362907775 -1.50759612349389 -4.46895069036954,0.514200100892672 -1.514852136862 -4.35698103399539,0.595724607153583 -1.52447174185242 -4.24909973627383,0.679218702490823 -1.5364080727166 -4.14583238404317,0.764275612064703 -1.55060297685042 -4.04768208546307,0.850480947161672 -1.56698729810778 -3.95512701892219,0.937414724054466 -1.58548121372248 -3.86861810340111,1.02465341012062 -1.60599462319664 -3.78857680164041,1.11177198725081 -1.6284275872613 -3.71539306681653,1.1983460224944 -1.6526708147705 -3.64942344272914,1.28395373585407 -1.67860619515673 -3.59098932675554,1.36817805515559 -1.70610737385376 -3.54037540403499,1.45060864798152 -1.7350403678834 -3.49782826051129,1.53084392076951 -1.76526421860705 -3.46355518159085,1.60849297533575 -1.7966316784621 -3.43772314226906,1.68317751329166 -1.82898992833716 -3.42045799364487,1.75453367907557 -1.8621813220915 -3.41184384978689,1.82221383262049 -1.89604415459112 -3.4119226779381,1.88588824302152 -1.93041344951997 -3.42069409405568,1.94524669495173 -1.96512176312794 -3.438115364682,2.0 -2.0 -3.46410161513775)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2.0 -2.0 -3.46410161513775,2.04988140556792 -2.03487823687206 -3.49852624302284,2.09464789446162 -2.06958655048003 -3.54122153501056,2.13408136884713 -2.10395584540888 -3.59197948393006,2.16798971280107 -2.1378186779085 -3.65055280215638,2.19620772828016 -2.17101007166283 -3.7166561263709,2.21859793994945 -2.2033683215379 -3.78996740782271,2.23505126494835 -2.23473578139294 -3.87012948131781,2.24548754433133 -2.2649596321166 -3.956751805292,2.2498559335943 -2.29389262614624 -4.04941236449012,2.24813515038388 -2.32139380484327 -4.14765972598196,2.2403335781829 -2.3473291852295 -4.25101523849813,2.2264892254669 -2.3715724127387 -4.35897536437091,2.2066695405307 -2.39400537680336 -4.47101413271915,2.18097108288703 -2.41451878627752 -4.58658570192556,2.14951905283833 -2.43301270189222 -4.70512701892219,2.11246668151345 -2.44939702314958 -4.82606056232836,2.069994484341 -2.46359192728339 -4.94879715607678,2.02230938159631 -2.47552825814758 -5.07273883982016,1.96964369030667 -2.485147863138 -5.19728178213388,1.91225399242609 -2.4924038765061 -5.32181922232198,1.85041988479386 -2.49726094768414 -5.44574442649435,1.78444261696682 -2.49969541350955 -5.56845364351315,1.71464362356182 -2.49969541350955 -5.68934904640778,1.64136295825855 -2.49726094768414 -5.80784164492769,1.56495763709223 -2.4924038765061 -5.92335415504372,1.48579989910733 -2.485147863138 -6.03532381141787,1.40427539284642 -2.47552825814758 -6.14320510913943,1.32078129750918 -2.46359192728339 -6.24647246137009,1.2357243879353 -2.44939702314958 -6.34462275995019,1.14951905283833 -2.43301270189222 -6.43717782649107,1.06258527594554 -2.41451878627752 -6.52368674201215,0.975346589879385 -2.39400537680336 -6.60372804377285,0.888228012749189 -2.3715724127387 -6.67691177859673,0.801653977505599 -2.3473291852295 -6.74288140268412,0.716046264145928 -2.32139380484327 -6.80131551865772,0.631821944844409 -2.29389262614623 -6.85192944137827,0.549391352018479 -2.2649596321166 -6.89447658490197,0.469156079230493 -2.23473578139294 -6.92874966382241,0.391507024664251 -2.2033683215379 -6.9545817031442,0.316822486708345 -2.17101007166283 -6.97184685176839,0.245466320924432 -2.1378186779085 -6.98046099562637,0.177786167379516 -2.10395584540888 -6.98038216747516,0.114111756978481 -2.06958655048003 -6.97161075135758,0.054753305048271 -2.03487823687206 -6.95418948073126,0.0 -2.0 -6.92820323027551,-0.049881405567917 -1.96512176312794 -6.89377860239042,-0.094647894461618 -1.93041344951997 -6.8510833104027,-0.134081368847123 -1.89604415459112 -6.8003253614832,-0.167989712801067 -1.8621813220915 -6.74175204325688,-0.196207728280158 -1.82898992833716 -6.67564871904237,-0.218597939949449 -1.7966316784621 -6.60233743759055," + + "-0.235051264948343 -1.76526421860705 -6.52217536409545,-0.245487544331328 -1.7350403678834 -6.43555304012126,-0.2498559335943 -1.70610737385376 -6.34289248092314,-0.248135150383881 -1.67860619515673 -6.2446451194313,-0.240333578182897 -1.6526708147705 -6.14128960691513,-0.226489225466902 -1.6284275872613 -6.03332948104236,-0.206669540530698 -1.60599462319664 -5.92129071269411,-0.180971082887026 -1.58548121372248 -5.8057191434877,-0.149519052838327 -1.56698729810778 -5.68717782649107,-0.112466681513451 -1.55060297685042 -5.5662442830849,-0.069994484341001 -1.5364080727166 -5.44350768933648,-0.022309381596311 -1.52447174185242 -5.3195660055931,0.030356309693336 -1.514852136862 -5.19502306327939,0.087746007573915 -1.50759612349389 -5.07048562309128,0.149580115206143 -1.50273905231586 -4.94656041891892,0.215557383033179 -1.50030458649045 -4.82385120190011,0.28535637643818 -1.50030458649045 -4.70295579900548,0.35863704174145 -1.50273905231586 -4.58446320048557,0.435042362907775 -1.50759612349389 -4.46895069036954,0.514200100892672 -1.514852136862 -4.35698103399539,0.595724607153583 -1.52447174185242 -4.24909973627383,0.679218702490823 -1.5364080727166 -4.14583238404317,0.764275612064703 -1.55060297685042 -4.04768208546307,0.850480947161672 -1.56698729810778 -3.95512701892219,0.937414724054466 -1.58548121372248 -3.86861810340111,1.02465341012062 -1.60599462319664 -3.78857680164041,1.11177198725081 -1.6284275872613 -3.71539306681653,1.1983460224944 -1.6526708147705 -3.64942344272914,1.28395373585407 -1.67860619515673 -3.59098932675554,1.36817805515559 -1.70610737385376 -3.54037540403499,1.45060864798152 -1.7350403678834 -3.49782826051129,1.53084392076951 -1.76526421860705 -3.46355518159085,1.60849297533575 -1.7966316784621 -3.43772314226906,1.68317751329166 -1.82898992833716 -3.42045799364487,1.75453367907557 -1.8621813220915 -3.41184384978689,1.82221383262049 -1.89604415459112 -3.4119226779381,1.88588824302152 -1.93041344951997 -3.42069409405568,1.94524669495173 -1.96512176312794 -3.438115364682,2.0 -2.0 -3.46410161513775)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):44 -# EntityHandle (String) = 1ED -# LINESTRING Z (0.5 -1.0 -2.59807621135332,0.543577773425908 -1.01791116395762 -2.58464338569351,0.587546417985528 -1.03693648101917 -2.57439309093773,0.631694860183701 -1.05698461927736 -2.56737453409618,0.675811163398452 -1.07795933672482 -2.56362140807291,0.719683545292469 -1.09975994326827 -2.56315172992158,0.763101394483934 -1.12228178409597 -2.5659677543537,0.805856281596113 -1.14541674207787 -2.57205596291479,0.847742959832148 -1.16905375678694 -2.58138712888039,0.888560350271717 -1.19307935764976 -2.59391645756022,0.928112507159618 -1.21737820866727 -2.60958380133721,0.96620955855235 -1.24183366209053 -2.62831394840886,1.00266861780709 -1.26632831839353 -2.65001698384495,1.03731466153743 -1.29074458985506 -2.67458872122829,1.06998136982112 -1.31496526504393 -2.7019112028064,1.10051192462654 -1.33887407149783 -2.73185326575312,1.12875976262485 -1.36235623389463 -2.76427117182176,1.15458927877392 -1.38529902503655 -2.79900929736714,1.17787647729662 -1.40759230700227 -2.83590088042404,1.19850956692819 -1.42912905986906 -2.8747688212557,1.21638949757537 -1.44980589546683 -2.91542653252918,1.23143043581088 -1.46952355369781 -2.95767883503644,1.24356017692077 -1.48818737903916 -3.00132289466106,1.2527204915264 -1.50570777494116 -3.04614919609277,1.25886740511731 -1.52200063393958 -3.09194254861523,1.26197140915283 -1.53698774141742 -3.138483119139,1.2620176027192 -1.55059715107771 -3.18554748752036,1.25900576406208 -1.56276353032509 -3.23290971909991,1.25295035165112 -1.57342847389788 -3.28034244931235,1.24388043477135 -1.58254078424523 -3.32761797516041,1.23183955397484 -1.59005671730331 -3.37450934831362,1.21688551206218 -1.5959401924907 -3.42079146458413,1.19909009659756 -1.60016296591487 -3.46624214454969,1.17853873528923 -1.6027047659583 -3.51064320013621,1.15533008588991 -1.60355339059327 -3.55378148203954,1.12957556258567 -1.6027047659583 -3.59544990295855,1.10139880114707 -1.60016296591487 -3.63544843172717,1.07093506540992 -1.5959401924907 -3.67358505357321,1.03833059793508 -1.59005671730331 -3.70967669189409,1.00374191796432 -1.58254078424523 -3.74355008712442,0.967335070042516 -1.57342847389788 -3.77504262847653,0.929284826913179 -1.56276353032509 -3.80400313456104,0.889773850513921 -1.55059715107771 -3.83029257913998,0.848991815099414 -1.53698774141741 -3.85378475852869,0.807134496701444 -1.52200063393958 -3.87436689744237,0.764402833297081 -1.50570777494116 -3.891940190379,0.72100196019671 -1.48818737903916 -3.90642027593972,0.677140225282558 -1.46952355369781 -3.91773764180954,0.633028188825132 -1.44980589546683 -3.92583795845446,0.588877612678977 -1.42912905986906 -3.93068233993284,0.544900443710183 -1.40759230700227 -3.93224753056917,0.501307796335731 -1.38529902503655 -3.93052601659399,0.458308939059047 -1.36235623389463 -3.92552606221412,0.416110289866958 -1.33887407149783 -3.91727166993992,0.374914425310669 -1.31496526504393 -3.90580246536015,0.334919108027743 -1.29074458985506 -3.89117350691752,0.296316337373485 -1.26632831839353 -3.87345502159809,0.259291427719229 -1.24183366209053 -3.85273206780345,0.224022118842197 -1.21737820866727 -3.82910412702388,0.190677722677547 -1.19307935764975 -3.80268462627299,0.159418310528662 -1.16905375678694 -3.77360039357605,0.13039394463751 -1.14541674207787 -3.7419910491263,0.103743957803975 -1.12228178409597 -3.70800833503176,0.079596284512354 -1.09975994326827 -3.67181538687033,0.058066846776 -1.07795933672482 -3.63358595054991,0.039258997648375 -1.05698461927736 -3.59350354823325,0.023263025071983 -1.03693648101917 -3.55176059733134,0.010155718446952 -1.01791116395762 -3.50855748679486,0.0 -1.0 -3.46410161513776) + # OGRFeature(entities):44 + # EntityHandle (String) = 1ED + # LINESTRING Z (0.5 -1.0 -2.59807621135332,0.543577773425908 -1.01791116395762 -2.58464338569351,0.587546417985528 -1.03693648101917 -2.57439309093773,0.631694860183701 -1.05698461927736 -2.56737453409618,0.675811163398452 -1.07795933672482 -2.56362140807291,0.719683545292469 -1.09975994326827 -2.56315172992158,0.763101394483934 -1.12228178409597 -2.5659677543537,0.805856281596113 -1.14541674207787 -2.57205596291479,0.847742959832148 -1.16905375678694 -2.58138712888039,0.888560350271717 -1.19307935764976 -2.59391645756022,0.928112507159618 -1.21737820866727 -2.60958380133721,0.96620955855235 -1.24183366209053 -2.62831394840886,1.00266861780709 -1.26632831839353 -2.65001698384495,1.03731466153743 -1.29074458985506 -2.67458872122829,1.06998136982112 -1.31496526504393 -2.7019112028064,1.10051192462654 -1.33887407149783 -2.73185326575312,1.12875976262485 -1.36235623389463 -2.76427117182176,1.15458927877392 -1.38529902503655 -2.79900929736714,1.17787647729662 -1.40759230700227 -2.83590088042404,1.19850956692819 -1.42912905986906 -2.8747688212557,1.21638949757537 -1.44980589546683 -2.91542653252918,1.23143043581088 -1.46952355369781 -2.95767883503644,1.24356017692077 -1.48818737903916 -3.00132289466106,1.2527204915264 -1.50570777494116 -3.04614919609277,1.25886740511731 -1.52200063393958 -3.09194254861523,1.26197140915283 -1.53698774141742 -3.138483119139,1.2620176027192 -1.55059715107771 -3.18554748752036,1.25900576406208 -1.56276353032509 -3.23290971909991,1.25295035165112 -1.57342847389788 -3.28034244931235,1.24388043477135 -1.58254078424523 -3.32761797516041,1.23183955397484 -1.59005671730331 -3.37450934831362,1.21688551206218 -1.5959401924907 -3.42079146458413,1.19909009659756 -1.60016296591487 -3.46624214454969,1.17853873528923 -1.6027047659583 -3.51064320013621,1.15533008588991 -1.60355339059327 -3.55378148203954,1.12957556258567 -1.6027047659583 -3.59544990295855,1.10139880114707 -1.60016296591487 -3.63544843172717,1.07093506540992 -1.5959401924907 -3.67358505357321,1.03833059793508 -1.59005671730331 -3.70967669189409,1.00374191796432 -1.58254078424523 -3.74355008712442,0.967335070042516 -1.57342847389788 -3.77504262847653,0.929284826913179 -1.56276353032509 -3.80400313456104,0.889773850513921 -1.55059715107771 -3.83029257913998,0.848991815099414 -1.53698774141741 -3.85378475852869,0.807134496701444 -1.52200063393958 -3.87436689744237,0.764402833297081 -1.50570777494116 -3.891940190379,0.72100196019671 -1.48818737903916 -3.90642027593972,0.677140225282558 -1.46952355369781 -3.91773764180954,0.633028188825132 -1.44980589546683 -3.92583795845446,0.588877612678977 -1.42912905986906 -3.93068233993284,0.544900443710183 -1.40759230700227 -3.93224753056917,0.501307796335731 -1.38529902503655 -3.93052601659399,0.458308939059047 -1.36235623389463 -3.92552606221412,0.416110289866958 -1.33887407149783 -3.91727166993992,0.374914425310669 -1.31496526504393 -3.90580246536015,0.334919108027743 -1.29074458985506 -3.89117350691752,0.296316337373485 -1.26632831839353 -3.87345502159809,0.259291427719229 -1.24183366209053 -3.85273206780345,0.224022118842197 -1.21737820866727 -3.82910412702388,0.190677722677547 -1.19307935764975 -3.80268462627299,0.159418310528662 -1.16905375678694 -3.77360039357605,0.13039394463751 -1.14541674207787 -3.7419910491263,0.103743957803975 -1.12228178409597 -3.70800833503176,0.079596284512354 -1.09975994326827 -3.67181538687033,0.058066846776 -1.07795933672482 -3.63358595054991,0.039258997648375 -1.05698461927736 -3.59350354823325,0.023263025071983 -1.03693648101917 -3.55176059733134,0.010155718446952 -1.01791116395762 -3.50855748679486,0.0 -1.0 -3.46410161513776) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0.5 -1.0 -2.59807621135332,0.543577773425908 -1.01791116395762 -2.58464338569351,0.587546417985528 -1.03693648101917 -2.57439309093773,0.631694860183701 -1.05698461927736 -2.56737453409618,0.675811163398452 -1.07795933672482 -2.56362140807291,0.719683545292469 -1.09975994326827 -2.56315172992158,0.763101394483934 -1.12228178409597 -2.5659677543537,0.805856281596113 -1.14541674207787 -2.57205596291479,0.847742959832148 -1.16905375678694 -2.58138712888039,0.888560350271717 -1.19307935764976 -2.59391645756022,0.928112507159618 -1.21737820866727 -2.60958380133721,0.96620955855235 -1.24183366209053 -2.62831394840886,1.00266861780709 -1.26632831839353 -2.65001698384495,1.03731466153743 -1.29074458985506 -2.67458872122829,1.06998136982112 -1.31496526504393 -2.7019112028064,1.10051192462654 -1.33887407149783 -2.73185326575312,1.12875976262485 -1.36235623389463 -2.76427117182176,1.15458927877392 -1.38529902503655 -2.79900929736714,1.17787647729662 -1.40759230700227 -2.83590088042404,1.19850956692819 -1.42912905986906 -2.8747688212557,1.21638949757537 -1.44980589546683 -2.91542653252918,1.23143043581088 -1.46952355369781 -2.95767883503644,1.24356017692077 -1.48818737903916 -3.00132289466106,1.2527204915264 -1.50570777494116 -3.04614919609277,1.25886740511731 -1.52200063393958 -3.09194254861523,1.26197140915283 -1.53698774141742 -3.138483119139,1.2620176027192 -1.55059715107771 -3.18554748752036,1.25900576406208 -1.56276353032509 -3.23290971909991,1.25295035165112 -1.57342847389788 -3.28034244931235,1.24388043477135 -1.58254078424523 -3.32761797516041,1.23183955397484 -1.59005671730331 -3.37450934831362,1.21688551206218 -1.5959401924907 -3.42079146458413,1.19909009659756 -1.60016296591487 -3.46624214454969,1.17853873528923 -1.6027047659583 -3.51064320013621,1.15533008588991 -1.60355339059327 -3.55378148203954,1.12957556258567 -1.6027047659583 -3.59544990295855,1.10139880114707 -1.60016296591487 -3.63544843172717,1.07093506540992 -1.5959401924907 -3.67358505357321,1.03833059793508 -1.59005671730331 -3.70967669189409,1.00374191796432 -1.58254078424523 -3.74355008712442,0.967335070042516 -1.57342847389788 -3.77504262847653,0.929284826913179 -1.56276353032509 -3.80400313456104,0.889773850513921 -1.55059715107771 -3.83029257913998,0.848991815099414 -1.53698774141741 -3.85378475852869,0.807134496701444 -1.52200063393958 -3.87436689744237,0.764402833297081 -1.50570777494116 -3.891940190379,0.72100196019671 -1.48818737903916 -3.90642027593972,0.677140225282558 -1.46952355369781 -3.91773764180954,0.633028188825132 -1.44980589546683 -3.92583795845446,0.588877612678977 -1.42912905986906 -3.93068233993284,0.544900443710183 -1.40759230700227 -3.93224753056917,0.501307796335731 -1.38529902503655 -3.93052601659399,0.458308939059047 -1.36235623389463 -3.92552606221412,0.416110289866958 -1.33887407149783 -3.91727166993992,0.374914425310669 -1.31496526504393 -3.90580246536015,0.334919108027743 -1.29074458985506 -3.89117350691752,0.296316337373485 -1.26632831839353 -3.87345502159809,0.259291427719229 -1.24183366209053 -3.85273206780345,0.224022118842197 -1.21737820866727 -3.82910412702388,0.190677722677547 -1.19307935764975 -3.80268462627299,0.159418310528662 -1.16905375678694 -3.77360039357605,0.13039394463751 -1.14541674207787 -3.7419910491263,0.103743957803975 -1.12228178409597 -3.70800833503176,0.079596284512354 -1.09975994326827 -3.67181538687033,0.058066846776 -1.07795933672482 -3.63358595054991,0.039258997648375 -1.05698461927736 -3.59350354823325,0.023263025071983 -1.03693648101917 -3.55176059733134,0.010155718446952 -1.01791116395762 -3.50855748679486,0.0 -1.0 -3.46410161513776)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (0.5 -1.0 -2.59807621135332,0.543577773425908 -1.01791116395762 -2.58464338569351,0.587546417985528 -1.03693648101917 -2.57439309093773,0.631694860183701 -1.05698461927736 -2.56737453409618,0.675811163398452 -1.07795933672482 -2.56362140807291,0.719683545292469 -1.09975994326827 -2.56315172992158,0.763101394483934 -1.12228178409597 -2.5659677543537,0.805856281596113 -1.14541674207787 -2.57205596291479,0.847742959832148 -1.16905375678694 -2.58138712888039,0.888560350271717 -1.19307935764976 -2.59391645756022,0.928112507159618 -1.21737820866727 -2.60958380133721,0.96620955855235 -1.24183366209053 -2.62831394840886,1.00266861780709 -1.26632831839353 -2.65001698384495,1.03731466153743 -1.29074458985506 -2.67458872122829,1.06998136982112 -1.31496526504393 -2.7019112028064,1.10051192462654 -1.33887407149783 -2.73185326575312,1.12875976262485 -1.36235623389463 -2.76427117182176,1.15458927877392 -1.38529902503655 -2.79900929736714,1.17787647729662 -1.40759230700227 -2.83590088042404,1.19850956692819 -1.42912905986906 -2.8747688212557,1.21638949757537 -1.44980589546683 -2.91542653252918,1.23143043581088 -1.46952355369781 -2.95767883503644,1.24356017692077 -1.48818737903916 -3.00132289466106,1.2527204915264 -1.50570777494116 -3.04614919609277,1.25886740511731 -1.52200063393958 -3.09194254861523,1.26197140915283 -1.53698774141742 -3.138483119139,1.2620176027192 -1.55059715107771 -3.18554748752036,1.25900576406208 -1.56276353032509 -3.23290971909991,1.25295035165112 -1.57342847389788 -3.28034244931235,1.24388043477135 -1.58254078424523 -3.32761797516041,1.23183955397484 -1.59005671730331 -3.37450934831362,1.21688551206218 -1.5959401924907 -3.42079146458413,1.19909009659756 -1.60016296591487 -3.46624214454969,1.17853873528923 -1.6027047659583 -3.51064320013621,1.15533008588991 -1.60355339059327 -3.55378148203954,1.12957556258567 -1.6027047659583 -3.59544990295855,1.10139880114707 -1.60016296591487 -3.63544843172717,1.07093506540992 -1.5959401924907 -3.67358505357321,1.03833059793508 -1.59005671730331 -3.70967669189409,1.00374191796432 -1.58254078424523 -3.74355008712442,0.967335070042516 -1.57342847389788 -3.77504262847653,0.929284826913179 -1.56276353032509 -3.80400313456104,0.889773850513921 -1.55059715107771 -3.83029257913998,0.848991815099414 -1.53698774141741 -3.85378475852869,0.807134496701444 -1.52200063393958 -3.87436689744237,0.764402833297081 -1.50570777494116 -3.891940190379,0.72100196019671 -1.48818737903916 -3.90642027593972,0.677140225282558 -1.46952355369781 -3.91773764180954,0.633028188825132 -1.44980589546683 -3.92583795845446,0.588877612678977 -1.42912905986906 -3.93068233993284,0.544900443710183 -1.40759230700227 -3.93224753056917,0.501307796335731 -1.38529902503655 -3.93052601659399,0.458308939059047 -1.36235623389463 -3.92552606221412,0.416110289866958 -1.33887407149783 -3.91727166993992,0.374914425310669 -1.31496526504393 -3.90580246536015,0.334919108027743 -1.29074458985506 -3.89117350691752,0.296316337373485 -1.26632831839353 -3.87345502159809,0.259291427719229 -1.24183366209053 -3.85273206780345,0.224022118842197 -1.21737820866727 -3.82910412702388,0.190677722677547 -1.19307935764975 -3.80268462627299,0.159418310528662 -1.16905375678694 -3.77360039357605,0.13039394463751 -1.14541674207787 -3.7419910491263,0.103743957803975 -1.12228178409597 -3.70800833503176,0.079596284512354 -1.09975994326827 -3.67181538687033,0.058066846776 -1.07795933672482 -3.63358595054991,0.039258997648375 -1.05698461927736 -3.59350354823325,0.023263025071983 -1.03693648101917 -3.55176059733134,0.010155718446952 -1.01791116395762 -3.50855748679486,0.0 -1.0 -3.46410161513776)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):45 -# EntityHandle (String) = 1EE -# POLYGON Z ((1 -1 -1.73205080756888,1.75 -1.5 -2.1650635094611,1.25 -1.5 -3.03108891324553,0.5 -1.0 -2.59807621135332,1 -1 -1.73205080756888)) + # OGRFeature(entities):45 + # EntityHandle (String) = 1EE + # POLYGON Z ((1 -1 -1.73205080756888,1.75 -1.5 -2.1650635094611,1.25 -1.5 -3.03108891324553,0.5 -1.0 -2.59807621135332,1 -1 -1.73205080756888)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((1 -1 -1.73205080756888,1.75 -1.5 -2.1650635094611,1.25 -1.5 -3.03108891324553,0.5 -1.0 -2.59807621135332,1 -1 -1.73205080756888))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((1 -1 -1.73205080756888,1.75 -1.5 -2.1650635094611,1.25 -1.5 -3.03108891324553,0.5 -1.0 -2.59807621135332,1 -1 -1.73205080756888))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):46 -# EntityHandle (String) = 1EF -# POLYGON Z ((1.5 -2.0 -4.33012701892219,1.0 -2.0 -5.19615242270663,0.25 -1.5 -4.76313972081441,0.75 -1.5 -3.89711431702997,1.5 -2.0 -4.33012701892219)) + # OGRFeature(entities):46 + # EntityHandle (String) = 1EF + # POLYGON Z ((1.5 -2.0 -4.33012701892219,1.0 -2.0 -5.19615242270663,0.25 -1.5 -4.76313972081441,0.75 -1.5 -3.89711431702997,1.5 -2.0 -4.33012701892219)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((1.5 -2.0 -4.33012701892219,1.0 -2.0 -5.19615242270663,0.25 -1.5 -4.76313972081441,0.75 -1.5 -3.89711431702997,1.5 -2.0 -4.33012701892219))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((1.5 -2.0 -4.33012701892219,1.0 -2.0 -5.19615242270663,0.25 -1.5 -4.76313972081441,0.75 -1.5 -3.89711431702997,1.5 -2.0 -4.33012701892219))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):47 -# EntityHandle (String) = 1F1 -# POLYGON Z ((2.0 -4.0 -10.3923048454133,1.5 -4.0 -11.2583302491977,2.25 -4.5 -11.6913429510899,2.75 -4.5 -10.8253175473055,2.0 -4.0 -10.3923048454133)) + # OGRFeature(entities):47 + # EntityHandle (String) = 1F1 + # POLYGON Z ((2.0 -4.0 -10.3923048454133,1.5 -4.0 -11.2583302491977,2.25 -4.5 -11.6913429510899,2.75 -4.5 -10.8253175473055,2.0 -4.0 -10.3923048454133)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((2.0 -4.0 -10.3923048454133,1.5 -4.0 -11.2583302491977,2.25 -4.5 -11.6913429510899,2.75 -4.5 -10.8253175473055,2.0 -4.0 -10.3923048454133))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((2.0 -4.0 -10.3923048454133,1.5 -4.0 -11.2583302491977,2.25 -4.5 -11.6913429510899,2.75 -4.5 -10.8253175473055,2.0 -4.0 -10.3923048454133))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):48 -# EntityHandle (String) = 1F2 -# LINESTRING (0.5 -1.0,0.53846153846154 -1.07692307692308,0.576923076923078 -1.15384615384615,0.615384615384617 -1.23076923076923,0.653846153846155 -1.30769230769231,0.692307692307694 -1.38461538461538,0.730769230769232 -1.46153846153846,0.769230769230771 -1.53846153846154,0.807692307692309 -1.61538461538462,0.846153846153848 -1.69230769230769,0.884615384615386 -1.76923076923077,0.923076923076924 -1.84615384615385,0.961538461538463 -1.92307692307692,1.0 -2.0,1.03846153846154 -2.07692307692308,1.07692307692308 -2.15384615384615,1.11538461538462 -2.23076923076923,1.15384615384616 -2.30769230769231,1.19230769230769 -2.38461538461538,1.23076923076923 -2.46153846153846,1.26923076923077 -2.53846153846154,1.30769230769231 -2.61538461538461,1.34615384615385 -2.69230769230769,1.38461538461539 -2.76923076923077,1.42307692307693 -2.84615384615385,1.46153846153846 -2.92307692307692,1.5 -3.0,1.53846153846154 -3.07692307692308,1.57692307692308 -3.15384615384615,1.61538461538462 -3.23076923076923,1.65384615384616 -3.30769230769231,1.6923076923077 -3.38461538461539,1.73076923076923 -3.46153846153846,1.76923076923077 -3.53846153846154,1.80769230769231 -3.61538461538461,1.84615384615385 -3.69230769230769,1.88461538461539 -3.76923076923077,1.92307692307693 -3.84615384615385,1.96153846153847 -3.92307692307692,2.0 -4.0) + # OGRFeature(entities):48 + # EntityHandle (String) = 1F2 + # LINESTRING (0.5 -1.0,0.53846153846154 -1.07692307692308,0.576923076923078 -1.15384615384615,0.615384615384617 -1.23076923076923,0.653846153846155 -1.30769230769231,0.692307692307694 -1.38461538461538,0.730769230769232 -1.46153846153846,0.769230769230771 -1.53846153846154,0.807692307692309 -1.61538461538462,0.846153846153848 -1.69230769230769,0.884615384615386 -1.76923076923077,0.923076923076924 -1.84615384615385,0.961538461538463 -1.92307692307692,1.0 -2.0,1.03846153846154 -2.07692307692308,1.07692307692308 -2.15384615384615,1.11538461538462 -2.23076923076923,1.15384615384616 -2.30769230769231,1.19230769230769 -2.38461538461538,1.23076923076923 -2.46153846153846,1.26923076923077 -2.53846153846154,1.30769230769231 -2.61538461538461,1.34615384615385 -2.69230769230769,1.38461538461539 -2.76923076923077,1.42307692307693 -2.84615384615385,1.46153846153846 -2.92307692307692,1.5 -3.0,1.53846153846154 -3.07692307692308,1.57692307692308 -3.15384615384615,1.61538461538462 -3.23076923076923,1.65384615384616 -3.30769230769231,1.6923076923077 -3.38461538461539,1.73076923076923 -3.46153846153846,1.76923076923077 -3.53846153846154,1.80769230769231 -3.61538461538461,1.84615384615385 -3.69230769230769,1.88461538461539 -3.76923076923077,1.92307692307693 -3.84615384615385,1.96153846153847 -3.92307692307692,2.0 -4.0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (0.5 -1.0,0.53846153846154 -1.07692307692308,0.576923076923078 -1.15384615384615,0.615384615384617 -1.23076923076923,0.653846153846155 -1.30769230769231,0.692307692307694 -1.38461538461538,0.730769230769232 -1.46153846153846,0.769230769230771 -1.53846153846154,0.807692307692309 -1.61538461538462,0.846153846153848 -1.69230769230769,0.884615384615386 -1.76923076923077,0.923076923076924 -1.84615384615385,0.961538461538463 -1.92307692307692,1.0 -2.0,1.03846153846154 -2.07692307692308,1.07692307692308 -2.15384615384615,1.11538461538462 -2.23076923076923,1.15384615384616 -2.30769230769231,1.19230769230769 -2.38461538461538,1.23076923076923 -2.46153846153846,1.26923076923077 -2.53846153846154,1.30769230769231 -2.61538461538461,1.34615384615385 -2.69230769230769,1.38461538461539 -2.76923076923077,1.42307692307693 -2.84615384615385,1.46153846153846 -2.92307692307692,1.5 -3.0,1.53846153846154 -3.07692307692308,1.57692307692308 -3.15384615384615,1.61538461538462 -3.23076923076923,1.65384615384616 -3.30769230769231,1.6923076923077 -3.38461538461539,1.73076923076923 -3.46153846153846,1.76923076923077 -3.53846153846154,1.80769230769231 -3.61538461538461,1.84615384615385 -3.69230769230769,1.88461538461539 -3.76923076923077,1.92307692307693 -3.84615384615385,1.96153846153847 -3.92307692307692,2.0 -4.0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (0.5 -1.0,0.53846153846154 -1.07692307692308,0.576923076923078 -1.15384615384615,0.615384615384617 -1.23076923076923,0.653846153846155 -1.30769230769231,0.692307692307694 -1.38461538461538,0.730769230769232 -1.46153846153846,0.769230769230771 -1.53846153846154,0.807692307692309 -1.61538461538462,0.846153846153848 -1.69230769230769,0.884615384615386 -1.76923076923077,0.923076923076924 -1.84615384615385,0.961538461538463 -1.92307692307692,1.0 -2.0,1.03846153846154 -2.07692307692308,1.07692307692308 -2.15384615384615,1.11538461538462 -2.23076923076923,1.15384615384616 -2.30769230769231,1.19230769230769 -2.38461538461538,1.23076923076923 -2.46153846153846,1.26923076923077 -2.53846153846154,1.30769230769231 -2.61538461538461,1.34615384615385 -2.69230769230769,1.38461538461539 -2.76923076923077,1.42307692307693 -2.84615384615385,1.46153846153846 -2.92307692307692,1.5 -3.0,1.53846153846154 -3.07692307692308,1.57692307692308 -3.15384615384615,1.61538461538462 -3.23076923076923,1.65384615384616 -3.30769230769231,1.6923076923077 -3.38461538461539,1.73076923076923 -3.46153846153846,1.76923076923077 -3.53846153846154,1.80769230769231 -3.61538461538461,1.84615384615385 -3.69230769230769,1.88461538461539 -3.76923076923077,1.92307692307693 -3.84615384615385,1.96153846153847 -3.92307692307692,2.0 -4.0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):49 -# EntityHandle (String) = 1F3 -# LINESTRING (-3.25 -0.5,-3.07367580370539 -0.493674033614862,-2.89709873733542 -0.487853807380434,-2.72001593081474 -0.483045061447428,-2.542174514068 -0.479753535966554,-2.36332161701984 -0.478484971088521,-2.1832043695949 -0.479745106964042,-2.00156990171783 -0.484039683743825,-1.81816534331327 -0.491874441578583,-1.63273782430587 -0.503755120619026,-1.44503447462027 -0.520187461015863,-1.25480242418112 -0.541677202919806,-1.06178880291306 -0.568730086481565,-0.865740740740739 -0.601851851851852,-0.666405367588798 -0.641548239181375,-0.463529813381883 -0.688324988620846,-0.256861208044639 -0.742687840320976,-0.04614668150171 -0.805142534432475,0.168866636322258 -0.876194811106053,0.388431615502622 -0.956350410492422,0.612790589861596 -1.04609400023601,0.841943559399181 -1.14542558033682,1.07564819029316 -1.25386048315042,1.31365161246818 -1.3708929685261,1.55570095584888 -1.49601729631315,1.80154335035992 -1.62872772636086,2.05092592592592 -1.76851851851852,2.30359581247155 -1.91488393263541,2.55930013992144 -2.06731822856083,2.81778603820024 -2.22531566614407,3.07880063723259 -2.38837050523441,3.34209106694314 -2.55597700568115,3.60740445725653 -2.72762942733357,3.87448793809741 -2.90282203004097,4.14308863939042 -3.08104907365262,4.4129536910602 -3.26180481801784,4.68383022303141 -3.44458352298589,4.95546536522868 -3.62887944840608,5.22760624757667 -3.81418685412768,5.5 -4.0) + # OGRFeature(entities):49 + # EntityHandle (String) = 1F3 + # LINESTRING (-3.25 -0.5,-3.07367580370539 -0.493674033614862,-2.89709873733542 -0.487853807380434,-2.72001593081474 -0.483045061447428,-2.542174514068 -0.479753535966554,-2.36332161701984 -0.478484971088521,-2.1832043695949 -0.479745106964042,-2.00156990171783 -0.484039683743825,-1.81816534331327 -0.491874441578583,-1.63273782430587 -0.503755120619026,-1.44503447462027 -0.520187461015863,-1.25480242418112 -0.541677202919806,-1.06178880291306 -0.568730086481565,-0.865740740740739 -0.601851851851852,-0.666405367588798 -0.641548239181375,-0.463529813381883 -0.688324988620846,-0.256861208044639 -0.742687840320976,-0.04614668150171 -0.805142534432475,0.168866636322258 -0.876194811106053,0.388431615502622 -0.956350410492422,0.612790589861596 -1.04609400023601,0.841943559399181 -1.14542558033682,1.07564819029316 -1.25386048315042,1.31365161246818 -1.3708929685261,1.55570095584888 -1.49601729631315,1.80154335035992 -1.62872772636086,2.05092592592592 -1.76851851851852,2.30359581247155 -1.91488393263541,2.55930013992144 -2.06731822856083,2.81778603820024 -2.22531566614407,3.07880063723259 -2.38837050523441,3.34209106694314 -2.55597700568115,3.60740445725653 -2.72762942733357,3.87448793809741 -2.90282203004097,4.14308863939042 -3.08104907365262,4.4129536910602 -3.26180481801784,4.68383022303141 -3.44458352298589,4.95546536522868 -3.62887944840608,5.22760624757667 -3.81418685412768,5.5 -4.0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (-3.25 -0.5,-3.07367580370539 -0.493674033614862,-2.89709873733542 -0.487853807380434,-2.72001593081474 -0.483045061447428,-2.542174514068 -0.479753535966554,-2.36332161701984 -0.478484971088521,-2.1832043695949 -0.479745106964042,-2.00156990171783 -0.484039683743825,-1.81816534331327 -0.491874441578583,-1.63273782430587 -0.503755120619026,-1.44503447462027 -0.520187461015863,-1.25480242418112 -0.541677202919806,-1.06178880291306 -0.568730086481565,-0.865740740740739 -0.601851851851852,-0.666405367588798 -0.641548239181375,-0.463529813381883 -0.688324988620846,-0.256861208044639 -0.742687840320976,-0.04614668150171 -0.805142534432475,0.168866636322258 -0.876194811106053,0.388431615502622 -0.956350410492422,0.612790589861596 -1.04609400023601,0.841943559399181 -1.14542558033682,1.07564819029316 -1.25386048315042,1.31365161246818 -1.3708929685261,1.55570095584888 -1.49601729631315,1.80154335035992 -1.62872772636086,2.05092592592592 -1.76851851851852,2.30359581247155 -1.91488393263541,2.55930013992144 -2.06731822856083,2.81778603820024 -2.22531566614407,3.07880063723259 -2.38837050523441,3.34209106694314 -2.55597700568115,3.60740445725653 -2.72762942733357,3.87448793809741 -2.90282203004097,4.14308863939042 -3.08104907365262,4.4129536910602 -3.26180481801784,4.68383022303141 -3.44458352298589,4.95546536522868 -3.62887944840608,5.22760624757667 -3.81418685412768,5.5 -4.0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (-3.25 -0.5,-3.07367580370539 -0.493674033614862,-2.89709873733542 -0.487853807380434,-2.72001593081474 -0.483045061447428,-2.542174514068 -0.479753535966554,-2.36332161701984 -0.478484971088521,-2.1832043695949 -0.479745106964042,-2.00156990171783 -0.484039683743825,-1.81816534331327 -0.491874441578583,-1.63273782430587 -0.503755120619026,-1.44503447462027 -0.520187461015863,-1.25480242418112 -0.541677202919806,-1.06178880291306 -0.568730086481565,-0.865740740740739 -0.601851851851852,-0.666405367588798 -0.641548239181375,-0.463529813381883 -0.688324988620846,-0.256861208044639 -0.742687840320976,-0.04614668150171 -0.805142534432475,0.168866636322258 -0.876194811106053,0.388431615502622 -0.956350410492422,0.612790589861596 -1.04609400023601,0.841943559399181 -1.14542558033682,1.07564819029316 -1.25386048315042,1.31365161246818 -1.3708929685261,1.55570095584888 -1.49601729631315,1.80154335035992 -1.62872772636086,2.05092592592592 -1.76851851851852,2.30359581247155 -1.91488393263541,2.55930013992144 -2.06731822856083,2.81778603820024 -2.22531566614407,3.07880063723259 -2.38837050523441,3.34209106694314 -2.55597700568115,3.60740445725653 -2.72762942733357,3.87448793809741 -2.90282203004097,4.14308863939042 -3.08104907365262,4.4129536910602 -3.26180481801784,4.68383022303141 -3.44458352298589,4.95546536522868 -3.62887944840608,5.22760624757667 -3.81418685412768,5.5 -4.0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):50 -# EntityHandle (String) = 1F4 -# POINT Z (1.75 -3.5 -9.09326673973661) + # OGRFeature(entities):50 + # EntityHandle (String) = 1F4 + # POINT Z (1.75 -3.5 -9.09326673973661) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (1.75 -3.5 -9.09326673973661)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (1.75 -3.5 -9.09326673973661)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):51 -# EntityHandle (String) = 1F5 -# POINT Z (5.5 1.0 -0.866025403784439) + # OGRFeature(entities):51 + # EntityHandle (String) = 1F5 + # POINT Z (5.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (5.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (5.5 1.0 -0.866025403784439)"): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):52 -# EntityHandle (String) = 1F6 -# LINESTRING Z (0 0 0,1.375 0.25 -0.21650635094611) + # OGRFeature(entities):52 + # EntityHandle (String) = 1F6 + # LINESTRING Z (0 0 0,1.375 0.25 -0.21650635094611) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (0 0 0,1.375 0.25 -0.21650635094611)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (0 0 0,1.375 0.25 -0.21650635094611)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):53 -# EntityHandle (String) = 1F7 -# LINESTRING Z (1.375 0.25 -0.21650635094611,2.0 1.0 -9.68245836551854e-17,2.125 -0.25 -0.649519052838329,1.375 0.25 -0.21650635094611) + # OGRFeature(entities):53 + # EntityHandle (String) = 1F7 + # LINESTRING Z (1.375 0.25 -0.21650635094611,2.0 1.0 -9.68245836551854e-17,2.125 -0.25 -0.649519052838329,1.375 0.25 -0.21650635094611) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1.375 0.25 -0.21650635094611,2.0 1.0 -9.68245836551854e-17,2.125 -0.25 -0.649519052838329,1.375 0.25 -0.21650635094611)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (1.375 0.25 -0.21650635094611,2.0 1.0 -9.68245836551854e-17,2.125 -0.25 -0.649519052838329,1.375 0.25 -0.21650635094611)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):54 -# EntityHandle (String) = 1F8 -# LINESTRING Z (1.375 0.25 -0.21650635094611,2.125 -0.25 -0.649519052838329,2.75 0.5 -0.43301270189222,1.375 0.25 -0.21650635094611) + # OGRFeature(entities):54 + # EntityHandle (String) = 1F8 + # LINESTRING Z (1.375 0.25 -0.21650635094611,2.125 -0.25 -0.649519052838329,2.75 0.5 -0.43301270189222,1.375 0.25 -0.21650635094611) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (1.375 0.25 -0.21650635094611,2.125 -0.25 -0.649519052838329,2.75 0.5 -0.43301270189222,1.375 0.25 -0.21650635094611)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (1.375 0.25 -0.21650635094611,2.125 -0.25 -0.649519052838329,2.75 0.5 -0.43301270189222,1.375 0.25 -0.21650635094611)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):55 -# EntityHandle (String) = 1FD -# LINESTRING Z (3.71114561800017 0.105572809000085 -0.866025403784439,3.77009625337411 -0.001434563330173 -0.933566819059727,3.83747480591229 -0.103563047131737 -1.00077917934903,3.91295301407961 -0.200315082697444 -1.06733503278919,3.99616315563294 -0.2912193038355 -1.13291012595241,4.08669983912687 -0.37583283431818 -1.19718498357639,4.18412197894014 -0.453743445530294 -1.25984646501566,4.28795494420042 -0.524571564805566 -1.32058928983137,4.39769287113821 -0.587972124666501 -1.37911752508686,4.51280112760429 -0.643636243958462 -1.43514602710321,4.6327189177438 -0.691292732687594 -1.48840183065055,4.75686201413727 -0.730709413231224 -1.53862547880726,4.88462560409789 -0.761694251483893 -1.58557228700798,5.01538723625813 -0.784096292428219 -1.62901353512224,5.14850985309022 -0.797806395572568 -1.66873758175591,5.28334489458639 -0.802757766672552 -1.70455089534686,5.41923545797803 -0.798926283145887 -1.7362789970312,5.55551949809999 -0.786330611595171 -1.76376731068683,5.691533052808 -0.76503211686609 -1.78688191601273,5.82661347773556 -0.735134563084044 -1.80551020097523,5.96010267463067 -0.69678360812577 -1.8195614104425,6.09135029754434 -0.650166093988798 -1.82896708833443,6.2197169212507 -0.595509136516029 -1.83368141113379,6.34457715646241 -0.533079018910172 -1.83368141113379,6.46532269666444 -0.463179894428748 -1.82896708833443,6.58136528172222 -0.386152304579996 -1.8195614104425,6.69213956382591 -0.302371520038872 -1.80551020097523,6.79710586180808 -0.212245712366048 -1.78688191601273,6.89575279041615 -0.116213965437088 -1.76376731068683,6.9875997517299 -0.014744136269953 -1.7362789970312,7.07219927658622 0.091669424327363 -1.70455089534686,7.14913920460393 0.202508280184287 -1.66873758175591,7.2180446921877 0.317232435536567 -1.62901353512224,7.27858003872839 0.435282965831356 -1.58557228700798,7.33045032210263 0.556084740751457 -1.53862547880726,7.37340283550381 0.679049226192411 -1.48840183065055,7.4072283186042 0.803577351541497 -1.43514602710321,7.43176197705028 0.929062428289537 -1.37911752508686,7.44688428532421 1.05489310575633 -1.32058928983137,7.45252156906016 1.18045634952971 -1.25984646501566,7.44864636397843 1.3051404281076 -1.19718498357639,7.43527754968864 1.42833789319235 -1.13291012595241,7.41248025771019 1.54944853911785 -1.06733503278919,7.38036555415802 1.66788232699113 -1.00077917934903,7.33908989863968 1.78306225930261 -0.933566819059728,7.28885438199984 1.89442719099992 -0.86602540378444, -# 7.2299037466259 2.00143456333018 -0.798483988509152,7.16252519408772 2.10356304713174 -0.731271628219845,7.08704698592039 2.20031508269745 -0.664715774779688,7.00383684436707 2.2912193038355 -0.599140681616468,6.91330016087314 2.37583283431818 -0.534865823992492,6.81587802105987 2.4537434455303 -0.472204342553219,6.71204505579959 2.52457156480557 -0.411461517737508,6.6023071288618 2.5879721246665 -0.352933282482017,6.48719887239572 2.64363624395846 -0.296904780465671,6.36728108225621 2.6912927326876 -0.24364897691833,6.24313798586274 2.73070941323123 -0.19342532876162,6.11537439590212 2.7616942514839 -0.146478520560899,5.98461276374187 2.78409629242822 -0.103037272446642,5.85149014690979 2.79780639557257 -0.0633132258129652,5.71665510541362 2.80275776667256 -0.0274999122220189,5.58076454202198 2.79892628314589 0.00422818946232298,5.44448050190002 2.78633061159517 0.0317165031179519,5.30846694719201 2.76503211686609 0.0548311084438533,5.17338652226444 2.73513456308405 0.0734593934063514,5.03989732536933 2.69678360812577 0.0875106028736174,4.90864970245567 2.6501660939888 0.0969162807655497,4.78028307874931 2.59550913651603 0.101630603564914,4.6554228435376 2.53307901891017 0.101630603564914,4.53467730333557 2.46317989442875 0.0969162807655497,4.41863471827779 2.38615230458 0.0875106028736175,4.3078604361741 2.30237152003888 0.0734593934063515,4.20289413819193 2.21224571236605 0.0548311084438534,4.10424720958385 2.11621396543709 0.031716503117952,4.01240024827011 2.01474413626996 0.00422818946232319,3.92780072341379 1.90833057567264 -0.0274999122220187,3.85086079539608 1.79749171981572 -0.0633132258129645,3.7819553078123 1.68276756446344 -0.103037272446642,3.72141996127162 1.56471703416865 -0.146478520560898,3.66954967789738 1.44391525924855 -0.19342532876162,3.6265971644962 1.32095077380759 -0.243648976918329,3.5927716813958 1.19642264845851 -0.296904780465671,3.56823802294973 1.07093757171047 -0.352933282482016,3.5531157146758 0.945106894243672 -0.411461517737508,3.54747843093985 0.819543650470287 -0.472204342553219,3.55135363602158 0.694859571892403 -0.534865823992493,3.56472245031136 0.571662106807651 -0.599140681616467,3.58751974228981 0.450551460882157 -0.664715774779687,3.61963444584198 0.332117673008871 -0.731271628219845,3.66091010136033 0.216937740697387 -0.798483988509152,3.71114561800017 0.105572809000085 -0.866025403784439) + # OGRFeature(entities):55 + # EntityHandle (String) = 1FD + # LINESTRING Z (3.71114561800017 0.105572809000085 -0.866025403784439,3.77009625337411 -0.001434563330173 -0.933566819059727,3.83747480591229 -0.103563047131737 -1.00077917934903,3.91295301407961 -0.200315082697444 -1.06733503278919,3.99616315563294 -0.2912193038355 -1.13291012595241,4.08669983912687 -0.37583283431818 -1.19718498357639,4.18412197894014 -0.453743445530294 -1.25984646501566,4.28795494420042 -0.524571564805566 -1.32058928983137,4.39769287113821 -0.587972124666501 -1.37911752508686,4.51280112760429 -0.643636243958462 -1.43514602710321,4.6327189177438 -0.691292732687594 -1.48840183065055,4.75686201413727 -0.730709413231224 -1.53862547880726,4.88462560409789 -0.761694251483893 -1.58557228700798,5.01538723625813 -0.784096292428219 -1.62901353512224,5.14850985309022 -0.797806395572568 -1.66873758175591,5.28334489458639 -0.802757766672552 -1.70455089534686,5.41923545797803 -0.798926283145887 -1.7362789970312,5.55551949809999 -0.786330611595171 -1.76376731068683,5.691533052808 -0.76503211686609 -1.78688191601273,5.82661347773556 -0.735134563084044 -1.80551020097523,5.96010267463067 -0.69678360812577 -1.8195614104425,6.09135029754434 -0.650166093988798 -1.82896708833443,6.2197169212507 -0.595509136516029 -1.83368141113379,6.34457715646241 -0.533079018910172 -1.83368141113379,6.46532269666444 -0.463179894428748 -1.82896708833443,6.58136528172222 -0.386152304579996 -1.8195614104425,6.69213956382591 -0.302371520038872 -1.80551020097523,6.79710586180808 -0.212245712366048 -1.78688191601273,6.89575279041615 -0.116213965437088 -1.76376731068683,6.9875997517299 -0.014744136269953 -1.7362789970312,7.07219927658622 0.091669424327363 -1.70455089534686,7.14913920460393 0.202508280184287 -1.66873758175591,7.2180446921877 0.317232435536567 -1.62901353512224,7.27858003872839 0.435282965831356 -1.58557228700798,7.33045032210263 0.556084740751457 -1.53862547880726,7.37340283550381 0.679049226192411 -1.48840183065055,7.4072283186042 0.803577351541497 -1.43514602710321,7.43176197705028 0.929062428289537 -1.37911752508686,7.44688428532421 1.05489310575633 -1.32058928983137,7.45252156906016 1.18045634952971 -1.25984646501566,7.44864636397843 1.3051404281076 -1.19718498357639,7.43527754968864 1.42833789319235 -1.13291012595241,7.41248025771019 1.54944853911785 -1.06733503278919,7.38036555415802 1.66788232699113 -1.00077917934903,7.33908989863968 1.78306225930261 -0.933566819059728,7.28885438199984 1.89442719099992 -0.86602540378444, + # 7.2299037466259 2.00143456333018 -0.798483988509152,7.16252519408772 2.10356304713174 -0.731271628219845,7.08704698592039 2.20031508269745 -0.664715774779688,7.00383684436707 2.2912193038355 -0.599140681616468,6.91330016087314 2.37583283431818 -0.534865823992492,6.81587802105987 2.4537434455303 -0.472204342553219,6.71204505579959 2.52457156480557 -0.411461517737508,6.6023071288618 2.5879721246665 -0.352933282482017,6.48719887239572 2.64363624395846 -0.296904780465671,6.36728108225621 2.6912927326876 -0.24364897691833,6.24313798586274 2.73070941323123 -0.19342532876162,6.11537439590212 2.7616942514839 -0.146478520560899,5.98461276374187 2.78409629242822 -0.103037272446642,5.85149014690979 2.79780639557257 -0.0633132258129652,5.71665510541362 2.80275776667256 -0.0274999122220189,5.58076454202198 2.79892628314589 0.00422818946232298,5.44448050190002 2.78633061159517 0.0317165031179519,5.30846694719201 2.76503211686609 0.0548311084438533,5.17338652226444 2.73513456308405 0.0734593934063514,5.03989732536933 2.69678360812577 0.0875106028736174,4.90864970245567 2.6501660939888 0.0969162807655497,4.78028307874931 2.59550913651603 0.101630603564914,4.6554228435376 2.53307901891017 0.101630603564914,4.53467730333557 2.46317989442875 0.0969162807655497,4.41863471827779 2.38615230458 0.0875106028736175,4.3078604361741 2.30237152003888 0.0734593934063515,4.20289413819193 2.21224571236605 0.0548311084438534,4.10424720958385 2.11621396543709 0.031716503117952,4.01240024827011 2.01474413626996 0.00422818946232319,3.92780072341379 1.90833057567264 -0.0274999122220187,3.85086079539608 1.79749171981572 -0.0633132258129645,3.7819553078123 1.68276756446344 -0.103037272446642,3.72141996127162 1.56471703416865 -0.146478520560898,3.66954967789738 1.44391525924855 -0.19342532876162,3.6265971644962 1.32095077380759 -0.243648976918329,3.5927716813958 1.19642264845851 -0.296904780465671,3.56823802294973 1.07093757171047 -0.352933282482016,3.5531157146758 0.945106894243672 -0.411461517737508,3.54747843093985 0.819543650470287 -0.472204342553219,3.55135363602158 0.694859571892403 -0.534865823992493,3.56472245031136 0.571662106807651 -0.599140681616467,3.58751974228981 0.450551460882157 -0.664715774779687,3.61963444584198 0.332117673008871 -0.731271628219845,3.66091010136033 0.216937740697387 -0.798483988509152,3.71114561800017 0.105572809000085 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (3.71114561800017 0.105572809000085 -0.866025403784439,3.77009625337411 -0.001434563330173 -0.933566819059727,3.83747480591229 -0.103563047131737 -1.00077917934903,3.91295301407961 -0.200315082697444 -1.06733503278919,3.99616315563294 -0.2912193038355 -1.13291012595241,4.08669983912687 -0.37583283431818 -1.19718498357639,4.18412197894014 -0.453743445530294 -1.25984646501566,4.28795494420042 -0.524571564805566 -1.32058928983137,4.39769287113821 -0.587972124666501 -1.37911752508686,4.51280112760429 -0.643636243958462 -1.43514602710321,4.6327189177438 -0.691292732687594 -1.48840183065055,4.75686201413727 -0.730709413231224 -1.53862547880726,4.88462560409789 -0.761694251483893 -1.58557228700798,5.01538723625813 -0.784096292428219 -1.62901353512224,5.14850985309022 -0.797806395572568 -1.66873758175591,5.28334489458639 -0.802757766672552 -1.70455089534686,5.41923545797803 -0.798926283145887 -1.7362789970312,5.55551949809999 -0.786330611595171 -1.76376731068683,5.691533052808 -0.76503211686609 -1.78688191601273,5.82661347773556 -0.735134563084044 -1.80551020097523,5.96010267463067 -0.69678360812577 -1.8195614104425,6.09135029754434 -0.650166093988798 -1.82896708833443,6.2197169212507 -0.595509136516029 -1.83368141113379,6.34457715646241 -0.533079018910172 -1.83368141113379,6.46532269666444 -0.463179894428748 -1.82896708833443,6.58136528172222 -0.386152304579996 -1.8195614104425,6.69213956382591 -0.302371520038872 -1.80551020097523,6.79710586180808 -0.212245712366048 -1.78688191601273,6.89575279041615 -0.116213965437088 -1.76376731068683,6.9875997517299 -0.014744136269953 -1.7362789970312,7.07219927658622 0.091669424327363 -1.70455089534686,7.14913920460393 0.202508280184287 -1.66873758175591,7.2180446921877 0.317232435536567 -1.62901353512224,7.27858003872839 0.435282965831356 -1.58557228700798,7.33045032210263 0.556084740751457 -1.53862547880726,7.37340283550381 0.679049226192411 -1.48840183065055,7.4072283186042 0.803577351541497 -1.43514602710321,7.43176197705028 0.929062428289537 -1.37911752508686,7.44688428532421 1.05489310575633 -1.32058928983137,7.45252156906016 1.18045634952971 -1.25984646501566,7.44864636397843 1.3051404281076 -1.19718498357639,7.43527754968864 1.42833789319235 -1.13291012595241,7.41248025771019 1.54944853911785 -1.06733503278919,7.38036555415802 1.66788232699113 -1.00077917934903,7.33908989863968 1.78306225930261 -0.933566819059728,7.28885438199984 1.89442719099992 -0.86602540378444,7.2299037466259 2.00143456333018 -0.798483988509152,7.16252519408772 2.10356304713174 -0.731271628219845,7.08704698592039 2.20031508269745 -0.664715774779688,' + - '7.00383684436707 2.2912193038355 -0.599140681616468,6.91330016087314 2.37583283431818 -0.534865823992492,6.81587802105987 2.4537434455303 -0.472204342553219,6.71204505579959 2.52457156480557 -0.411461517737508,6.6023071288618 2.5879721246665 -0.352933282482017,6.48719887239572 2.64363624395846 -0.296904780465671,6.36728108225621 2.6912927326876 -0.24364897691833,6.24313798586274 2.73070941323123 -0.19342532876162,6.11537439590212 2.7616942514839 -0.146478520560899,5.98461276374187 2.78409629242822 -0.103037272446642,5.85149014690979 2.79780639557257 -0.0633132258129652,5.71665510541362 2.80275776667256 -0.0274999122220189,5.58076454202198 2.79892628314589 0.00422818946232298,5.44448050190002 2.78633061159517 0.0317165031179519,5.30846694719201 2.76503211686609 0.0548311084438533,5.17338652226444 2.73513456308405 0.0734593934063514,5.03989732536933 2.69678360812577 0.0875106028736174,4.90864970245567 2.6501660939888 0.0969162807655497,4.78028307874931 2.59550913651603 0.101630603564914,4.6554228435376 2.53307901891017 0.101630603564914,4.53467730333557 2.46317989442875 0.0969162807655497,4.41863471827779 2.38615230458 0.0875106028736175,4.3078604361741 2.30237152003888 0.0734593934063515,4.20289413819193 2.21224571236605 0.0548311084438534,4.10424720958385 2.11621396543709 0.031716503117952,4.01240024827011 2.01474413626996 0.00422818946232319,3.92780072341379 1.90833057567264 -0.0274999122220187,3.85086079539608 1.79749171981572 -0.0633132258129645,3.7819553078123 1.68276756446344 -0.103037272446642,3.72141996127162 1.56471703416865 -0.146478520560898,3.66954967789738 1.44391525924855 -0.19342532876162,3.6265971644962 1.32095077380759 -0.243648976918329,3.5927716813958 1.19642264845851 -0.296904780465671,3.56823802294973 1.07093757171047 -0.352933282482016,3.5531157146758 0.945106894243672 -0.411461517737508,3.54747843093985 0.819543650470287 -0.472204342553219,3.55135363602158 0.694859571892403 -0.534865823992493,3.56472245031136 0.571662106807651 -0.599140681616467,3.58751974228981 0.450551460882157 -0.664715774779687,3.61963444584198 0.332117673008871 -0.731271628219845,3.66091010136033 0.216937740697387 -0.798483988509152,3.71114561800017 0.105572809000085 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (3.71114561800017 0.105572809000085 -0.866025403784439,3.77009625337411 -0.001434563330173 -0.933566819059727,3.83747480591229 -0.103563047131737 -1.00077917934903,3.91295301407961 -0.200315082697444 -1.06733503278919,3.99616315563294 -0.2912193038355 -1.13291012595241,4.08669983912687 -0.37583283431818 -1.19718498357639,4.18412197894014 -0.453743445530294 -1.25984646501566,4.28795494420042 -0.524571564805566 -1.32058928983137,4.39769287113821 -0.587972124666501 -1.37911752508686,4.51280112760429 -0.643636243958462 -1.43514602710321,4.6327189177438 -0.691292732687594 -1.48840183065055,4.75686201413727 -0.730709413231224 -1.53862547880726,4.88462560409789 -0.761694251483893 -1.58557228700798,5.01538723625813 -0.784096292428219 -1.62901353512224,5.14850985309022 -0.797806395572568 -1.66873758175591,5.28334489458639 -0.802757766672552 -1.70455089534686,5.41923545797803 -0.798926283145887 -1.7362789970312,5.55551949809999 -0.786330611595171 -1.76376731068683,5.691533052808 -0.76503211686609 -1.78688191601273,5.82661347773556 -0.735134563084044 -1.80551020097523,5.96010267463067 -0.69678360812577 -1.8195614104425,6.09135029754434 -0.650166093988798 -1.82896708833443,6.2197169212507 -0.595509136516029 -1.83368141113379,6.34457715646241 -0.533079018910172 -1.83368141113379,6.46532269666444 -0.463179894428748 -1.82896708833443,6.58136528172222 -0.386152304579996 -1.8195614104425,6.69213956382591 -0.302371520038872 -1.80551020097523,6.79710586180808 -0.212245712366048 -1.78688191601273,6.89575279041615 -0.116213965437088 -1.76376731068683,6.9875997517299 -0.014744136269953 -1.7362789970312,7.07219927658622 0.091669424327363 -1.70455089534686,7.14913920460393 0.202508280184287 -1.66873758175591,7.2180446921877 0.317232435536567 -1.62901353512224,7.27858003872839 0.435282965831356 -1.58557228700798,7.33045032210263 0.556084740751457 -1.53862547880726,7.37340283550381 0.679049226192411 -1.48840183065055,7.4072283186042 0.803577351541497 -1.43514602710321,7.43176197705028 0.929062428289537 -1.37911752508686,7.44688428532421 1.05489310575633 -1.32058928983137,7.45252156906016 1.18045634952971 -1.25984646501566,7.44864636397843 1.3051404281076 -1.19718498357639,7.43527754968864 1.42833789319235 -1.13291012595241,7.41248025771019 1.54944853911785 -1.06733503278919,7.38036555415802 1.66788232699113 -1.00077917934903,7.33908989863968 1.78306225930261 -0.933566819059728,7.28885438199984 1.89442719099992 -0.86602540378444,7.2299037466259 2.00143456333018 -0.798483988509152,7.16252519408772 2.10356304713174 -0.731271628219845,7.08704698592039 2.20031508269745 -0.664715774779688," + + "7.00383684436707 2.2912193038355 -0.599140681616468,6.91330016087314 2.37583283431818 -0.534865823992492,6.81587802105987 2.4537434455303 -0.472204342553219,6.71204505579959 2.52457156480557 -0.411461517737508,6.6023071288618 2.5879721246665 -0.352933282482017,6.48719887239572 2.64363624395846 -0.296904780465671,6.36728108225621 2.6912927326876 -0.24364897691833,6.24313798586274 2.73070941323123 -0.19342532876162,6.11537439590212 2.7616942514839 -0.146478520560899,5.98461276374187 2.78409629242822 -0.103037272446642,5.85149014690979 2.79780639557257 -0.0633132258129652,5.71665510541362 2.80275776667256 -0.0274999122220189,5.58076454202198 2.79892628314589 0.00422818946232298,5.44448050190002 2.78633061159517 0.0317165031179519,5.30846694719201 2.76503211686609 0.0548311084438533,5.17338652226444 2.73513456308405 0.0734593934063514,5.03989732536933 2.69678360812577 0.0875106028736174,4.90864970245567 2.6501660939888 0.0969162807655497,4.78028307874931 2.59550913651603 0.101630603564914,4.6554228435376 2.53307901891017 0.101630603564914,4.53467730333557 2.46317989442875 0.0969162807655497,4.41863471827779 2.38615230458 0.0875106028736175,4.3078604361741 2.30237152003888 0.0734593934063515,4.20289413819193 2.21224571236605 0.0548311084438534,4.10424720958385 2.11621396543709 0.031716503117952,4.01240024827011 2.01474413626996 0.00422818946232319,3.92780072341379 1.90833057567264 -0.0274999122220187,3.85086079539608 1.79749171981572 -0.0633132258129645,3.7819553078123 1.68276756446344 -0.103037272446642,3.72141996127162 1.56471703416865 -0.146478520560898,3.66954967789738 1.44391525924855 -0.19342532876162,3.6265971644962 1.32095077380759 -0.243648976918329,3.5927716813958 1.19642264845851 -0.296904780465671,3.56823802294973 1.07093757171047 -0.352933282482016,3.5531157146758 0.945106894243672 -0.411461517737508,3.54747843093985 0.819543650470287 -0.472204342553219,3.55135363602158 0.694859571892403 -0.534865823992493,3.56472245031136 0.571662106807651 -0.599140681616467,3.58751974228981 0.450551460882157 -0.664715774779687,3.61963444584198 0.332117673008871 -0.731271628219845,3.66091010136033 0.216937740697387 -0.798483988509152,3.71114561800017 0.105572809000085 -0.866025403784439)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):56 -# EntityHandle (String) = 1FE -# LINESTRING Z (4.25 -0.5 -1.29903810567666,5.5 1.0 -0.866025403784439) + # OGRFeature(entities):56 + # EntityHandle (String) = 1FE + # LINESTRING Z (4.25 -0.5 -1.29903810567666,5.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4.25 -0.5 -1.29903810567666,5.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (4.25 -0.5 -1.29903810567666,5.5 1.0 -0.866025403784439)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):57 -# EntityHandle (String) = 1FF -# LINESTRING Z (5.5 1.0 -0.866025403784439,6.75 2.5 -0.43301270189222) + # OGRFeature(entities):57 + # EntityHandle (String) = 1FF + # LINESTRING Z (5.5 1.0 -0.866025403784439,6.75 2.5 -0.43301270189222) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (5.5 1.0 -0.866025403784439,6.75 2.5 -0.43301270189222)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (5.5 1.0 -0.866025403784439,6.75 2.5 -0.43301270189222)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):58 -# EntityHandle (String) = 200 -# LINESTRING Z (4.75 1.5 -0.43301270189222,5.5 1.0 -0.866025403784439) + # OGRFeature(entities):58 + # EntityHandle (String) = 200 + # LINESTRING Z (4.75 1.5 -0.43301270189222,5.5 1.0 -0.866025403784439) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4.75 1.5 -0.43301270189222,5.5 1.0 -0.866025403784439)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (4.75 1.5 -0.43301270189222,5.5 1.0 -0.866025403784439)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):59 -# EntityHandle (String) = 201 -# LINESTRING Z (5.5 1.0 -0.866025403784439,6.25 0.5 -1.29903810567666) + # OGRFeature(entities):59 + # EntityHandle (String) = 201 + # LINESTRING Z (5.5 1.0 -0.866025403784439,6.25 0.5 -1.29903810567666) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (5.5 1.0 -0.866025403784439,6.25 0.5 -1.29903810567666)'): + if ogrtest.check_feature_geometry( + feat, "LINESTRING Z (5.5 1.0 -0.866025403784439,6.25 0.5 -1.29903810567666)" + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):60 -# EntityHandle (String) = 202 -# LINESTRING Z (4.25 -0.5 -1.29903810567666,4.30536229248331 -0.531224312261799 -1.32818874766841,4.36654473979309 -0.554988653592388 -1.35508777630525,4.43324926719606 -0.571177246509588 -1.37960414222355,4.50515089693985 -0.579711221815978 -1.40161840415293,4.58189933151187 -0.580549002841697 -1.42102331082214,4.6631206602536 -0.573686508001801 -1.43772432347645,4.74841918101576 -0.559157170681335 -1.451640076461,4.83737932797937 -0.53703177635124 -1.46270277362604,4.92956769625067 -0.507418117708657 -1.47085851862302,5.02453515336618 -0.470460469521736 -1.47606757748212,5.12181902742094 -0.426338885737475 -1.47830457219218,5.22094536115948 -0.375268322276984 -1.47755860433986,5.32143122104797 -0.317497589791849 -1.47383330820552,5.42278705007785 -0.253308141483641 -1.46714683305749,5.52451905283833 -0.183012701892219 -1.45753175473055,5.62613160123803 -0.106953743333199 -1.44503491691981,5.7271296491552 -0.025501817407262 -1.42971720296291,5.82702114425268 0.060946250290002 -1.41165323922251,5.92531942520741 0.151969293462501 -1.39093103151418,6.02154559267549 0.247123856993501 -1.36765153635088,6.11523084244164 0.345946357414384 -1.34192816909299,6.2059187493862 0.4479553414367 -1.31388625140011,6.29316749114245 0.552653831544204 -1.28366240067645,6.37655200061077 0.659531747217344 -1.25140386448466,6.45566603684282 0.768068389994292 -1.21726780317044,6.53012416420658 0.877734980261504 -1.18142052419318,6.59956363019005 0.987997233414845 -1.1440366718927,6.66364613269498 1.09831796284048 -1.10529837663958,6.72205946821072 1.20815969703403 -1.06539436751435,6.77451905283833 1.31698729810778 -1.02451905283833,6.82076930875472 1.4242705689286 -0.982871573035841,6.86058490936212 1.52948683618513 -0.940654830442097,6.89377187705662 1.63212349679959 -0.898074500783399,6.92016852826756 1.73168051527848 -0.855338031145687,6.93964626116363 1.8276728598352 -0.81265362931318,6.95211018218804 1.91963286541618 -0.770229249400985,6.95749956837044 2.00711251211804 -0.72827157872355,6.95578816316308 2.08968560789544 -0.686985030834846,6.9469843043601 2.166949864926 -0.646570749646076,6.93113088347664 2.23852885951603 -0.607225629472764,6.90830513678565 2.30407386599898 -0.569141355785437,6.87861826903058 2.36326555569183 -0.53250347133728,6.84221491164701 2.41581555263232 -0.497490472218499,6.79927241813288 2.46146783851767 -0.464272938241304,6.75 2.5 -0.43301270189222,6.69463770751669 2.5312243122618 -0.40386205990047,6.63345526020692 2.55498865359239 -0.376963031263626, -# 6.56675073280394 2.57117724650959 -0.352446665345325,6.49484910306015 2.57971122181598 -0.330432403415945,6.41810066848813 2.5805490028417 -0.311027496746741,6.3368793397464 2.5736865080018 -0.294326484092429,6.25158081898424 2.55915717068134 -0.280410731107883,6.16262067202063 2.53703177635124 -0.269348033942836,6.07043230374933 2.50741811770866 -0.261192288945857,5.97546484663382 2.47046046952174 -0.255983230086761,5.87818097257907 2.42633888573748 -0.253746235376694,5.77905463884053 2.37526832227698 -0.254492203229023,5.67856877895203 2.31749758979185 -0.258217499363356,5.57721294992215 2.25330814148364 -0.264903974511391,5.47548094716167 2.18301270189222 -0.27451905283833,5.37386839876197 2.1069537433332 -0.287015890649068,5.2728703508448 2.02550181740726 -0.302333604605968,5.17297885574732 1.93905374971 -0.320397568346365,5.07468057479259 1.8480307065375 -0.341119776054697,4.97845440732451 1.7528761430065 -0.364399271218,4.88476915755836 1.65405364258562 -0.390122638475884,4.79408125061381 1.5520446585633 -0.418164556168773,4.70683250885755 1.4473461684558 -0.44838840689243,4.62344799938923 1.34046825278266 -0.48064694308422,4.54433396315718 1.23193161000571 -0.514783004398435,4.46987583579342 1.1222650197385 -0.550630283375696,4.40043636980995 1.01200276658516 -0.588014135676182,4.33635386730502 0.901682037159526 -0.626752430929296,4.27794053178928 0.791840302965968 -0.666656440054525,4.22548094716167 0.68301270189222 -0.707531754730549,4.17923069124529 0.575729431071401 -0.749179234533037,4.13941509063789 0.470513163814874 -0.791395977126782,4.10622812294338 0.36787650320041 -0.833976306785479,4.07983147173244 0.268319484721523 -0.876712776423191,4.06035373883638 0.172327140164803 -0.919397178255699,4.04788981781196 0.080367134583816 -0.961821558167894,4.04250043162957 -0.007112512118036 -1.00377922884533,4.04421183683692 -0.089685607895445 -1.04506577673403,4.0530156956399 -0.166949864926001 -1.0854800579228,4.06886911652336 -0.238528859516028 -1.12482517809611,4.09169486321435 -0.304073865998978 -1.16290945178344,4.12138173096942 -0.363265555691829 -1.1995473362316,4.15778508835299 -0.415815552632322 -1.23456033535038,4.20072758186713 -0.461467838517673 -1.26777786932757,4.25 -0.5 -1.29903810567666) + # OGRFeature(entities):60 + # EntityHandle (String) = 202 + # LINESTRING Z (4.25 -0.5 -1.29903810567666,4.30536229248331 -0.531224312261799 -1.32818874766841,4.36654473979309 -0.554988653592388 -1.35508777630525,4.43324926719606 -0.571177246509588 -1.37960414222355,4.50515089693985 -0.579711221815978 -1.40161840415293,4.58189933151187 -0.580549002841697 -1.42102331082214,4.6631206602536 -0.573686508001801 -1.43772432347645,4.74841918101576 -0.559157170681335 -1.451640076461,4.83737932797937 -0.53703177635124 -1.46270277362604,4.92956769625067 -0.507418117708657 -1.47085851862302,5.02453515336618 -0.470460469521736 -1.47606757748212,5.12181902742094 -0.426338885737475 -1.47830457219218,5.22094536115948 -0.375268322276984 -1.47755860433986,5.32143122104797 -0.317497589791849 -1.47383330820552,5.42278705007785 -0.253308141483641 -1.46714683305749,5.52451905283833 -0.183012701892219 -1.45753175473055,5.62613160123803 -0.106953743333199 -1.44503491691981,5.7271296491552 -0.025501817407262 -1.42971720296291,5.82702114425268 0.060946250290002 -1.41165323922251,5.92531942520741 0.151969293462501 -1.39093103151418,6.02154559267549 0.247123856993501 -1.36765153635088,6.11523084244164 0.345946357414384 -1.34192816909299,6.2059187493862 0.4479553414367 -1.31388625140011,6.29316749114245 0.552653831544204 -1.28366240067645,6.37655200061077 0.659531747217344 -1.25140386448466,6.45566603684282 0.768068389994292 -1.21726780317044,6.53012416420658 0.877734980261504 -1.18142052419318,6.59956363019005 0.987997233414845 -1.1440366718927,6.66364613269498 1.09831796284048 -1.10529837663958,6.72205946821072 1.20815969703403 -1.06539436751435,6.77451905283833 1.31698729810778 -1.02451905283833,6.82076930875472 1.4242705689286 -0.982871573035841,6.86058490936212 1.52948683618513 -0.940654830442097,6.89377187705662 1.63212349679959 -0.898074500783399,6.92016852826756 1.73168051527848 -0.855338031145687,6.93964626116363 1.8276728598352 -0.81265362931318,6.95211018218804 1.91963286541618 -0.770229249400985,6.95749956837044 2.00711251211804 -0.72827157872355,6.95578816316308 2.08968560789544 -0.686985030834846,6.9469843043601 2.166949864926 -0.646570749646076,6.93113088347664 2.23852885951603 -0.607225629472764,6.90830513678565 2.30407386599898 -0.569141355785437,6.87861826903058 2.36326555569183 -0.53250347133728,6.84221491164701 2.41581555263232 -0.497490472218499,6.79927241813288 2.46146783851767 -0.464272938241304,6.75 2.5 -0.43301270189222,6.69463770751669 2.5312243122618 -0.40386205990047,6.63345526020692 2.55498865359239 -0.376963031263626, + # 6.56675073280394 2.57117724650959 -0.352446665345325,6.49484910306015 2.57971122181598 -0.330432403415945,6.41810066848813 2.5805490028417 -0.311027496746741,6.3368793397464 2.5736865080018 -0.294326484092429,6.25158081898424 2.55915717068134 -0.280410731107883,6.16262067202063 2.53703177635124 -0.269348033942836,6.07043230374933 2.50741811770866 -0.261192288945857,5.97546484663382 2.47046046952174 -0.255983230086761,5.87818097257907 2.42633888573748 -0.253746235376694,5.77905463884053 2.37526832227698 -0.254492203229023,5.67856877895203 2.31749758979185 -0.258217499363356,5.57721294992215 2.25330814148364 -0.264903974511391,5.47548094716167 2.18301270189222 -0.27451905283833,5.37386839876197 2.1069537433332 -0.287015890649068,5.2728703508448 2.02550181740726 -0.302333604605968,5.17297885574732 1.93905374971 -0.320397568346365,5.07468057479259 1.8480307065375 -0.341119776054697,4.97845440732451 1.7528761430065 -0.364399271218,4.88476915755836 1.65405364258562 -0.390122638475884,4.79408125061381 1.5520446585633 -0.418164556168773,4.70683250885755 1.4473461684558 -0.44838840689243,4.62344799938923 1.34046825278266 -0.48064694308422,4.54433396315718 1.23193161000571 -0.514783004398435,4.46987583579342 1.1222650197385 -0.550630283375696,4.40043636980995 1.01200276658516 -0.588014135676182,4.33635386730502 0.901682037159526 -0.626752430929296,4.27794053178928 0.791840302965968 -0.666656440054525,4.22548094716167 0.68301270189222 -0.707531754730549,4.17923069124529 0.575729431071401 -0.749179234533037,4.13941509063789 0.470513163814874 -0.791395977126782,4.10622812294338 0.36787650320041 -0.833976306785479,4.07983147173244 0.268319484721523 -0.876712776423191,4.06035373883638 0.172327140164803 -0.919397178255699,4.04788981781196 0.080367134583816 -0.961821558167894,4.04250043162957 -0.007112512118036 -1.00377922884533,4.04421183683692 -0.089685607895445 -1.04506577673403,4.0530156956399 -0.166949864926001 -1.0854800579228,4.06886911652336 -0.238528859516028 -1.12482517809611,4.09169486321435 -0.304073865998978 -1.16290945178344,4.12138173096942 -0.363265555691829 -1.1995473362316,4.15778508835299 -0.415815552632322 -1.23456033535038,4.20072758186713 -0.461467838517673 -1.26777786932757,4.25 -0.5 -1.29903810567666) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (4.25 -0.5 -1.29903810567666,4.30536229248331 -0.531224312261799 -1.32818874766841,4.36654473979309 -0.554988653592388 -1.35508777630525,4.43324926719606 -0.571177246509588 -1.37960414222355,4.50515089693985 -0.579711221815978 -1.40161840415293,4.58189933151187 -0.580549002841697 -1.42102331082214,4.6631206602536 -0.573686508001801 -1.43772432347645,4.74841918101576 -0.559157170681335 -1.451640076461,4.83737932797937 -0.53703177635124 -1.46270277362604,4.92956769625067 -0.507418117708657 -1.47085851862302,5.02453515336618 -0.470460469521736 -1.47606757748212,5.12181902742094 -0.426338885737475 -1.47830457219218,5.22094536115948 -0.375268322276984 -1.47755860433986,5.32143122104797 -0.317497589791849 -1.47383330820552,5.42278705007785 -0.253308141483641 -1.46714683305749,5.52451905283833 -0.183012701892219 -1.45753175473055,5.62613160123803 -0.106953743333199 -1.44503491691981,5.7271296491552 -0.025501817407262 -1.42971720296291,5.82702114425268 0.060946250290002 -1.41165323922251,5.92531942520741 0.151969293462501 -1.39093103151418,6.02154559267549 0.247123856993501 -1.36765153635088,6.11523084244164 0.345946357414384 -1.34192816909299,6.2059187493862 0.4479553414367 -1.31388625140011,6.29316749114245 0.552653831544204 -1.28366240067645,6.37655200061077 0.659531747217344 -1.25140386448466,6.45566603684282 0.768068389994292 -1.21726780317044,6.53012416420658 0.877734980261504 -1.18142052419318,6.59956363019005 0.987997233414845 -1.1440366718927,6.66364613269498 1.09831796284048 -1.10529837663958,6.72205946821072 1.20815969703403 -1.06539436751435,6.77451905283833 1.31698729810778 -1.02451905283833,6.82076930875472 1.4242705689286 -0.982871573035841,6.86058490936212 1.52948683618513 -0.940654830442097,6.89377187705662 1.63212349679959 -0.898074500783399,6.92016852826756 1.73168051527848 -0.855338031145687,6.93964626116363 1.8276728598352 -0.81265362931318,6.95211018218804 1.91963286541618 -0.770229249400985,6.95749956837044 2.00711251211804 -0.72827157872355,6.95578816316308 2.08968560789544 -0.686985030834846,6.9469843043601 2.166949864926 -0.646570749646076,6.93113088347664 2.23852885951603 -0.607225629472764,6.90830513678565 2.30407386599898 -0.569141355785437,6.87861826903058 2.36326555569183 -0.53250347133728,6.84221491164701 2.41581555263232 -0.497490472218499,6.79927241813288 2.46146783851767 -0.464272938241304,6.75 2.5 -0.43301270189222,6.69463770751669 2.5312243122618 -0.40386205990047,' + - '6.63345526020692 2.55498865359239 -0.376963031263626,6.56675073280394 2.57117724650959 -0.352446665345325,6.49484910306015 2.57971122181598 -0.330432403415945,6.41810066848813 2.5805490028417 -0.311027496746741,6.3368793397464 2.5736865080018 -0.294326484092429,6.25158081898424 2.55915717068134 -0.280410731107883,6.16262067202063 2.53703177635124 -0.269348033942836,6.07043230374933 2.50741811770866 -0.261192288945857,5.97546484663382 2.47046046952174 -0.255983230086761,5.87818097257907 2.42633888573748 -0.253746235376694,5.77905463884053 2.37526832227698 -0.254492203229023,5.67856877895203 2.31749758979185 -0.258217499363356,5.57721294992215 2.25330814148364 -0.264903974511391,5.47548094716167 2.18301270189222 -0.27451905283833,5.37386839876197 2.1069537433332 -0.287015890649068,5.2728703508448 2.02550181740726 -0.302333604605968,5.17297885574732 1.93905374971 -0.320397568346365,5.07468057479259 1.8480307065375 -0.341119776054697,4.97845440732451 1.7528761430065 -0.364399271218,4.88476915755836 1.65405364258562 -0.390122638475884,4.79408125061381 1.5520446585633 -0.418164556168773,4.70683250885755 1.4473461684558 -0.44838840689243,4.62344799938923 1.34046825278266 -0.48064694308422,4.54433396315718 1.23193161000571 -0.514783004398435,4.46987583579342 1.1222650197385 -0.550630283375696,4.40043636980995 1.01200276658516 -0.588014135676182,4.33635386730502 0.901682037159526 -0.626752430929296,4.27794053178928 0.791840302965968 -0.666656440054525,4.22548094716167 0.68301270189222 -0.707531754730549,4.17923069124529 0.575729431071401 -0.749179234533037,4.13941509063789 0.470513163814874 -0.791395977126782,4.10622812294338 0.36787650320041 -0.833976306785479,4.07983147173244 0.268319484721523 -0.876712776423191,4.06035373883638 0.172327140164803 -0.919397178255699,4.04788981781196 0.080367134583816 -0.961821558167894,4.04250043162957 -0.007112512118036 -1.00377922884533,4.04421183683692 -0.089685607895445 -1.04506577673403,4.0530156956399 -0.166949864926001 -1.0854800579228,4.06886911652336 -0.238528859516028 -1.12482517809611,4.09169486321435 -0.304073865998978 -1.16290945178344,4.12138173096942 -0.363265555691829 -1.1995473362316,4.15778508835299 -0.415815552632322 -1.23456033535038,4.20072758186713 -0.461467838517673 -1.26777786932757,4.25 -0.5 -1.29903810567666)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (4.25 -0.5 -1.29903810567666,4.30536229248331 -0.531224312261799 -1.32818874766841,4.36654473979309 -0.554988653592388 -1.35508777630525,4.43324926719606 -0.571177246509588 -1.37960414222355,4.50515089693985 -0.579711221815978 -1.40161840415293,4.58189933151187 -0.580549002841697 -1.42102331082214,4.6631206602536 -0.573686508001801 -1.43772432347645,4.74841918101576 -0.559157170681335 -1.451640076461,4.83737932797937 -0.53703177635124 -1.46270277362604,4.92956769625067 -0.507418117708657 -1.47085851862302,5.02453515336618 -0.470460469521736 -1.47606757748212,5.12181902742094 -0.426338885737475 -1.47830457219218,5.22094536115948 -0.375268322276984 -1.47755860433986,5.32143122104797 -0.317497589791849 -1.47383330820552,5.42278705007785 -0.253308141483641 -1.46714683305749,5.52451905283833 -0.183012701892219 -1.45753175473055,5.62613160123803 -0.106953743333199 -1.44503491691981,5.7271296491552 -0.025501817407262 -1.42971720296291,5.82702114425268 0.060946250290002 -1.41165323922251,5.92531942520741 0.151969293462501 -1.39093103151418,6.02154559267549 0.247123856993501 -1.36765153635088,6.11523084244164 0.345946357414384 -1.34192816909299,6.2059187493862 0.4479553414367 -1.31388625140011,6.29316749114245 0.552653831544204 -1.28366240067645,6.37655200061077 0.659531747217344 -1.25140386448466,6.45566603684282 0.768068389994292 -1.21726780317044,6.53012416420658 0.877734980261504 -1.18142052419318,6.59956363019005 0.987997233414845 -1.1440366718927,6.66364613269498 1.09831796284048 -1.10529837663958,6.72205946821072 1.20815969703403 -1.06539436751435,6.77451905283833 1.31698729810778 -1.02451905283833,6.82076930875472 1.4242705689286 -0.982871573035841,6.86058490936212 1.52948683618513 -0.940654830442097,6.89377187705662 1.63212349679959 -0.898074500783399,6.92016852826756 1.73168051527848 -0.855338031145687,6.93964626116363 1.8276728598352 -0.81265362931318,6.95211018218804 1.91963286541618 -0.770229249400985,6.95749956837044 2.00711251211804 -0.72827157872355,6.95578816316308 2.08968560789544 -0.686985030834846,6.9469843043601 2.166949864926 -0.646570749646076,6.93113088347664 2.23852885951603 -0.607225629472764,6.90830513678565 2.30407386599898 -0.569141355785437,6.87861826903058 2.36326555569183 -0.53250347133728,6.84221491164701 2.41581555263232 -0.497490472218499,6.79927241813288 2.46146783851767 -0.464272938241304,6.75 2.5 -0.43301270189222,6.69463770751669 2.5312243122618 -0.40386205990047," + + "6.63345526020692 2.55498865359239 -0.376963031263626,6.56675073280394 2.57117724650959 -0.352446665345325,6.49484910306015 2.57971122181598 -0.330432403415945,6.41810066848813 2.5805490028417 -0.311027496746741,6.3368793397464 2.5736865080018 -0.294326484092429,6.25158081898424 2.55915717068134 -0.280410731107883,6.16262067202063 2.53703177635124 -0.269348033942836,6.07043230374933 2.50741811770866 -0.261192288945857,5.97546484663382 2.47046046952174 -0.255983230086761,5.87818097257907 2.42633888573748 -0.253746235376694,5.77905463884053 2.37526832227698 -0.254492203229023,5.67856877895203 2.31749758979185 -0.258217499363356,5.57721294992215 2.25330814148364 -0.264903974511391,5.47548094716167 2.18301270189222 -0.27451905283833,5.37386839876197 2.1069537433332 -0.287015890649068,5.2728703508448 2.02550181740726 -0.302333604605968,5.17297885574732 1.93905374971 -0.320397568346365,5.07468057479259 1.8480307065375 -0.341119776054697,4.97845440732451 1.7528761430065 -0.364399271218,4.88476915755836 1.65405364258562 -0.390122638475884,4.79408125061381 1.5520446585633 -0.418164556168773,4.70683250885755 1.4473461684558 -0.44838840689243,4.62344799938923 1.34046825278266 -0.48064694308422,4.54433396315718 1.23193161000571 -0.514783004398435,4.46987583579342 1.1222650197385 -0.550630283375696,4.40043636980995 1.01200276658516 -0.588014135676182,4.33635386730502 0.901682037159526 -0.626752430929296,4.27794053178928 0.791840302965968 -0.666656440054525,4.22548094716167 0.68301270189222 -0.707531754730549,4.17923069124529 0.575729431071401 -0.749179234533037,4.13941509063789 0.470513163814874 -0.791395977126782,4.10622812294338 0.36787650320041 -0.833976306785479,4.07983147173244 0.268319484721523 -0.876712776423191,4.06035373883638 0.172327140164803 -0.919397178255699,4.04788981781196 0.080367134583816 -0.961821558167894,4.04250043162957 -0.007112512118036 -1.00377922884533,4.04421183683692 -0.089685607895445 -1.04506577673403,4.0530156956399 -0.166949864926001 -1.0854800579228,4.06886911652336 -0.238528859516028 -1.12482517809611,4.09169486321435 -0.304073865998978 -1.16290945178344,4.12138173096942 -0.363265555691829 -1.1995473362316,4.15778508835299 -0.415815552632322 -1.23456033535038,4.20072758186713 -0.461467838517673 -1.26777786932757,4.25 -0.5 -1.29903810567666)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):61 -# EntityHandle (String) = 203 -# LINESTRING Z (2.75 0.5 -0.43301270189222,2.75597796157458 0.457022294808167 -0.455760312055479,2.76522760095779 0.414850974295674 -0.478918395607368,2.77770451483146 0.37368848382115 -0.502375781105475,2.79334880719819 0.333732425808347 -0.526019860294666,2.81208537691484 0.295174611146642 -0.549737128688177,2.83382427821898 0.258200138394064 -0.573413730451116,2.85846115251769 0.222986505203176 -0.596936004970611,2.88587772936573 0.189702756235451 -0.620191032488805,2.91594239422828 0.15850867165462 -0.643067176179329,2.94851082030252 0.129554000094665 -0.66545461806501,2.98342666136509 0.102977739784634 -0.687245886204105,3.02052230231928 0.078907471281269 -0.708336370614292,3.05961966383903 0.057458745012683 -0.728624825457685,3.10053105724686 0.038734526573237 -0.748013855076124,3.14306008552201 0.022824702432479 -0.766410381543502,3.18700258611332 0.009805648431019 -0.783726091490617,3.23214761103096 -0.00026013686519 -0.79987786005755,3.27827843951188 -0.007324332192091 -0.814788149938374,3.32517361839783 -0.011353025555964 -0.828385383602543,3.37260802523135 -0.012326877029509 -0.84060428690611,3.42035394896652 -0.010241211594056 -0.851386202443257,3.46818218310621 -0.0051060415822 -0.860679371133851,3.51586312601842 0.003053981386852 -0.868439180695292,3.56316788314946 0.014199684748517 -0.874628379805819,3.60986936584274 0.028277563042523 -0.879217256931186,3.65574338148826 0.045220034768334 -0.882183782956251,3.70056970976957 0.064945766813234 -0.883513716936746,3.74413315984144 0.087360064895672 -0.883200674463593,3.78622460336345 0.112355328149502 -0.881246158311542,3.82664197843012 0.139811565666877 -0.87765955122504,3.86519125957839 0.169596972520106 -0.872458070875934,3.90168738921576 0.201568562497258 -0.865666687209244,3.93595516599773 0.235572854514029 -0.857318002573801,3.96783008588991 0.271446609406727 -0.847452095213172,3.99715913187718 0.30901761356937 -0.836116326868217,4.02380150852887 0.348105505672996 -0.823365115414876,4.04762931789371 0.3885226424985 -0.809259673628662,4.06852817347981 0.430074999726512 -0.793867715329923,4.08639774937224 0.472563103360048 -0.777263130320539,4.10115226185219 0.515782987308575 -0.759525629672545,4.1127208812057 0.559527172536592 -0.740740363071464,4.12104807174486 0.603585663076254 -0.720997510051345,4.12609385840951 0.647746954122649 -0.700391847083764,4.1278340186693 0.691799047372318 -0.679022292599034,4.12626019880507 0.735530468730831 -0.656991432123733,4.12137995401128 0.778731283503886 -0.634405025814187,4.11321671212692 0.821194104198432 -0.61137150074998,4.10180966116915 0.862715086095846 -0.588001430424789,4.08721356120934 0.903094905817856 -0.564407003933257,4.06949848149492 0.942139718187561 -0.540701487402092,4.04874946407869 0.979662086792094 -0.516998680250836,4.02506611557057 1.01548188377972 -0.493412368892526,3.99856212897149 1.04942715457186 -0.470055780496802,3.96936473788492 1.08133494333891 -0.447041039437686,3.93761410572614 1.11105207527721 -0.424478629035376,3.9034626528613 1.13843589193168 -0.402476861176005,3.86707432490649 1.16335493603432 -0.381141356355458,3.8286238056993 1.1856895825708 -0.360574536643342,3.78829567872099 1.20533261304587 -0.340875134001137,3.74628354099508 1.22218973019068 -0.322137716314888,3.70278907371594 1.23618001064108 -0.304452233417734,3.65802107406893 1.247236293414 -0.287903585281599,3.61219445288998 1.25530550231681 -0.27257121445099,3.56552920297626 1.26034890074202 -0.258528724675415,3.51824934300062 1.26234227762414 -0.245843527571206,3.47058184209972 1.26127606366599 -0.234576519008966,3.42275553029828 1.2571553772766 -0.224781786780142,3.375 1.25 -0.21650635094611) + # OGRFeature(entities):61 + # EntityHandle (String) = 203 + # LINESTRING Z (2.75 0.5 -0.43301270189222,2.75597796157458 0.457022294808167 -0.455760312055479,2.76522760095779 0.414850974295674 -0.478918395607368,2.77770451483146 0.37368848382115 -0.502375781105475,2.79334880719819 0.333732425808347 -0.526019860294666,2.81208537691484 0.295174611146642 -0.549737128688177,2.83382427821898 0.258200138394064 -0.573413730451116,2.85846115251769 0.222986505203176 -0.596936004970611,2.88587772936573 0.189702756235451 -0.620191032488805,2.91594239422828 0.15850867165462 -0.643067176179329,2.94851082030252 0.129554000094665 -0.66545461806501,2.98342666136509 0.102977739784634 -0.687245886204105,3.02052230231928 0.078907471281269 -0.708336370614292,3.05961966383903 0.057458745012683 -0.728624825457685,3.10053105724686 0.038734526573237 -0.748013855076124,3.14306008552201 0.022824702432479 -0.766410381543502,3.18700258611332 0.009805648431019 -0.783726091490617,3.23214761103096 -0.00026013686519 -0.79987786005755,3.27827843951188 -0.007324332192091 -0.814788149938374,3.32517361839783 -0.011353025555964 -0.828385383602543,3.37260802523135 -0.012326877029509 -0.84060428690611,3.42035394896652 -0.010241211594056 -0.851386202443257,3.46818218310621 -0.0051060415822 -0.860679371133851,3.51586312601842 0.003053981386852 -0.868439180695292,3.56316788314946 0.014199684748517 -0.874628379805819,3.60986936584274 0.028277563042523 -0.879217256931186,3.65574338148826 0.045220034768334 -0.882183782956251,3.70056970976957 0.064945766813234 -0.883513716936746,3.74413315984144 0.087360064895672 -0.883200674463593,3.78622460336345 0.112355328149502 -0.881246158311542,3.82664197843012 0.139811565666877 -0.87765955122504,3.86519125957839 0.169596972520106 -0.872458070875934,3.90168738921576 0.201568562497258 -0.865666687209244,3.93595516599773 0.235572854514029 -0.857318002573801,3.96783008588991 0.271446609406727 -0.847452095213172,3.99715913187718 0.30901761356937 -0.836116326868217,4.02380150852887 0.348105505672996 -0.823365115414876,4.04762931789371 0.3885226424985 -0.809259673628662,4.06852817347981 0.430074999726512 -0.793867715329923,4.08639774937224 0.472563103360048 -0.777263130320539,4.10115226185219 0.515782987308575 -0.759525629672545,4.1127208812057 0.559527172536592 -0.740740363071464,4.12104807174486 0.603585663076254 -0.720997510051345,4.12609385840951 0.647746954122649 -0.700391847083764,4.1278340186693 0.691799047372318 -0.679022292599034,4.12626019880507 0.735530468730831 -0.656991432123733,4.12137995401128 0.778731283503886 -0.634405025814187,4.11321671212692 0.821194104198432 -0.61137150074998,4.10180966116915 0.862715086095846 -0.588001430424789,4.08721356120934 0.903094905817856 -0.564407003933257,4.06949848149492 0.942139718187561 -0.540701487402092,4.04874946407869 0.979662086792094 -0.516998680250836,4.02506611557057 1.01548188377972 -0.493412368892526,3.99856212897149 1.04942715457186 -0.470055780496802,3.96936473788492 1.08133494333891 -0.447041039437686,3.93761410572614 1.11105207527721 -0.424478629035376,3.9034626528613 1.13843589193168 -0.402476861176005,3.86707432490649 1.16335493603432 -0.381141356355458,3.8286238056993 1.1856895825708 -0.360574536643342,3.78829567872099 1.20533261304587 -0.340875134001137,3.74628354099508 1.22218973019068 -0.322137716314888,3.70278907371594 1.23618001064108 -0.304452233417734,3.65802107406893 1.247236293414 -0.287903585281599,3.61219445288998 1.25530550231681 -0.27257121445099,3.56552920297626 1.26034890074202 -0.258528724675415,3.51824934300062 1.26234227762414 -0.245843527571206,3.47058184209972 1.26127606366599 -0.234576519008966,3.42275553029828 1.2571553772766 -0.224781786780142,3.375 1.25 -0.21650635094611) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING Z (2.75 0.5 -0.43301270189222,2.75597796157458 0.457022294808167 -0.455760312055479,2.76522760095779 0.414850974295674 -0.478918395607368,2.77770451483146 0.37368848382115 -0.502375781105475,2.79334880719819 0.333732425808347 -0.526019860294666,2.81208537691484 0.295174611146642 -0.549737128688177,2.83382427821898 0.258200138394064 -0.573413730451116,2.85846115251769 0.222986505203176 -0.596936004970611,2.88587772936573 0.189702756235451 -0.620191032488805,2.91594239422828 0.15850867165462 -0.643067176179329,2.94851082030252 0.129554000094665 -0.66545461806501,2.98342666136509 0.102977739784634 -0.687245886204105,3.02052230231928 0.078907471281269 -0.708336370614292,3.05961966383903 0.057458745012683 -0.728624825457685,3.10053105724686 0.038734526573237 -0.748013855076124,3.14306008552201 0.022824702432479 -0.766410381543502,3.18700258611332 0.009805648431019 -0.783726091490617,3.23214761103096 -0.00026013686519 -0.79987786005755,3.27827843951188 -0.007324332192091 -0.814788149938374,3.32517361839783 -0.011353025555964 -0.828385383602543,3.37260802523135 -0.012326877029509 -0.84060428690611,3.42035394896652 -0.010241211594056 -0.851386202443257,3.46818218310621 -0.0051060415822 -0.860679371133851,3.51586312601842 0.003053981386852 -0.868439180695292,3.56316788314946 0.014199684748517 -0.874628379805819,3.60986936584274 0.028277563042523 -0.879217256931186,3.65574338148826 0.045220034768334 -0.882183782956251,3.70056970976957 0.064945766813234 -0.883513716936746,3.74413315984144 0.087360064895672 -0.883200674463593,3.78622460336345 0.112355328149502 -0.881246158311542,3.82664197843012 0.139811565666877 -0.87765955122504,3.86519125957839 0.169596972520106 -0.872458070875934,3.90168738921576 0.201568562497258 -0.865666687209244,3.93595516599773 0.235572854514029 -0.857318002573801,3.96783008588991 0.271446609406727 -0.847452095213172,3.99715913187718 0.30901761356937 -0.836116326868217,4.02380150852887 0.348105505672996 -0.823365115414876,4.04762931789371 0.3885226424985 -0.809259673628662,4.06852817347981 0.430074999726512 -0.793867715329923,4.08639774937224 0.472563103360048 -0.777263130320539,4.10115226185219 0.515782987308575 -0.759525629672545,4.1127208812057 0.559527172536592 -0.740740363071464,4.12104807174486 0.603585663076254 -0.720997510051345,4.12609385840951 0.647746954122649 -0.700391847083764,4.1278340186693 0.691799047372318 -0.679022292599034,4.12626019880507 0.735530468730831 -0.656991432123733,4.12137995401128 0.778731283503886 -0.634405025814187,4.11321671212692 0.821194104198432 -0.61137150074998,4.10180966116915 0.862715086095846 -0.588001430424789,4.08721356120934 0.903094905817856 -0.564407003933257,4.06949848149492 0.942139718187561 -0.540701487402092,4.04874946407869 0.979662086792094 -0.516998680250836,4.02506611557057 1.01548188377972 -0.493412368892526,3.99856212897149 1.04942715457186 -0.470055780496802,3.96936473788492 1.08133494333891 -0.447041039437686,3.93761410572614 1.11105207527721 -0.424478629035376,3.9034626528613 1.13843589193168 -0.402476861176005,3.86707432490649 1.16335493603432 -0.381141356355458,3.8286238056993 1.1856895825708 -0.360574536643342,3.78829567872099 1.20533261304587 -0.340875134001137,3.74628354099508 1.22218973019068 -0.322137716314888,3.70278907371594 1.23618001064108 -0.304452233417734,3.65802107406893 1.247236293414 -0.287903585281599,3.61219445288998 1.25530550231681 -0.27257121445099,3.56552920297626 1.26034890074202 -0.258528724675415,3.51824934300062 1.26234227762414 -0.245843527571206,3.47058184209972 1.26127606366599 -0.234576519008966,3.42275553029828 1.2571553772766 -0.224781786780142,3.375 1.25 -0.21650635094611)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING Z (2.75 0.5 -0.43301270189222,2.75597796157458 0.457022294808167 -0.455760312055479,2.76522760095779 0.414850974295674 -0.478918395607368,2.77770451483146 0.37368848382115 -0.502375781105475,2.79334880719819 0.333732425808347 -0.526019860294666,2.81208537691484 0.295174611146642 -0.549737128688177,2.83382427821898 0.258200138394064 -0.573413730451116,2.85846115251769 0.222986505203176 -0.596936004970611,2.88587772936573 0.189702756235451 -0.620191032488805,2.91594239422828 0.15850867165462 -0.643067176179329,2.94851082030252 0.129554000094665 -0.66545461806501,2.98342666136509 0.102977739784634 -0.687245886204105,3.02052230231928 0.078907471281269 -0.708336370614292,3.05961966383903 0.057458745012683 -0.728624825457685,3.10053105724686 0.038734526573237 -0.748013855076124,3.14306008552201 0.022824702432479 -0.766410381543502,3.18700258611332 0.009805648431019 -0.783726091490617,3.23214761103096 -0.00026013686519 -0.79987786005755,3.27827843951188 -0.007324332192091 -0.814788149938374,3.32517361839783 -0.011353025555964 -0.828385383602543,3.37260802523135 -0.012326877029509 -0.84060428690611,3.42035394896652 -0.010241211594056 -0.851386202443257,3.46818218310621 -0.0051060415822 -0.860679371133851,3.51586312601842 0.003053981386852 -0.868439180695292,3.56316788314946 0.014199684748517 -0.874628379805819,3.60986936584274 0.028277563042523 -0.879217256931186,3.65574338148826 0.045220034768334 -0.882183782956251,3.70056970976957 0.064945766813234 -0.883513716936746,3.74413315984144 0.087360064895672 -0.883200674463593,3.78622460336345 0.112355328149502 -0.881246158311542,3.82664197843012 0.139811565666877 -0.87765955122504,3.86519125957839 0.169596972520106 -0.872458070875934,3.90168738921576 0.201568562497258 -0.865666687209244,3.93595516599773 0.235572854514029 -0.857318002573801,3.96783008588991 0.271446609406727 -0.847452095213172,3.99715913187718 0.30901761356937 -0.836116326868217,4.02380150852887 0.348105505672996 -0.823365115414876,4.04762931789371 0.3885226424985 -0.809259673628662,4.06852817347981 0.430074999726512 -0.793867715329923,4.08639774937224 0.472563103360048 -0.777263130320539,4.10115226185219 0.515782987308575 -0.759525629672545,4.1127208812057 0.559527172536592 -0.740740363071464,4.12104807174486 0.603585663076254 -0.720997510051345,4.12609385840951 0.647746954122649 -0.700391847083764,4.1278340186693 0.691799047372318 -0.679022292599034,4.12626019880507 0.735530468730831 -0.656991432123733,4.12137995401128 0.778731283503886 -0.634405025814187,4.11321671212692 0.821194104198432 -0.61137150074998,4.10180966116915 0.862715086095846 -0.588001430424789,4.08721356120934 0.903094905817856 -0.564407003933257,4.06949848149492 0.942139718187561 -0.540701487402092,4.04874946407869 0.979662086792094 -0.516998680250836,4.02506611557057 1.01548188377972 -0.493412368892526,3.99856212897149 1.04942715457186 -0.470055780496802,3.96936473788492 1.08133494333891 -0.447041039437686,3.93761410572614 1.11105207527721 -0.424478629035376,3.9034626528613 1.13843589193168 -0.402476861176005,3.86707432490649 1.16335493603432 -0.381141356355458,3.8286238056993 1.1856895825708 -0.360574536643342,3.78829567872099 1.20533261304587 -0.340875134001137,3.74628354099508 1.22218973019068 -0.322137716314888,3.70278907371594 1.23618001064108 -0.304452233417734,3.65802107406893 1.247236293414 -0.287903585281599,3.61219445288998 1.25530550231681 -0.27257121445099,3.56552920297626 1.26034890074202 -0.258528724675415,3.51824934300062 1.26234227762414 -0.245843527571206,3.47058184209972 1.26127606366599 -0.234576519008966,3.42275553029828 1.2571553772766 -0.224781786780142,3.375 1.25 -0.21650635094611)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):62 -# EntityHandle (String) = 204 -# POLYGON Z ((2.125 -0.25 -0.649519052838329,2.875 -0.75 -1.08253175473055,3.5 0.0 -0.866025403784439,2.75 0.5 -0.43301270189222,2.125 -0.25 -0.649519052838329)) + # OGRFeature(entities):62 + # EntityHandle (String) = 204 + # POLYGON Z ((2.125 -0.25 -0.649519052838329,2.875 -0.75 -1.08253175473055,3.5 0.0 -0.866025403784439,2.75 0.5 -0.43301270189222,2.125 -0.25 -0.649519052838329)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((2.125 -0.25 -0.649519052838329,2.875 -0.75 -1.08253175473055,3.5 0.0 -0.866025403784439,2.75 0.5 -0.43301270189222,2.125 -0.25 -0.649519052838329))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((2.125 -0.25 -0.649519052838329,2.875 -0.75 -1.08253175473055,3.5 0.0 -0.866025403784439,2.75 0.5 -0.43301270189222,2.125 -0.25 -0.649519052838329))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):63 -# EntityHandle (String) = 205 -# POLYGON Z ((4.875 0.25 -1.08253175473055,5.5 1.0 -0.866025403784439,4.75 1.5 -0.43301270189222,4.125 0.75 -0.649519052838329,4.875 0.25 -1.08253175473055)) + # OGRFeature(entities):63 + # EntityHandle (String) = 205 + # POLYGON Z ((4.875 0.25 -1.08253175473055,5.5 1.0 -0.866025403784439,4.75 1.5 -0.43301270189222,4.125 0.75 -0.649519052838329,4.875 0.25 -1.08253175473055)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((4.875 0.25 -1.08253175473055,5.5 1.0 -0.866025403784439,4.75 1.5 -0.43301270189222,4.125 0.75 -0.649519052838329,4.875 0.25 -1.08253175473055))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((4.875 0.25 -1.08253175473055,5.5 1.0 -0.866025403784439,4.75 1.5 -0.43301270189222,4.125 0.75 -0.649519052838329,4.875 0.25 -1.08253175473055))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):64 -# EntityHandle (String) = 207 -# POLYGON Z ((11 2 -1.73205080756888,11.625 2.75 -1.51554445662277,12.375 2.25 -1.94855715851499,11.75 1.5 -2.1650635094611,11 2 -1.73205080756888)) + # OGRFeature(entities):64 + # EntityHandle (String) = 207 + # POLYGON Z ((11 2 -1.73205080756888,11.625 2.75 -1.51554445662277,12.375 2.25 -1.94855715851499,11.75 1.5 -2.1650635094611,11 2 -1.73205080756888)) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POLYGON Z ((11 2 -1.73205080756888,11.625 2.75 -1.51554445662277,12.375 2.25 -1.94855715851499,11.75 1.5 -2.1650635094611,11 2 -1.73205080756888))'): + if ogrtest.check_feature_geometry( + feat, + "POLYGON Z ((11 2 -1.73205080756888,11.625 2.75 -1.51554445662277,12.375 2.25 -1.94855715851499,11.75 1.5 -2.1650635094611,11 2 -1.73205080756888))", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):65 -# EntityHandle (String) = 208 -# LINESTRING (2.75 0.5,2.96153846153846 0.538461538461539,3.17307692307692 0.576923076923077,3.38461538461539 0.615384615384616,3.59615384615385 0.653846153846154,3.80769230769231 0.692307692307693,4.01923076923077 0.730769230769231,4.23076923076923 0.76923076923077,4.44230769230769 0.807692307692308,4.65384615384616 0.846153846153847,4.86538461538462 0.884615384615385,5.07692307692308 0.923076923076924,5.28846153846154 0.961538461538462,5.5 1.0,5.71153846153846 1.03846153846154,5.92307692307693 1.07692307692308,6.13461538461539 1.11538461538462,6.34615384615385 1.15384615384615,6.55769230769231 1.19230769230769,6.76923076923077 1.23076923076923,6.98076923076923 1.26923076923077,7.19230769230769 1.30769230769231,7.40384615384616 1.34615384615385,7.61538461538462 1.38461538461539,7.82692307692308 1.42307692307692,8.03846153846154 1.46153846153846,8.25 1.5,8.46153846153846 1.53846153846154,8.67307692307693 1.57692307692308,8.88461538461539 1.61538461538462,9.09615384615385 1.65384615384615,9.30769230769231 1.69230769230769,9.51923076923077 1.73076923076923,9.73076923076923 1.76923076923077,9.94230769230769 1.80769230769231,10.1538461538462 1.84615384615385,10.3653846153846 1.88461538461539,10.5769230769231 1.92307692307692,10.7884615384615 1.96153846153846,11.0 2.0) + # OGRFeature(entities):65 + # EntityHandle (String) = 208 + # LINESTRING (2.75 0.5,2.96153846153846 0.538461538461539,3.17307692307692 0.576923076923077,3.38461538461539 0.615384615384616,3.59615384615385 0.653846153846154,3.80769230769231 0.692307692307693,4.01923076923077 0.730769230769231,4.23076923076923 0.76923076923077,4.44230769230769 0.807692307692308,4.65384615384616 0.846153846153847,4.86538461538462 0.884615384615385,5.07692307692308 0.923076923076924,5.28846153846154 0.961538461538462,5.5 1.0,5.71153846153846 1.03846153846154,5.92307692307693 1.07692307692308,6.13461538461539 1.11538461538462,6.34615384615385 1.15384615384615,6.55769230769231 1.19230769230769,6.76923076923077 1.23076923076923,6.98076923076923 1.26923076923077,7.19230769230769 1.30769230769231,7.40384615384616 1.34615384615385,7.61538461538462 1.38461538461539,7.82692307692308 1.42307692307692,8.03846153846154 1.46153846153846,8.25 1.5,8.46153846153846 1.53846153846154,8.67307692307693 1.57692307692308,8.88461538461539 1.61538461538462,9.09615384615385 1.65384615384615,9.30769230769231 1.69230769230769,9.51923076923077 1.73076923076923,9.73076923076923 1.76923076923077,9.94230769230769 1.80769230769231,10.1538461538462 1.84615384615385,10.3653846153846 1.88461538461539,10.5769230769231 1.92307692307692,10.7884615384615 1.96153846153846,11.0 2.0) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (2.75 0.5,2.96153846153846 0.538461538461539,3.17307692307692 0.576923076923077,3.38461538461539 0.615384615384616,3.59615384615385 0.653846153846154,3.80769230769231 0.692307692307693,4.01923076923077 0.730769230769231,4.23076923076923 0.76923076923077,4.44230769230769 0.807692307692308,4.65384615384616 0.846153846153847,4.86538461538462 0.884615384615385,5.07692307692308 0.923076923076924,5.28846153846154 0.961538461538462,5.5 1.0,5.71153846153846 1.03846153846154,5.92307692307693 1.07692307692308,6.13461538461539 1.11538461538462,6.34615384615385 1.15384615384615,6.55769230769231 1.19230769230769,6.76923076923077 1.23076923076923,6.98076923076923 1.26923076923077,7.19230769230769 1.30769230769231,7.40384615384616 1.34615384615385,7.61538461538462 1.38461538461539,7.82692307692308 1.42307692307692,8.03846153846154 1.46153846153846,8.25 1.5,8.46153846153846 1.53846153846154,8.67307692307693 1.57692307692308,8.88461538461539 1.61538461538462,9.09615384615385 1.65384615384615,9.30769230769231 1.69230769230769,9.51923076923077 1.73076923076923,9.73076923076923 1.76923076923077,9.94230769230769 1.80769230769231,10.1538461538462 1.84615384615385,10.3653846153846 1.88461538461539,10.5769230769231 1.92307692307692,10.7884615384615 1.96153846153846,11.0 2.0)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (2.75 0.5,2.96153846153846 0.538461538461539,3.17307692307692 0.576923076923077,3.38461538461539 0.615384615384616,3.59615384615385 0.653846153846154,3.80769230769231 0.692307692307693,4.01923076923077 0.730769230769231,4.23076923076923 0.76923076923077,4.44230769230769 0.807692307692308,4.65384615384616 0.846153846153847,4.86538461538462 0.884615384615385,5.07692307692308 0.923076923076924,5.28846153846154 0.961538461538462,5.5 1.0,5.71153846153846 1.03846153846154,5.92307692307693 1.07692307692308,6.13461538461539 1.11538461538462,6.34615384615385 1.15384615384615,6.55769230769231 1.19230769230769,6.76923076923077 1.23076923076923,6.98076923076923 1.26923076923077,7.19230769230769 1.30769230769231,7.40384615384616 1.34615384615385,7.61538461538462 1.38461538461539,7.82692307692308 1.42307692307692,8.03846153846154 1.46153846153846,8.25 1.5,8.46153846153846 1.53846153846154,8.67307692307693 1.57692307692308,8.88461538461539 1.61538461538462,9.09615384615385 1.65384615384615,9.30769230769231 1.69230769230769,9.51923076923077 1.73076923076923,9.73076923076923 1.76923076923077,9.94230769230769 1.80769230769231,10.1538461538462 1.84615384615385,10.3653846153846 1.88461538461539,10.5769230769231 1.92307692307692,10.7884615384615 1.96153846153846,11.0 2.0)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):66 -# EntityHandle (String) = 209 -# LINESTRING (5.75 5.5,5.5082446180819 5.22760624757667,5.26788002157825 4.95546536522868,5.03029699590351 4.68383022303141,4.79688632647213 4.4129536910602,4.56903879869856 4.14308863939042,4.34814519799727 3.87448793809741,4.1355963097827 3.60740445725653,3.93278291946931 3.34209106694314,3.74109581247155 3.07880063723259,3.56192577420388 2.81778603820024,3.39666359008075 2.55930013992144,3.24670004551661 2.30359581247155,3.11342592592593 2.05092592592593,2.99823201672314 1.80154335035992,2.90250910332271 1.55570095584889,2.8276479711391 1.31365161246818,2.77503940558674 1.07564819029316,2.74607419208011 0.84194355939918,2.74214311603365 0.612790589861594,2.76457901346955 0.38843161550262,2.8133818843878 0.168866636322256,2.88721889276623 -0.046146681501713,2.98469925319038 -0.256861208044643,3.10443218024579 -0.463529813381887,3.24502688851802 -0.666405367588803,3.4050925925926 -0.865740740740744,3.58323850705508 -1.06178880291307,3.77807384649101 -1.25480242418113,3.98820782548594 -1.44503447462028,4.21224965862541 -1.63273782430588,4.44880856049496 -1.81816534331328,4.69649374568015 -2.00156990171784,4.95391442876651 -2.18320436959491,5.2196798243396 -2.36332161701985,5.49239914698496 -2.54217451406801,5.77068161128813 -2.72001593081475,6.05313643183467 -2.89709873733543,6.33837282321012 -3.0736758037054,6.625 -3.25) + # OGRFeature(entities):66 + # EntityHandle (String) = 209 + # LINESTRING (5.75 5.5,5.5082446180819 5.22760624757667,5.26788002157825 4.95546536522868,5.03029699590351 4.68383022303141,4.79688632647213 4.4129536910602,4.56903879869856 4.14308863939042,4.34814519799727 3.87448793809741,4.1355963097827 3.60740445725653,3.93278291946931 3.34209106694314,3.74109581247155 3.07880063723259,3.56192577420388 2.81778603820024,3.39666359008075 2.55930013992144,3.24670004551661 2.30359581247155,3.11342592592593 2.05092592592593,2.99823201672314 1.80154335035992,2.90250910332271 1.55570095584889,2.8276479711391 1.31365161246818,2.77503940558674 1.07564819029316,2.74607419208011 0.84194355939918,2.74214311603365 0.612790589861594,2.76457901346955 0.38843161550262,2.8133818843878 0.168866636322256,2.88721889276623 -0.046146681501713,2.98469925319038 -0.256861208044643,3.10443218024579 -0.463529813381887,3.24502688851802 -0.666405367588803,3.4050925925926 -0.865740740740744,3.58323850705508 -1.06178880291307,3.77807384649101 -1.25480242418113,3.98820782548594 -1.44503447462028,4.21224965862541 -1.63273782430588,4.44880856049496 -1.81816534331328,4.69649374568015 -2.00156990171784,4.95391442876651 -2.18320436959491,5.2196798243396 -2.36332161701985,5.49239914698496 -2.54217451406801,5.77068161128813 -2.72001593081475,6.05313643183467 -2.89709873733543,6.33837282321012 -3.0736758037054,6.625 -3.25) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'LINESTRING (5.75 5.5,5.5082446180819 5.22760624757667,5.26788002157825 4.95546536522868,5.03029699590351 4.68383022303141,4.79688632647213 4.4129536910602,4.56903879869856 4.14308863939042,4.34814519799727 3.87448793809741,4.1355963097827 3.60740445725653,3.93278291946931 3.34209106694314,3.74109581247155 3.07880063723259,3.56192577420388 2.81778603820024,3.39666359008075 2.55930013992144,3.24670004551661 2.30359581247155,3.11342592592593 2.05092592592593,2.99823201672314 1.80154335035992,2.90250910332271 1.55570095584889,2.8276479711391 1.31365161246818,2.77503940558674 1.07564819029316,2.74607419208011 0.84194355939918,2.74214311603365 0.612790589861594,2.76457901346955 0.38843161550262,2.8133818843878 0.168866636322256,2.88721889276623 -0.046146681501713,2.98469925319038 -0.256861208044643,3.10443218024579 -0.463529813381887,3.24502688851802 -0.666405367588803,3.4050925925926 -0.865740740740744,3.58323850705508 -1.06178880291307,3.77807384649101 -1.25480242418113,3.98820782548594 -1.44503447462028,4.21224965862541 -1.63273782430588,4.44880856049496 -1.81816534331328,4.69649374568015 -2.00156990171784,4.95391442876651 -2.18320436959491,5.2196798243396 -2.36332161701985,5.49239914698496 -2.54217451406801,5.77068161128813 -2.72001593081475,6.05313643183467 -2.89709873733543,6.33837282321012 -3.0736758037054,6.625 -3.25)'): + if ogrtest.check_feature_geometry( + feat, + "LINESTRING (5.75 5.5,5.5082446180819 5.22760624757667,5.26788002157825 4.95546536522868,5.03029699590351 4.68383022303141,4.79688632647213 4.4129536910602,4.56903879869856 4.14308863939042,4.34814519799727 3.87448793809741,4.1355963097827 3.60740445725653,3.93278291946931 3.34209106694314,3.74109581247155 3.07880063723259,3.56192577420388 2.81778603820024,3.39666359008075 2.55930013992144,3.24670004551661 2.30359581247155,3.11342592592593 2.05092592592593,2.99823201672314 1.80154335035992,2.90250910332271 1.55570095584889,2.8276479711391 1.31365161246818,2.77503940558674 1.07564819029316,2.74607419208011 0.84194355939918,2.74214311603365 0.612790589861594,2.76457901346955 0.38843161550262,2.8133818843878 0.168866636322256,2.88721889276623 -0.046146681501713,2.98469925319038 -0.256861208044643,3.10443218024579 -0.463529813381887,3.24502688851802 -0.666405367588803,3.4050925925926 -0.865740740740744,3.58323850705508 -1.06178880291307,3.77807384649101 -1.25480242418113,3.98820782548594 -1.44503447462028,4.21224965862541 -1.63273782430588,4.44880856049496 -1.81816534331328,4.69649374568015 -2.00156990171784,4.95391442876651 -2.18320436959491,5.2196798243396 -2.36332161701985,5.49239914698496 -2.54217451406801,5.77068161128813 -2.72001593081475,6.05313643183467 -2.89709873733543,6.33837282321012 -3.0736758037054,6.625 -3.25)", + ): feat.DumpReadable() pytest.fail() -# OGRFeature(entities):67 -# EntityHandle (String) = 20A -# POINT Z (9.625 1.75 -1.51554445662277) + # OGRFeature(entities):67 + # EntityHandle (String) = 20A + # POINT Z (9.625 1.75 -1.51554445662277) feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT Z (9.625 1.75 -1.51554445662277)'): + if ogrtest.check_feature_geometry(feat, "POINT Z (9.625 1.75 -1.51554445662277)"): feat.DumpReadable() pytest.fail() @@ -2273,86 +2736,115 @@ def test_ogr_dxf_32(): def test_ogr_dxf_33(): - gdal.SetConfigOption('DXF_3D_EXTENSIBLE_MODE', 'TRUE') - ds = ogr.Open('data/dxf/3d.dxf') - gdal.SetConfigOption('DXF_3D_EXTENSIBLE_MODE', None) + gdal.SetConfigOption("DXF_3D_EXTENSIBLE_MODE", "TRUE") + ds = ogr.Open("data/dxf/3d.dxf") + gdal.SetConfigOption("DXF_3D_EXTENSIBLE_MODE", None) layer = ds.GetLayer(0) # Polyface mesh (POLYLINE) feat = layer.GetNextFeature() - assert feat.Layer == '0' + assert feat.Layer == "0" geom = feat.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbPolyhedralSurfaceZ, \ - ('did not get expected geometry type; got %s instead of wkbPolyhedralSurface' % geom.GetGeometryType()) + assert geom.GetGeometryType() == ogr.wkbPolyhedralSurfaceZ, ( + "did not get expected geometry type; got %s instead of wkbPolyhedralSurface" + % geom.GetGeometryType() + ) wkt_string = geom.ExportToIsoWkt() - wkt_string_expected = 'POLYHEDRALSURFACE Z (((0 0 0,1 0 0,1 1 0,0 1 0,0 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((1 1 0,1 1 1,0 1 1,0 1 0,1 1 0)),((0 0 0,0 1 0,0 1 1,0 0 1,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))' + wkt_string_expected = "POLYHEDRALSURFACE Z (((0 0 0,1 0 0,1 1 0,0 1 0,0 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((1 1 0,1 1 1,0 1 1,0 1 0,1 1 0)),((0 0 0,0 1 0,0 1 1,0 0 1,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))" if wkt_string != wkt_string_expected: feat.DumpReadable() - pytest.fail('wrong geometry for polyface mesh') + pytest.fail("wrong geometry for polyface mesh") faces = geom.GetGeometryCount() - assert faces == 6, \ - ('did not get expected number of faces, got %d instead of %d' % (faces, 6)) + assert faces == 6, "did not get expected number of faces, got %d instead of %d" % ( + faces, + 6, + ) # Cylinder (CIRCLE with thickness) feat = layer.GetNextFeature() - assert (not ogrtest.check_feature_geometry(feat, 'POLYHEDRALSURFACE Z (((2.8 -0.0 1e-31,2.79902562010393 -0.0 -0.0279025894976501,2.79610722749663 -0.0 -0.0556692403840262,2.79125904029352 -0.0 -0.0831646763271037,2.78450467837533 -0.0 -0.1102549423268,2.77587704831436 -0.0 -0.136808057330267,2.76541818305704 -0.0 -0.16269465723032,2.75317903714357 -0.0 -0.187788625114356,2.73921923846257 -0.0 -0.211967705693282,2.72360679774998 0.0 -0.235114100916989,2.70641777724759 0.0 -0.257115043874616,2.68773592013546 0.0 -0.277863348183599,2.66765224254354 0.0 -0.297257930190958,2.64626459013026 0.0 -0.315204301442689,2.6236771613883 0.0 -0.331615029022017,2.6 0.0 -0.346410161513775,2.57534845871563 0.0 -0.359517618519667,2.54984263736636 0.0 -0.370873541826715,2.52360679774998 0.0 -0.380422606518061,2.49676875823987 0.0 -0.388118290510399,2.46945927106677 0.0 -0.393923101204883,2.44181138530706 0.0 -0.397808758147309,2.413959798681 0.0 -0.399756330807638,2.386040201319 0.0 -0.399756330807638,2.35818861469294 0.0 -0.397808758147309,2.33054072893323 0.0 -0.393923101204883,2.30323124176013 0.0 -0.388118290510399,2.27639320225002 0.0 -0.380422606518061,2.25015736263363 0.0 -0.370873541826715,2.22465154128437 0.0 -0.359517618519667,2.2 0.0 -0.346410161513776,2.1763228386117 0.0 -0.331615029022017,2.15373540986974 0.0 -0.315204301442689,2.13234775745646 0.0 -0.297257930190958,2.11226407986454 0.0 -0.277863348183599,2.09358222275241 0.0 -0.257115043874616,2.07639320225002 0.0 -0.235114100916989,2.06078076153743 0.0 -0.211967705693282,2.04682096285643 0.0 -0.187788625114356,2.03458181694296 0.0 -0.16269465723032,2.02412295168564 0.0 -0.136808057330268,2.01549532162467 0.0 -0.1102549423268,2.00874095970648 0.0 -0.0831646763271037,2.00389277250337 0.0 -0.0556692403840263,2.00097437989607 0.0 -0.0279025894976502,' + - '2.0 0.0 -4.8985871965894e-17,2.00097437989607 0.0 0.0279025894976499,2.00389277250337 0.0 0.0556692403840262,2.00874095970648 0.0 0.0831646763271036,2.01549532162467 0.0 0.1102549423268,2.02412295168564 0.0 0.136808057330267,2.03458181694296 0.0 0.16269465723032,2.04682096285643 0.0 0.187788625114356,2.06078076153743 0.0 0.211967705693282,2.07639320225002 0.0 0.235114100916989,2.09358222275241 0.0 0.257115043874616,2.11226407986454 0.0 0.277863348183599,2.13234775745646 0.0 0.297257930190958,2.15373540986974 0.0 0.315204301442689,2.1763228386117 -0.0 0.331615029022017,2.2 -0.0 0.346410161513775,2.22465154128437 -0.0 0.359517618519667,2.25015736263363 -0.0 0.370873541826715,2.27639320225002 -0.0 0.380422606518061,2.30323124176013 -0.0 0.388118290510399,2.33054072893323 -0.0 0.393923101204883,2.35818861469294 -0.0 0.397808758147309,2.386040201319 -0.0 0.399756330807638,2.413959798681 -0.0 0.399756330807638,2.44181138530706 -0.0 0.397808758147309,2.46945927106677 -0.0 0.393923101204883,2.49676875823987 -0.0 0.388118290510399,2.52360679774998 -0.0 0.380422606518061,2.54984263736636 -0.0 0.370873541826715,2.57534845871563 -0.0 0.359517618519667,2.6 -0.0 0.346410161513775,2.6236771613883 -0.0 0.331615029022017,2.64626459013026 -0.0 0.315204301442689,2.66765224254354 -0.0 0.297257930190958,2.68773592013546 -0.0 0.277863348183599,2.70641777724759 -0.0 0.257115043874616,2.72360679774998 -0.0 0.235114100916989,2.73921923846257 -0.0 0.211967705693282,2.75317903714357 -0.0 0.187788625114356,2.76541818305704 -0.0 0.16269465723032,2.77587704831436 -0.0 0.136808057330267,2.78450467837533 -0.0 0.1102549423268,2.79125904029352 -0.0 0.0831646763271039,2.79610722749663 -0.0 0.0556692403840264,2.79902562010393 -0.0 0.0279025894976499,2.8 -0.0 1e-31)),' + - '((2.8 1.8 3.6e-16,2.79902562010393 1.8 -0.0279025894976498,2.79610722749663 1.8 -0.0556692403840258,2.79125904029352 1.8 -0.0831646763271034,2.78450467837533 1.8 -0.110254942326799,2.77587704831436 1.8 -0.136808057330267,2.76541818305704 1.8 -0.16269465723032,2.75317903714357 1.8 -0.187788625114356,2.73921923846257 1.8 -0.211967705693282,2.72360679774998 1.8 -0.235114100916989,2.70641777724759 1.8 -0.257115043874615,2.68773592013546 1.8 -0.277863348183599,2.66765224254354 1.8 -0.297257930190957,2.64626459013026 1.8 -0.315204301442689,2.6236771613883 1.8 -0.331615029022016,2.6 1.8 -0.346410161513775,2.57534845871563 1.8 -0.359517618519667,2.54984263736636 1.8 -0.370873541826715,2.52360679774998 1.8 -0.380422606518061,2.49676875823987 1.8 -0.388118290510398,2.46945927106677 1.8 -0.393923101204883,2.44181138530706 1.8 -0.397808758147309,2.413959798681 1.8 -0.399756330807638,2.386040201319 1.8 -0.399756330807638,2.35818861469294 1.8 -0.397808758147309,2.33054072893323 1.8 -0.393923101204883,2.30323124176013 1.8 -0.388118290510398,2.27639320225002 1.8 -0.380422606518061,2.25015736263363 1.8 -0.370873541826715,2.22465154128437 1.8 -0.359517618519666,2.2 1.8 -0.346410161513775,2.1763228386117 1.8 -0.331615029022016,2.15373540986974 1.8 -0.315204301442689,2.13234775745646 1.8 -0.297257930190957,2.11226407986454 1.8 -0.277863348183599,2.09358222275241 1.8 -0.257115043874615,2.07639320225002 1.8 -0.235114100916989,2.06078076153743 1.8 -0.211967705693282,2.04682096285643 1.8 -0.187788625114356,2.03458181694296 1.8 -0.16269465723032,2.02412295168564 1.8 -0.136808057330267,2.01549532162467 1.8 -0.1102549423268,2.00874095970648 1.8 -0.0831646763271034,2.00389277250337 1.8 -0.0556692403840259,2.00097437989607 1.8 -0.0279025894976499,2.0 1.8 3.11014128034106e-16,' + - '2.00097437989607 1.8 0.0279025894976503,2.00389277250337 1.8 0.0556692403840266,2.00874095970648 1.8 0.083164676327104,2.01549532162467 1.8 0.1102549423268,2.02412295168564 1.8 0.136808057330268,2.03458181694296 1.8 0.16269465723032,2.04682096285643 1.8 0.187788625114357,2.06078076153743 1.8 0.211967705693282,2.07639320225002 1.8 0.23511410091699,2.09358222275241 1.8 0.257115043874616,2.11226407986454 1.8 0.277863348183599,2.13234775745646 1.8 0.297257930190958,2.15373540986974 1.8 0.315204301442689,2.1763228386117 1.8 0.331615029022017,2.2 1.8 0.346410161513776,2.22465154128437 1.8 0.359517618519667,2.25015736263363 1.8 0.370873541826715,2.27639320225002 1.8 0.380422606518062,2.30323124176013 1.8 0.388118290510399,2.33054072893323 1.8 0.393923101204884,2.35818861469294 1.8 0.39780875814731,2.386040201319 1.8 0.399756330807639,2.413959798681 1.8 0.399756330807639,2.44181138530706 1.8 0.39780875814731,2.46945927106677 1.8 0.393923101204884,2.49676875823987 1.8 0.388118290510399,2.52360679774998 1.8 0.380422606518062,2.54984263736636 1.8 0.370873541826715,2.57534845871563 1.8 0.359517618519667,2.6 1.8 0.346410161513776,2.6236771613883 1.8 0.331615029022017,2.64626459013026 1.8 0.315204301442689,2.66765224254354 1.8 0.297257930190958,2.68773592013546 1.8 0.277863348183599,2.70641777724759 1.8 0.257115043874616,2.72360679774998 1.8 0.23511410091699,2.73921923846257 1.8 0.211967705693283,2.75317903714357 1.8 0.187788625114357,2.76541818305704 1.8 0.16269465723032,2.77587704831436 1.8 0.136808057330268,2.78450467837533 1.8 0.1102549423268,2.79125904029352 1.8 0.0831646763271043,2.79610722749663 1.8 0.0556692403840267,2.79902562010393 1.8 0.0279025894976503,2.8 1.8 3.6e-16)),' + - '((2.0 0.0 -4.8985871965894e-17,2.00097437989607 0.0 -0.0279025894976502,2.00389277250337 0.0 -0.0556692403840263,2.00874095970648 0.0 -0.0831646763271037,2.01549532162467 0.0 -0.1102549423268,2.02412295168564 0.0 -0.136808057330268,2.03458181694296 0.0 -0.16269465723032,2.04682096285643 0.0 -0.187788625114356,2.06078076153743 0.0 -0.211967705693282,2.07639320225002 0.0 -0.235114100916989,2.09358222275241 0.0 -0.257115043874616,2.11226407986454 0.0 -0.277863348183599,2.13234775745646 0.0 -0.297257930190958,2.15373540986974 0.0 -0.315204301442689,2.1763228386117 0.0 -0.331615029022017,2.2 0.0 -0.346410161513776,2.22465154128437 0.0 -0.359517618519667,2.25015736263363 0.0 -0.370873541826715,2.27639320225002 0.0 -0.380422606518061,2.30323124176013 0.0 -0.388118290510399,2.33054072893323 0.0 -0.393923101204883,2.35818861469294 0.0 -0.397808758147309,2.386040201319 0.0 -0.399756330807638,2.413959798681 0.0 -0.399756330807638,2.44181138530706 0.0 -0.397808758147309,2.46945927106677 0.0 -0.393923101204883,2.49676875823987 0.0 -0.388118290510399,2.52360679774998 0.0 -0.380422606518061,2.54984263736636 0.0 -0.370873541826715,2.57534845871563 0.0 -0.359517618519667,2.6 0.0 -0.346410161513775,2.6236771613883 0.0 -0.331615029022017,2.64626459013026 0.0 -0.315204301442689,2.66765224254354 0.0 -0.297257930190958,2.68773592013546 0.0 -0.277863348183599,2.70641777724759 0.0 -0.257115043874616,2.72360679774998 0.0 -0.235114100916989,2.73921923846257 -0.0 -0.211967705693282,2.75317903714357 -0.0 -0.187788625114356,2.76541818305704 -0.0 -0.16269465723032,2.77587704831436 -0.0 -0.136808057330267,2.78450467837533 -0.0 -0.1102549423268,2.79125904029352 -0.0 -0.0831646763271037,2.79610722749663 -0.0 -0.0556692403840262,2.79902562010393 -0.0 -0.0279025894976501,' + - '2.8 -0.0 1e-31,2.8 1.8 3.6e-16,2.79902562010393 1.8 -0.0279025894976498,2.79610722749663 1.8 -0.0556692403840258,2.79125904029352 1.8 -0.0831646763271034,2.78450467837533 1.8 -0.110254942326799,2.77587704831436 1.8 -0.136808057330267,2.76541818305704 1.8 -0.16269465723032,2.75317903714357 1.8 -0.187788625114356,2.73921923846257 1.8 -0.211967705693282,2.72360679774998 1.8 -0.235114100916989,2.70641777724759 1.8 -0.257115043874615,2.68773592013546 1.8 -0.277863348183599,2.66765224254354 1.8 -0.297257930190957,2.64626459013026 1.8 -0.315204301442689,2.6236771613883 1.8 -0.331615029022016,2.6 1.8 -0.346410161513775,2.57534845871563 1.8 -0.359517618519667,2.54984263736636 1.8 -0.370873541826715,2.52360679774998 1.8 -0.380422606518061,2.49676875823987 1.8 -0.388118290510398,2.46945927106677 1.8 -0.393923101204883,2.44181138530706 1.8 -0.397808758147309,2.413959798681 1.8 -0.399756330807638,2.386040201319 1.8 -0.399756330807638,2.35818861469294 1.8 -0.397808758147309,2.33054072893323 1.8 -0.393923101204883,2.30323124176013 1.8 -0.388118290510398,2.27639320225002 1.8 -0.380422606518061,2.25015736263363 1.8 -0.370873541826715,2.22465154128437 1.8 -0.359517618519666,2.2 1.8 -0.346410161513775,2.1763228386117 1.8 -0.331615029022016,2.15373540986974 1.8 -0.315204301442689,2.13234775745646 1.8 -0.297257930190957,2.11226407986454 1.8 -0.277863348183599,2.09358222275241 1.8 -0.257115043874615,2.07639320225002 1.8 -0.235114100916989,2.06078076153743 1.8 -0.211967705693282,2.04682096285643 1.8 -0.187788625114356,2.03458181694296 1.8 -0.16269465723032,2.02412295168564 1.8 -0.136808057330267,2.01549532162467 1.8 -0.1102549423268,2.00874095970648 1.8 -0.0831646763271034,2.00389277250337 1.8 -0.0556692403840259,2.00097437989607 1.8 -0.0279025894976499,2.0 1.8 3.11014128034106e-16,2.0 0.0 -4.8985871965894e-17)),' + - '((2.8 -0.0 1e-31,2.79902562010393 -0.0 0.0279025894976499,2.79610722749663 -0.0 0.0556692403840264,2.79125904029352 -0.0 0.0831646763271039,2.78450467837533 -0.0 0.1102549423268,2.77587704831436 -0.0 0.136808057330267,2.76541818305704 -0.0 0.16269465723032,2.75317903714357 -0.0 0.187788625114356,2.73921923846257 -0.0 0.211967705693282,2.72360679774998 -0.0 0.235114100916989,2.70641777724759 -0.0 0.257115043874616,2.68773592013546 -0.0 0.277863348183599,2.66765224254354 -0.0 0.297257930190958,2.64626459013026 -0.0 0.315204301442689,2.6236771613883 -0.0 0.331615029022017,2.6 -0.0 0.346410161513775,2.57534845871563 -0.0 0.359517618519667,2.54984263736636 -0.0 0.370873541826715,2.52360679774998 -0.0 0.380422606518061,2.49676875823987 -0.0 0.388118290510399,2.46945927106677 -0.0 0.393923101204883,2.44181138530706 -0.0 0.397808758147309,2.413959798681 -0.0 0.399756330807638,2.386040201319 -0.0 0.399756330807638,2.35818861469294 -0.0 0.397808758147309,2.33054072893323 -0.0 0.393923101204883,2.30323124176013 -0.0 0.388118290510399,2.27639320225002 -0.0 0.380422606518061,2.25015736263363 -0.0 0.370873541826715,2.22465154128437 -0.0 0.359517618519667,2.2 -0.0 0.346410161513775,2.1763228386117 -0.0 0.331615029022017,2.15373540986974 0.0 0.315204301442689,2.13234775745646 0.0 0.297257930190958,2.11226407986454 0.0 0.277863348183599,2.09358222275241 0.0 0.257115043874616,2.07639320225002 0.0 0.235114100916989,2.06078076153743 0.0 0.211967705693282,2.04682096285643 0.0 0.187788625114356,2.03458181694296 0.0 0.16269465723032,2.02412295168564 0.0 0.136808057330267,2.01549532162467 0.0 0.1102549423268,2.00874095970648 0.0 0.0831646763271036,2.00389277250337 0.0 0.0556692403840262,2.00097437989607 0.0 0.0279025894976499,' + - '2.0 0.0 -4.8985871965894e-17,2.0 1.8 3.11014128034106e-16,2.00097437989607 1.8 0.0279025894976503,2.00389277250337 1.8 0.0556692403840266,2.00874095970648 1.8 0.083164676327104,2.01549532162467 1.8 0.1102549423268,2.02412295168564 1.8 0.136808057330268,2.03458181694296 1.8 0.16269465723032,2.04682096285643 1.8 0.187788625114357,2.06078076153743 1.8 0.211967705693282,2.07639320225002 1.8 0.23511410091699,2.09358222275241 1.8 0.257115043874616,2.11226407986454 1.8 0.277863348183599,2.13234775745646 1.8 0.297257930190958,2.15373540986974 1.8 0.315204301442689,2.1763228386117 1.8 0.331615029022017,2.2 1.8 0.346410161513776,2.22465154128437 1.8 0.359517618519667,2.25015736263363 1.8 0.370873541826715,2.27639320225002 1.8 0.380422606518062,2.30323124176013 1.8 0.388118290510399,2.33054072893323 1.8 0.393923101204884,2.35818861469294 1.8 0.39780875814731,2.386040201319 1.8 0.399756330807639,2.413959798681 1.8 0.399756330807639,2.44181138530706 1.8 0.39780875814731,2.46945927106677 1.8 0.393923101204884,2.49676875823987 1.8 0.388118290510399,2.52360679774998 1.8 0.380422606518062,2.54984263736636 1.8 0.370873541826715,2.57534845871563 1.8 0.359517618519667,2.6 1.8 0.346410161513776,2.6236771613883 1.8 0.331615029022017,2.64626459013026 1.8 0.315204301442689,2.66765224254354 1.8 0.297257930190958,2.68773592013546 1.8 0.277863348183599,2.70641777724759 1.8 0.257115043874616,2.72360679774998 1.8 0.23511410091699,2.73921923846257 1.8 0.211967705693283,2.75317903714357 1.8 0.187788625114357,2.76541818305704 1.8 0.16269465723032,2.77587704831436 1.8 0.136808057330268,2.78450467837533 1.8 0.1102549423268,2.79125904029352 1.8 0.0831646763271043,2.79610722749663 1.8 0.0556692403840267,2.79902562010393 1.8 0.0279025894976503,2.8 1.8 3.6e-16,2.8 -0.0 1e-31)))')), \ - 'wrong geometry for cylinder' + assert not ogrtest.check_feature_geometry( + feat, + "POLYHEDRALSURFACE Z (((2.8 -0.0 1e-31,2.79902562010393 -0.0 -0.0279025894976501,2.79610722749663 -0.0 -0.0556692403840262,2.79125904029352 -0.0 -0.0831646763271037,2.78450467837533 -0.0 -0.1102549423268,2.77587704831436 -0.0 -0.136808057330267,2.76541818305704 -0.0 -0.16269465723032,2.75317903714357 -0.0 -0.187788625114356,2.73921923846257 -0.0 -0.211967705693282,2.72360679774998 0.0 -0.235114100916989,2.70641777724759 0.0 -0.257115043874616,2.68773592013546 0.0 -0.277863348183599,2.66765224254354 0.0 -0.297257930190958,2.64626459013026 0.0 -0.315204301442689,2.6236771613883 0.0 -0.331615029022017,2.6 0.0 -0.346410161513775,2.57534845871563 0.0 -0.359517618519667,2.54984263736636 0.0 -0.370873541826715,2.52360679774998 0.0 -0.380422606518061,2.49676875823987 0.0 -0.388118290510399,2.46945927106677 0.0 -0.393923101204883,2.44181138530706 0.0 -0.397808758147309,2.413959798681 0.0 -0.399756330807638,2.386040201319 0.0 -0.399756330807638,2.35818861469294 0.0 -0.397808758147309,2.33054072893323 0.0 -0.393923101204883,2.30323124176013 0.0 -0.388118290510399,2.27639320225002 0.0 -0.380422606518061,2.25015736263363 0.0 -0.370873541826715,2.22465154128437 0.0 -0.359517618519667,2.2 0.0 -0.346410161513776,2.1763228386117 0.0 -0.331615029022017,2.15373540986974 0.0 -0.315204301442689,2.13234775745646 0.0 -0.297257930190958,2.11226407986454 0.0 -0.277863348183599,2.09358222275241 0.0 -0.257115043874616,2.07639320225002 0.0 -0.235114100916989,2.06078076153743 0.0 -0.211967705693282,2.04682096285643 0.0 -0.187788625114356,2.03458181694296 0.0 -0.16269465723032,2.02412295168564 0.0 -0.136808057330268,2.01549532162467 0.0 -0.1102549423268,2.00874095970648 0.0 -0.0831646763271037,2.00389277250337 0.0 -0.0556692403840263,2.00097437989607 0.0 -0.0279025894976502," + + "2.0 0.0 -4.8985871965894e-17,2.00097437989607 0.0 0.0279025894976499,2.00389277250337 0.0 0.0556692403840262,2.00874095970648 0.0 0.0831646763271036,2.01549532162467 0.0 0.1102549423268,2.02412295168564 0.0 0.136808057330267,2.03458181694296 0.0 0.16269465723032,2.04682096285643 0.0 0.187788625114356,2.06078076153743 0.0 0.211967705693282,2.07639320225002 0.0 0.235114100916989,2.09358222275241 0.0 0.257115043874616,2.11226407986454 0.0 0.277863348183599,2.13234775745646 0.0 0.297257930190958,2.15373540986974 0.0 0.315204301442689,2.1763228386117 -0.0 0.331615029022017,2.2 -0.0 0.346410161513775,2.22465154128437 -0.0 0.359517618519667,2.25015736263363 -0.0 0.370873541826715,2.27639320225002 -0.0 0.380422606518061,2.30323124176013 -0.0 0.388118290510399,2.33054072893323 -0.0 0.393923101204883,2.35818861469294 -0.0 0.397808758147309,2.386040201319 -0.0 0.399756330807638,2.413959798681 -0.0 0.399756330807638,2.44181138530706 -0.0 0.397808758147309,2.46945927106677 -0.0 0.393923101204883,2.49676875823987 -0.0 0.388118290510399,2.52360679774998 -0.0 0.380422606518061,2.54984263736636 -0.0 0.370873541826715,2.57534845871563 -0.0 0.359517618519667,2.6 -0.0 0.346410161513775,2.6236771613883 -0.0 0.331615029022017,2.64626459013026 -0.0 0.315204301442689,2.66765224254354 -0.0 0.297257930190958,2.68773592013546 -0.0 0.277863348183599,2.70641777724759 -0.0 0.257115043874616,2.72360679774998 -0.0 0.235114100916989,2.73921923846257 -0.0 0.211967705693282,2.75317903714357 -0.0 0.187788625114356,2.76541818305704 -0.0 0.16269465723032,2.77587704831436 -0.0 0.136808057330267,2.78450467837533 -0.0 0.1102549423268,2.79125904029352 -0.0 0.0831646763271039,2.79610722749663 -0.0 0.0556692403840264,2.79902562010393 -0.0 0.0279025894976499,2.8 -0.0 1e-31))," + + "((2.8 1.8 3.6e-16,2.79902562010393 1.8 -0.0279025894976498,2.79610722749663 1.8 -0.0556692403840258,2.79125904029352 1.8 -0.0831646763271034,2.78450467837533 1.8 -0.110254942326799,2.77587704831436 1.8 -0.136808057330267,2.76541818305704 1.8 -0.16269465723032,2.75317903714357 1.8 -0.187788625114356,2.73921923846257 1.8 -0.211967705693282,2.72360679774998 1.8 -0.235114100916989,2.70641777724759 1.8 -0.257115043874615,2.68773592013546 1.8 -0.277863348183599,2.66765224254354 1.8 -0.297257930190957,2.64626459013026 1.8 -0.315204301442689,2.6236771613883 1.8 -0.331615029022016,2.6 1.8 -0.346410161513775,2.57534845871563 1.8 -0.359517618519667,2.54984263736636 1.8 -0.370873541826715,2.52360679774998 1.8 -0.380422606518061,2.49676875823987 1.8 -0.388118290510398,2.46945927106677 1.8 -0.393923101204883,2.44181138530706 1.8 -0.397808758147309,2.413959798681 1.8 -0.399756330807638,2.386040201319 1.8 -0.399756330807638,2.35818861469294 1.8 -0.397808758147309,2.33054072893323 1.8 -0.393923101204883,2.30323124176013 1.8 -0.388118290510398,2.27639320225002 1.8 -0.380422606518061,2.25015736263363 1.8 -0.370873541826715,2.22465154128437 1.8 -0.359517618519666,2.2 1.8 -0.346410161513775,2.1763228386117 1.8 -0.331615029022016,2.15373540986974 1.8 -0.315204301442689,2.13234775745646 1.8 -0.297257930190957,2.11226407986454 1.8 -0.277863348183599,2.09358222275241 1.8 -0.257115043874615,2.07639320225002 1.8 -0.235114100916989,2.06078076153743 1.8 -0.211967705693282,2.04682096285643 1.8 -0.187788625114356,2.03458181694296 1.8 -0.16269465723032,2.02412295168564 1.8 -0.136808057330267,2.01549532162467 1.8 -0.1102549423268,2.00874095970648 1.8 -0.0831646763271034,2.00389277250337 1.8 -0.0556692403840259,2.00097437989607 1.8 -0.0279025894976499,2.0 1.8 3.11014128034106e-16," + + "2.00097437989607 1.8 0.0279025894976503,2.00389277250337 1.8 0.0556692403840266,2.00874095970648 1.8 0.083164676327104,2.01549532162467 1.8 0.1102549423268,2.02412295168564 1.8 0.136808057330268,2.03458181694296 1.8 0.16269465723032,2.04682096285643 1.8 0.187788625114357,2.06078076153743 1.8 0.211967705693282,2.07639320225002 1.8 0.23511410091699,2.09358222275241 1.8 0.257115043874616,2.11226407986454 1.8 0.277863348183599,2.13234775745646 1.8 0.297257930190958,2.15373540986974 1.8 0.315204301442689,2.1763228386117 1.8 0.331615029022017,2.2 1.8 0.346410161513776,2.22465154128437 1.8 0.359517618519667,2.25015736263363 1.8 0.370873541826715,2.27639320225002 1.8 0.380422606518062,2.30323124176013 1.8 0.388118290510399,2.33054072893323 1.8 0.393923101204884,2.35818861469294 1.8 0.39780875814731,2.386040201319 1.8 0.399756330807639,2.413959798681 1.8 0.399756330807639,2.44181138530706 1.8 0.39780875814731,2.46945927106677 1.8 0.393923101204884,2.49676875823987 1.8 0.388118290510399,2.52360679774998 1.8 0.380422606518062,2.54984263736636 1.8 0.370873541826715,2.57534845871563 1.8 0.359517618519667,2.6 1.8 0.346410161513776,2.6236771613883 1.8 0.331615029022017,2.64626459013026 1.8 0.315204301442689,2.66765224254354 1.8 0.297257930190958,2.68773592013546 1.8 0.277863348183599,2.70641777724759 1.8 0.257115043874616,2.72360679774998 1.8 0.23511410091699,2.73921923846257 1.8 0.211967705693283,2.75317903714357 1.8 0.187788625114357,2.76541818305704 1.8 0.16269465723032,2.77587704831436 1.8 0.136808057330268,2.78450467837533 1.8 0.1102549423268,2.79125904029352 1.8 0.0831646763271043,2.79610722749663 1.8 0.0556692403840267,2.79902562010393 1.8 0.0279025894976503,2.8 1.8 3.6e-16))," + + "((2.0 0.0 -4.8985871965894e-17,2.00097437989607 0.0 -0.0279025894976502,2.00389277250337 0.0 -0.0556692403840263,2.00874095970648 0.0 -0.0831646763271037,2.01549532162467 0.0 -0.1102549423268,2.02412295168564 0.0 -0.136808057330268,2.03458181694296 0.0 -0.16269465723032,2.04682096285643 0.0 -0.187788625114356,2.06078076153743 0.0 -0.211967705693282,2.07639320225002 0.0 -0.235114100916989,2.09358222275241 0.0 -0.257115043874616,2.11226407986454 0.0 -0.277863348183599,2.13234775745646 0.0 -0.297257930190958,2.15373540986974 0.0 -0.315204301442689,2.1763228386117 0.0 -0.331615029022017,2.2 0.0 -0.346410161513776,2.22465154128437 0.0 -0.359517618519667,2.25015736263363 0.0 -0.370873541826715,2.27639320225002 0.0 -0.380422606518061,2.30323124176013 0.0 -0.388118290510399,2.33054072893323 0.0 -0.393923101204883,2.35818861469294 0.0 -0.397808758147309,2.386040201319 0.0 -0.399756330807638,2.413959798681 0.0 -0.399756330807638,2.44181138530706 0.0 -0.397808758147309,2.46945927106677 0.0 -0.393923101204883,2.49676875823987 0.0 -0.388118290510399,2.52360679774998 0.0 -0.380422606518061,2.54984263736636 0.0 -0.370873541826715,2.57534845871563 0.0 -0.359517618519667,2.6 0.0 -0.346410161513775,2.6236771613883 0.0 -0.331615029022017,2.64626459013026 0.0 -0.315204301442689,2.66765224254354 0.0 -0.297257930190958,2.68773592013546 0.0 -0.277863348183599,2.70641777724759 0.0 -0.257115043874616,2.72360679774998 0.0 -0.235114100916989,2.73921923846257 -0.0 -0.211967705693282,2.75317903714357 -0.0 -0.187788625114356,2.76541818305704 -0.0 -0.16269465723032,2.77587704831436 -0.0 -0.136808057330267,2.78450467837533 -0.0 -0.1102549423268,2.79125904029352 -0.0 -0.0831646763271037,2.79610722749663 -0.0 -0.0556692403840262,2.79902562010393 -0.0 -0.0279025894976501," + + "2.8 -0.0 1e-31,2.8 1.8 3.6e-16,2.79902562010393 1.8 -0.0279025894976498,2.79610722749663 1.8 -0.0556692403840258,2.79125904029352 1.8 -0.0831646763271034,2.78450467837533 1.8 -0.110254942326799,2.77587704831436 1.8 -0.136808057330267,2.76541818305704 1.8 -0.16269465723032,2.75317903714357 1.8 -0.187788625114356,2.73921923846257 1.8 -0.211967705693282,2.72360679774998 1.8 -0.235114100916989,2.70641777724759 1.8 -0.257115043874615,2.68773592013546 1.8 -0.277863348183599,2.66765224254354 1.8 -0.297257930190957,2.64626459013026 1.8 -0.315204301442689,2.6236771613883 1.8 -0.331615029022016,2.6 1.8 -0.346410161513775,2.57534845871563 1.8 -0.359517618519667,2.54984263736636 1.8 -0.370873541826715,2.52360679774998 1.8 -0.380422606518061,2.49676875823987 1.8 -0.388118290510398,2.46945927106677 1.8 -0.393923101204883,2.44181138530706 1.8 -0.397808758147309,2.413959798681 1.8 -0.399756330807638,2.386040201319 1.8 -0.399756330807638,2.35818861469294 1.8 -0.397808758147309,2.33054072893323 1.8 -0.393923101204883,2.30323124176013 1.8 -0.388118290510398,2.27639320225002 1.8 -0.380422606518061,2.25015736263363 1.8 -0.370873541826715,2.22465154128437 1.8 -0.359517618519666,2.2 1.8 -0.346410161513775,2.1763228386117 1.8 -0.331615029022016,2.15373540986974 1.8 -0.315204301442689,2.13234775745646 1.8 -0.297257930190957,2.11226407986454 1.8 -0.277863348183599,2.09358222275241 1.8 -0.257115043874615,2.07639320225002 1.8 -0.235114100916989,2.06078076153743 1.8 -0.211967705693282,2.04682096285643 1.8 -0.187788625114356,2.03458181694296 1.8 -0.16269465723032,2.02412295168564 1.8 -0.136808057330267,2.01549532162467 1.8 -0.1102549423268,2.00874095970648 1.8 -0.0831646763271034,2.00389277250337 1.8 -0.0556692403840259,2.00097437989607 1.8 -0.0279025894976499,2.0 1.8 3.11014128034106e-16,2.0 0.0 -4.8985871965894e-17))," + + "((2.8 -0.0 1e-31,2.79902562010393 -0.0 0.0279025894976499,2.79610722749663 -0.0 0.0556692403840264,2.79125904029352 -0.0 0.0831646763271039,2.78450467837533 -0.0 0.1102549423268,2.77587704831436 -0.0 0.136808057330267,2.76541818305704 -0.0 0.16269465723032,2.75317903714357 -0.0 0.187788625114356,2.73921923846257 -0.0 0.211967705693282,2.72360679774998 -0.0 0.235114100916989,2.70641777724759 -0.0 0.257115043874616,2.68773592013546 -0.0 0.277863348183599,2.66765224254354 -0.0 0.297257930190958,2.64626459013026 -0.0 0.315204301442689,2.6236771613883 -0.0 0.331615029022017,2.6 -0.0 0.346410161513775,2.57534845871563 -0.0 0.359517618519667,2.54984263736636 -0.0 0.370873541826715,2.52360679774998 -0.0 0.380422606518061,2.49676875823987 -0.0 0.388118290510399,2.46945927106677 -0.0 0.393923101204883,2.44181138530706 -0.0 0.397808758147309,2.413959798681 -0.0 0.399756330807638,2.386040201319 -0.0 0.399756330807638,2.35818861469294 -0.0 0.397808758147309,2.33054072893323 -0.0 0.393923101204883,2.30323124176013 -0.0 0.388118290510399,2.27639320225002 -0.0 0.380422606518061,2.25015736263363 -0.0 0.370873541826715,2.22465154128437 -0.0 0.359517618519667,2.2 -0.0 0.346410161513775,2.1763228386117 -0.0 0.331615029022017,2.15373540986974 0.0 0.315204301442689,2.13234775745646 0.0 0.297257930190958,2.11226407986454 0.0 0.277863348183599,2.09358222275241 0.0 0.257115043874616,2.07639320225002 0.0 0.235114100916989,2.06078076153743 0.0 0.211967705693282,2.04682096285643 0.0 0.187788625114356,2.03458181694296 0.0 0.16269465723032,2.02412295168564 0.0 0.136808057330267,2.01549532162467 0.0 0.1102549423268,2.00874095970648 0.0 0.0831646763271036,2.00389277250337 0.0 0.0556692403840262,2.00097437989607 0.0 0.0279025894976499," + + "2.0 0.0 -4.8985871965894e-17,2.0 1.8 3.11014128034106e-16,2.00097437989607 1.8 0.0279025894976503,2.00389277250337 1.8 0.0556692403840266,2.00874095970648 1.8 0.083164676327104,2.01549532162467 1.8 0.1102549423268,2.02412295168564 1.8 0.136808057330268,2.03458181694296 1.8 0.16269465723032,2.04682096285643 1.8 0.187788625114357,2.06078076153743 1.8 0.211967705693282,2.07639320225002 1.8 0.23511410091699,2.09358222275241 1.8 0.257115043874616,2.11226407986454 1.8 0.277863348183599,2.13234775745646 1.8 0.297257930190958,2.15373540986974 1.8 0.315204301442689,2.1763228386117 1.8 0.331615029022017,2.2 1.8 0.346410161513776,2.22465154128437 1.8 0.359517618519667,2.25015736263363 1.8 0.370873541826715,2.27639320225002 1.8 0.380422606518062,2.30323124176013 1.8 0.388118290510399,2.33054072893323 1.8 0.393923101204884,2.35818861469294 1.8 0.39780875814731,2.386040201319 1.8 0.399756330807639,2.413959798681 1.8 0.399756330807639,2.44181138530706 1.8 0.39780875814731,2.46945927106677 1.8 0.393923101204884,2.49676875823987 1.8 0.388118290510399,2.52360679774998 1.8 0.380422606518062,2.54984263736636 1.8 0.370873541826715,2.57534845871563 1.8 0.359517618519667,2.6 1.8 0.346410161513776,2.6236771613883 1.8 0.331615029022017,2.64626459013026 1.8 0.315204301442689,2.66765224254354 1.8 0.297257930190958,2.68773592013546 1.8 0.277863348183599,2.70641777724759 1.8 0.257115043874616,2.72360679774998 1.8 0.23511410091699,2.73921923846257 1.8 0.211967705693283,2.75317903714357 1.8 0.187788625114357,2.76541818305704 1.8 0.16269465723032,2.77587704831436 1.8 0.136808057330268,2.78450467837533 1.8 0.1102549423268,2.79125904029352 1.8 0.0831646763271043,2.79610722749663 1.8 0.0556692403840267,2.79902562010393 1.8 0.0279025894976503,2.8 1.8 3.6e-16,2.8 -0.0 1e-31)))", + ), "wrong geometry for cylinder" # 3DSOLID, plain feat = layer.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() - pytest.fail('geometry on first 3DSOLID was not empty') + pytest.fail("geometry on first 3DSOLID was not empty") - if feat.GetFieldAsBinary('ASMData') != b'ACIS BinaryFile(U\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x07\x10Autodesk AutoCAD\x07\x13ASM 221.0.0.1871 NT\x07\x18Sun Mar 04 15:10:20 2018\x06ffffff9@\x06\x8d\xed\xb5\xa0\xf7\xc6\xb0>\x06\xbb\xbd\xd7\xd9\xdf|\xdb=\r\tasmheader\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x07\x0c221.0.0.1871\x11\r\x04body\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x03\x00\x00\x00\x11\r\x04lump\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\x01\x00\x00\x00\x11\r\ttransform\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x14\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x11\r\x05shell\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x11\r\x04face\x0c\x06\x00\x00\x00\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x07\x00\x00\x00\x0b\x0b\x11\x0e\tpersubent\x0e\x10acadSolidHistory\r\x06attrib\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x04\x01\x00\x00\x00\x04\x02\x00\x00\x00\x04\x01\x00\x00\x00\x04\x00\x00\x00\x00\x11\x0e\x06sphere\r\x07surface\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xcd;\x7ff\x9e\xa0\xe6?\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x0b\x0b\x11\x0e\x03End\x0e\x02of\x0e\x03ASM\r\x04data': + if ( + feat.GetFieldAsBinary("ASMData") + != b"ACIS BinaryFile(U\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x07\x10Autodesk AutoCAD\x07\x13ASM 221.0.0.1871 NT\x07\x18Sun Mar 04 15:10:20 2018\x06ffffff9@\x06\x8d\xed\xb5\xa0\xf7\xc6\xb0>\x06\xbb\xbd\xd7\xd9\xdf|\xdb=\r\tasmheader\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x07\x0c221.0.0.1871\x11\r\x04body\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x03\x00\x00\x00\x11\r\x04lump\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\x01\x00\x00\x00\x11\r\ttransform\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x14\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x11\r\x05shell\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x11\r\x04face\x0c\x06\x00\x00\x00\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x07\x00\x00\x00\x0b\x0b\x11\x0e\tpersubent\x0e\x10acadSolidHistory\r\x06attrib\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x04\x01\x00\x00\x00\x04\x02\x00\x00\x00\x04\x01\x00\x00\x00\x04\x00\x00\x00\x00\x11\x0e\x06sphere\r\x07surface\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xcd;\x7ff\x9e\xa0\xe6?\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x0b\x0b\x11\x0e\x03End\x0e\x02of\x0e\x03ASM\r\x04data" + ): feat.DumpReadable() - pytest.fail('wrong ASMData on first 3DSOLID') + pytest.fail("wrong ASMData on first 3DSOLID") - if feat.GetField('ASMTransform') != [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]: + if feat.GetField("ASMTransform") != [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]: feat.DumpReadable() - pytest.fail('wrong ASMTransform on first 3DSOLID') + pytest.fail("wrong ASMTransform on first 3DSOLID") - if feat.GetStyleString() != 'BRUSH(fc:#000000)': + if feat.GetStyleString() != "BRUSH(fc:#000000)": feat.DumpReadable() - pytest.fail('wrong style string on first 3DSOLID') + pytest.fail("wrong style string on first 3DSOLID") # 3DSOLID inside a block feat = layer.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() - pytest.fail('geometry on second 3DSOLID was not empty') + pytest.fail("geometry on second 3DSOLID was not empty") - if feat.GetFieldAsBinary('ASMData') != b'ACIS BinaryFile(U\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x07\x10Autodesk AutoCAD\x07\x13ASM 221.0.0.1871 NT\x07\x18Sun Mar 04 15:10:20 2018\x06ffffff9@\x06\x8d\xed\xb5\xa0\xf7\xc6\xb0>\x06\xbb\xbd\xd7\xd9\xdf|\xdb=\r\tasmheader\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x07\x0c221.0.0.1871\x11\r\x04body\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x03\x00\x00\x00\x11\r\x04lump\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\x01\x00\x00\x00\x11\r\ttransform\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x11\r\x05shell\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x11\r\x04face\x0c\x06\x00\x00\x00\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x07\x00\x00\x00\x0b\x0b\x11\x0e\tpersubent\x0e\x10acadSolidHistory\r\x06attrib\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x04\x01\x00\x00\x00\x04\x04\x00\x00\x00\x04\x01\x00\x00\x00\x04\x00\x00\x00\x00\x11\x0e\x06sphere\r\x07surface\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00@\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x0b\x0b\x11\x0e\x03End\x0e\x02of\x0e\x03ASM\r\x04data': + if ( + feat.GetFieldAsBinary("ASMData") + != b"ACIS BinaryFile(U\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x07\x10Autodesk AutoCAD\x07\x13ASM 221.0.0.1871 NT\x07\x18Sun Mar 04 15:10:20 2018\x06ffffff9@\x06\x8d\xed\xb5\xa0\xf7\xc6\xb0>\x06\xbb\xbd\xd7\xd9\xdf|\xdb=\r\tasmheader\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x07\x0c221.0.0.1871\x11\r\x04body\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x03\x00\x00\x00\x11\r\x04lump\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\x01\x00\x00\x00\x11\r\ttransform\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x11\r\x05shell\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x02\x00\x00\x00\x11\r\x04face\x0c\x06\x00\x00\x00\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x04\x00\x00\x00\x0c\xff\xff\xff\xff\x0c\x07\x00\x00\x00\x0b\x0b\x11\x0e\tpersubent\x0e\x10acadSolidHistory\r\x06attrib\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\x05\x00\x00\x00\x04\x01\x00\x00\x00\x04\x04\x00\x00\x00\x04\x01\x00\x00\x00\x04\x00\x00\x00\x00\x11\x0e\x06sphere\r\x07surface\x0c\xff\xff\xff\xff\x04\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00@\x14\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x0b\x0b\x0b\x0b\x0b\x11\x0e\x03End\x0e\x02of\x0e\x03ASM\r\x04data" + ): feat.DumpReadable() - pytest.fail('wrong ASMData on second 3DSOLID') + pytest.fail("wrong ASMData on second 3DSOLID") - if feat.GetField('ASMTransform') != pytest.approx([-0.1875, 0.3247595264191645, 0.0, 0.08660254037844387, 0.05, 0.0, 0.0, 0.0, -1.0, 5.75, 1.125, 0.0]): + if feat.GetField("ASMTransform") != pytest.approx( + [ + -0.1875, + 0.3247595264191645, + 0.0, + 0.08660254037844387, + 0.05, + 0.0, + 0.0, + 0.0, + -1.0, + 5.75, + 1.125, + 0.0, + ] + ): feat.DumpReadable() - pytest.fail('wrong ASMTransform on second 3DSOLID') + pytest.fail("wrong ASMTransform on second 3DSOLID") - if feat.GetStyleString() != 'BRUSH(fc:#ff0000)': + if feat.GetStyleString() != "BRUSH(fc:#ff0000)": feat.DumpReadable() - pytest.fail('wrong style string on second 3DSOLID') + pytest.fail("wrong style string on second 3DSOLID") # 3DSOLID inside a block where the INSERT has rotation and OCS feat = layer.GetNextFeature() - if feat.GetField('ASMTransform') != pytest.approx([0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 100.0, 200.0, 300.0]): + if feat.GetField("ASMTransform") != pytest.approx( + [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 100.0, 200.0, 300.0] + ): feat.DumpReadable() - pytest.fail('wrong ASMTransform on third 3DSOLID') + pytest.fail("wrong ASMTransform on third 3DSOLID") ############################################################################### @@ -2360,10 +2852,12 @@ def test_ogr_dxf_33(): def test_ogr_dxf_34(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('tmp/triangle_test.dxf') - lyr = ds.CreateLayer('entities') + ds = ogr.GetDriverByName("DXF").CreateDataSource("tmp/triangle_test.dxf") + lyr = ds.CreateLayer("entities") dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,0 1,1 0,0 0))')) + dst_feat.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("TRIANGLE ((0 0,0 1,1 0,0 0))") + ) lyr.CreateFeature(dst_feat) dst_feat = None @@ -2372,20 +2866,22 @@ def test_ogr_dxf_34(): ds = None # Read back. - ds = ogr.Open('tmp/triangle_test.dxf') + ds = ogr.Open("tmp/triangle_test.dxf") lyr = ds.GetLayer(0) # Check first feature feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() - expected_wkt = 'POLYGON ((0 0,0 1,1 0,0 0))' + expected_wkt = "POLYGON ((0 0,0 1,1 0,0 0))" received_wkt = geom.ExportToWkt() - assert expected_wkt == received_wkt, \ - ('did not get expected geometry back: got %s' % received_wkt) + assert expected_wkt == received_wkt, ( + "did not get expected geometry back: got %s" % received_wkt + ) ds = None - gdal.Unlink('tmp/triangle_test.dxf') + gdal.Unlink("tmp/triangle_test.dxf") + ############################################################################### # Test reading hatch with elliptical harts @@ -2393,201 +2889,209 @@ def test_ogr_dxf_34(): def test_ogr_dxf_35(): - ds = ogr.Open('data/dxf/elliptical-arc-hatch-min.dxf') + ds = ogr.Open("data/dxf/elliptical-arc-hatch-min.dxf") lyr = ds.GetLayer(0) - expected_wkt = "POLYGON Z ((10.0 5.0 0,10.0121275732481 0.823574944937595 0," + \ - "10.0484514617793 -3.3325901498166 0," + \ - "10.1087954573461 -7.44833360561541 0," + \ - "10.1928668294578 -11.5036898303666 0," + \ - "10.3002577454253 -15.478986172205 0," + \ - "10.4304472487686 -19.3549383521031 0," + \ - "10.5828037863926 -23.1127440124738 0," + \ - "10.7565882722693 -26.7341739279578 0," + \ - "10.950957672766 -30.2016604359299 0," + \ - "11.164969096226 -33.4983826577451 0," + \ - "11.3975843669637 -36.6083480973141 0," + \ - "11.6476750614854 -39.5164702211696 0," + \ - "11.9140279825044 -42.2086416436832 0," + \ - "12.1953510441969 -44.6718025624057 0," + \ - "12.4902795401481 -46.8940041115515 0," + \ - "12.797382763583 -48.8644663262969 0," + \ - "13.1151709477668 -50.5736304367052 0," + \ - "13.442102492907 -52.0132052375995 0," + \ - "13.7765914444993 -53.1762073094422 0," + \ - "14.1170151868394 -54.0569948951078 0," + \ - "14.4617223143788 -54.6512952682117 0," + \ - "14.8090406427424 -54.9562254602315 0," + \ - "15.1572853205429 -54.9703062458714 0," + \ - "15.5047670026452 -54.6934693188278 0," + \ - "15.8498000452284 -54.1270576231449 0," + \ - "16.1907106828936 -53.2738188385539 0," + \ - "16.5258451481492 -52.137892051398 0," + \ - "16.853577693885 -50.7247876758036 0," + \ - "17.1723184799194 -49.0413607224995 0," + \ - "17.4805212853603 -47.0957775449594 0," + \ - "17.7766910093686 -44.8974762241817 0," + \ - "18.0593909239355 -42.457120784282 0," + \ - "18.3272496434925 -39.7865494609998 0," + \ - "18.578967777543 -36.8987172740701 0," + \ - "18.8133242340436 -33.8076331820431 0," + \ - "19.0291821429573 -30.5282921244156 0," + \ - "19.2254943712436 -27.0766022807403 0," + \ - "19.4013086025311 -23.4693078995808 0," + \ - "19.5557719568327 -19.7239080716712 0," + \ - "19.6881351278911 -15.8585718413141 0," + \ - "19.7977560180852 -11.8920500678142 0," + \ - "19.8841028532649 -7.84358446451107 0," + \ - "19.9467567624029 -3.73281425666327 0," + \ - "19.9854138095503 0.420319089008591 0," + \ - "19.9998864682387 4.59566860096071 0," + \ - "19.9901045311767 8.77297953637629 0," + \ - "19.9561154508277 12.9319876375154 0," + \ - "19.8980841092162 17.0525174342237 0," + \ - "19.8162920180808 21.1145801157289 0," + \ - "19.7111359532519 25.0984704969476 0," + \ - "19.5831260298811 28.9848626089156 0," + \ - "19.4328832278572 32.7549034496293 0," + \ - "19.2611363794148 36.390304440511 0," + \ - "19.0687186335478 39.8734301448397 0," + \ - "18.856563414379 43.1873838177704 0," + \ - "18.6256998930927 46.3160893729396 0," + \ - "18.3772479953948 49.2443693680303 0," + \ - "18.1124129687203 51.9580186309899 0," + \ - "17.8324795355432 54.4438731697361 0," + \ - "17.5388056611497 56.6898740310677 0," + \ - "17.2328159661089 58.6851257990001 0," + \ - "16.9159948153966 60.4199494487478 0," + \ - "16.5898791176976 61.8859292999569 0," + \ - "16.2560508698165 63.075953841417 0," + \ - "15.9161294823645 63.9842502292107 0," + \ - "15.5717639239516 64.6064122909483 0," + \ - "15.2246247219914 64.9394219002396 0," + \ - "14.8763958589235 64.9816636177129 0," + \ - "14.5287666031655 64.7329325275591 0," + \ - "14.1834233144223 64.1944352315841 0," + \ - "13.8420412631059 63.3687839959484 0," + \ - "13.5062765035495 62.2599840789869 0," + \ - "13.1777578404393 60.8734143015838 0," + \ - "12.8580789274355 59.2158009543548 0," + \ - "12.5487905363114 57.2951851682141 0," + \ - "12.2513930341143 55.1208839066128 0," + \ - "11.9673291048407 52.7034447686764 0," + \ - "11.6979767509346 50.0545948224921 0," + \ - "11.4446426085565 47.1871837167582 0," + \ - "11.2085556090535 44.1151213467616 0," + \ - "10.9908610173775 40.8533103770683 0," + \ - "10.792614876371 37.4175739482608 0," + \ - "10.6147788838724 33.8245789184198 0," + \ - "10.4582157274918 30.0917550117071 0," + \ - "10.323684899688 26.2372102662631 0," + \ - "10.2118390134483 22.2796431915832 0," + \ - "10.1232206364439 18.2382520615003 0," + \ - "10.0582596590181 14.1326417827963 0," + \ - "10.0172712087756 9.98272879122447 0," + \ - "13.3027626235603 8.26630944469236 0," + \ - "10.0 5.0 0))""" - - feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, expected_wkt) == 0, \ - 'Wrong boundary on hatch 1' - - expected_wkt = "POLYGON Z ((10.0172712087756 9.98272879122439 0," + \ - "10.0582596590181 14.1326417827963 0," + \ - "10.1232206364439 18.2382520615002 0," + \ - "10.2118390134483 22.2796431915831 0," + \ - "10.323684899688 26.237210266263 0," + \ - "10.4582157274918 30.0917550117071 0," + \ - "10.6147788838723 33.8245789184198 0," + \ - "10.792614876371 37.4175739482608 0," + \ - "10.9908610173775 40.8533103770683 0," + \ - "11.2085556090535 44.1151213467616 0," + \ - "11.4446426085564 47.1871837167582 0," + \ - "11.6979767509346 50.0545948224921 0," + \ - "11.9673291048407 52.7034447686763 0," + \ - "12.2513930341143 55.1208839066127 0," + \ - "12.5487905363114 57.295185168214 0," + \ - "12.8580789274355 59.2158009543548 0," + \ - "13.1777578404393 60.8734143015838 0," + \ - "13.5062765035495 62.2599840789869 0," + \ - "13.8420412631059 63.3687839959484 0," + \ - "14.1834233144223 64.1944352315841 0," + \ - "14.5287666031655 64.7329325275591 0," + \ - "14.8763958589235 64.9816636177129 0," + \ - "15.2246247219914 64.9394219002396 0," + \ - "15.5717639239516 64.6064122909483 0," + \ - "15.9161294823645 63.9842502292107 0," + \ - "16.2560508698165 63.075953841417 0," + \ - "16.5898791176976 61.8859292999569 0," + \ - "16.9159948153966 60.4199494487478 0," + \ - "17.2328159661089 58.6851257990001 0," + \ - "17.5388056611497 56.6898740310677 0," + \ - "17.8324795355432 54.4438731697361 0," + \ - "18.1124129687203 51.95801863099 0," + \ - "18.3772479953948 49.2443693680303 0," + \ - "18.6256998930927 46.3160893729396 0," + \ - "18.856563414379 43.1873838177704 0," + \ - "19.0687186335478 39.8734301448397 0," + \ - "19.2611363794148 36.3903044405111 0," + \ - "19.4328832278572 32.7549034496293 0," + \ - "19.5831260298811 28.9848626089156 0," + \ - "19.7111359532519 25.0984704969477 0," + \ - "19.8162920180808 21.1145801157289 0," + \ - "19.8980841092162 17.0525174342238 0," + \ - "19.9561154508277 12.9319876375155 0," + \ - "19.9901045311767 8.77297953637629 0," + \ - "19.9998864682387 4.59566860096075 0," + \ - "19.9854138095503 0.420319089008538 0," + \ - "19.9467567624029 -3.73281425666325 0," + \ - "19.8841028532649 -7.84358446451108 0," + \ - "19.7977560180852 -11.8920500678142 0," + \ - "19.6881351278911 -15.8585718413141 0," + \ - "19.5557719568327 -19.7239080716712 0," + \ - "19.4013086025311 -23.4693078995808 0," + \ - "19.2254943712436 -27.0766022807403 0," + \ - "19.0291821429573 -30.5282921244156 0," + \ - "18.8133242340436 -33.8076331820431 0," + \ - "18.578967777543 -36.8987172740701 0," + \ - "18.3272496434925 -39.7865494609998 0," + \ - "18.0593909239355 -42.457120784282 0," + \ - "17.7766910093686 -44.8974762241817 0," + \ - "17.4805212853603 -47.0957775449594 0," + \ - "17.1723184799194 -49.0413607224995 0," + \ - "16.853577693885 -50.7247876758035 0," + \ - "16.5258451481492 -52.137892051398 0," + \ - "16.1907106828936 -53.2738188385539 0," + \ - "15.8498000452284 -54.1270576231449 0," + \ - "15.5047670026452 -54.6934693188278 0," + \ - "15.1572853205429 -54.9703062458714 0," + \ - "14.8090406427424 -54.9562254602315 0," + \ - "14.4617223143788 -54.6512952682117 0," + \ - "14.1170151868394 -54.0569948951078 0," + \ - "13.7765914444993 -53.1762073094422 0," + \ - "13.442102492907 -52.0132052375995 0," + \ - "13.1151709477668 -50.5736304367052 0," + \ - "12.797382763583 -48.8644663262969 0," + \ - "12.4902795401481 -46.8940041115515 0," + \ - "12.1953510441969 -44.6718025624057 0," + \ - "11.9140279825044 -42.2086416436832 0," + \ - "11.6476750614854 -39.5164702211696 0," + \ - "11.3975843669637 -36.6083480973141 0," + \ - "11.164969096226 -33.4983826577452 0," + \ - "10.950957672766 -30.2016604359299 0," + \ - "10.7565882722693 -26.7341739279578 0," + \ - "10.5828037863926 -23.1127440124739 0," + \ - "10.4304472487686 -19.3549383521031 0," + \ - "10.3002577454253 -15.4789861722049 0," + \ - "10.1928668294578 -11.5036898303666 0," + \ - "10.1087954573461 -7.44833360561536 0," + \ - "10.0484514617793 -3.33259014981659 0," + \ - "10.0121275732481 0.823574944937621 0," + \ - "10.0 5.0 0," + \ - "13.3027626235603 8.26630944469236 0," + \ - "10.0172712087756 9.98272879122439 0))" - - feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, expected_wkt) == 0, \ - 'Wrong boundary on hatch 2' + expected_wkt = ( + "POLYGON Z ((10.0 5.0 0,10.0121275732481 0.823574944937595 0," + + "10.0484514617793 -3.3325901498166 0," + + "10.1087954573461 -7.44833360561541 0," + + "10.1928668294578 -11.5036898303666 0," + + "10.3002577454253 -15.478986172205 0," + + "10.4304472487686 -19.3549383521031 0," + + "10.5828037863926 -23.1127440124738 0," + + "10.7565882722693 -26.7341739279578 0," + + "10.950957672766 -30.2016604359299 0," + + "11.164969096226 -33.4983826577451 0," + + "11.3975843669637 -36.6083480973141 0," + + "11.6476750614854 -39.5164702211696 0," + + "11.9140279825044 -42.2086416436832 0," + + "12.1953510441969 -44.6718025624057 0," + + "12.4902795401481 -46.8940041115515 0," + + "12.797382763583 -48.8644663262969 0," + + "13.1151709477668 -50.5736304367052 0," + + "13.442102492907 -52.0132052375995 0," + + "13.7765914444993 -53.1762073094422 0," + + "14.1170151868394 -54.0569948951078 0," + + "14.4617223143788 -54.6512952682117 0," + + "14.8090406427424 -54.9562254602315 0," + + "15.1572853205429 -54.9703062458714 0," + + "15.5047670026452 -54.6934693188278 0," + + "15.8498000452284 -54.1270576231449 0," + + "16.1907106828936 -53.2738188385539 0," + + "16.5258451481492 -52.137892051398 0," + + "16.853577693885 -50.7247876758036 0," + + "17.1723184799194 -49.0413607224995 0," + + "17.4805212853603 -47.0957775449594 0," + + "17.7766910093686 -44.8974762241817 0," + + "18.0593909239355 -42.457120784282 0," + + "18.3272496434925 -39.7865494609998 0," + + "18.578967777543 -36.8987172740701 0," + + "18.8133242340436 -33.8076331820431 0," + + "19.0291821429573 -30.5282921244156 0," + + "19.2254943712436 -27.0766022807403 0," + + "19.4013086025311 -23.4693078995808 0," + + "19.5557719568327 -19.7239080716712 0," + + "19.6881351278911 -15.8585718413141 0," + + "19.7977560180852 -11.8920500678142 0," + + "19.8841028532649 -7.84358446451107 0," + + "19.9467567624029 -3.73281425666327 0," + + "19.9854138095503 0.420319089008591 0," + + "19.9998864682387 4.59566860096071 0," + + "19.9901045311767 8.77297953637629 0," + + "19.9561154508277 12.9319876375154 0," + + "19.8980841092162 17.0525174342237 0," + + "19.8162920180808 21.1145801157289 0," + + "19.7111359532519 25.0984704969476 0," + + "19.5831260298811 28.9848626089156 0," + + "19.4328832278572 32.7549034496293 0," + + "19.2611363794148 36.390304440511 0," + + "19.0687186335478 39.8734301448397 0," + + "18.856563414379 43.1873838177704 0," + + "18.6256998930927 46.3160893729396 0," + + "18.3772479953948 49.2443693680303 0," + + "18.1124129687203 51.9580186309899 0," + + "17.8324795355432 54.4438731697361 0," + + "17.5388056611497 56.6898740310677 0," + + "17.2328159661089 58.6851257990001 0," + + "16.9159948153966 60.4199494487478 0," + + "16.5898791176976 61.8859292999569 0," + + "16.2560508698165 63.075953841417 0," + + "15.9161294823645 63.9842502292107 0," + + "15.5717639239516 64.6064122909483 0," + + "15.2246247219914 64.9394219002396 0," + + "14.8763958589235 64.9816636177129 0," + + "14.5287666031655 64.7329325275591 0," + + "14.1834233144223 64.1944352315841 0," + + "13.8420412631059 63.3687839959484 0," + + "13.5062765035495 62.2599840789869 0," + + "13.1777578404393 60.8734143015838 0," + + "12.8580789274355 59.2158009543548 0," + + "12.5487905363114 57.2951851682141 0," + + "12.2513930341143 55.1208839066128 0," + + "11.9673291048407 52.7034447686764 0," + + "11.6979767509346 50.0545948224921 0," + + "11.4446426085565 47.1871837167582 0," + + "11.2085556090535 44.1151213467616 0," + + "10.9908610173775 40.8533103770683 0," + + "10.792614876371 37.4175739482608 0," + + "10.6147788838724 33.8245789184198 0," + + "10.4582157274918 30.0917550117071 0," + + "10.323684899688 26.2372102662631 0," + + "10.2118390134483 22.2796431915832 0," + + "10.1232206364439 18.2382520615003 0," + + "10.0582596590181 14.1326417827963 0," + + "10.0172712087756 9.98272879122447 0," + + "13.3027626235603 8.26630944469236 0," + + "10.0 5.0 0))" + "" + ) + + feat = lyr.GetNextFeature() + assert ( + ogrtest.check_feature_geometry(feat, expected_wkt) == 0 + ), "Wrong boundary on hatch 1" + + expected_wkt = ( + "POLYGON Z ((10.0172712087756 9.98272879122439 0," + + "10.0582596590181 14.1326417827963 0," + + "10.1232206364439 18.2382520615002 0," + + "10.2118390134483 22.2796431915831 0," + + "10.323684899688 26.237210266263 0," + + "10.4582157274918 30.0917550117071 0," + + "10.6147788838723 33.8245789184198 0," + + "10.792614876371 37.4175739482608 0," + + "10.9908610173775 40.8533103770683 0," + + "11.2085556090535 44.1151213467616 0," + + "11.4446426085564 47.1871837167582 0," + + "11.6979767509346 50.0545948224921 0," + + "11.9673291048407 52.7034447686763 0," + + "12.2513930341143 55.1208839066127 0," + + "12.5487905363114 57.295185168214 0," + + "12.8580789274355 59.2158009543548 0," + + "13.1777578404393 60.8734143015838 0," + + "13.5062765035495 62.2599840789869 0," + + "13.8420412631059 63.3687839959484 0," + + "14.1834233144223 64.1944352315841 0," + + "14.5287666031655 64.7329325275591 0," + + "14.8763958589235 64.9816636177129 0," + + "15.2246247219914 64.9394219002396 0," + + "15.5717639239516 64.6064122909483 0," + + "15.9161294823645 63.9842502292107 0," + + "16.2560508698165 63.075953841417 0," + + "16.5898791176976 61.8859292999569 0," + + "16.9159948153966 60.4199494487478 0," + + "17.2328159661089 58.6851257990001 0," + + "17.5388056611497 56.6898740310677 0," + + "17.8324795355432 54.4438731697361 0," + + "18.1124129687203 51.95801863099 0," + + "18.3772479953948 49.2443693680303 0," + + "18.6256998930927 46.3160893729396 0," + + "18.856563414379 43.1873838177704 0," + + "19.0687186335478 39.8734301448397 0," + + "19.2611363794148 36.3903044405111 0," + + "19.4328832278572 32.7549034496293 0," + + "19.5831260298811 28.9848626089156 0," + + "19.7111359532519 25.0984704969477 0," + + "19.8162920180808 21.1145801157289 0," + + "19.8980841092162 17.0525174342238 0," + + "19.9561154508277 12.9319876375155 0," + + "19.9901045311767 8.77297953637629 0," + + "19.9998864682387 4.59566860096075 0," + + "19.9854138095503 0.420319089008538 0," + + "19.9467567624029 -3.73281425666325 0," + + "19.8841028532649 -7.84358446451108 0," + + "19.7977560180852 -11.8920500678142 0," + + "19.6881351278911 -15.8585718413141 0," + + "19.5557719568327 -19.7239080716712 0," + + "19.4013086025311 -23.4693078995808 0," + + "19.2254943712436 -27.0766022807403 0," + + "19.0291821429573 -30.5282921244156 0," + + "18.8133242340436 -33.8076331820431 0," + + "18.578967777543 -36.8987172740701 0," + + "18.3272496434925 -39.7865494609998 0," + + "18.0593909239355 -42.457120784282 0," + + "17.7766910093686 -44.8974762241817 0," + + "17.4805212853603 -47.0957775449594 0," + + "17.1723184799194 -49.0413607224995 0," + + "16.853577693885 -50.7247876758035 0," + + "16.5258451481492 -52.137892051398 0," + + "16.1907106828936 -53.2738188385539 0," + + "15.8498000452284 -54.1270576231449 0," + + "15.5047670026452 -54.6934693188278 0," + + "15.1572853205429 -54.9703062458714 0," + + "14.8090406427424 -54.9562254602315 0," + + "14.4617223143788 -54.6512952682117 0," + + "14.1170151868394 -54.0569948951078 0," + + "13.7765914444993 -53.1762073094422 0," + + "13.442102492907 -52.0132052375995 0," + + "13.1151709477668 -50.5736304367052 0," + + "12.797382763583 -48.8644663262969 0," + + "12.4902795401481 -46.8940041115515 0," + + "12.1953510441969 -44.6718025624057 0," + + "11.9140279825044 -42.2086416436832 0," + + "11.6476750614854 -39.5164702211696 0," + + "11.3975843669637 -36.6083480973141 0," + + "11.164969096226 -33.4983826577452 0," + + "10.950957672766 -30.2016604359299 0," + + "10.7565882722693 -26.7341739279578 0," + + "10.5828037863926 -23.1127440124739 0," + + "10.4304472487686 -19.3549383521031 0," + + "10.3002577454253 -15.4789861722049 0," + + "10.1928668294578 -11.5036898303666 0," + + "10.1087954573461 -7.44833360561536 0," + + "10.0484514617793 -3.33259014981659 0," + + "10.0121275732481 0.823574944937621 0," + + "10.0 5.0 0," + + "13.3027626235603 8.26630944469236 0," + + "10.0172712087756 9.98272879122439 0))" + ) + + feat = lyr.GetNextFeature() + assert ( + ogrtest.check_feature_geometry(feat, expected_wkt) == 0 + ), "Wrong boundary on hatch 2" + ############################################################################### # Test reading files with only INSERT content (#7006) @@ -2595,24 +3099,25 @@ def test_ogr_dxf_35(): def test_ogr_dxf_36(): - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE') - ds = ogr.Open('data/dxf/insert_only.dxf') - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', None) + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE") + ds = ogr.Open("data/dxf/insert_only.dxf") + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", None) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 5 + ############################################################################### # Create a blocks layer only def test_ogr_dxf_37(): - ds = ogr.GetDriverByName('DXF').CreateDataSource('/vsimem/ogr_dxf_37.dxf') + ds = ogr.GetDriverByName("DXF").CreateDataSource("/vsimem/ogr_dxf_37.dxf") - lyr = ds.CreateLayer('blocks') + lyr = ds.CreateLayer("blocks") dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) + dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 2)")) lyr.CreateFeature(dst_feat) dst_feat = None @@ -2620,17 +3125,18 @@ def test_ogr_dxf_37(): ds = None # Read back. - gdal.SetConfigOption('DXF_INLINE_BLOCKS', 'FALSE') - ds = ogr.Open('/vsimem/ogr_dxf_37.dxf') - gdal.SetConfigOption('DXF_INLINE_BLOCKS', None) - lyr = ds.GetLayerByName('blocks') + gdal.SetConfigOption("DXF_INLINE_BLOCKS", "FALSE") + ds = ogr.Open("/vsimem/ogr_dxf_37.dxf") + gdal.SetConfigOption("DXF_INLINE_BLOCKS", None) + lyr = ds.GetLayerByName("blocks") # Check first feature feat = lyr.GetNextFeature() assert feat is not None ds = None - gdal.Unlink('/vsimem/ogr_dxf_37.dxf') + gdal.Unlink("/vsimem/ogr_dxf_37.dxf") + ############################################################################### # Test degenerated cases of SOLID (#7038) @@ -2638,17 +3144,21 @@ def test_ogr_dxf_37(): def test_ogr_dxf_38(): - ds = ogr.Open('data/dxf/solid-less-than-4-vertices.dxf') + ds = ogr.Open("data/dxf/solid-less-than-4-vertices.dxf") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (0 2)' \ - or f.GetStyleString() != 'PEN(c:#000000)': + if ( + f.GetGeometryRef().ExportToWkt() != "POINT (0 2)" + or f.GetStyleString() != "PEN(c:#000000)" + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (0.5 2.0,1 2)' \ - or f.GetStyleString() != 'PEN(c:#000000)': + if ( + f.GetGeometryRef().ExportToWkt() != "LINESTRING (0.5 2.0,1 2)" + or f.GetStyleString() != "PEN(c:#000000)" + ): f.DumpReadable() pytest.fail() @@ -2659,16 +3169,22 @@ def test_ogr_dxf_38(): def test_ogr_dxf_39(): - ds = ogr.Open('data/dxf/solid-vertex-ordering.dxf') + ds = ogr.Open("data/dxf/solid-vertex-ordering.dxf") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 5,1.5 2.5,1.5 0.0,0.0 2.5,0 5))': + if ( + f.GetGeometryRef().ExportToWkt() + != "POLYGON ((0 5,1.5 2.5,1.5 0.0,0.0 2.5,0 5))" + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToIsoWkt() != 'POLYGON Z ((-10 13 123,10 10 123,5 12 123,8 13 123,-10 13 123))': + if ( + f.GetGeometryRef().ExportToIsoWkt() + != "POLYGON Z ((-10 13 123,10 10 123,5 12 123,8 13 123,-10 13 123))" + ): f.DumpReadable() pytest.fail() @@ -2679,10 +3195,10 @@ def test_ogr_dxf_39(): def test_ogr_dxf_40(): - ds = ogr.Open('data/dxf/mtext-ocs-reduced.dxf') + ds = ogr.Open("data/dxf/mtext-ocs-reduced.dxf") lyr = ds.GetLayer(0) f = lyr.GetFeature(5) - if ogrtest.check_feature_geometry(f, 'POINT (320000.0 5815007.5 0)') != 0: + if ogrtest.check_feature_geometry(f, "POINT (320000.0 5815007.5 0)") != 0: f.DumpReadable() pytest.fail() @@ -2693,89 +3209,112 @@ def test_ogr_dxf_40(): def test_ogr_dxf_41(): - ds = ogr.Open('data/dxf/ocs2wcs3.dxf') + ds = ogr.Open("data/dxf/ocs2wcs3.dxf") lyr = ds.GetLayer(0) # INSERT #1: OCS normal vector (0,0,-1) f = lyr.GetFeature(1) - if ogrtest.check_feature_geometry(f, 'LINESTRING (45 20,25 20,25 40,45 40,45 20)') != 0: + if ( + ogrtest.check_feature_geometry(f, "LINESTRING (45 20,25 20,25 40,45 40,45 20)") + != 0 + ): f.DumpReadable() pytest.fail() # INSERT #2: OCS normal vector (0,1/sqrt(2),-1/sqrt(2)) f = lyr.GetFeature(3) - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (10.0 18.0 -76.3675323681472,-10.0 18.0 -76.3675323681472,-10.0 32.142135623731 -62.2253967444162,10.0 32.142135623731 -62.2253967444162,10.0 18.0 -76.3675323681472)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (10.0 18.0 -76.3675323681472,-10.0 18.0 -76.3675323681472,-10.0 32.142135623731 -62.2253967444162,10.0 32.142135623731 -62.2253967444162,10.0 18.0 -76.3675323681472)", + ) + != 0 + ): f.DumpReadable() pytest.fail() # INSERT #3: OCS normal vector (0.6,sqrt(8)/5,sqrt(8)/5) with # Y scale factor of 2 and rotation angle of 45 degrees f = lyr.GetFeature(5) - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (49.7198871869889 -21.8420670839387 75.1721817670195,34.1976071850546 -17.0401066991021 86.8340855568821,41.9587471852111 -48.595846365317 110.157893136607,57.4810271871454 -53.3978067501536 98.4959893467447,49.7198871869889 -21.8420670839387 75.1721817670195)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (49.7198871869889 -21.8420670839387 75.1721817670195,34.1976071850546 -17.0401066991021 86.8340855568821,41.9587471852111 -48.595846365317 110.157893136607,57.4810271871454 -53.3978067501536 98.4959893467447,49.7198871869889 -21.8420670839387 75.1721817670195)", + ) + != 0 + ): f.DumpReadable() pytest.fail() # HATCH f = lyr.GetFeature(7) - expected_wkt = "POLYGON Z ((-4.0 41.0121933088198 -132.936074863071," + \ - "-4.40490904691695 41.0186412752948 -132.929626896596," + \ - "-4.80797195119362 41.0379557758564 -132.910312396034," + \ - "-5.20735098749398 41.0700487479548 -132.878219423936," + \ - "-5.60122522671268 41.1147738668667 -132.833494305024," + \ - "-5.98779883832069 41.1719272128483 -132.776340959042," + \ - "-6.3653092782765 41.2412482008871 -132.707019971004," + \ - "-6.73203532517085 41.3224207688135 -132.625847403077," + \ - "-7.08630492796504 41.4150748183547 -132.533193353536," + \ - "-7.42650282954181 41.5187879025613 -132.429480269329," + \ - "-7.75107793130996 41.6330871519123 -132.315181019978," + \ - "-8.05855036528454 41.7574514303164 -132.190816741574," + \ - "-8.34751824139814 41.8913137111809 -132.05695446071," + \ - "-8.61666403927964 42.0340636627126 -131.914204509178," + \ - "-8.86476061535765 42.1850504306657 -131.763217741225," + \ - "-9.09067679789991 42.3435856058464 -131.604682566044," + \ - "-9.29338254447862 42.5089463628474 -131.439321809043," + \ - "-9.47195363834675 42.6803787556975 -131.267889416193," + \ - "-9.62557590231259 42.8571011554044 -131.091167016486," + \ - "-9.75354891089994 43.0383078137139 -130.909960358177," + \ - "-9.85528918386859 43.2231725368399 -130.725095635051," + \ - "-9.9303328465346 43.4108524524121 -130.537415719479," + \ - "-9.97833774476093 43.6004918524697 -130.347776319421," + \ - "-9.99908500497526 43.7912260949768 -130.157042076914," + \ - "-9.99248003210238 43.9821855460716 -129.966082625819," + \ - "-9.95855294086101 44.1724995450765 -129.775768626814," + \ - "-9.89745841845876 44.3613003741885 -129.586967797702," + \ - "-9.80947501931113 44.5477272147525 -129.400540957138," + \ - "1.0 44.5477272147525 -129.400540957138," + \ - "0.988343845952696 44.306453848479 -129.641814323412," + \ - "0.953429730181654 44.0663054100155 -129.881962761875," + \ - "0.895420438411614 43.828401582239 -130.119866589652," + \ - "0.814586436738996 43.5938515826157 -130.354416589275," + \ - "0.711304610594103 43.3637489915164 -130.584519180374," + \ - "0.586056507527265 43.1391666534406 -130.80910151845," + \ - "0.439426092011876 42.9211516749198 -131.027116496971," + \ - "0.272097022732443 42.7107205424238 -131.237547629467," + \ - "0.084849465052212 42.5088543830312 -131.43941378886," + \ - "-0.1214435464779 42.3164943899624 -131.631773781928," + \ - "-0.34582017860938 42.134537434302 -131.813730737589," + \ - "-0.587234283906729 41.9638318833721 -131.984436288519," + \ - "-0.844560278369735 41.8051736452522 -132.143094526639," + \ - "-1.11659838942566 41.6593024578878 -132.288965714003," + \ - "-1.40208024982283 41.5268984400915 -132.421369731799," + \ - "-1.69967481134424 41.4085789205144 -132.539689251376," + \ - "-2.00799455076879 41.3048955593753 -132.643372612515," + \ - "-2.32560193914507 41.216331776366 -132.731936395525," + \ - "-2.65101614421488 41.1433004967256 -132.804967675165," + \ - "-2.98271993473683 41.0861422259924 -132.862125945898," + \ - "-3.31916675451876 41.04512346241 -132.903144709481," + \ - "-3.65878793317664 41.0204354543892 -132.927832717502," + \ - "-4.0 41.0121933088198 -132.936074863071))" + expected_wkt = ( + "POLYGON Z ((-4.0 41.0121933088198 -132.936074863071," + + "-4.40490904691695 41.0186412752948 -132.929626896596," + + "-4.80797195119362 41.0379557758564 -132.910312396034," + + "-5.20735098749398 41.0700487479548 -132.878219423936," + + "-5.60122522671268 41.1147738668667 -132.833494305024," + + "-5.98779883832069 41.1719272128483 -132.776340959042," + + "-6.3653092782765 41.2412482008871 -132.707019971004," + + "-6.73203532517085 41.3224207688135 -132.625847403077," + + "-7.08630492796504 41.4150748183547 -132.533193353536," + + "-7.42650282954181 41.5187879025613 -132.429480269329," + + "-7.75107793130996 41.6330871519123 -132.315181019978," + + "-8.05855036528454 41.7574514303164 -132.190816741574," + + "-8.34751824139814 41.8913137111809 -132.05695446071," + + "-8.61666403927964 42.0340636627126 -131.914204509178," + + "-8.86476061535765 42.1850504306657 -131.763217741225," + + "-9.09067679789991 42.3435856058464 -131.604682566044," + + "-9.29338254447862 42.5089463628474 -131.439321809043," + + "-9.47195363834675 42.6803787556975 -131.267889416193," + + "-9.62557590231259 42.8571011554044 -131.091167016486," + + "-9.75354891089994 43.0383078137139 -130.909960358177," + + "-9.85528918386859 43.2231725368399 -130.725095635051," + + "-9.9303328465346 43.4108524524121 -130.537415719479," + + "-9.97833774476093 43.6004918524697 -130.347776319421," + + "-9.99908500497526 43.7912260949768 -130.157042076914," + + "-9.99248003210238 43.9821855460716 -129.966082625819," + + "-9.95855294086101 44.1724995450765 -129.775768626814," + + "-9.89745841845876 44.3613003741885 -129.586967797702," + + "-9.80947501931113 44.5477272147525 -129.400540957138," + + "1.0 44.5477272147525 -129.400540957138," + + "0.988343845952696 44.306453848479 -129.641814323412," + + "0.953429730181654 44.0663054100155 -129.881962761875," + + "0.895420438411614 43.828401582239 -130.119866589652," + + "0.814586436738996 43.5938515826157 -130.354416589275," + + "0.711304610594103 43.3637489915164 -130.584519180374," + + "0.586056507527265 43.1391666534406 -130.80910151845," + + "0.439426092011876 42.9211516749198 -131.027116496971," + + "0.272097022732443 42.7107205424238 -131.237547629467," + + "0.084849465052212 42.5088543830312 -131.43941378886," + + "-0.1214435464779 42.3164943899624 -131.631773781928," + + "-0.34582017860938 42.134537434302 -131.813730737589," + + "-0.587234283906729 41.9638318833721 -131.984436288519," + + "-0.844560278369735 41.8051736452522 -132.143094526639," + + "-1.11659838942566 41.6593024578878 -132.288965714003," + + "-1.40208024982283 41.5268984400915 -132.421369731799," + + "-1.69967481134424 41.4085789205144 -132.539689251376," + + "-2.00799455076879 41.3048955593753 -132.643372612515," + + "-2.32560193914507 41.216331776366 -132.731936395525," + + "-2.65101614421488 41.1433004967256 -132.804967675165," + + "-2.98271993473683 41.0861422259924 -132.862125945898," + + "-3.31916675451876 41.04512346241 -132.903144709481," + + "-3.65878793317664 41.0204354543892 -132.927832717502," + + "-4.0 41.0121933088198 -132.936074863071))" + ) if ogrtest.check_feature_geometry(f, expected_wkt) != 0: f.DumpReadable() pytest.fail() # SOLID f = lyr.GetFeature(9) - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((-10.0 13.0 124,8.0 13.0 124,5.0 12.0 123,10.0 10.0 121,-10.0 13.0 124))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((-10.0 13.0 124,8.0 13.0 124,5.0 12.0 123,10.0 10.0 121,-10.0 13.0 124))", + ) + != 0 + ): f.DumpReadable() pytest.fail() @@ -2787,60 +3326,73 @@ def test_ogr_dxf_41(): def test_ogr_dxf_42(): # Inlining, merging - ds = ogr.Open('data/dxf/block-insert-order.dxf') + ds = ogr.Open("data/dxf/block-insert-order.dxf") lyr = ds.GetLayer(0) - assert lyr.GetFeatureCount() == 2, \ - ('Defaults: Expected 2 features, found %d' % lyr.GetFeatureCount()) + assert lyr.GetFeatureCount() == 2, ( + "Defaults: Expected 2 features, found %d" % lyr.GetFeatureCount() + ) # No inlining, merging - gdal.SetConfigOption('DXF_INLINE_BLOCKS', 'FALSE') - ds = ogr.Open('data/dxf/block-insert-order.dxf') - gdal.SetConfigOption('DXF_INLINE_BLOCKS', None) + gdal.SetConfigOption("DXF_INLINE_BLOCKS", "FALSE") + ds = ogr.Open("data/dxf/block-insert-order.dxf") + gdal.SetConfigOption("DXF_INLINE_BLOCKS", None) - lyr = ds.GetLayerByName('entities') - assert lyr.GetFeatureCount() == 2, \ - ('No inlining: Expected 2 features on entities, found %d' % lyr.GetFeatureCount()) + lyr = ds.GetLayerByName("entities") + assert lyr.GetFeatureCount() == 2, ( + "No inlining: Expected 2 features on entities, found %d" % lyr.GetFeatureCount() + ) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (8.0 2.5 6)') != 0: + if ogrtest.check_feature_geometry(f, "POINT Z (8.0 2.5 6)") != 0: f.DumpReadable() - pytest.fail('Wrong geometry for first insertion point') + pytest.fail("Wrong geometry for first insertion point") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (-1 -2 -3)') != 0: + if ogrtest.check_feature_geometry(f, "POINT Z (-1 -2 -3)") != 0: f.DumpReadable() - pytest.fail('Wrong geometry for second insertion point') + pytest.fail("Wrong geometry for second insertion point") - lyr = ds.GetLayerByName('blocks') - assert lyr.GetFeatureCount() == 6, \ - ('No inlining: Expected 6 feature on blocks, found %d' % lyr.GetFeatureCount()) + lyr = ds.GetLayerByName("blocks") + assert lyr.GetFeatureCount() == 6, ( + "No inlining: Expected 6 feature on blocks, found %d" % lyr.GetFeatureCount() + ) f = lyr.GetFeature(3) - if ogrtest.check_feature_geometry(f, 'POINT Z (5 5 0)') != 0: + if ogrtest.check_feature_geometry(f, "POINT Z (5 5 0)") != 0: f.DumpReadable() - pytest.fail('Wrong geometry for second insertion of BLOCK4 on BLOCK3') + pytest.fail("Wrong geometry for second insertion of BLOCK4 on BLOCK3") f = lyr.GetFeature(4) - if ogrtest.check_feature_geometry(f, 'POINT Z (-5.48795472456028 1.69774937525433 4.12310562561766)') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (-5.48795472456028 1.69774937525433 4.12310562561766)" + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry for third insertion of BLOCK4 on BLOCK3') - - assert f.GetField('BlockName') == 'BLOCK4', 'Wrong BlockName' - assert f.GetField('BlockScale') == [0.4, 1.0, 1.5], 'Wrong BlockScale' - assert f.GetField('BlockAngle') == 40, 'Wrong BlockAngle' - assert f.GetField('BlockOCSNormal') == [0.6, 0.565685424949238, 0.565685424949238], \ - 'Wrong BlockOCSNormal' - assert f.GetField('BlockOCSCoords') == [5, 5, 0], 'Wrong BlockOCSCoords' - assert f.GetField('Block') == 'BLOCK3', 'Wrong Block' + pytest.fail("Wrong geometry for third insertion of BLOCK4 on BLOCK3") + + assert f.GetField("BlockName") == "BLOCK4", "Wrong BlockName" + assert f.GetField("BlockScale") == [0.4, 1.0, 1.5], "Wrong BlockScale" + assert f.GetField("BlockAngle") == 40, "Wrong BlockAngle" + assert f.GetField("BlockOCSNormal") == [ + 0.6, + 0.565685424949238, + 0.565685424949238, + ], "Wrong BlockOCSNormal" + assert f.GetField("BlockOCSCoords") == [5, 5, 0], "Wrong BlockOCSCoords" + assert f.GetField("Block") == "BLOCK3", "Wrong Block" # Inlining, no merging - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE') - ds = ogr.Open('data/dxf/block-insert-order.dxf') - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', None) + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE") + ds = ogr.Open("data/dxf/block-insert-order.dxf") + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", None) lyr = ds.GetLayer(0) - assert lyr.GetFeatureCount() == 4, \ - ('Merging: Expected 4 features, found %d' % lyr.GetFeatureCount()) + assert lyr.GetFeatureCount() == 4, ( + "Merging: Expected 4 features, found %d" % lyr.GetFeatureCount() + ) + ############################################################################### # Ensure recursively-included blocks don't fail badly @@ -2848,35 +3400,47 @@ def test_ogr_dxf_42(): def test_ogr_dxf_43(): - ds = ogr.Open('data/dxf/insert-recursive-pair.dxf') + ds = ogr.Open("data/dxf/insert-recursive-pair.dxf") lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 + ############################################################################### # General tests of LEADER and MULTILEADER entities (#7111) def test_ogr_dxf_44(): - with gdaltest.config_option('DXF_MAX_BSPLINE_CONTROL_POINTS', '1'): - ds = ogr.Open('data/dxf/leader-mleader.dxf') + with gdaltest.config_option("DXF_MAX_BSPLINE_CONTROL_POINTS", "1"): + ds = ogr.Open("data/dxf/leader-mleader.dxf") lyr = ds.GetLayer(0) with gdaltest.error_handler(): lyr.GetFeatureCount() - assert gdal.GetLastErrorMsg().find('DXF_MAX_BSPLINE_CONTROL_POINTS') >= 0 + assert gdal.GetLastErrorMsg().find("DXF_MAX_BSPLINE_CONTROL_POINTS") >= 0 - ds = ogr.Open('data/dxf/leader-mleader.dxf') + ds = ogr.Open("data/dxf/leader-mleader.dxf") lyr = ds.GetLayer(0) # LEADER with default arrowhead, plus a couple of DIMSTYLE overrides # (6.0 arrowhead size and 1.5 scale factor) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (21 40 0,10 40 0,19.3125 34.6875 0,10.3125 34.6875 0,-13.5990791268758 34.6875 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (21 40 0,10 40 0,19.3125 34.6875 0,10.3125 34.6875 0,-13.5990791268758 34.6875 0)", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((21.0 41.5 0,30 40 0,21.0 38.5 0,21.0 41.5 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POLYGON Z ((21.0 41.5 0,30 40 0,21.0 38.5 0,21.0 41.5 0))" + ) + != 0 + ): f.DumpReadable() pytest.fail() @@ -2885,66 +3449,106 @@ def test_ogr_dxf_44(): # Basic LEADER with no dimension style or override information f = lyr.GetNextFeature() - if f.GetStyleString() != 'PEN(c:#ff0000)' \ - or ogrtest.check_feature_geometry(f, 'LINESTRING Z (-20.9782552979609 38.1443878852919 30,-12.2152357926375 44.793971841437 30,-13.7256166009765 49.0748560186272 30,-13.9025293262723 49.0416613258524 30)') != 0: + if ( + f.GetStyleString() != "PEN(c:#ff0000)" + or ogrtest.check_feature_geometry( + f, + "LINESTRING Z (-20.9782552979609 38.1443878852919 30,-12.2152357926375 44.793971841437 30,-13.7256166009765 49.0748560186272 30,-13.9025293262723 49.0416613258524 30)", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'BRUSH(fc:#ff0000)' \ - or ogrtest.check_feature_geometry(f, 'POLYGON Z ((-20.9601206293303 38.1204894796201 30,-21.121645731992 38.035579873508 30,-20.9963899665916 38.1682862909638 30,-20.9601206293303 38.1204894796201 30))') != 0: + if ( + f.GetStyleString() != "BRUSH(fc:#ff0000)" + or ogrtest.check_feature_geometry( + f, + "POLYGON Z ((-20.9601206293303 38.1204894796201 30,-21.121645731992 38.035579873508 30,-20.9963899665916 38.1682862909638 30,-20.9601206293303 38.1204894796201 30))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # LEADER with a custom arrowhead that consists of a polygon and line f = lyr.GetNextFeature() - if f.GetStyleString() != 'PEN(c:#00ff00)' \ - or ogrtest.check_feature_geometry(f, 'LINESTRING Z (26.8 77.6 0,10 65 0,25 55 0,25 50 0,40 65 0,48 65 0,169.282571623465 65.0 0)') != 0: + if ( + f.GetStyleString() != "PEN(c:#00ff00)" + or ogrtest.check_feature_geometry( + f, + "LINESTRING Z (26.8 77.6 0,10 65 0,25 55 0,25 50 0,40 65 0,48 65 0,169.282571623465 65.0 0)", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'BRUSH(fc:#00ff00)' \ - or ogrtest.check_feature_geometry(f, 'POLYGON ((27.2 80.4,30.4 82.8,32.8 79.6,29.6 77.2,27.2 80.4))') != 0: + if ( + f.GetStyleString() != "BRUSH(fc:#00ff00)" + or ogrtest.check_feature_geometry( + f, "POLYGON ((27.2 80.4,30.4 82.8,32.8 79.6,29.6 77.2,27.2 80.4))" + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'PEN(c:#00ff00)' \ - or ogrtest.check_feature_geometry(f, 'LINESTRING Z (28.4 78.8 0,26.8 77.6 0)') != 0: + if ( + f.GetStyleString() != "PEN(c:#00ff00)" + or ogrtest.check_feature_geometry(f, "LINESTRING Z (28.4 78.8 0,26.8 77.6 0)") + != 0 + ): f.DumpReadable() pytest.fail() # Check that the very long text string in the MTEXT entity associated # to this LEADER is captured correctly f = lyr.GetNextFeature() - assert len(f.GetField('Text')) == 319, \ - ('Wrong text length: got %d' % len(f.GetField('Text'))) + assert len(f.GetField("Text")) == 319, "Wrong text length: got %d" % len( + f.GetField("Text") + ) # MULTILEADER with custom arrowhead f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((26.8 32.6,10 20,25 10,25 5,40 20),(40 20,48 20))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "MULTILINESTRING ((26.8 32.6,10 20,25 10,25 5,40 20),(40 20,48 20))" + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((27.2 35.4,30.4 37.8,32.8 34.6,29.6 32.2,27.2 35.4))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POLYGON ((27.2 35.4,30.4 37.8,32.8 34.6,29.6 32.2,27.2 35.4))" + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (28.4 33.8 0,26.8 32.6 0)') != 0: + if ogrtest.check_feature_geometry(f, "LINESTRING Z (28.4 33.8 0,26.8 32.6 0)") != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT (50.0 22.0327421555252)') != 0: + if ogrtest.check_feature_geometry(f, "POINT (50.0 22.0327421555252)") != 0: f.DumpReadable() pytest.fail() - if f.GetStyleString() != 'LABEL(f:"Arial",t:"Basic Multileader",p:7,s:4g,c:#000000)': + if ( + f.GetStyleString() + != 'LABEL(f:"Arial",t:"Basic Multileader",p:7,s:4g,c:#000000)' + ): f.DumpReadable() - pytest.fail('Wrong style string on MULTILEADER text') + pytest.fail("Wrong style string on MULTILEADER text") # There are three LEADERs, followed by two MULTILEADERs, without arrowheads. # In the first LEADER/MULTILEADER, the arrowhead is set to an empty block. @@ -2954,70 +3558,119 @@ def test_ogr_dxf_44(): for x in range(3): f = lyr.GetNextFeature() geom = f.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString25D, \ - ('Unexpected LEADER geometry, expected wkbLineString25D on iteration %d' % x) + assert geom.GetGeometryType() == ogr.wkbLineString25D, ( + "Unexpected LEADER geometry, expected wkbLineString25D on iteration %d" % x + ) for x in range(2): f = lyr.GetNextFeature() geom = f.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbMultiLineString, \ - ('Unexpected MULTILEADER geometry, expected wkbMultiLineString on iteration %d' % x) + assert geom.GetGeometryType() == ogr.wkbMultiLineString, ( + "Unexpected MULTILEADER geometry, expected wkbMultiLineString on iteration %d" + % x + ) f = lyr.GetNextFeature() geom = f.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbPoint, \ - ('Unexpected MULTILEADER geometry, expected wkbPoint on iteration %d' % x) + assert geom.GetGeometryType() == ogr.wkbPoint, ( + "Unexpected MULTILEADER geometry, expected wkbPoint on iteration %d" % x + ) # MULTILEADER with multiple leader lines and formatted text f = lyr.GetNextFeature() - if f.GetStyleString() != 'PEN(c:#0000ff)' \ - or ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((7.6425115795681 -8.00285406769102,18.2 -20.0),(19.2913880067389 -13.9367332958948,18.2 -20.0),(18.2 -20.0,38 -20),(54.8204921137545 -22.5800753657327,60.2227692307692 -20.0),(60.2227692307692 -20.0,52.2227692307692 -20.0))') != 0: + if ( + f.GetStyleString() != "PEN(c:#0000ff)" + or ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((7.6425115795681 -8.00285406769102,18.2 -20.0),(19.2913880067389 -13.9367332958948,18.2 -20.0),(18.2 -20.0,38 -20),(54.8204921137545 -22.5800753657327,60.2227692307692 -20.0),(60.2227692307692 -20.0,52.2227692307692 -20.0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'BRUSH(fc:#0000ff)' \ - or ogrtest.check_feature_geometry(f, 'POLYGON Z ((7.1420359016196 -8.4432726642857 0,5 -5 0,8.1429872575166 -7.56243547109634 0,7.1420359016196 -8.4432726642857 0))') != 0: + if ( + f.GetStyleString() != "BRUSH(fc:#0000ff)" + or ogrtest.check_feature_geometry( + f, + "POLYGON Z ((7.1420359016196 -8.4432726642857 0,5 -5 0,8.1429872575166 -7.56243547109634 0,7.1420359016196 -8.4432726642857 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'BRUSH(fc:#0000ff)' \ - or ogrtest.check_feature_geometry(f, 'POLYGON Z ((18.6352657907565 -13.8186312970179 0,20 -10 0,19.9475102227214 -14.0548352947716 0,18.6352657907565 -13.8186312970179 0))') != 0: + if ( + f.GetStyleString() != "BRUSH(fc:#0000ff)" + or ogrtest.check_feature_geometry( + f, + "POLYGON Z ((18.6352657907565 -13.8186312970179 0,20 -10 0,19.9475102227214 -14.0548352947716 0,18.6352657907565 -13.8186312970179 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'LABEL(f:"Calibri",it:1,t:"wwmhyhuasmjekhosovikpigsvtippomllixhzkrpithawzztyqybthjqiobkrpcxngjfkepricimyjplksbzteotqgnkbprugrextpsnhhiorevsxjxzomzcnyrtphzgeibfljbsaikosjfrhrrhidjswmxeqjrvbllbjggjblzydcqpbuzjhgcaoflgskaabkuikiwqcmytgbaxbiukpqvqjtfinygjcakzfdyyejvvpdbwsftxzimjettbzkjmdqfigwyoghbsolhvlfunknprjmmrfxntjwmvonkxvmgsntczwcmbujxkwzykpaexmquoatsvjkbchlzptgedbjnbutvimbufrbhxpwotemzvrxtidzdtbbqywmurmdzsgqqyiyahgmnacmhrlpekufpgfruh",p:7,s:4g,w:40,c:#0000ff)' \ - or ogrtest.check_feature_geometry(f, 'POINT (40.0 -17.9846153846154)') != 0: + if ( + f.GetStyleString() + != 'LABEL(f:"Calibri",it:1,t:"wwmhyhuasmjekhosovikpigsvtippomllixhzkrpithawzztyqybthjqiobkrpcxngjfkepricimyjplksbzteotqgnkbprugrextpsnhhiorevsxjxzomzcnyrtphzgeibfljbsaikosjfrhrrhidjswmxeqjrvbllbjggjblzydcqpbuzjhgcaoflgskaabkuikiwqcmytgbaxbiukpqvqjtfinygjcakzfdyyejvvpdbwsftxzimjettbzkjmdqfigwyoghbsolhvlfunknprjmmrfxntjwmvonkxvmgsntczwcmbujxkwzykpaexmquoatsvjkbchlzptgedbjnbutvimbufrbhxpwotemzvrxtidzdtbbqywmurmdzsgqqyiyahgmnacmhrlpekufpgfruh",p:7,s:4g,w:40,c:#0000ff)' + or ogrtest.check_feature_geometry(f, "POINT (40.0 -17.9846153846154)") != 0 + ): f.DumpReadable() pytest.fail() # Rotated MULTILEADER with scaled block content, block attributes, and # different leader color f = lyr.GetNextFeature() - if f.GetStyleString() != 'PEN(c:#ff00ff)' \ - or ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((-41.8919467995818 -22.8930851139176,-36.1215379759023 -17.6108145786645),(-36.1215379759023 -17.6108145786645,-44.0 -19.0))') != 0: + if ( + f.GetStyleString() != "PEN(c:#ff00ff)" + or ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((-41.8919467995818 -22.8930851139176,-36.1215379759023 -17.6108145786645),(-36.1215379759023 -17.6108145786645,-44.0 -19.0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((-40.7553616986189 -14.3661762772835,-44.6945927106677 -15.0607689879512,-44 -19,-40.0607689879512 -18.3054072893323,-40.7553616986189 -14.3661762772835),(-41.9142984770378 -17.0075519687798,-41.126452274628 -16.8686334266463,-40.9875337324945 -17.6564796290561,-41.7753799349043 -17.7953981711896,-41.9142984770378 -17.0075519687798),(-42.0532170191713 -16.2197057663701,-42.1921355613049 -15.4318595639603,-41.4042893588951 -15.2929410218268,-41.2653708167616 -16.0807872242365,-42.0532170191713 -16.2197057663701),(-42.7021446794476 -17.1464705109134,-42.563226137314 -17.9343167133231,-43.3510723397238 -18.0732352554567,-43.4899908818573 -17.2853890530469,-42.7021446794476 -17.1464705109134),(-42.8410632215811 -16.3586243085036,-43.6289094239909 -16.4975428506372,-43.7678279661244 -15.7096966482274,-42.9799817637146 -15.5707781060938,-42.8410632215811 -16.3586243085036))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON ((-40.7553616986189 -14.3661762772835,-44.6945927106677 -15.0607689879512,-44 -19,-40.0607689879512 -18.3054072893323,-40.7553616986189 -14.3661762772835),(-41.9142984770378 -17.0075519687798,-41.126452274628 -16.8686334266463,-40.9875337324945 -17.6564796290561,-41.7753799349043 -17.7953981711896,-41.9142984770378 -17.0075519687798),(-42.0532170191713 -16.2197057663701,-42.1921355613049 -15.4318595639603,-41.4042893588951 -15.2929410218268,-41.2653708167616 -16.0807872242365,-42.0532170191713 -16.2197057663701),(-42.7021446794476 -17.1464705109134,-42.563226137314 -17.9343167133231,-43.3510723397238 -18.0732352554567,-43.4899908818573 -17.2853890530469,-42.7021446794476 -17.1464705109134),(-42.8410632215811 -16.3586243085036,-43.6289094239909 -16.4975428506372,-43.7678279661244 -15.7096966482274,-42.9799817637146 -15.5707781060938,-42.8410632215811 -16.3586243085036))", + ) + != 0 + ): f.DumpReadable() pytest.fail() - test_text = 'Apples\u00B1' + test_text = "Apples\u00B1" f = lyr.GetNextFeature() - if f.GetStyleString() != 'LABEL(f:"Arial",t:"' + test_text + '",p:2,s:1g,c:#ff0000,a:10)' \ - or f.GetField('Text') != test_text \ - or ogrtest.check_feature_geometry(f, 'POINT Z (-42.7597068401767 -14.5165110820149 0)') != 0: + if ( + f.GetStyleString() + != 'LABEL(f:"Arial",t:"' + test_text + '",p:2,s:1g,c:#ff0000,a:10)' + or f.GetField("Text") != test_text + or ogrtest.check_feature_geometry( + f, "POINT Z (-42.7597068401767 -14.5165110820149 0)" + ) + != 0 + ): f.DumpReadable() pytest.fail() # MULTILEADER with no dogleg f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((-2.39659963256204 -14.5201521575302,-3.98423252456234 -23.1105237601191),(-26.0282877045921 -20.4748699216691,-3.98423252456233 -23.1105237601191))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((-2.39659963256204 -14.5201521575302,-3.98423252456234 -23.1105237601191),(-26.0282877045921 -20.4748699216691,-3.98423252456233 -23.1105237601191))", + ) + != 0 + ): f.DumpReadable() pytest.fail() @@ -3026,12 +3679,18 @@ def test_ogr_dxf_44(): # MULTILEADER with no leader lines (block content only) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING EMPTY') != 0: + if ogrtest.check_feature_geometry(f, "MULTILINESTRING EMPTY") != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((-4.98423252456234 -22.1105237601191,-6.98423252456234 -22.1105237601191,-6.98423252456234 -24.1105237601191,-4.98423252456234 -24.1105237601191,-4.98423252456234 -22.1105237601191),(-5.78423252456234 -23.3105237601191,-5.38423252456234 -23.3105237601191,-5.38423252456234 -23.7105237601191,-5.78423252456234 -23.7105237601191,-5.78423252456234 -23.3105237601191),(-5.78423252456234 -22.9105237601191,-5.78423252456234 -22.5105237601191,-5.38423252456234 -22.5105237601191,-5.38423252456234 -22.9105237601191,-5.78423252456234 -22.9105237601191),(-6.18423252456234 -23.3105237601191,-6.18423252456234 -23.7105237601191,-6.58423252456234 -23.7105237601191,-6.58423252456234 -23.3105237601191,-6.18423252456234 -23.3105237601191),(-6.18423252456234 -22.9105237601191,-6.58423252456234 -22.9105237601191,-6.58423252456234 -22.5105237601191,-6.18423252456234 -22.5105237601191,-6.18423252456234 -22.9105237601191))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON ((-4.98423252456234 -22.1105237601191,-6.98423252456234 -22.1105237601191,-6.98423252456234 -24.1105237601191,-4.98423252456234 -24.1105237601191,-4.98423252456234 -22.1105237601191),(-5.78423252456234 -23.3105237601191,-5.38423252456234 -23.3105237601191,-5.38423252456234 -23.7105237601191,-5.78423252456234 -23.7105237601191,-5.78423252456234 -23.3105237601191),(-5.78423252456234 -22.9105237601191,-5.78423252456234 -22.5105237601191,-5.38423252456234 -22.5105237601191,-5.38423252456234 -22.9105237601191,-5.78423252456234 -22.9105237601191),(-6.18423252456234 -23.3105237601191,-6.18423252456234 -23.7105237601191,-6.58423252456234 -23.7105237601191,-6.58423252456234 -23.3105237601191,-6.18423252456234 -23.3105237601191),(-6.18423252456234 -22.9105237601191,-6.58423252456234 -22.9105237601191,-6.58423252456234 -22.5105237601191,-6.18423252456234 -22.5105237601191,-6.18423252456234 -22.9105237601191))", + ) + != 0 + ): f.DumpReadable() pytest.fail() @@ -3039,31 +3698,58 @@ def test_ogr_dxf_44(): # LEADER with spline path f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (75 -5 0,75.3293039686015 -5.27450166567948 0,75.686184437139 -5.54808513378289 0,76.0669570707518 -5.8208730793178 0,76.4679375345795 -6.09298817729179 0,76.8854414937615 -6.36455310271241 0,77.3157846134373 -6.63569053058724 0,77.7552825587464 -6.90652313592384 0,78.2002509948283 -7.17717359372979 0,78.6470055868223 -7.44776457901266 0,79.091861999868 -7.71841876678001 0,79.5311358991048 -7.98925883203941 0,79.9611429496723 -8.26040744979843 0,80.3781988167098 -8.53198729506465 0,80.7786191653568 -8.80412104284562 0,81.1587196607529 -9.07693136814892 0,81.5148159680374 -9.35054094598211 0,81.8432237523498 -9.62507245135277 0,82.1402586788297 -9.90064855926846 0,82.4022364126165 -10.1773919447368 0,82.6254726188496 -10.4554252827652 0,82.8062829626685 -10.7348712483614 0,82.9409831092127 -11.0158525165329 0,83.0258887236216 -11.2984917622873 0,83.0573154710347 -11.5829116606322 0,83.0315790165916 -11.869234886575 0,82.9452821800198 -12.1575745539156 0,82.8004070385963 -12.447864666659 0,82.603711185096 -12.7398802214393 0,82.3621180817583 -13.033390692038 0,82.0825511908225 -13.3281655522369 0,81.7719339745283 -13.6239742758175 0,81.4371898951149 -13.9205863365615 0,81.0852424148219 -14.2177712082505 0,80.7230149958886 -14.515298364666 0,80.3574311005547 -14.8129372795898 0,79.9954141910594 -15.1104574268035 0,79.6438877296422 -15.4076282800887 0,79.3097751785426 -15.704219313227 0,79 -16 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (75 -5 0,75.3293039686015 -5.27450166567948 0,75.686184437139 -5.54808513378289 0,76.0669570707518 -5.8208730793178 0,76.4679375345795 -6.09298817729179 0,76.8854414937615 -6.36455310271241 0,77.3157846134373 -6.63569053058724 0,77.7552825587464 -6.90652313592384 0,78.2002509948283 -7.17717359372979 0,78.6470055868223 -7.44776457901266 0,79.091861999868 -7.71841876678001 0,79.5311358991048 -7.98925883203941 0,79.9611429496723 -8.26040744979843 0,80.3781988167098 -8.53198729506465 0,80.7786191653568 -8.80412104284562 0,81.1587196607529 -9.07693136814892 0,81.5148159680374 -9.35054094598211 0,81.8432237523498 -9.62507245135277 0,82.1402586788297 -9.90064855926846 0,82.4022364126165 -10.1773919447368 0,82.6254726188496 -10.4554252827652 0,82.8062829626685 -10.7348712483614 0,82.9409831092127 -11.0158525165329 0,83.0258887236216 -11.2984917622873 0,83.0573154710347 -11.5829116606322 0,83.0315790165916 -11.869234886575 0,82.9452821800198 -12.1575745539156 0,82.8004070385963 -12.447864666659 0,82.603711185096 -12.7398802214393 0,82.3621180817583 -13.033390692038 0,82.0825511908225 -13.3281655522369 0,81.7719339745283 -13.6239742758175 0,81.4371898951149 -13.9205863365615 0,81.0852424148219 -14.2177712082505 0,80.7230149958886 -14.515298364666 0,80.3574311005547 -14.8129372795898 0,79.9954141910594 -15.1104574268035 0,79.6438877296422 -15.4076282800887 0,79.3097751785426 -15.704219313227 0,79 -16 0)", + ) + != 0 + ): f.DumpReadable() pytest.fail() # MULTILEADER with spline path including an arrowhead on one leader line, # and text on an angle f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((97.9154085227223 -24.4884177083425,98.2307499443399 -23.8667044316857,98.5274844683239 -23.1977407715784,98.8076056908493 -22.4865892691047,99.0731072080911 -21.7383124653484,99.3259826162243 -20.9579729013935,99.568225511424 -20.1506331183241,99.8018294898652 -19.3213556572241,100.028788147723 -18.4752030591775,100.251095081172 -17.6172378652682,100.470743886388 -16.7525226165803,100.689728159546 -15.8861198541978,100.91004149682 -15.0230921192046,101.133677494386 -14.1685019526847,101.362629748419 -13.327411895722,101.598891855094 -12.5048844894007,101.844457410585 -11.7059822748045,102.101320011068 -10.9357677930177,102.371473252719 -10.199303585124,102.656910731711 -9.50165219220749,102.95962604422 -8.84787615535218,103.281612786421 -8.24303801564202,103.624864554489 -7.69220031416101,103.991374944599 -7.20042559199311,104.383137552927 -6.77277639022231,104.802145975646 -6.41431524993259,105.250393808933 -6.13010471220794,105.729874648962 -5.92520731813233,106.242582091908 -5.80468560878975,106.790509733946 -5.77360212526418,107.375651171252 -5.8370194086396,108.0 -6.0),(99.0 -4.0,99.2390786191346 -4.00918383080352,99.4787687119818 -4.01534615590692,99.7189331856537 -4.01916439926796,99.9594349472622 -4.02131598484443,100.200136903919 -4.02247833659411,100.440901962737 -4.02332887847475,100.681593030828 -4.02454503444416,100.922073015303 -4.02680422846008,101.162204823276 -4.03078388448032,101.401851361856 -4.03716142646263,101.640875538158 -4.0466142783648,101.879140259293 -4.0598198641446,102.116508432372 -4.07745560775981,102.352842964508 -4.1001989331682,102.588006762813 -4.12872726432755,102.821862734399 -4.16371802519564,103.054283542724 -4.20580126092676,103.285277318696 -4.25494915918985,103.514951346557 -4.31065239888725,103.743415181632 -4.37239063008777,103.970778379245 -4.43964350286021,104.19715049472 -4.51189066727337,104.422641083382 -4.58861177339606,104.647359700555 -4.66928647129708,104.871415901564 -4.75339441104525,105.094919241732 -4.84041524270936,105.317979276384 -4.92982861635822,105.540705560844 -5.02111418206063,105.763207650437 -5.11375158988541,105.985595100486 -5.20722048990135,106.207977466317 -5.30100053217725,106.430464303253 -5.39457136678194,106.653165166619 -5.4874126437842,106.876189611739 -5.57900401325284,107.099647193937 -5.66882512525668,107.323647468538 -5.7563556298645,107.548299990866 -5.84107517714513,107.773714316245 -5.92246341716736,108.0 -6.0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((97.9154085227223 -24.4884177083425,98.2307499443399 -23.8667044316857,98.5274844683239 -23.1977407715784,98.8076056908493 -22.4865892691047,99.0731072080911 -21.7383124653484,99.3259826162243 -20.9579729013935,99.568225511424 -20.1506331183241,99.8018294898652 -19.3213556572241,100.028788147723 -18.4752030591775,100.251095081172 -17.6172378652682,100.470743886388 -16.7525226165803,100.689728159546 -15.8861198541978,100.91004149682 -15.0230921192046,101.133677494386 -14.1685019526847,101.362629748419 -13.327411895722,101.598891855094 -12.5048844894007,101.844457410585 -11.7059822748045,102.101320011068 -10.9357677930177,102.371473252719 -10.199303585124,102.656910731711 -9.50165219220749,102.95962604422 -8.84787615535218,103.281612786421 -8.24303801564202,103.624864554489 -7.69220031416101,103.991374944599 -7.20042559199311,104.383137552927 -6.77277639022231,104.802145975646 -6.41431524993259,105.250393808933 -6.13010471220794,105.729874648962 -5.92520731813233,106.242582091908 -5.80468560878975,106.790509733946 -5.77360212526418,107.375651171252 -5.8370194086396,108.0 -6.0),(99.0 -4.0,99.2390786191346 -4.00918383080352,99.4787687119818 -4.01534615590692,99.7189331856537 -4.01916439926796,99.9594349472622 -4.02131598484443,100.200136903919 -4.02247833659411,100.440901962737 -4.02332887847475,100.681593030828 -4.02454503444416,100.922073015303 -4.02680422846008,101.162204823276 -4.03078388448032,101.401851361856 -4.03716142646263,101.640875538158 -4.0466142783648,101.879140259293 -4.0598198641446,102.116508432372 -4.07745560775981,102.352842964508 -4.1001989331682,102.588006762813 -4.12872726432755,102.821862734399 -4.16371802519564,103.054283542724 -4.20580126092676,103.285277318696 -4.25494915918985,103.514951346557 -4.31065239888725,103.743415181632 -4.37239063008777,103.970778379245 -4.43964350286021,104.19715049472 -4.51189066727337,104.422641083382 -4.58861177339606,104.647359700555 -4.66928647129708,104.871415901564 -4.75339441104525,105.094919241732 -4.84041524270936,105.317979276384 -4.92982861635822,105.540705560844 -5.02111418206063,105.763207650437 -5.11375158988541,105.985595100486 -5.20722048990135,106.207977466317 -5.30100053217725,106.430464303253 -5.39457136678194,106.653165166619 -5.4874126437842,106.876189611739 -5.57900401325284,107.099647193937 -5.66882512525668,107.323647468538 -5.7563556298645,107.548299990866 -5.84107517714513,107.773714316245 -5.92246341716736,108.0 -6.0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((98.5006722379985 -24.8076524621295 0,96 -28 0,97.330144807446 -24.1691829545554 0,98.5006722379985 -24.8076524621295 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((98.5006722379985 -24.8076524621295 0,96 -28 0,97.330144807446 -24.1691829545554 0,98.5006722379985 -24.8076524621295 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetStyleString() != 'LABEL(f:"Arial",t:"Splines",p:7,a:342,s:2g,c:#000000)' \ - or ogrtest.check_feature_geometry(f, 'POINT (110.7043505591 -4.20673403616296)') != 0: + if ( + f.GetStyleString() != 'LABEL(f:"Arial",t:"Splines",p:7,a:342,s:2g,c:#000000)' + or ogrtest.check_feature_geometry(f, "POINT (110.7043505591 -4.20673403616296)") + != 0 + ): f.DumpReadable() pytest.fail() # MULTILEADER with DIMBREAK f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((50.8917622404846 41.5635728657296,51.2877903403879 42.2579494192141),(51.9070696740577 43.3437639093041,54.3108962133801 47.5585173269448,55.9270734326513 48.2521008552884),(57.0757636753042 48.7450620367561,59.4256548786735 49.7535194092661),(60 50,60 50),(60 50,60 50),(60.625 50.0,61.875 50.0),(63.125 50.0,63.6 50.0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((50.8917622404846 41.5635728657296,51.2877903403879 42.2579494192141),(51.9070696740577 43.3437639093041,54.3108962133801 47.5585173269448,55.9270734326513 48.2521008552884),(57.0757636753042 48.7450620367561,59.4256548786735 49.7535194092661),(60 50,60 50),(60 50,60 50),(60.625 50.0,61.875 50.0),(63.125 50.0,63.6 50.0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() @@ -3074,32 +3760,37 @@ def test_ogr_dxf_44(): def test_ogr_dxf_45(): - ds = ogr.Open('data/dxf/linetypes.dxf') + ds = ogr.Open("data/dxf/linetypes.dxf") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DASHED2', 'Got wrong linetype (1)' + assert feat.GetField("Linetype") == "DASHED2", "Got wrong linetype (1)" - assert feat.GetStyleString() == 'PEN(c:#000000,p:"12.5g 6.25g")', \ - 'Got wrong style string (1)' + assert ( + feat.GetStyleString() == 'PEN(c:#000000,p:"12.5g 6.25g")' + ), "Got wrong style string (1)" feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DASHED2', 'Got wrong linetype (2)' + assert feat.GetField("Linetype") == "DASHED2", "Got wrong linetype (2)" - assert feat.GetStyleString() == 'PEN(c:#000000,p:"0.625g 0.3125g")', \ - 'Got wrong style string (2)' + assert ( + feat.GetStyleString() == 'PEN(c:#000000,p:"0.625g 0.3125g")' + ), "Got wrong style string (2)" feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'DASHED2_FLIPPED', 'Got wrong linetype (3)' + assert feat.GetField("Linetype") == "DASHED2_FLIPPED", "Got wrong linetype (3)" - assert feat.GetStyleString() == 'PEN(c:#000000,p:"0.625g 0.3125g")', \ - 'Got wrong style string (3)' + assert ( + feat.GetStyleString() == 'PEN(c:#000000,p:"0.625g 0.3125g")' + ), "Got wrong style string (3)" feat = lyr.GetNextFeature() - assert feat.GetField('Linetype') == 'Drain_Pipe_Inv_100', 'Got wrong linetype (4)' + assert feat.GetField("Linetype") == "Drain_Pipe_Inv_100", "Got wrong linetype (4)" + + assert ( + feat.GetStyleString() == 'PEN(c:#000000,p:"35g 22.5g")' + ), "Got wrong style string (4)" - assert feat.GetStyleString() == 'PEN(c:#000000,p:"35g 22.5g")', \ - 'Got wrong style string (4)' ############################################################################### # Test handling of DIMENSION anonymous block insertion (#7120) @@ -3107,47 +3798,86 @@ def test_ogr_dxf_45(): def test_ogr_dxf_46(): - ds = ogr.Open('data/dxf/dimension.dxf') + ds = ogr.Open("data/dxf/dimension.dxf") lyr = ds.GetLayer(0) # Extension lines f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (320000.0 5820010.0625 0,320000.0 5820010.43087258 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, "LINESTRING Z (320000.0 5820010.0625 0,320000.0 5820010.43087258 0)" + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (320010.0 5820010.0625 0,320010.0 5820010.43087258 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, "LINESTRING Z (320010.0 5820010.0625 0,320010.0 5820010.43087258 0)" + ) + != 0 + ): f.DumpReadable() pytest.fail() # Dimension arrow lines f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (320000.18 5820010.25087258 0,320004.475225102 5820010.25087258 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (320000.18 5820010.25087258 0,320004.475225102 5820010.25087258 0)", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING Z (320009.82 5820010.25087258 0,320005.524774898 5820010.25087258 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING Z (320009.82 5820010.25087258 0,320005.524774898 5820010.25087258 0)", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Arrowheads f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((320000.18 5820010.28087259,320000.18 5820010.22087258,320000.0 5820010.25087258,320000.18 5820010.28087259))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON ((320000.18 5820010.28087259,320000.18 5820010.22087258,320000.0 5820010.25087258,320000.18 5820010.28087259))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((320009.82 5820010.28087259,320009.82 5820010.22087258,320010.0 5820010.25087258,320009.82 5820010.28087259))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON ((320009.82 5820010.28087259,320009.82 5820010.22087258,320010.0 5820010.25087258,320009.82 5820010.28087259))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Text f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (320004.537844475 5820010.16240737 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (320004.537844475 5820010.16240737 0)" + ) + != 0 + ): f.DumpReadable() pytest.fail() if f.GetStyleString() != 'LABEL(f:"Arial",t:"10.0000",p:1,s:0.18g,c:#000000)': f.DumpReadable() - pytest.fail('Wrong style string on DIMENSION text from block') + pytest.fail("Wrong style string on DIMENSION text from block") ############################################################################### @@ -3156,89 +3886,145 @@ def test_ogr_dxf_46(): def test_ogr_dxf_47(): - ds = ogr.Open('data/dxf/dimension-entities-only.dxf') + ds = ogr.Open("data/dxf/dimension-entities-only.dxf") lyr = ds.GetLayer(0) # Basic DIMENSION inheriting default styling # Dimension line and extension lines f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((320010.0 5820010.25087258,320000.0 5820010.25087258),(320010.0 5820010.0625,320010.0 5820010.43087258),(320000.0 5820010.0625,320000.0 5820010.43087258))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((320010.0 5820010.25087258,320000.0 5820010.25087258),(320010.0 5820010.0625,320010.0 5820010.43087258),(320000.0 5820010.0625,320000.0 5820010.43087258))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Arrowheads f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320009.82 5820010.28087259 0,320010.0 5820010.25087258 0,320009.82 5820010.22087258 0,320009.82 5820010.28087259 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320009.82 5820010.28087259 0,320010.0 5820010.25087258 0,320009.82 5820010.22087258 0,320009.82 5820010.28087259 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320000.18 5820010.22087258 0,320000.0 5820010.25087258 0,320000.18 5820010.28087259 0,320000.18 5820010.22087258 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320000.18 5820010.22087258 0,320000.0 5820010.25087258 0,320000.18 5820010.28087259 0,320000.18 5820010.22087258 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Text f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT (320005.0 5820010.25087258)') != 0: + if ogrtest.check_feature_geometry(f, "POINT (320005.0 5820010.25087258)") != 0: f.DumpReadable() pytest.fail() if f.GetStyleString() != 'LABEL(f:"Arial",t:"10.0000",p:11,s:0.18g,c:#000000)': f.DumpReadable() - pytest.fail('Wrong style string on first DIMENSION text') + pytest.fail("Wrong style string on first DIMENSION text") # DIMENSION with style overrides # Dimension line f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((320005 5820005,320000 5820010))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "MULTILINESTRING ((320005 5820005,320000 5820010))" + ) + != 0 + ): f.DumpReadable() pytest.fail() # Arrowheads f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320004.116116524 5820006.23743687 0,320005 5820005 0,320003.762563133 5820005.88388348 0,320004.116116524 5820006.23743687 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320004.116116524 5820006.23743687 0,320005 5820005 0,320003.762563133 5820005.88388348 0,320004.116116524 5820006.23743687 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320000.883883476 5820008.76256313 0,320000 5820010 0,320001.237436867 5820009.11611652 0,320000.883883476 5820008.76256313 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320000.883883476 5820008.76256313 0,320000 5820010 0,320001.237436867 5820009.11611652 0,320000.883883476 5820008.76256313 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Text f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT (320002.5 5820007.5)') != 0: + if ogrtest.check_feature_geometry(f, "POINT (320002.5 5820007.5)") != 0: f.DumpReadable() pytest.fail() if f.GetStyleString() != 'LABEL(f:"Arial",t:"7.1",p:11,a:-45,s:0.48g,c:#000000)': f.DumpReadable() - pytest.fail('Wrong style string on second DIMENSION text') + pytest.fail("Wrong style string on second DIMENSION text") # DIMENSION inheriting styles from a custom DIMSTYLE # Dimension line f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((320000.0 5820001.5,320005.0 5820001.5),(320000.0 5820002.4,320000 5820001),(320005.0 5820002.4,320005 5820001))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING ((320000.0 5820001.5,320005.0 5820001.5),(320000.0 5820002.4,320000 5820001),(320005.0 5820002.4,320005 5820001))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Arrowheads f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320000.18 5820001.47 0,320000.0 5820001.5 0,320000.18 5820001.53 0,320000.18 5820001.47 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320000.18 5820001.47 0,320000.0 5820001.5 0,320000.18 5820001.53 0,320000.18 5820001.47 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((320004.82 5820001.53 0,320005.0 5820001.5 0,320004.82 5820001.47 0,320004.82 5820001.53 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((320004.82 5820001.53 0,320005.0 5820001.5 0,320004.82 5820001.47 0,320004.82 5820001.53 0))", + ) + != 0 + ): f.DumpReadable() pytest.fail() # Text f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT (320001.5 5820001.5)') != 0: + if ogrtest.check_feature_geometry(f, "POINT (320001.5 5820001.5)") != 0: f.DumpReadable() pytest.fail() - if f.GetStyleString() != 'LABEL(f:"Arial",t:"±2 3\n\\P4 5.0000",p:11,s:0.18g,c:#000000)': + if ( + f.GetStyleString() + != 'LABEL(f:"Arial",t:"±2 3\n\\P4 5.0000",p:11,s:0.18g,c:#000000)' + ): f.DumpReadable() - pytest.fail('Wrong style string on third DIMENSION text') + pytest.fail("Wrong style string on third DIMENSION text") ############################################################################### @@ -3247,9 +4033,9 @@ def test_ogr_dxf_47(): def test_ogr_dxf_48(): - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE') - ds = ogr.Open('data/dxf/byblock-bylayer.dxf') - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', None) + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE") + ds = ogr.Open("data/dxf/byblock-bylayer.dxf") + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", None) lyr = ds.GetLayer(0) @@ -3260,21 +4046,21 @@ def test_ogr_dxf_48(): f = lyr.GetFeature(0) if f.GetStyleString() != 'PEN(c:#ff00ff,p:"1.5875g 1.5875g")': f.DumpReadable() - pytest.fail('Wrong style string on feature 0') + pytest.fail("Wrong style string on feature 0") # The dimension line is set directly to blue f = lyr.GetFeature(2) - if f.GetStyleString() != 'PEN(c:#0000ff)': + if f.GetStyleString() != "PEN(c:#0000ff)": f.DumpReadable() - pytest.fail('Wrong style string on feature 2') + pytest.fail("Wrong style string on feature 2") # The first arrowhead is a custom block; the SOLID in this block is # colored ByLayer; the layer the block is inserted on (_K_POINTS) # is colored red f = lyr.GetFeature(4) - if f.GetStyleString() != 'BRUSH(fc:#ff0000)': + if f.GetStyleString() != "BRUSH(fc:#ff0000)": f.DumpReadable() - pytest.fail('Wrong style string on feature 4') + pytest.fail("Wrong style string on feature 4") # The first arrowhead block also contains a line colored ByBlock. # The arrowhead INSERT is blue, so the line should be blue. @@ -3282,75 +4068,75 @@ def test_ogr_dxf_48(): # sure the ByBlock colouring isn't handled again for the outer # block, which is magenta. f = lyr.GetFeature(5) - if f.GetStyleString() != 'PEN(c:#0000ff)': + if f.GetStyleString() != "PEN(c:#0000ff)": f.DumpReadable() - pytest.fail('Wrong style string on feature 5') + pytest.fail("Wrong style string on feature 5") # The second arrowhead, like the dimension line, is set directly # to blue f = lyr.GetFeature(6) - if f.GetStyleString() != 'BRUSH(fc:#0000ff)': + if f.GetStyleString() != "BRUSH(fc:#0000ff)": f.DumpReadable() - pytest.fail('Wrong style string on feature 6') + pytest.fail("Wrong style string on feature 6") # Like the dimension extension lines, the text is ByBlock (#7099) f = lyr.GetFeature(7) if f.GetStyleString() != 'LABEL(f:"Arial",t:"10.141 (2C)",s:0.4g,p:5,c:#ff00ff)': f.DumpReadable() - pytest.fail('Wrong style string on feature 7') + pytest.fail("Wrong style string on feature 7") # ByLayer feature in block f = lyr.GetFeature(11) - if f.GetStyleString() != 'PEN(c:#ff0000)': + if f.GetStyleString() != "PEN(c:#ff0000)": f.DumpReadable() - pytest.fail('Wrong style string on feature 11') + pytest.fail("Wrong style string on feature 11") # Since the INSERT is in PaperSpace, this feature should be too - assert f.GetField('PaperSpace') == 1, 'Wrong PaperSpace on feature 11' + assert f.GetField("PaperSpace") == 1, "Wrong PaperSpace on feature 11" # ByBlock feature in block f = lyr.GetFeature(12) - if f.GetStyleString() != 'PEN(c:#a552a5)': + if f.GetStyleString() != "PEN(c:#a552a5)": f.DumpReadable() - pytest.fail('Wrong style string on feature 12') + pytest.fail("Wrong style string on feature 12") # ByLayer feature inserted via an INSERT on yellow layer in block # inserted via an INSERT on red layer: should be yellow f = lyr.GetFeature(13) - if f.GetStyleString() != 'PEN(c:#ffff00)': + if f.GetStyleString() != "PEN(c:#ffff00)": f.DumpReadable() - pytest.fail('Wrong style string on feature 13') + pytest.fail("Wrong style string on feature 13") # ByBlock feature inserted via a ByBlock INSERT in block inserted # via a color213 INSERT: should be color213 f = lyr.GetFeature(14) - if f.GetStyleString() != 'PEN(c:#a552a5)': + if f.GetStyleString() != "PEN(c:#a552a5)": f.DumpReadable() - pytest.fail('Wrong style string on feature 14') + pytest.fail("Wrong style string on feature 14") # ByBlock entities directly on the canvas show up as black f = lyr.GetFeature(15) - if f.GetStyleString() != 'PEN(c:#000000)': + if f.GetStyleString() != "PEN(c:#000000)": f.DumpReadable() - pytest.fail('Wrong style string on feature 15') + pytest.fail("Wrong style string on feature 15") # ByBlock feature inserted via a true-color INSERT f = lyr.GetFeature(16) - if f.GetStyleString() != 'PEN(c:#18dce1)': + if f.GetStyleString() != "PEN(c:#18dce1)": f.DumpReadable() - pytest.fail('Wrong style string on feature 16') + pytest.fail("Wrong style string on feature 16") # True-color feature in block f = lyr.GetFeature(17) - if f.GetStyleString() != 'PEN(c:#5e089b)': + if f.GetStyleString() != "PEN(c:#5e089b)": f.DumpReadable() - pytest.fail('Wrong style string on feature 17') + pytest.fail("Wrong style string on feature 17") # ByBlock feature inserted via a ByLayer INSERT on true-color layer f = lyr.GetFeature(18) - if f.GetStyleString() != 'PEN(c:#8ef19c)': + if f.GetStyleString() != "PEN(c:#8ef19c)": f.DumpReadable() - pytest.fail('Wrong style string on feature 18') + pytest.fail("Wrong style string on feature 18") ############################################################################### @@ -3360,56 +4146,64 @@ def test_ogr_dxf_48(): def test_ogr_dxf_49(): # Inline blocks mode - ds = ogr.Open('data/dxf/attrib.dxf') + ds = ogr.Open("data/dxf/attrib.dxf") lyr = ds.GetLayer(0) - assert lyr.GetFeatureCount() == 6, \ - ('Wrong feature count, got %d' % lyr.GetFeatureCount()) + assert lyr.GetFeatureCount() == 6, ( + "Wrong feature count, got %d" % lyr.GetFeatureCount() + ) f = lyr.GetFeature(1) - if f.GetField('Text') != 'super test': + if f.GetField("Text") != "super test": f.DumpReadable() - pytest.fail('Wrong Text value on first ATTRIB on first INSERT') - if f.GetStyleString() != 'LABEL(f:"Arial",t:"super test",p:2,s:8g,w:234.6,dx:30.293g,c:#ff0000)': + pytest.fail("Wrong Text value on first ATTRIB on first INSERT") + if ( + f.GetStyleString() + != 'LABEL(f:"Arial",t:"super test",p:2,s:8g,w:234.6,dx:30.293g,c:#ff0000)' + ): f.DumpReadable() - pytest.fail('Wrong style string on first ATTRIB on first INSERT') + pytest.fail("Wrong style string on first ATTRIB on first INSERT") f = lyr.GetFeature(4) geom = f.GetGeometryRef() - assert geom.GetGeometryType() == ogr.wkbLineString25D, 'Expected LINESTRING Z' + assert geom.GetGeometryType() == ogr.wkbLineString25D, "Expected LINESTRING Z" f = lyr.GetFeature(5) - if f.GetField('Text') != '': + if f.GetField("Text") != "": f.DumpReadable() - pytest.fail('Wrong Text value on ATTRIB on second INSERT') + pytest.fail("Wrong Text value on ATTRIB on second INSERT") # No inlining - gdal.SetConfigOption('DXF_INLINE_BLOCKS', 'FALSE') - ds = ogr.Open('data/dxf/attrib.dxf') - gdal.SetConfigOption('DXF_INLINE_BLOCKS', None) + gdal.SetConfigOption("DXF_INLINE_BLOCKS", "FALSE") + ds = ogr.Open("data/dxf/attrib.dxf") + gdal.SetConfigOption("DXF_INLINE_BLOCKS", None) - lyr = ds.GetLayerByName('entities') + lyr = ds.GetLayerByName("entities") f = lyr.GetFeature(0) - if f.GetField('BlockAttributes') != ['MYATT1 super test', 'MYATTMULTI_001 Corps', 'MYATTMULTI_002 plpl']: + if f.GetField("BlockAttributes") != [ + "MYATT1 super test", + "MYATTMULTI_001 Corps", + "MYATTMULTI_002 plpl", + ]: f.DumpReadable() - pytest.fail('Wrong BlockAttributes value on first INSERT') + pytest.fail("Wrong BlockAttributes value on first INSERT") f = lyr.GetFeature(1) - if f.GetField('BlockAttributes') != ['MYATTMULTI ']: + if f.GetField("BlockAttributes") != ["MYATTMULTI "]: f.DumpReadable() - pytest.fail('Wrong BlockAttributes value on second INSERT') + pytest.fail("Wrong BlockAttributes value on second INSERT") - lyr = ds.GetLayerByName('blocks') + lyr = ds.GetLayerByName("blocks") f = lyr.GetFeature(1) - if f.GetField('AttributeTag') != 'MYATT1': + if f.GetField("AttributeTag") != "MYATT1": f.DumpReadable() - pytest.fail('Wrong AttributeTag value on first ATTDEF') + pytest.fail("Wrong AttributeTag value on first ATTDEF") f = lyr.GetFeature(2) - if f.GetField('AttributeTag') != 'MYATTMULTI': + if f.GetField("AttributeTag") != "MYATTMULTI": f.DumpReadable() - pytest.fail('Wrong AttributeTag value on second ATTDEF') + pytest.fail("Wrong AttributeTag value on second ATTDEF") ############################################################################### @@ -3418,50 +4212,62 @@ def test_ogr_dxf_49(): def test_ogr_dxf_50(): - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE') - ds = ogr.Open('data/dxf/text-fancy.dxf') - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', None) + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE") + ds = ogr.Open("data/dxf/text-fancy.dxf") + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", None) lyr = ds.GetLayer(0) # Text in Times New Roman bold italic, stretched 190%, color ByLayer # inside block inserted on a blue layer f = lyr.GetFeature(0) - if f.GetStyleString() != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Some nice text",p:5,s:10g,w:190,dx:84.3151g,dy:4.88825g,c:#0000ff)': + if ( + f.GetStyleString() + != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Some nice text",p:5,s:10g,w:190,dx:84.3151g,dy:4.88825g,c:#0000ff)' + ): f.DumpReadable() - pytest.fail('Wrong style string on feature 0') + pytest.fail("Wrong style string on feature 0") # Polyline, color and linetype ByBlock inside block with red color # and ByLayer linetype inserted on a layer with DASHED2 linetype f = lyr.GetFeature(1) if f.GetStyleString() != 'PEN(c:#ff0000,w:2.1g,p:"2.5g 1.25g")': f.DumpReadable() - pytest.fail('Wrong style string on feature 1') + pytest.fail("Wrong style string on feature 1") # Make sure TEXT objects don't inherit anything other than font name, # bold and italic from their parent STYLE f = lyr.GetFeature(2) - if f.GetStyleString() != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Good text",p:1,s:5g,c:#000000)': + if ( + f.GetStyleString() + != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Good text",p:1,s:5g,c:#000000)' + ): f.DumpReadable() - pytest.fail('Wrong style string on feature 2') + pytest.fail("Wrong style string on feature 2") # Polyline, color ByBlock, inside block inserted on a blue layer f = lyr.GetFeature(3) - if f.GetStyleString() != 'PEN(c:#0000ff,w:2.1g)': + if f.GetStyleString() != "PEN(c:#0000ff,w:2.1g)": f.DumpReadable() - pytest.fail('Wrong style string on feature 3') + pytest.fail("Wrong style string on feature 3") # MTEXT stretched 250%, color ByLayer inside block inserted on a blue layer f = lyr.GetFeature(4) - if f.GetStyleString() != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Some nice MTEXT",s:10g,w:250,p:8,c:#0000ff)': + if ( + f.GetStyleString() + != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Some nice MTEXT",s:10g,w:250,p:8,c:#0000ff)' + ): f.DumpReadable() - pytest.fail('Wrong style string on feature 4') + pytest.fail("Wrong style string on feature 4") # Individually invisible object should be invisible f = lyr.GetFeature(5) - if f.GetStyleString() != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Invisible text",p:1,s:5g,c:#00000000)': + if ( + f.GetStyleString() + != 'LABEL(f:"Times New Roman",bo:1,it:1,t:"Invisible text",p:1,s:5g,c:#00000000)' + ): f.DumpReadable() - pytest.fail('Wrong style string on feature 5') + pytest.fail("Wrong style string on feature 5") ############################################################################### @@ -3470,23 +4276,38 @@ def test_ogr_dxf_50(): def test_ogr_dxf_51(): - ds = ogr.Open('data/dxf/text-block-transform.dxf') + ds = ogr.Open("data/dxf/text-block-transform.dxf") lyr = ds.GetLayer(0) - wanted_style = ['a:330', 'c:#000000', 'dx:1.96672g', 'dy:-1.13549g', 'f:"Arial"', 'p:2', 's:3g', 't:"some text"', 'w:25'] + wanted_style = [ + "a:330", + "c:#000000", + "dx:1.96672g", + "dy:-1.13549g", + 'f:"Arial"', + "p:2", + "s:3g", + 't:"some text"', + "w:25", + ] # Three text features, all with the same effective geometry and style for x in range(3): f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (2.83231568033604 5.98356393304499 0)') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (2.83231568033604 5.98356393304499 0)" + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on feature %d' % x) + pytest.fail("Wrong geometry on feature %d" % x) - if sorted(f.GetStyleString()[6:-1].split(',')) != wanted_style: + if sorted(f.GetStyleString()[6:-1].split(",")) != wanted_style: f.DumpReadable() - pytest.fail('Wrong style string on feature %d' % x) + pytest.fail("Wrong style string on feature %d" % x) ############################################################################### @@ -3495,100 +4316,182 @@ def test_ogr_dxf_51(): def test_ogr_dxf_52(): - ds = ogr.Open('data/dxf/additional-entities.dxf') + ds = ogr.Open("data/dxf/additional-entities.dxf") lyr = ds.GetLayer(0) # HELIX f = lyr.GetNextFeature() - if f.GetField('SubClasses') != 'AcDbEntity:AcDbSpline:AcDbHelix': + if f.GetField("SubClasses") != "AcDbEntity:AcDbSpline:AcDbHelix": f.DumpReadable() - pytest.fail('Wrong SubClasses on HELIX') - if ogrtest.check_feature_geometry(f, 'LINESTRING (150 120,149.345876458438 119.778561209114,148.706627788813 119.535836602547,148.082773142501 119.272634882071,147.474831670876 118.989764749454,146.883322525316 118.688034906466,146.308764857195 118.368254054878,145.75167781789 118.03123089646,145.212580558776 117.677774132981,144.691992231228 117.308692466212,144.190431986623 116.924794597921,143.708418976337 116.52688922988,143.246472351745 116.115785063858,142.805226682224 115.692350328976,142.385468357145 115.257680939095,141.987209053809 114.8126724387,141.610382578047 114.358190780749,141.254922735687 113.895101918197,140.920763332559 113.424271804003,140.607838174492 112.946566391121,140.316081067316 112.46285163251,140.04542581686 111.973993481125,139.795806228954 111.480857889924,139.567156109426 110.984310811863,139.359409264107 110.4852181999,139.172499498825 109.98444600699,139.00636061941 109.482860186091,138.860926431692 108.981326690159,138.7361307415 108.480711472151,138.631907354662 107.981880485024,138.54819007701 107.485699681734,138.484912714371 106.993035015239,138.442009072576 106.504752438495,138.419412957453 106.021717904458,138.41678542913 105.544991394258,138.433333223564 105.075482938615,138.468434844937 104.613670677827,138.521471087835 104.160029888371,138.59182274684 103.715035846723,138.678870616536 103.27916382936,138.781995491508 102.852889112758,138.900578166339 102.436686973394,139.033999435614 102.031032687745,139.181640093916 101.636401532287,139.342880935829 101.253268783496,139.517102755937 100.882109717849,139.703686348824 100.523399611823,139.902012509075 100.177613741895,140.111462031272 99.8452273845396,140.33141571 99.5267158162348,140.561254339843 99.2225543134567,140.800358715385 98.933218152682,141.04810963121 98.6591826103871,141.303887881901 98.4009229630486,141.567055122443 98.1589144355755,141.836465751876 97.9334729764931,142.111203876514 97.7245055448538,142.390570491032 97.5318567084626,142.673866590107 97.3553710351246,142.960393168413 97.194893092645,143.249451220625 97.0502674488286,143.54034174142 96.9213386714808,143.832365725473 96.8079513284064,144.124824167458 96.7099499874106,144.417018062052 96.6271792162984,144.708248403929 96.5594835828749,144.997816187765 96.5067076549452,145.285022408236 96.4686960003143,145.569168060017 96.4452931867873,145.849554137782 96.4363437821692,146.125481636209 96.4416923542652,146.396251549971 96.4611834708803,146.661164873745 96.4946616998195,146.919522602205 96.5419716088879,147.170625730027 96.6029577658907,147.413708536343 96.6773765373194,147.64790100184 96.7644518356677,147.872845806317 96.8635266377703,148.088244263586 96.9739879715066,148.293797687463 97.0952228647559,148.48920739176 97.2266183453974,148.674174690292 97.3675614413103,148.848400896871 97.5174391803741,149.011587325312 97.675638590468,149.163435289429 97.8415466994713,149.303646103034 98.0145505352631,149.431921079943 98.194037125723,149.547961533967 98.37939349873,149.651468778922 98.5700066821635,149.742144128621 98.7652637039028,149.819688896877 98.9645515918272,149.883804397505 99.1672573738159,149.934191944317 99.3727680777483,149.970552851128 99.5804707315036,149.992588431751 99.7897523629611,150 100)') != 0: + pytest.fail("Wrong SubClasses on HELIX") + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING (150 120,149.345876458438 119.778561209114,148.706627788813 119.535836602547,148.082773142501 119.272634882071,147.474831670876 118.989764749454,146.883322525316 118.688034906466,146.308764857195 118.368254054878,145.75167781789 118.03123089646,145.212580558776 117.677774132981,144.691992231228 117.308692466212,144.190431986623 116.924794597921,143.708418976337 116.52688922988,143.246472351745 116.115785063858,142.805226682224 115.692350328976,142.385468357145 115.257680939095,141.987209053809 114.8126724387,141.610382578047 114.358190780749,141.254922735687 113.895101918197,140.920763332559 113.424271804003,140.607838174492 112.946566391121,140.316081067316 112.46285163251,140.04542581686 111.973993481125,139.795806228954 111.480857889924,139.567156109426 110.984310811863,139.359409264107 110.4852181999,139.172499498825 109.98444600699,139.00636061941 109.482860186091,138.860926431692 108.981326690159,138.7361307415 108.480711472151,138.631907354662 107.981880485024,138.54819007701 107.485699681734,138.484912714371 106.993035015239,138.442009072576 106.504752438495,138.419412957453 106.021717904458,138.41678542913 105.544991394258,138.433333223564 105.075482938615,138.468434844937 104.613670677827,138.521471087835 104.160029888371,138.59182274684 103.715035846723,138.678870616536 103.27916382936,138.781995491508 102.852889112758,138.900578166339 102.436686973394,139.033999435614 102.031032687745,139.181640093916 101.636401532287,139.342880935829 101.253268783496,139.517102755937 100.882109717849,139.703686348824 100.523399611823,139.902012509075 100.177613741895,140.111462031272 99.8452273845396,140.33141571 99.5267158162348,140.561254339843 99.2225543134567,140.800358715385 98.933218152682,141.04810963121 98.6591826103871,141.303887881901 98.4009229630486,141.567055122443 98.1589144355755,141.836465751876 97.9334729764931,142.111203876514 97.7245055448538,142.390570491032 97.5318567084626,142.673866590107 97.3553710351246,142.960393168413 97.194893092645,143.249451220625 97.0502674488286,143.54034174142 96.9213386714808,143.832365725473 96.8079513284064,144.124824167458 96.7099499874106,144.417018062052 96.6271792162984,144.708248403929 96.5594835828749,144.997816187765 96.5067076549452,145.285022408236 96.4686960003143,145.569168060017 96.4452931867873,145.849554137782 96.4363437821692,146.125481636209 96.4416923542652,146.396251549971 96.4611834708803,146.661164873745 96.4946616998195,146.919522602205 96.5419716088879,147.170625730027 96.6029577658907,147.413708536343 96.6773765373194,147.64790100184 96.7644518356677,147.872845806317 96.8635266377703,148.088244263586 96.9739879715066,148.293797687463 97.0952228647559,148.48920739176 97.2266183453974,148.674174690292 97.3675614413103,148.848400896871 97.5174391803741,149.011587325312 97.675638590468,149.163435289429 97.8415466994713,149.303646103034 98.0145505352631,149.431921079943 98.194037125723,149.547961533967 98.37939349873,149.651468778922 98.5700066821635,149.742144128621 98.7652637039028,149.819688896877 98.9645515918272,149.883804397505 99.1672573738159,149.934191944317 99.3727680777483,149.970552851128 99.5804707315036,149.992588431751 99.7897523629611,150 100)", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on HELIX') + pytest.fail("Wrong geometry on HELIX") # TRACE f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((150.0 120.5,150.0 119.5,200.0 119.5,200.0 120.5,150.0 120.5))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "POLYGON ((150.0 120.5,150.0 119.5,200.0 119.5,200.0 120.5,150.0 120.5))" + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on TRACE') + pytest.fail("Wrong geometry on TRACE") # HATCH with a spline boundary path (and OCS as well, just for fun) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON Z ((47.6969600708475 60.0 15,47.6969600708475 0.0 15,46.1103652823066 -0.466958240734954 14.5010390223444,44.5309994192688 -0.919910449553494 14.0043514365868,42.9660914072371 -1.34485059453921 13.5122106346236,41.4228701717145 -1.72777264377568 13.0268900083519,39.9085646382042 -2.0546705653465 12.5506629496691,38.4304037322091 -2.31153832733525 12.0858028504722,36.9956163792324 -2.48436989782552 11.6345831026584,35.6114315047771 -2.55915924490089 11.1992770981251,34.2850780343463 -2.52190033664495 10.7821582287693,33.0237848934429 -2.3585871411413 10.3854998864882,31.8347810075701 -2.0552136264735 10.011575463179,30.725295302231 -1.59777376072516 9.66265835073903,29.7025567029285 -0.972261511979859 9.34102194106535,28.7737941351658 -0.164670848321179 9.04893962605519,27.9445456607789 0.835923776643351 8.78815304558283,27.2086691364137 2.01916842728349 8.55673058492536,26.5550905172208 3.36572402537053 8.35118961809371,25.9727183005027 4.85621968724478 8.1680420288596,25.450460983562 6.47128452924656 8.00379970099481,24.9772270637013 8.19154766771616 7.85497451827107,24.5419250382231 9.99763821899391 7.71807836446012,24.1334634044299 11.8701852994201 7.58962312333373,23.7407506596245 13.7898180253351 7.46612067866363,23.3526953011092 15.7371655130791 7.34408291422158,22.9582058261868 17.6928568789925 7.22002171377933,22.5461907321598 19.6375212394157 7.09044896110861,22.1055585163308 21.5517877106888 6.95187653998118,21.6252176760022 23.4162854091522 6.80081633416879,21.0940767084768 25.2116434511463 6.63378022744318,20.501044111057 26.9184909530113 6.44728010357611,19.8350283810455 28.5174570310876 6.23782784633932,19.0849380157448 29.9891708017154 6.00193533950455,18.2425220975445 31.3190096857923 5.73700778952582,17.3111586046656 32.5117898949509 5.44410752140743,16.2972009340528 33.5773013324584 5.12523258605305,15.2070024839932 34.5253339038266 4.7823810347885,14.046916652774 35.3656775145671 4.41755091893963,12.8232968386826 36.1081220701913 4.0327402898323,11.5424964400062 36.7624574762111 3.62994719879235,10.2108688550319 37.338473638138 3.21116969714562,8.834767482047 37.8459604614835 2.77840583621797,7.42054571933875 38.2947078517594 2.33365366733523,5.97455696519436 38.6945057144772 1.87891124182326,4.50315461790106 39.0551439551486 1.41617661100791,3.01269207574607 39.3864124792851 0.947447826215011,1.50952273701662 39.6981011923983 0.474722938770421,0 40 0,47.6969600708475 60.0 15))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON Z ((47.6969600708475 60.0 15,47.6969600708475 0.0 15,46.1103652823066 -0.466958240734954 14.5010390223444,44.5309994192688 -0.919910449553494 14.0043514365868,42.9660914072371 -1.34485059453921 13.5122106346236,41.4228701717145 -1.72777264377568 13.0268900083519,39.9085646382042 -2.0546705653465 12.5506629496691,38.4304037322091 -2.31153832733525 12.0858028504722,36.9956163792324 -2.48436989782552 11.6345831026584,35.6114315047771 -2.55915924490089 11.1992770981251,34.2850780343463 -2.52190033664495 10.7821582287693,33.0237848934429 -2.3585871411413 10.3854998864882,31.8347810075701 -2.0552136264735 10.011575463179,30.725295302231 -1.59777376072516 9.66265835073903,29.7025567029285 -0.972261511979859 9.34102194106535,28.7737941351658 -0.164670848321179 9.04893962605519,27.9445456607789 0.835923776643351 8.78815304558283,27.2086691364137 2.01916842728349 8.55673058492536,26.5550905172208 3.36572402537053 8.35118961809371,25.9727183005027 4.85621968724478 8.1680420288596,25.450460983562 6.47128452924656 8.00379970099481,24.9772270637013 8.19154766771616 7.85497451827107,24.5419250382231 9.99763821899391 7.71807836446012,24.1334634044299 11.8701852994201 7.58962312333373,23.7407506596245 13.7898180253351 7.46612067866363,23.3526953011092 15.7371655130791 7.34408291422158,22.9582058261868 17.6928568789925 7.22002171377933,22.5461907321598 19.6375212394157 7.09044896110861,22.1055585163308 21.5517877106888 6.95187653998118,21.6252176760022 23.4162854091522 6.80081633416879,21.0940767084768 25.2116434511463 6.63378022744318,20.501044111057 26.9184909530113 6.44728010357611,19.8350283810455 28.5174570310876 6.23782784633932,19.0849380157448 29.9891708017154 6.00193533950455,18.2425220975445 31.3190096857923 5.73700778952582,17.3111586046656 32.5117898949509 5.44410752140743,16.2972009340528 33.5773013324584 5.12523258605305,15.2070024839932 34.5253339038266 4.7823810347885,14.046916652774 35.3656775145671 4.41755091893963,12.8232968386826 36.1081220701913 4.0327402898323,11.5424964400062 36.7624574762111 3.62994719879235,10.2108688550319 37.338473638138 3.21116969714562,8.834767482047 37.8459604614835 2.77840583621797,7.42054571933875 38.2947078517594 2.33365366733523,5.97455696519436 38.6945057144772 1.87891124182326,4.50315461790106 39.0551439551486 1.41617661100791,3.01269207574607 39.3864124792851 0.947447826215011,1.50952273701662 39.6981011923983 0.474722938770421,0 40 0,47.6969600708475 60.0 15))", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on HATCH 1') + pytest.fail("Wrong geometry on HATCH 1") # Another HATCH with a spline boundary path f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POLYGON ((77.2409948093467 172.430072843974,75.261065049518 171.643815908613,73.2981627172517 170.696359298076,71.3875263981659 169.604375316261,69.5631545040892 168.388782317518,67.8563613292361 167.073645833116,66.2946346031063 165.684923719356,64.9008927779373 164.249191641798,63.6931834376534 162.792474868402,62.6848095284188 161.339284018754,61.8848281190297 159.911914493846,61.298843085132 158.530030785262,60.9300095654357 157.21052494952,60.7801817312349 155.967617443343,60.8511622391671 154.813159397702,61.1453506194465 153.756315627339,61.664528568996 152.803726831033,62.4105189258065 151.964301284269,63.3843801494824 151.249807149788,64.5850174245011 150.674379748575,66.0076885629501 150.253830592488,67.6424701411086 150.004704104407,69.4728079995063 149.943055679116,71.4743351228068 150.082969908572,73.6141841756299 150.434899728198,75.8510314766708 151.003978292885,78.1360638882735 151.788519596984,80.41494916904 152.778958906121,82.6307223520159 153.957467932202,84.7273090430607 155.298400731333,86.6532441052495 156.769592674546,88.3650659486779 158.334376895018,89.8299059955281 159.954044613131,91.0272387483612 161.589690168686,91.957368361883 163.189390065386,92.6421956980388 164.701128484532,93.1110835351921 166.094608264522,93.3942229550992 167.356341648662,93.5189493216415 168.483994478151,93.5079031853763 169.481912548033,93.3782987206629 170.357905428604,93.1417233193846 171.121075154443,92.8040593119231 171.78040251468,92.3652285565357 172.343822183981,91.8186752047856 172.817679470437,91.1571081487304 173.20986823606,90.3766844995721 173.528608818345,89.4716123962251 173.777329886712,88.4346297478537 173.955199520934,87.2580461173156 174.057607166253,85.9350751682361 174.076420167619,84.4616595153474 174.000186427787,82.8389797200317 173.814465060529,81.0767853391384 173.502507153586,79.1975328516125 173.04655812613,77.2409948093467 172.430072843974))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "POLYGON ((77.2409948093467 172.430072843974,75.261065049518 171.643815908613,73.2981627172517 170.696359298076,71.3875263981659 169.604375316261,69.5631545040892 168.388782317518,67.8563613292361 167.073645833116,66.2946346031063 165.684923719356,64.9008927779373 164.249191641798,63.6931834376534 162.792474868402,62.6848095284188 161.339284018754,61.8848281190297 159.911914493846,61.298843085132 158.530030785262,60.9300095654357 157.21052494952,60.7801817312349 155.967617443343,60.8511622391671 154.813159397702,61.1453506194465 153.756315627339,61.664528568996 152.803726831033,62.4105189258065 151.964301284269,63.3843801494824 151.249807149788,64.5850174245011 150.674379748575,66.0076885629501 150.253830592488,67.6424701411086 150.004704104407,69.4728079995063 149.943055679116,71.4743351228068 150.082969908572,73.6141841756299 150.434899728198,75.8510314766708 151.003978292885,78.1360638882735 151.788519596984,80.41494916904 152.778958906121,82.6307223520159 153.957467932202,84.7273090430607 155.298400731333,86.6532441052495 156.769592674546,88.3650659486779 158.334376895018,89.8299059955281 159.954044613131,91.0272387483612 161.589690168686,91.957368361883 163.189390065386,92.6421956980388 164.701128484532,93.1110835351921 166.094608264522,93.3942229550992 167.356341648662,93.5189493216415 168.483994478151,93.5079031853763 169.481912548033,93.3782987206629 170.357905428604,93.1417233193846 171.121075154443,92.8040593119231 171.78040251468,92.3652285565357 172.343822183981,91.8186752047856 172.817679470437,91.1571081487304 173.20986823606,90.3766844995721 173.528608818345,89.4716123962251 173.777329886712,88.4346297478537 173.955199520934,87.2580461173156 174.057607166253,85.9350751682361 174.076420167619,84.4616595153474 174.000186427787,82.8389797200317 173.814465060529,81.0767853391384 173.502507153586,79.1975328516125 173.04655812613,77.2409948093467 172.430072843974))", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on HATCH 2') + pytest.fail("Wrong geometry on HATCH 2") # Three MLINE objects f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING Z ((-3.92232270276368 270.388386486182 0,44.2014737139232 260.763627202844 0),(0 290 0,50 280 0),(50 280 0,54.2440667916678 280.848813358334 0),(66.6666666666666 283.333333333333 0,87.2937093466817 287.458741869336 0),(55.335512192016 260.671024384032 0,83.0445264186877 266.212827229366 0),(97.9166666666667 289.583333333333 0,150 300 0),(93.6674837386727 268.337418693363 0,122.93205511402 274.190332968433 0),(150 300 0,140 260 0),(122.93205511402 274.190332968433 0,120.597149997093 264.850712500727 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING Z ((-3.92232270276368 270.388386486182 0,44.2014737139232 260.763627202844 0),(0 290 0,50 280 0),(50 280 0,54.2440667916678 280.848813358334 0),(66.6666666666666 283.333333333333 0,87.2937093466817 287.458741869336 0),(55.335512192016 260.671024384032 0,83.0445264186877 266.212827229366 0),(97.9166666666667 289.583333333333 0,150 300 0),(93.6674837386727 268.337418693363 0,122.93205511402 274.190332968433 0),(150 300 0,140 260 0),(122.93205511402 274.190332968433 0,120.597149997093 264.850712500727 0))", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on MLINE 1') + pytest.fail("Wrong geometry on MLINE 1") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING Z ((70 290 0,50 250 0),(61.0557280900008 294.472135955 0,41.0557280900008 254.472135955 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING Z ((70 290 0,50 250 0),(61.0557280900008 294.472135955 0,41.0557280900008 254.472135955 0))", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on MLINE 2') + pytest.fail("Wrong geometry on MLINE 2") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING Z ((100 300 0,97.9166666666667 289.583333333333 0),(95.7739043877141 304.364619506534 0,92.6051880066742 288.521037601335 0),(91.5478087754281 308.729239013068 0,87.2937093466817 287.458741869336 0),(93.6674837386727 268.337418693363 0,90 250 0),(88.3560050786802 267.275122961365 0,83.7111464107331 244.050829621629 0),(83.0445264186877 266.212827229366 0,77.4222928214662 238.101659243259 0),(90 250 0,160 260 0),(83.7111464107331 244.050829621629 0,165.0 255.663522991525 0),(77.4222928214662 238.101659243259 0,170.0 251.327045983049 0),(160 260 0,160 310 0),(165.0 255.663522991525 0,165.0 315.902302108582 0),(170.0 251.327045983049 0,170.0 321.804604217164 0),(160 310 0,100 300 0),(165.0 315.902302108582 0,95.7739043877141 304.364619506534 0),(170.0 321.804604217164 0,91.5478087754281 308.729239013068 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "MULTILINESTRING Z ((100 300 0,97.9166666666667 289.583333333333 0),(95.7739043877141 304.364619506534 0,92.6051880066742 288.521037601335 0),(91.5478087754281 308.729239013068 0,87.2937093466817 287.458741869336 0),(93.6674837386727 268.337418693363 0,90 250 0),(88.3560050786802 267.275122961365 0,83.7111464107331 244.050829621629 0),(83.0445264186877 266.212827229366 0,77.4222928214662 238.101659243259 0),(90 250 0,160 260 0),(83.7111464107331 244.050829621629 0,165.0 255.663522991525 0),(77.4222928214662 238.101659243259 0,170.0 251.327045983049 0),(160 260 0,160 310 0),(165.0 255.663522991525 0,165.0 315.902302108582 0),(170.0 251.327045983049 0,170.0 321.804604217164 0),(160 310 0,100 300 0),(165.0 315.902302108582 0,95.7739043877141 304.364619506534 0),(170.0 321.804604217164 0,91.5478087754281 308.729239013068 0))", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on MLINE 3') + pytest.fail("Wrong geometry on MLINE 3") # INSERT with rows/columns (MInsert) - minsert_attrib_style = 'LABEL(f:"Arial",t:"N",p:5,a:13,s:8g,w:120,dx:2.21818g,dy:4.61732g,c:#000000)' + minsert_attrib_style = ( + 'LABEL(f:"Arial",t:"N",p:5,a:13,s:8g,w:120,dx:2.21818g,dy:4.61732g,c:#000000)' + ) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING (57.7504894565613 50.7437006478524,69.4429302339842 53.4431132999787,71.6924407774228 43.6994126521264,60 41,57.7504894565613 50.7437006478524)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING (57.7504894565613 50.7437006478524,69.4429302339842 53.4431132999787,71.6924407774228 43.6994126521264,60 41,57.7504894565613 50.7437006478524)", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT polyline 1') + pytest.fail("Wrong geometry on INSERT polyline 1") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (62.5032851270548 42.604233016948 0)') != 0 \ - or f.GetStyleString() != minsert_attrib_style: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (62.5032851270548 42.604233016948 0)" + ) + != 0 + or f.GetStyleString() != minsert_attrib_style + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT attribute 1') + pytest.fail("Wrong geometry on INSERT attribute 1") for _ in range(2): f = lyr.GetNextFeature() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING (116.212693343675 64.2407639084843,127.905134121098 66.9401765606106,130.154644664537 57.1964759127583,118.462203887114 54.4970632606319,116.212693343675 64.2407639084843)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING (116.212693343675 64.2407639084843,127.905134121098 66.9401765606106,130.154644664537 57.1964759127583,118.462203887114 54.4970632606319,116.212693343675 64.2407639084843)", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT polyline 3') + pytest.fail("Wrong geometry on INSERT polyline 3") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (120.965489014169 56.1012962775799 0)') != 0 \ - or f.GetStyleString() != minsert_attrib_style: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (120.965489014169 56.1012962775799 0)" + ) + != 0 + or f.GetStyleString() != minsert_attrib_style + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT attribute 3') + pytest.fail("Wrong geometry on INSERT attribute 3") for _ in range(8): f = lyr.GetNextFeature() f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING (140.944774200355 90.4766968345049,152.637214977778 93.1761094866313,154.886725521217 83.4324088387789,143.194284743794 80.7329961866526,140.944774200355 90.4766968345049)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING (140.944774200355 90.4766968345049,152.637214977778 93.1761094866313,154.886725521217 83.4324088387789,143.194284743794 80.7329961866526,140.944774200355 90.4766968345049)", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT polyline 8') + pytest.fail("Wrong geometry on INSERT polyline 8") f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'POINT Z (145.697569870849 82.3372292036006 0)') != 0 \ - or f.GetStyleString() != minsert_attrib_style: + if ( + ogrtest.check_feature_geometry( + f, "POINT Z (145.697569870849 82.3372292036006 0)" + ) + != 0 + or f.GetStyleString() != minsert_attrib_style + ): f.DumpReadable() - pytest.fail('Wrong geometry on INSERT attribute 8') + pytest.fail("Wrong geometry on INSERT attribute 8") # Also throw in a test of a weird SPLINE generated by a certain CAD package # with a knot vector that does not start at zero f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'LINESTRING (0 20,0.513272464826192 19.8251653183892,1.00815682586353 19.629626397244,1.48499546839613 19.4132825350102,1.94413077770813 19.1760330301337,2.38590513908363 18.9177771810603,2.81066093780676 18.6384142862359,3.21874055916165 18.3378436441062,3.61048638843241 18.0159645531172,3.98624081090316 17.6726763117148,4.34634621185803 17.3078782183446,4.69114497658114 16.9214695714527,5.02097949035661 16.5133496694848,5.33619213846856 16.0834178108867,5.63712530620111 15.6315732941045,5.92412137883838 15.1577154175837,6.1975227416645 14.6617434797705,6.45767177996359 14.1435567791104,6.70491087901976 13.6030546140496,6.93958242411715 13.0401362830336,7.16202880053986 12.4547010845085,7.37259239357203 11.8466483169201,7.57161558849776 11.2158772787141,7.7594407706012 10.5622872683365,7.93641032516645 9.88577758423314,8.10286663747763 9.18624752484979,8.25915209281888 8.46359638863234,8.4056090764743 7.71772347402662,8.54257997372803 6.94852807947849,8.67040716986418 6.1559095034338,8.78943305016688 5.33976704433838,8.9 4.5)') != 0: + if ( + ogrtest.check_feature_geometry( + f, + "LINESTRING (0 20,0.513272464826192 19.8251653183892,1.00815682586353 19.629626397244,1.48499546839613 19.4132825350102,1.94413077770813 19.1760330301337,2.38590513908363 18.9177771810603,2.81066093780676 18.6384142862359,3.21874055916165 18.3378436441062,3.61048638843241 18.0159645531172,3.98624081090316 17.6726763117148,4.34634621185803 17.3078782183446,4.69114497658114 16.9214695714527,5.02097949035661 16.5133496694848,5.33619213846856 16.0834178108867,5.63712530620111 15.6315732941045,5.92412137883838 15.1577154175837,6.1975227416645 14.6617434797705,6.45767177996359 14.1435567791104,6.70491087901976 13.6030546140496,6.93958242411715 13.0401362830336,7.16202880053986 12.4547010845085,7.37259239357203 11.8466483169201,7.57161558849776 11.2158772787141,7.7594407706012 10.5622872683365,7.93641032516645 9.88577758423314,8.10286663747763 9.18624752484979,8.25915209281888 8.46359638863234,8.4056090764743 7.71772347402662,8.54257997372803 6.94852807947849,8.67040716986418 6.1559095034338,8.78943305016688 5.33976704433838,8.9 4.5)", + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong geometry on SPLINE') + pytest.fail("Wrong geometry on SPLINE") ############################################################################### @@ -3597,13 +4500,18 @@ def test_ogr_dxf_52(): def test_ogr_dxf_53(): - ds = ogr.Open('data/dxf/block-basepoint.dxf') + ds = ogr.Open("data/dxf/block-basepoint.dxf") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(f, 'MULTILINESTRING Z ((290 160 0,310 140 0),(310 160 0,290 140 0))') != 0: + if ( + ogrtest.check_feature_geometry( + f, "MULTILINESTRING Z ((290 160 0,310 140 0),(310 160 0,290 140 0))" + ) + != 0 + ): f.DumpReadable() - pytest.fail('Wrong feature geometry') + pytest.fail("Wrong feature geometry") ############################################################################### @@ -3612,20 +4520,22 @@ def test_ogr_dxf_53(): def test_ogr_dxf_54(): - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE') - ds = ogr.Open('data/dxf/frozen-off.dxf') - gdal.SetConfigOption('DXF_MERGE_BLOCK_GEOMETRIES', None) + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE") + ds = ogr.Open("data/dxf/frozen-off.dxf") + gdal.SetConfigOption("DXF_MERGE_BLOCK_GEOMETRIES", None) lyr = ds.GetLayer(0) # Features should be visible/hidden in the following order: - featureVisibility = '.hhh..hhh..hhhhhhhhhhhhhh.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.hhh..hhhhhhhhhhhhhh.hhh' + featureVisibility = ".hhh..hhh..hhhhhhhhhhhhhh.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.hhh..hhhhhhhhhhhhhh.hhh" for number, h in enumerate(featureVisibility): f = lyr.GetNextFeature() - isFeatureVisible = '#000000)' in f.GetStyleString() or '#ff0000)' in f.GetStyleString() - if isFeatureVisible == (h == 'h'): + isFeatureVisible = ( + "#000000)" in f.GetStyleString() or "#ff0000)" in f.GetStyleString() + ) + if isFeatureVisible == (h == "h"): f.DumpReadable() - pytest.fail('Wrong visibility on feature %d' % number) + pytest.fail("Wrong visibility on feature %d" % number) ############################################################################### @@ -3634,23 +4544,22 @@ def test_ogr_dxf_54(): def test_ogr_dxf_55(): - with gdaltest.config_option('DXF_MERGE_BLOCK_GEOMETRIES', 'FALSE'): - ds = ogr.Open('data/dxf/block-hidden-entities.dxf') + with gdaltest.config_option("DXF_MERGE_BLOCK_GEOMETRIES", "FALSE"): + ds = ogr.Open("data/dxf/block-hidden-entities.dxf") lyr = ds.GetLayer(0) # Red features should be hidden, black features should be visible for number, f in enumerate(lyr): - if not ('#ff000000)' in f.GetStyleString() or '#000000)' in f.GetStyleString()): + if not ("#ff000000)" in f.GetStyleString() or "#000000)" in f.GetStyleString()): f.DumpReadable() - pytest.fail('Wrong visibility on feature %d' % number) + pytest.fail("Wrong visibility on feature %d" % number) ############################################################################### def test_ogr_dxf_insert_too_many_errors(): with gdaltest.error_handler(): - ogr.Open('data/dxf/insert-too-many-errors.dxf') - + ogr.Open("data/dxf/insert-too-many-errors.dxf") ############################################################################### @@ -3658,12 +4567,11 @@ def test_ogr_dxf_insert_too_many_errors(): def test_ogr_dxf_write_geometry_collection_of_unsupported_type(): - - tmpfile = '/vsimem/ogr_dxf_write_geometry_collection_of_unsupported_type.dxf' - ds = ogr.GetDriverByName('DXF').CreateDataSource(tmpfile) - lyr = ds.CreateLayer('test') + tmpfile = "/vsimem/ogr_dxf_write_geometry_collection_of_unsupported_type.dxf" + ds = ogr.GetDriverByName("DXF").CreateDataSource(tmpfile) + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(TIN EMPTY)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("GEOMETRYCOLLECTION(TIN EMPTY)")) with gdaltest.error_handler(): ret = lyr.CreateFeature(f) assert ret != 0 @@ -3675,28 +4583,31 @@ def test_ogr_dxf_write_geometry_collection_of_unsupported_type(): # Test fix for https://github.com/OSGeo/gdal/issues/1969 # with a SPLINE whose first knot is a very close to zero negative value. + def test_ogr_dxf_very_close_neg_to_zero_knot(): - ds = ogr.Open('data/dxf/spline_with_very_close_neg_to_zero_knot.dxf') + ds = ogr.Open("data/dxf/spline_with_very_close_neg_to_zero_knot.dxf") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() extent = g.GetEnvelope() - assert extent == pytest.approx((163.0306017054786, 166.6530957511469, - 78.40469559017359, 81.82569418640966), abs=1e-5) + assert extent == pytest.approx( + (163.0306017054786, 166.6530957511469, 78.40469559017359, 81.82569418640966), + abs=1e-5, + ) + ############################################################################### def test_ogr_dxf_polygon_3D(): - - tmpfile = '/vsimem/test_ogr_dxf_polygon_3D.dxf' - ds = ogr.GetDriverByName('DXF').CreateDataSource(tmpfile) - lyr = ds.CreateLayer('test') + tmpfile = "/vsimem/test_ogr_dxf_polygon_3D.dxf" + ds = ogr.GetDriverByName("DXF").CreateDataSource(tmpfile) + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - g = ogr.CreateGeometryFromWkt('POLYGON((0 0 10,0 1 10,1 1 10,0 0 10))') + g = ogr.CreateGeometryFromWkt("POLYGON((0 0 10,0 1 10,1 1 10,0 0 10))") f.SetGeometry(g) lyr.CreateFeature(f) ds = None @@ -3707,26 +4618,32 @@ def test_ogr_dxf_polygon_3D(): assert got_g.Equals(g) gdal.Unlink(tmpfile) + ############################################################################### def test_ogr_dxf_read_broken_file_1(): - """ Test that we don't crash """ + """Test that we don't crash""" with gdaltest.error_handler(): - ds = ogr.Open('data/dxf/clusterfuzz-testcase-minimized-dxf_fuzzer-5400376672124928.dxf') + ds = ogr.Open( + "data/dxf/clusterfuzz-testcase-minimized-dxf_fuzzer-5400376672124928.dxf" + ) lyr = ds.GetLayer(0) for f in lyr: pass + ############################################################################### def test_ogr_dxf_read_broken_file_2(): - """ Test that we don't crash """ + """Test that we don't crash""" with gdaltest.error_handler(): - ds = ogr.Open('data/dxf/clusterfuzz-testcase-minimized-shape_fuzzer-6126814756995072.dxf') + ds = ogr.Open( + "data/dxf/clusterfuzz-testcase-minimized-shape_fuzzer-6126814756995072.dxf" + ) lyr = ds.GetLayer(0) for f in lyr: pass diff --git a/autotest/ogr/ogr_edigeo.py b/autotest/ogr/ogr_edigeo.py index 7d9e85188039..9565da41e4e5 100755 --- a/autotest/ogr/ogr_edigeo.py +++ b/autotest/ogr/ogr_edigeo.py @@ -30,30 +30,32 @@ ############################################################################### import os -from osgeo import ogr - import gdaltest import ogrtest import pytest +from osgeo import ogr + ############################################################################### 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'] + 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/affa340d16681f1bb78673d23fb38a6c1eb2b38a/modules/unsupported/edigeo/src/test/resources/org/geotools/data/edigeo/test-data/' + base_url = "https://raw.githubusercontent.com/geotools/geotools/affa340d16681f1bb78673d23fb38a6c1eb2b38a/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): @@ -61,58 +63,65 @@ def test_ogr_edigeo_1(): try: for filename in filelist: - os.stat('tmp/cache/' + filename) + os.stat("tmp/cache/" + filename) except OSError: pytest.skip() - ds = ogr.Open('tmp/cache/E000AB01.THF') + 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), - ] + 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 + assert ( + lyr.GetSpatialRef().ExportToWkt().find("Lambert_Conformal_Conic_1SP") + != -1 + ) - lyr = ds.GetLayerByName('BORNE_id') + lyr = ds.GetLayerByName("BORNE_id") feat = lyr.GetNextFeature() - if ogrtest.check_feature_geometry(feat, 'POINT (877171.28 72489.22)'): + if ogrtest.check_feature_geometry(feat, "POINT (877171.28 72489.22)"): feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('BATIMENT_id') + 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))'): + 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') + 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)'): + 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() - - - diff --git a/autotest/ogr/ogr_eeda.py b/autotest/ogr/ogr_eeda.py index 377aee467517..a9b8cd44415c 100755 --- a/autotest/ogr/ogr_eeda.py +++ b/autotest/ogr/ogr_eeda.py @@ -31,34 +31,39 @@ import json - -from osgeo import gdal, ogr - import gdaltest import pytest +from osgeo import gdal, ogr -pytestmark = pytest.mark.require_driver('EEDA') +pytestmark = pytest.mark.require_driver("EEDA") ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") yield - 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') + 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" + ) ############################################################################### @@ -67,33 +72,37 @@ def startup_and_cleanup(): def test_eeda_2(): - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageSize=1', json.dumps({ - 'images': [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageSize=1", + json.dumps( { - 'properties': - { - 'string_field': 'bar', - 'int_field': 1, - 'int64_field': 123456789012, - 'double_field': 1.23 - } + "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.FileFromMemBuffer("/vsimem/ee/", "") - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = ogr.Open('EEDA:collection') - gdal.SetConfigOption('EEDA_URL', None) + 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.TestCapability("foo") == 0 assert lyr.GetLayerDefn().GetFieldCount() == 8 + 7 + 4 @@ -101,95 +110,112 @@ def test_eeda_2(): assert lyr.GetFeatureCount() == -1 - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages', json.dumps({ - 'images': [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/collection:listImages", + json.dumps( { - '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': [ + "images": [ { - "id": "B1", - "dataType": { - "precision": "INT", - "range": { - "max": 255 - } + "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, }, - "grid": { - "crsCode": "EPSG:32610", - "affineTransform": { - "translateX": 499980, - "translateY": 4200000, - "scaleX": 60, - "scaleY": -60 - }, - "dimensions": { - "width": 1830, - "height": 1831 + "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' + ], + }, + { + "name": "projects/earthengine-public/assets/collection/second_feature" + }, + ], + "nextPageToken": "myToken", } - ], - '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)))': + 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': + 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': [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageToken=myToken", + json.dumps( { - 'name': 'projects/earthengine-public/assets/collection/third_feature' + "images": [ + { + "name": "projects/earthengine-public/assets/collection/third_feature" + } + ] } - ] - })) + ), + ) f = lyr.GetNextFeature() - if f.GetField('name') != 'projects/earthengine-public/assets/collection/third_feature': + if ( + f.GetField("name") + != "projects/earthengine-public/assets/collection/third_feature" + ): f.DumpReadable() pytest.fail() @@ -199,111 +225,152 @@ def test_eeda_2(): lyr.ResetReading() f = lyr.GetNextFeature() - if f.GetField('name') != 'projects/earthengine-public/assets/collection/first_feature': + if ( + f.GetField("name") + != "projects/earthengine-public/assets/collection/first_feature" + ): f.DumpReadable() pytest.fail() - lyr.SetAttributeFilter('EEDA:raw_filter') + lyr.SetAttributeFilter("EEDA:raw_filter") - gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?filter=raw%5Ffilter', json.dumps({ - 'images': [ + gdal.FileFromMemBuffer( + "/vsimem/ee/projects/earthengine-public/assets/collection:listImages?filter=raw%5Ffilter", + json.dumps( { - 'name': 'projects/earthengine-public/assets/collection/raw_filter' + "images": [ + {"name": "projects/earthengine-public/assets/collection/raw_filter"} + ] } - ] - })) + ), + ) f = lyr.GetNextFeature() - assert f.GetField('name') == 'projects/earthengine-public/assets/collection/raw_filter' + 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) )") - - 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%28string%5Ffield%20%3D%20%22bar%22%20AND%20%28int%5Ffield%20%3E%200%20AND%20int%5Ffield%20%3C%202%29%29%20AND%20%28%28int64%5Ffield%20%3E%3D%200%20AND%20int64%5Ffield%20%3C%3D%209999999999999%29%20AND%20%28double%5Ffield%20%21%3D%203%2E5%20AND%20string%5Ffield%20%3D%20%22bar%22%20OR%20string%5Ffield%20%3D%20%22baz%22%29%29%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' - with gdaltest.tempfile(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': + 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) )" + ) + + 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%28string%5Ffield%20%3D%20%22bar%22%20AND%20%28int%5Ffield%20%3E%200%20AND%20int%5Ffield%20%3C%202%29%29%20AND%20%28%28int64%5Ffield%20%3E%3D%200%20AND%20int64%5Ffield%20%3C%3D%209999999999999%29%20AND%20%28double%5Ffield%20%21%3D%203%2E5%20AND%20string%5Ffield%20%3D%20%22bar%22%20OR%20string%5Ffield%20%3D%20%22baz%22%29%29%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" + with gdaltest.tempfile( + tmpfile, + json.dumps( + { + "images": [ { - 'string_field': 'bar', - 'int_field': 1, - 'int64_field': 123456789012, - 'double_field': 1.23, - 'another_prop': 3 - } - }, - { - 'name': 'projects/earthengine-public/assets/collection/second_feature' - } - ] - })): + "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() - assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' + 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'") - - tmpfile = '/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z' - with gdaltest.tempfile(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' - } - ] - })): + lyr.SetAttributeFilter( + "startTime >= '1980-01-01T00:00:00Z' AND endTime <= '1980-01-02T23:59:59Z'" + ) + + tmpfile = "/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z" + with gdaltest.tempfile( + 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() - assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' + 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'") - tmpfile = '/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z' - with gdaltest.tempfile(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' - } - ] - })): + tmpfile = "/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z" + with gdaltest.tempfile( + 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() - assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' + assert ( + f.GetField("name") + == "projects/earthengine-public/assets/collection/filtered_feature" + ) ds = None - gdal.SetConfigOption('EEDA_BEARER', None) + gdal.SetConfigOption("EEDA_BEARER", None) + ############################################################################### # Nominal case where collection is in eedaconf.json @@ -311,17 +378,18 @@ def test_eeda_2(): def test_eeda_3(): - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') - ds = ogr.Open('EEDA:##example_collection/example_subcollection') - gdal.SetConfigOption('EEDA_URL', None) + 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) + gdal.SetConfigOption("EEDA_BEARER", None) + ############################################################################### # Test that name and id variants are handled correctly. @@ -329,71 +397,75 @@ def test_eeda_3(): def test_eeda_4(): - gdal.SetConfigOption('EEDA_BEARER', 'mybearer') - gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') + gdal.SetConfigOption("EEDA_BEARER", "mybearer") + gdal.SetConfigOption("EEDA_URL", "/vsimem/ee/") # User asset ID ("users/**"). - tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/users/foo:listImages?pageSize=1' - with gdaltest.tempfile(tmpfile, json.dumps({ - 'images': [ - { - 'name': 'projects/earthengine-legacy/assets/users/foo/bar' - } - ] - })): - assert ogr.Open('EEDA:users/foo').GetLayer(0) + tmpfile = ( + "/vsimem/ee/projects/earthengine-legacy/assets/users/foo:listImages?pageSize=1" + ) + with gdaltest.tempfile( + tmpfile, + json.dumps( + {"images": [{"name": "projects/earthengine-legacy/assets/users/foo/bar"}]} + ), + ): + assert ogr.Open("EEDA:users/foo").GetLayer(0) # Project asset ID ("projects/**"). - tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/projects/foo:listImages?pageSize=1' - with gdaltest.tempfile(tmpfile, json.dumps({ - 'images': [ - { - 'name': 'projects/earthengine-legacy/assets/projects/foo/bar' - } - ] - })): - ds = ogr.Open('EEDA:projects/foo') + tmpfile = "/vsimem/ee/projects/earthengine-legacy/assets/projects/foo:listImages?pageSize=1" + with gdaltest.tempfile( + tmpfile, + json.dumps( + { + "images": [ + {"name": "projects/earthengine-legacy/assets/projects/foo/bar"} + ] + } + ), + ): + ds = ogr.Open("EEDA:projects/foo") assert ds.GetLayer(0) ds = None # Multi-folder project asset ID ("projects/foo/bar/baz"). - tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/projects/foo/bar/baz:listImages?pageSize=1' - with gdaltest.tempfile(tmpfile, json.dumps({ - 'images': [ - { - 'name': 'projects/earthengine-legacy/assets/projects/foo/bar/baz/qux' - } - ] - })): - ds = ogr.Open('EEDA:projects/foo/bar/baz') + tmpfile = "/vsimem/ee/projects/earthengine-legacy/assets/projects/foo/bar/baz:listImages?pageSize=1" + with gdaltest.tempfile( + 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) ds = None # Public-catalog asset ID (e.g. "LANDSAT"). - tmpfile = '/vsimem/ee/projects/earthengine-public/assets/foo:listImages?pageSize=1' - with gdaltest.tempfile(tmpfile, json.dumps({ - 'images': [ - { - 'name': 'projects/earthengine-public/assets/foo/bar' - } - ] - })): - ds = ogr.Open('EEDA:foo') + tmpfile = "/vsimem/ee/projects/earthengine-public/assets/foo:listImages?pageSize=1" + with gdaltest.tempfile( + tmpfile, + json.dumps( + {"images": [{"name": "projects/earthengine-public/assets/foo/bar"}]} + ), + ): + ds = ogr.Open("EEDA:foo") assert ds.GetLayer(0) ds = None # Asset name ("projects/*/assets/**"). - tmpfile = '/vsimem/ee/projects/foo/assets/bar:listImages?pageSize=1' - with gdaltest.tempfile(tmpfile, json.dumps({ - 'images': [ - { - 'name': 'projects/foo/assets/bar/baz' - } - ] - })): - ds = ogr.Open('EEDA:projects/foo/assets/bar') + tmpfile = "/vsimem/ee/projects/foo/assets/bar:listImages?pageSize=1" + with gdaltest.tempfile( + tmpfile, json.dumps({"images": [{"name": "projects/foo/assets/bar/baz"}]}) + ): + ds = ogr.Open("EEDA:projects/foo/assets/bar") assert ds.GetLayer(0) ds = None - gdal.SetConfigOption('EEDA_BEARER', None) - gdal.SetConfigOption('EEDA_URL', None) + gdal.SetConfigOption("EEDA_BEARER", None) + gdal.SetConfigOption("EEDA_URL", None) diff --git a/autotest/ogr/ogr_elasticsearch.py b/autotest/ogr/ogr_elasticsearch.py index c4d634302153..556c5fc051c5 100755 --- a/autotest/ogr/ogr_elasticsearch.py +++ b/autotest/ogr/ogr_elasticsearch.py @@ -31,59 +31,68 @@ import json import time -import ogrtest import gdaltest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr +import ogrtest import pytest -pytestmark = pytest.mark.require_driver('Elasticsearch') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("Elasticsearch") ############################################################################### # 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) + 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) + gdal.Unlink("/vsimem/fakeelasticsearch/" + subdir + "/" + f) - lst = gdal.ReadDir('/vsimem/fakeelasticsearch/' + - subdir + '/FeatureCollection') + lst = gdal.ReadDir("/vsimem/fakeelasticsearch/" + subdir + "/FeatureCollection") if lst: for f in lst: - gdal.Unlink('/vsimem/fakeelasticsearch/' + - subdir + '/FeatureCollection/' + f) + gdal.Unlink( + "/vsimem/fakeelasticsearch/" + subdir + "/FeatureCollection/" + f + ) - lst = gdal.ReadDir('/vsimem/fakeelasticsearch') + lst = gdal.ReadDir("/vsimem/fakeelasticsearch") if lst: for f in lst: - gdal.Unlink('/vsimem/fakeelasticsearch/' + f) + gdal.Unlink("/vsimem/fakeelasticsearch/" + f) - gdal.Unlink('/vsimem/fakeelasticsearch') - gdal.Unlink('/vsimem/fakeelasticsearch&USERPWD=user:pwd') + gdal.Unlink("/vsimem/fakeelasticsearch") + gdal.Unlink("/vsimem/fakeelasticsearch&USERPWD=user:pwd") ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): ogrtest.srs_wgs84 = osr.SpatialReference() - ogrtest.srs_wgs84.SetFromUserInput('WGS84') + ogrtest.srs_wgs84.SetFromUserInput("WGS84") - ogrtest.elasticsearch_drv = ogr.GetDriverByName('Elasticsearch') + ogrtest.elasticsearch_drv = ogr.GetDriverByName("Elasticsearch") - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES") yield ogr_elasticsearch_delete_files() - gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) + gdal.SetConfigOption("CPL_CURL_ENABLE_VSIMEM", None) + ############################################################################### # Test writing into an nonexistent Elasticsearch datastore. @@ -92,38 +101,39 @@ def startup_and_cleanup(): def test_ogr_elasticsearch_nonexistent_server(): with gdaltest.error_handler(): - ds = ogrtest.elasticsearch_drv.CreateDataSource( - '/vsimem/nonexistent_host') - assert ds is None, 'managed to open nonexistent Elasticsearch datastore.' + 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.' + 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.' + 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.' + 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.' + 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}}""") + 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.' + ds = ogrtest.elasticsearch_drv.Open("ES:/vsimem/fakeelasticsearch") + assert ds is None, "managed to open invalid Elasticsearch datastore." + ############################################################################### # Simple test @@ -131,12 +141,12 @@ def test_ogr_elasticsearch_nonexistent_server(): def test_ogr_elasticsearch_1(): - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"2.0.0"}}""") + 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' + 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 @@ -144,44 +154,49 @@ def test_ogr_elasticsearch_1(): # Failed index creation with gdaltest.error_handler(): - lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=['FID=']) + 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=']) + 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' + "/vsimem/fakeelasticsearch/foo/_mapping/FeatureCollection&POSTFIELDS" '={ "FeatureCollection": { "properties": { "type": ' - '{ "type": "string" }, "properties": { } } } }', '{}') + '{ "type": "string" }, "properties": { } } } }', + "{}", + ) # OVERWRITE an nonexistent layer. - lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, - options=['OVERWRITE=TRUE', 'FID=']) + 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":{}}}}') + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch/foo", '{"foo":{"mappings":{"FeatureCollection":{}}}}' + ) with gdaltest.error_handler(): - lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, - options=['OVERWRITE=TRUE']) + 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&CUSTOMREQUEST=DELETE', '{}') - gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/foo/FeatureCollection&POSTFIELDS={ }', '{}') - lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, options=[ - 'OVERWRITE=TRUE', 'BULK_INSERT=NO', 'FID=']) + "/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 @@ -193,69 +208,86 @@ def test_ogr_elasticsearch_1(): feat = ogr.Feature(lyr.GetLayerDefn()) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/foo/FeatureCollection&POSTFIELDS={ "properties": { } }', '{}') + '/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}') + 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) + 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" } } } }""", "") + """/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""", '') + 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&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) + '/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)) + 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)')) + 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(): @@ -264,24 +296,30 @@ def test_ogr_elasticsearch_1(): # 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" }') + '/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' + 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" } }', '{}') + '/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' + 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": { } }', '{}') + '/vsimem/fakeelasticsearch/foo2/FeatureCollection/my_id2&POSTFIELDS={ "properties": { } }', + "{}", + ) feat = ogr.Feature(lyr.GetLayerDefn()) - feat['_id'] = 'my_id2' + feat["_id"] = "my_id2" ret = lyr.CreateFeature(feat) assert ret == 0 @@ -292,133 +330,184 @@ def test_ogr_elasticsearch_1(): assert ret != 0 # Simulate server error - feat['_id'] = 'my_id' + 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": { } }', '{}') + '/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&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']) + '/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": { } }', '{}') + '/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)')) + 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', '{}') + gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/foo4&CUSTOMREQUEST=PUT", "{}") with gdaltest.error_handler(): - lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=[ - 'MAPPING={ "FeatureCollection": { "properties": {} }}']) + 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": {} }}']) + '/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" } } }}') + "/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') + '/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={}', '{}') + "/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={}']) + "/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/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') + '/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(): - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") - assert ds is not None, 'did not managed to open Elasticsearch datastore' + 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&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" } } } }', '{}') + '/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=']) + 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))))')) + 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": { } }', '{}') + 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=']) + 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))))')) + 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" } } } }', '{}') + '/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(): - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") - assert ds is not None, 'did not managed to open Elasticsearch datastore' + 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', '{}') + "/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" } } } }', '{}') + '/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=']) + lyr = ds.CreateLayer("NAME/laundering", srs=ogrtest.srs_wgs84, options=["FID="]) feat = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(feat) assert ret == 0 @@ -433,15 +522,19 @@ def test_ogr_elasticsearch_3(): assert ret == 0 feat = None - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"name_laundering", "_type":"FeatureCollection"}} + 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 @@ -449,18 +542,19 @@ def test_ogr_elasticsearch_3(): def test_ogr_elasticsearch_4(): with gdaltest.error_handler(): - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + 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') + 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""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", + """ { "a_layer": { @@ -523,43 +617,45 @@ def test_ogr_elasticsearch_4(): } } } -""") +""", + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + ds = ogr.Open("ES:/vsimem/fakeelasticsearch") assert ds is not None - lyr = ds.GetLayerByName('a_layer') + lyr = ds.GetLayerByName("a_layer") assert lyr is not None - lyr = ds.GetLayerByName('a_layer') + lyr = ds.GetLayerByName("a_layer") assert lyr is not None with gdaltest.error_handler(): - lyr = ds.GetLayerByName('not_a_layer') + 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']) + 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']) + 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') + 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') + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "a_layer \n" + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + ds = ogr.Open("ES:/vsimem/fakeelasticsearch") assert ds is not None assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) @@ -570,31 +666,43 @@ def test_ogr_elasticsearch_4(): 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' + assert lyr.GetFIDColumn() == "my_fid" - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ -}""") + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", + """{ +}""", + ) with gdaltest.error_handler(): lyr.GetFeatureCount() - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ + 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""", """{ + 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""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", + """{ "hits": { "count": 3 } -}""") +}""", + ) fc = lyr.GetFeatureCount() assert fc == 3 @@ -602,32 +710,46 @@ def test_ogr_elasticsearch_4(): f = lyr.GetNextFeature() assert f is None - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ + 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""", """{ + 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""", """{ + 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""", """{ + 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""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -664,18 +786,25 @@ def test_ogr_elasticsearch_4(): }, }] } -}""") +}""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", "{}") + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + "{}", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", '{}') + """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", + "{}", + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + 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""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -721,21 +850,32 @@ def test_ogr_elasticsearch_4(): } ] } -}""") +}""", + ) 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)': + 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() @@ -744,7 +884,9 @@ def test_ogr_elasticsearch_4(): f = lyr.GetNextFeature() assert f is not None - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + """{ "hits": { "hits":[ @@ -758,16 +900,20 @@ def test_ogr_elasticsearch_4(): } ] } -}""") +}""", + ) f = lyr.GetNextFeature() - assert f['int_field'] == 2 + assert f["int_field"] == 2 - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + """{ "hits": { "hits":[] } -}""") +}""", + ) f = lyr.GetNextFeature() assert f is None f = lyr.GetNextFeature() @@ -775,7 +921,9 @@ def test_ogr_elasticsearch_4(): 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 ] ] } } } } } } }""", """{ + 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":[ @@ -793,13 +941,16 @@ def test_ogr_elasticsearch_4(): } ] } -}""") +}""", + ) f = lyr.GetNextFeature() - assert f['int_field'] == 3 + 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 } } } } } } }""", """{ + 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":[ @@ -817,16 +968,20 @@ def test_ogr_elasticsearch_4(): } ] } -}""") +}""", + ) f = lyr.GetNextFeature() - assert f['int_field'] == 4 + 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 } } } } } } }""", """{ + 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 @@ -838,7 +993,9 @@ def test_ogr_elasticsearch_4(): lyr.SetAttributeFilter("{ 'FOO' : 'BAR' }") lyr.ResetReading() - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", + """{ "_scroll_id": "invalid", "hits": { @@ -857,22 +1014,28 @@ def test_ogr_elasticsearch_4(): } ] } -}""") +}""", + ) f = lyr.GetNextFeature() - assert f['int_field'] == 5 + assert f["int_field"] == 5 - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?pretty&POSTFIELDS={ "size": 0, 'FOO' : 'BAR' }""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?pretty&POSTFIELDS={ "size": 0, 'FOO' : 'BAR' }""", + """{ "hits": { "total": 1234 } -}""") +}""", + ) assert lyr.GetFeatureCount() == 1234 lyr.SetAttributeFilter(None) - sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect='ES') - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", """{ + sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect="ES") + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", + """{ "hits": { "hits":[ @@ -885,8 +1048,11 @@ def test_ogr_elasticsearch_4(): } ] } -}""") - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_mapping/some_type?pretty""", """ +}""", + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_mapping/some_type?pretty""", + """ { "some_layer": { @@ -902,9 +1068,10 @@ def test_ogr_elasticsearch_4(): } } } -""") +""", + ) f = sql_lyr.GetNextFeature() - if f['some_field'] != '5': + if f["some_field"] != "5": f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) @@ -925,8 +1092,9 @@ def test_ogr_elasticsearch_4(): 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" } } } }""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?search_type=count&pretty&POSTFIELDS={ "aggs" : { "bbox" : { "geo_bounds" : { "field" : "a_geopoint.coordinates" } } } }""", + """{ "aggregations" : { "bbox" : { "bounds" : { @@ -939,14 +1107,16 @@ def test_ogr_elasticsearch_4(): } } } -}""") +}""", + ) 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" } } } }""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?pretty&POSTFIELDS={ "size": 0, "aggs" : { "bbox" : { "geo_bounds" : { "field" : "a_geopoint.coordinates" } } } }""", + """{ "aggregations" : { "bbox" : { "bounds" : { @@ -961,17 +1131,18 @@ def test_ogr_elasticsearch_4(): } } } -}""") +}""", + ) 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)) + ret = lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) assert ret != 0 with gdaltest.error_handler(): - ret = lyr.CreateGeomField(ogr.GeomFieldDefn('shape', ogr.wkbPoint)) + ret = lyr.CreateGeomField(ogr.GeomFieldDefn("shape", ogr.wkbPoint)) assert ret != 0 with gdaltest.error_handler(): @@ -984,38 +1155,48 @@ def test_ogr_elasticsearch_4(): assert ret != 0 with gdaltest.error_handler(): - lyr = ds.CreateLayer('will_not_work') + 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(): - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", - """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") + 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', '') + "/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" } } }', '{}') + '/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)) + 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' + feat["str"] = "foo" gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/non_geojson/my_mapping&POSTFIELDS={ "ogc_fid": 5, "str": "foo" }', '{}') + '/vsimem/fakeelasticsearch/non_geojson/my_mapping&POSTFIELDS={ "ogc_fid": 5, "str": "foo" }', + "{}", + ) ret = lyr.CreateFeature(feat) assert ret == 0 feat = None @@ -1023,8 +1204,11 @@ def test_ogr_elasticsearch_5(): ds = None gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'non_geojson\n') - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_geojson/_mapping?pretty""", """ + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "non_geojson\n" + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/non_geojson/_mapping?pretty""", + """ { "non_geojson": { @@ -1067,12 +1251,16 @@ def test_ogr_elasticsearch_5(): } } } -""") - ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", - gdal.OF_UPDATE, open_options=['BULK_INSERT=NO']) +""", + ) + 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""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/non_geojson/my_mapping/_search?scroll=1m&size=100""", + """{ "hits": { "hits":[ @@ -1118,111 +1306,141 @@ def test_ogr_elasticsearch_5(): } }, { - "_source": {""" + - # "this is the geohash format", - """ "another_geopoint": "u09qv80meqh16ve02equ" + "_source": {""" + + + # "this is the geohash format", + """ "another_geopoint": "u09qv80meqh16ve02equ" } }] } -}""") - index = lyr.GetLayerDefn().GetFieldIndex('another_field') +}""", + ) + 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)': + 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' + 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" }""", "{}") + """/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)': + 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)': + 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: + 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)) + lyr.CreateField(ogr.FieldDefn("superobject.subfield2", ogr.OFTString)) with gdaltest.error_handler(): - lyr.CreateGeomField(ogr.GeomFieldDefn( - 'superobject.another_geoshape3', ogr.wkbPoint)) + 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" } } } }""", '{}') + f["superobject.subfield2"] = "foo" + f["superobject.another_geoshape3"] = ogr.CreateGeometryFromWkt("POINT (3 50)") gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/non_geojson/my_mapping&POSTFIELDS={ "superobject": { "another_geoshape3": { "type": "Point", "coordinates": [ 3.0, 50.0 ] }, "subfield2": "foo" } }""", "{}") + """/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/_count?pretty""", "{}") + """/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']) + 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)': + 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']) + 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') + 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)': + 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']) + 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)': + 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" }' + f["_id"] = "my_id" + f["_json"] = '{ "foo": "bar" }' gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/non_geojson/my_mapping/my_id&POSTFIELDS={ "foo": "bar" }""", "{}") + """/vsimem/fakeelasticsearch/non_geojson/my_mapping/my_id&POSTFIELDS={ "foo": "bar" }""", + "{}", + ) ret = lyr.SetFeature(f) assert ret == 0 + ############################################################################### # Test reading circle and envelope geometries @@ -1230,8 +1448,11 @@ def test_ogr_elasticsearch_5(): def test_ogr_elasticsearch_6(): gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'non_standard_geometries\n') - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_standard_geometries/_mapping?pretty""", """ + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "non_standard_geometries\n" + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/non_standard_geometries/_mapping?pretty""", + """ { "non_standard_geometries": { @@ -1250,11 +1471,14 @@ def test_ogr_elasticsearch_6(): } } } -""") +""", + ) ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch") lyr = ds.GetLayer(0) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_standard_geometries/my_mapping/_search?scroll=1m&size=100""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/non_standard_geometries/my_mapping/_search?scroll=1m&size=100""", + """{ "hits": { "hits":[ @@ -1294,25 +1518,26 @@ def test_ogr_elasticsearch_6(): } }] } -}""") +}""", + ) f = lyr.GetNextFeature() - if f['geometry'].ExportToWkt() != 'POLYGON ((2 49,3 49,3 50,2 50,2 49))': + 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 (('): + ref_txt = f["geometry"].ExportToWkt() + if not ref_txt.startswith("POLYGON (("): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f['geometry'].ExportToWkt() != ref_txt: + if f["geometry"].ExportToWkt() != ref_txt: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f['geometry'].ExportToWkt() != ref_txt: + if f["geometry"].ExportToWkt() != ref_txt: f.DumpReadable() pytest.fail() @@ -1323,28 +1548,37 @@ def test_ogr_elasticsearch_6(): def test_ogr_elasticsearch_7(): - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", - """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch/_stats", + """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""", + ) - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") + 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=']) + "/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') + f = gdal.VSIFOpenL("/vsimem/map.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/map.txt') + gdal.Unlink("/vsimem/map.txt") + + assert ( + data + == '{ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } } } }' + ) - assert data == '{ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } } } }' ############################################################################### # Test SRS support @@ -1352,52 +1586,64 @@ def test_ogr_elasticsearch_7(): def test_ogr_elasticsearch_8(): - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", - """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch/_stats", + """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""", + ) - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") + ds = ogrtest.elasticsearch_drv.CreateDataSource("/vsimem/fakeelasticsearch") # No SRS - gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/no_srs&CUSTOMREQUEST=PUT', '{}') + 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' + 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)')) + 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/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"}} + """/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 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) + "/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)')) + 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/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"}} + """/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 @@ -1406,12 +1652,16 @@ def test_ogr_elasticsearch_9(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"5.0.0"}}""") + 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""", """ + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "a_layer \n" + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", + """ { "a_layer": { @@ -1438,9 +1688,12 @@ def test_ogr_elasticsearch_9(): } } } -""") +""", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -1459,27 +1712,35 @@ def test_ogr_elasticsearch_9(): } }] } -}""") +}""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{}""") + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + """{}""", + ) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') + "/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE", + "{}", + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + 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 ] ] } } } } } } }""", - """{ + 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 ] ] } } } } } } }""", - """{ + 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": { @@ -1498,10 +1759,12 @@ def test_ogr_elasticsearch_9(): } }] } -}""") +}""", + ) f = lyr.GetNextFeature() assert f is not None + ############################################################################### # Test SQL @@ -1510,12 +1773,16 @@ def test_ogr_elasticsearch_10(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"5.0.0"}}""") + 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""", """ + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "a_layer \n" + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", + """ { "a_layer": { @@ -1550,20 +1817,25 @@ def test_ogr_elasticsearch_10(): } } } -""") +""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{}""") + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{}""", + ) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') + "/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE", + "{}", + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch') + 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" } } ] } } } } }""", - """{ + 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": { @@ -1578,13 +1850,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } }""", - """{ + 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": { @@ -1599,13 +1873,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } }""", - """{ + 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": { @@ -1620,13 +1896,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } }""", - """{ + 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": { @@ -1641,13 +1919,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" ] } } } } }""", - """{ + 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": { @@ -1661,13 +1941,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } } } }""", - """{ + 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": { @@ -1682,13 +1964,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } } } }""", - """{ + 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": { @@ -1702,13 +1986,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } } }""", - """{ + 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": { @@ -1723,13 +2009,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" ] } } } } }""", - """{ + 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": { @@ -1744,13 +2032,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } ] } } } } }""", - """{ + 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": { @@ -1765,13 +2055,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" ] } } } } }""", - """{ + 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": { @@ -1786,13 +2078,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" ] } } } } }""", - """{ + 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": { @@ -1807,14 +2101,17 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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 } } } ] } } } } }""", - """{ + "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": { @@ -1831,13 +2128,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } } }""", - """{ + 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": { @@ -1852,13 +2151,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } } } } }""", - """{ + 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": { @@ -1873,13 +2174,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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*" } } } } }""", - """{ + 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": { @@ -1894,14 +2197,16 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -1916,14 +2221,16 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -1938,13 +2245,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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*" } } } } }""", - """{ + 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": { @@ -1959,13 +2268,15 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } } } }""", - """{ + 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": { @@ -1980,7 +2291,8 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) f = lyr.GetNextFeature() assert f is not None @@ -1989,8 +2301,9 @@ def test_ogr_elasticsearch_10(): 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""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2005,14 +2318,16 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } }] } } } } }""", - """{ + 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": { @@ -2031,22 +2346,24 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) f = lyr.GetNextFeature() assert f is not None # SQL with WHERE - sql_lyr = ds.ExecuteSQL( - "SELECT * FROM a_layer WHERE keyword_field = 'foo'") + 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" } } ] }""", - """{ + "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": { @@ -2061,15 +2378,17 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } ] }""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "sort": [ { "properties.keyword_field": { "order": "asc" } } ] }""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2084,16 +2403,17 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) 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" } } ] }""", - """{ + 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": { @@ -2107,11 +2427,13 @@ def test_ogr_elasticsearch_10(): } }] } -}""") +}""", + ) f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) + ############################################################################### # Test isnull and unset @@ -2120,12 +2442,16 @@ def test_ogr_elasticsearch_11(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"5.0.0"}}""") + 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""", """ + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "a_layer \n" + ) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", + """ { "a_layer": { @@ -2148,18 +2474,24 @@ def test_ogr_elasticsearch_11(): } } } -""") +""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{}""") + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{}""", + ) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') + "/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE", + "{}", + ) - ds = ogr.Open('ES:/vsimem/fakeelasticsearch', update=1) + ds = ogr.Open("ES:/vsimem/fakeelasticsearch", update=1) lyr = ds.GetLayer(0) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2192,43 +2524,51 @@ def test_ogr_elasticsearch_11(): } ] } -}""") +}""", + ) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid', '{}') + "/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid", "{}" + ) f = lyr.GetNextFeature() - if f['str_field'] != 'foo': + if f["str_field"] != "foo": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f['str_field'] is not None: + if f["str_field"] is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.IsFieldSet('str_field'): + if f.IsFieldSet("str_field"): f.DumpReadable() pytest.fail() - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", + """{ "hits": { "count": 0 } -}""") +}""", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"a_layer", "_type":"FeatureCollection"}} + 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') + f.SetFieldNull("str_field") ret = lyr.CreateFeature(f) assert ret == 0 f = None @@ -2239,38 +2579,41 @@ def test_ogr_elasticsearch_11(): f = None assert lyr.SyncToDisk() == 0 + ############################################################################### # Test Elasticsearch 7.x (ignore MAPPING_NAME) + def test_ogr_elasticsearch_12(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"7.0.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"7.0.0"}}""" + ) - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") + ds = ogrtest.elasticsearch_drv.CreateDataSource("/vsimem/fakeelasticsearch") assert ds is not None - gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=PUT', '{}') - lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=[ - 'WRITE_MAPPING=/vsimem/map.txt', 'FID=']) + gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=PUT", "{}") + lyr = ds.CreateLayer( + "foo", srs=ogrtest.srs_wgs84, options=["WRITE_MAPPING=/vsimem/map.txt", "FID="] + ) assert lyr is not None f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None - f = gdal.VSIFOpenL('/vsimem/map.txt', 'rb') + f = gdal.VSIFOpenL("/vsimem/map.txt", "rb") assert f is not None - data = gdal.VSIFReadL(1, 10000, f).decode('ascii') + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/map.txt') + gdal.Unlink("/vsimem/map.txt") assert data == '{ "properties": { "geometry": { "type": "geo_shape" } } }' + ############################################################################### # Test authentication @@ -2280,11 +2623,16 @@ def test_ogr_elasticsearch_authentication(): ogr_elasticsearch_delete_files() gdal.FileFromMemBuffer( - "/vsimem/fakeelasticsearch&USERPWD=user:pwd", """{"version":{"number":"5.0.0"}}""") + "/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""", """ + """/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": { @@ -2307,12 +2655,13 @@ def test_ogr_elasticsearch_authentication(): } } } -""") +""", + ) - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['USERPWD=user:pwd']) + ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", open_options=["USERPWD=user:pwd"]) assert ds is not None + ############################################################################### # Test FORWARD_HTTP_HEADERS_FROM_ENV @@ -2321,13 +2670,19 @@ def test_ogr_elasticsearch_http_headers_from_env(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n", - """{"version":{"number":"5.0.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n", + """{"version":{"number":"5.0.0"}}""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_cat/indices?h=i&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n""", '') + """/vsimem/fakeelasticsearch/_cat/indices?h=i&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n""", + "", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }&HEADERS=Content-Type: application/json; charset=UTF-8\nBar: value_of_bar\nFoo: value_of_foo\n""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }&HEADERS=Content-Type: application/json; charset=UTF-8\nBar: value_of_bar\nFoo: value_of_foo\n""", + """{ "hits": { "hits":[ @@ -2340,9 +2695,12 @@ def test_ogr_elasticsearch_http_headers_from_env(): } ] } - }""") + }""", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_mapping/some_type?pretty&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_mapping/some_type?pretty&HEADERS=Bar: value_of_bar\nFoo: value_of_foo\n""", + """ { "some_layer": { @@ -2358,19 +2716,29 @@ def test_ogr_elasticsearch_http_headers_from_env(): } } } - """) + """, + ) - with gdaltest.config_options({ 'CPL_CURL_VSIMEM_PRINT_HEADERS': 'YES', - 'FOO': 'value_of_foo', - 'BAR': 'value_of_bar' }): - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['FORWARD_HTTP_HEADERS_FROM_ENV=Foo=FOO,Bar=BAR,Baz=I_AM_NOT_SET']) + with gdaltest.config_options( + { + "CPL_CURL_VSIMEM_PRINT_HEADERS": "YES", + "FOO": "value_of_foo", + "BAR": "value_of_bar", + } + ): + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", + open_options=[ + "FORWARD_HTTP_HEADERS_FROM_ENV=Foo=FOO,Bar=BAR,Baz=I_AM_NOT_SET" + ], + ) assert ds is not None - sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect='ES') + sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect="ES") f = sql_lyr.GetNextFeature() - assert f['some_field'] == '5' + assert f["some_field"] == "5" ds.ReleaseResultSet(sql_lyr) + ############################################################################### # Test GeoShape WKT support @@ -2379,30 +2747,39 @@ def test_ogr_elasticsearch_geo_shape_wkt(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"7.0.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"7.0.0"}}""" + ) - ds = ogrtest.elasticsearch_drv.CreateDataSource( - "/vsimem/fakeelasticsearch") + ds = ogrtest.elasticsearch_drv.CreateDataSource("/vsimem/fakeelasticsearch") assert ds is not None gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/geo_shape_wkt&CUSTOMREQUEST=PUT', "{}") - lyr = ds.CreateLayer('geo_shape_wkt', srs=ogrtest.srs_wgs84, options=['GEO_SHAPE_ENCODING=WKT']) + "/vsimem/fakeelasticsearch/geo_shape_wkt&CUSTOMREQUEST=PUT", "{}" + ) + lyr = ds.CreateLayer( + "geo_shape_wkt", srs=ogrtest.srs_wgs84, options=["GEO_SHAPE_ENCODING=WKT"] + ) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (2 49)")) + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/geo_shape_wkt/_mapping&POSTFIELDS={ "properties": { "geometry": { "type": "geo_shape" } }, "_meta": { "fid": "ogc_fid" } }""", + "{}", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/geo_shape_wkt/_mapping&POSTFIELDS={ "properties": { "geometry": { "type": "geo_shape" } }, "_meta": { "fid": "ogc_fid" } }""", '{}') - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"geo_shape_wkt"}} + """/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"geo_shape_wkt"}} { "ogc_fid": 1, "geometry": "POINT (2 49)" } -""", "{}") +""", + "{}", + ) ret = lyr.CreateFeature(f) assert ret == 0 lyr.ResetReading() - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/geo_shape_wkt/_search?scroll=1m&size=100""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/geo_shape_wkt/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2415,11 +2792,15 @@ def test_ogr_elasticsearch_geo_shape_wkt(): } ] } -}""") +}""", + ) gdal.FileFromMemBuffer( - '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') + "/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE", + "{}", + ) f = lyr.GetNextFeature() - assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" + ############################################################################### # Test _TIMEOUT / _TERMINATE_AFTER @@ -2429,13 +2810,17 @@ def test_ogr_elasticsearch_timeout_terminate_after(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"7.0.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"7.0.0"}}""" + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'some_layer\n') + """/vsimem/fakeelasticsearch/_cat/indices?h=i""", "some_layer\n" + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", + """{ "hits": { "hits":[ @@ -2448,9 +2833,12 @@ def test_ogr_elasticsearch_timeout_terminate_after(): } ] } - }""") + }""", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_mapping?pretty""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_mapping?pretty""", + """ { "some_layer": { @@ -2464,17 +2852,27 @@ def test_ogr_elasticsearch_timeout_terminate_after(): } } } - """) - - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['SINGLE_QUERY_TERMINATE_AFTER=10', 'SINGLE_QUERY_TIMEOUT=0.5', 'FEATURE_ITERATION_TERMINATE_AFTER=2', 'FEATURE_ITERATION_TIMEOUT=0.1' ]) + """, + ) + + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", + open_options=[ + "SINGLE_QUERY_TERMINATE_AFTER=10", + "SINGLE_QUERY_TIMEOUT=0.5", + "FEATURE_ITERATION_TERMINATE_AFTER=2", + "FEATURE_ITERATION_TIMEOUT=0.1", + ], + ) assert ds is not None - sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect='ES') + sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect="ES") f = sql_lyr.GetNextFeature() - assert f['some_field'] == '5' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' + assert f["some_field"] == "5" + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0 , 'FOO' : 'BAR' }""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0 , 'FOO' : 'BAR' }""", + """ { "took" : 1, "timed_out" : false, @@ -2488,7 +2886,8 @@ def test_ogr_elasticsearch_timeout_terminate_after(): "hits" : [ ] } } - """) + """, + ) assert sql_lyr.GetFeatureCount() == 4 @@ -2497,7 +2896,9 @@ def test_ogr_elasticsearch_timeout_terminate_after(): lyr = ds.GetLayer(0) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_search?scroll=1m&size=100""", """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_search?scroll=1m&size=100""", + """{ "hits": { "hits":[ @@ -2521,9 +2922,12 @@ def test_ogr_elasticsearch_timeout_terminate_after(): } ] } - }""") + }""", + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0 }""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0 }""", + """ { "took" : 1, "timed_out" : false, @@ -2537,12 +2941,14 @@ def test_ogr_elasticsearch_timeout_terminate_after(): "hits" : [ ] } } - """) + """, + ) assert lyr.GetFeatureCount() == 2 - - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "query": { "constant_score" : { "filter": { "term": { "some_field": "6" } } } } }""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "query": { "constant_score" : { "filter": { "term": { "some_field": "6" } } } } }""", + """ { "took" : 1, "timed_out" : false, @@ -2556,15 +2962,16 @@ def test_ogr_elasticsearch_timeout_terminate_after(): "hits" : [ ] } } - """) - + """, + ) - lyr.SetAttributeFilter( "some_field = '6'" ) + lyr.SetAttributeFilter("some_field = '6'") assert lyr.GetFeatureCount() == 3 lyr.SetAttributeFilter(None) - - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "foo": "bar" }""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "foo": "bar" }""", + """ { "took" : 1, "timed_out" : false, @@ -2578,14 +2985,16 @@ def test_ogr_elasticsearch_timeout_terminate_after(): "hits" : [ ] } } - """) - + """, + ) - lyr.SetAttributeFilter( '{ "foo": "bar" }' ) + lyr.SetAttributeFilter('{ "foo": "bar" }') assert lyr.GetFeatureCount() == 4 lyr.SetAttributeFilter(None) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "aggs" : { "bbox" : { "geo_bounds" : { "field" : "geometry" } } } }""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/some_layer/_search?pretty&timeout=500ms&terminate_after=10&POSTFIELDS={ "size": 0, "aggs" : { "bbox" : { "geo_bounds" : { "field" : "geometry" } } } }""", + """ { "aggregations" : { "bbox" : { @@ -2601,7 +3010,8 @@ def test_ogr_elasticsearch_timeout_terminate_after(): } } } - }""") + }""", + ) bbox = lyr.GetExtent() assert bbox == (1.0, 2.0, 9.0, 10.0) @@ -2617,6 +3027,7 @@ def test_ogr_elasticsearch_timeout_terminate_after(): time.sleep(0.15) assert lyr.GetNextFeature() is None + ############################################################################### # Test aggregation @@ -2625,10 +3036,13 @@ def test_ogr_elasticsearch_aggregation_minimum(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"6.8.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"6.8.0"}}""" + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/test/_mapping?pretty""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/test/_mapping?pretty""", + """ { "test": { @@ -2653,42 +3067,36 @@ def test_ogr_elasticsearch_aggregation_minimum(): } } } - """) + """, + ) - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['AGGREGATION={"index":"test"}']) + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", open_options=['AGGREGATION={"index":"test"}'] + ) assert ds is not None lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 response = { - "aggregations": - { - "grid": - { + "aggregations": { + "grid": { "buckets": [ - { - "key": "dummy_key", - "doc_count": 9876543210, - "centroid": { - "location": { - "lat": 60, - "lon": 50 + { + "key": "dummy_key", + "doc_count": 9876543210, + "centroid": { + "location": {"lat": 60, "lon": 50}, + "count": 9876543210, }, - "count": 9876543210 - } - }, - { - "key": "dummy_key2", - "doc_count": 1, - "centroid": { - "location": { - "lat": -60.5, - "lon": -50.5 + }, + { + "key": "dummy_key2", + "doc_count": 1, + "centroid": { + "location": {"lat": -60.5, "lon": -50.5}, + "count": 1, }, - "count": 1 - } - }, + }, ] } } @@ -2699,8 +3107,9 @@ def test_ogr_elasticsearch_aggregation_minimum(): assert lyr.GetFeatureCount() == 2 gdal.Unlink(request) - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['AGGREGATION={"index":"test"}']) + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", open_options=['AGGREGATION={"index":"test"}'] + ) assert ds is not None lyr = ds.GetLayer(0) gdal.FileFromMemBuffer(request, json.dumps(response)) @@ -2708,48 +3117,40 @@ def test_ogr_elasticsearch_aggregation_minimum(): gdal.Unlink(request) assert f is not None - assert f['key'] == 'dummy_key' - assert f['doc_count'] == 9876543210 - assert f.GetGeometryRef().ExportToWkt() == 'POINT (50 60)' + assert f["key"] == "dummy_key" + assert f["doc_count"] == 9876543210 + assert f.GetGeometryRef().ExportToWkt() == "POINT (50 60)" f = lyr.GetNextFeature() assert f is not None - assert f['key'] == 'dummy_key2' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (-50.5 -60.5)' + assert f["key"] == "dummy_key2" + assert f.GetGeometryRef().ExportToWkt() == "POINT (-50.5 -60.5)" assert lyr.GetFeatureCount() == 2 # Test spatial filter coordinate clamping - lyr.SetSpatialFilterRect(-200,-200,200,200) + lyr.SetSpatialFilterRect(-200, -200, 200, 200) lyr.ResetReading() gdal.FileFromMemBuffer(request, json.dumps(response)) assert lyr.GetFeatureCount() == 2 gdal.Unlink(request) # Test normal spatial filter - lyr.SetSpatialFilterRect(1,2,3,4) + lyr.SetSpatialFilterRect(1, 2, 3, 4) lyr.ResetReading() request = """/vsimem/fakeelasticsearch/test/_search&POSTFIELDS={"size":0,"aggs":{"filtered":{"filter":{"geo_bounding_box":{"a_geopoint.coordinates":{"top_left":{"lat":4.0,"lon":1.0},"bottom_right":{"lat":2.0,"lon":3.0}}}},"aggs":{"grid":{"geohash_grid":{"field":"a_geopoint.coordinates","precision":5,"size":10000},"aggs":{"centroid":{"geo_centroid":{"field":"a_geopoint.coordinates"}}}}}}}}""" response = { - "aggregations": - { - "filtered": - { - "grid": - { + "aggregations": { + "filtered": { + "grid": { "buckets": [ - { - "key": "dummy_key3", - "doc_count": 1, - "centroid": { - "location": { - "lat": 3.0, - "lon": 2.0 - } - } - } + { + "key": "dummy_key3", + "doc_count": 1, + "centroid": {"location": {"lat": 3.0, "lon": 2.0}}, + } ] } } @@ -2760,7 +3161,8 @@ def test_ogr_elasticsearch_aggregation_minimum(): f = lyr.GetNextFeature() gdal.Unlink(request) assert f is not None - assert f['key'] == 'dummy_key3' + assert f["key"] == "dummy_key3" + ############################################################################### # Test aggregation @@ -2770,44 +3172,44 @@ def test_ogr_elasticsearch_aggregation_all_options(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"6.8.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"6.8.0"}}""" + ) - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', - open_options=['AGGREGATION={"index":"test","geohash_grid":{"size":100,"precision":4},"fields":{"min":["a", "f"],"max":["b"],"avg":["c"],"sum":["d"],"count":["e"],"stats":["f"]}}']) + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", + open_options=[ + 'AGGREGATION={"index":"test","geohash_grid":{"size":100,"precision":4},"fields":{"min":["a", "f"],"max":["b"],"avg":["c"],"sum":["d"],"count":["e"],"stats":["f"]}}' + ], + ) assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 12 response = { - "aggregations": - { - "grid": - { + "aggregations": { + "grid": { "buckets": [ - { - "key": "dummy_key", - "doc_count": 9876543210, - "centroid": { - "location": { - "lat": 60, - "lon": 50 + { + "key": "dummy_key", + "doc_count": 9876543210, + "centroid": { + "location": {"lat": 60, "lon": 50}, + "count": 9876543210, }, - "count": 9876543210 - }, - "a_min": { "value": 1.5 }, - "b_max": { "value": 2.5 }, - "c_avg": { "value": 3.5 }, - "d_sum": { "value": 4.5 }, - "e_count": { "value": 9876543211 }, - "f_stats": { - "min": 1, - "max": 2, - "avg": 3, - "sum": 4, - "count": 9876543212 - } - }, + "a_min": {"value": 1.5}, + "b_max": {"value": 2.5}, + "c_avg": {"value": 3.5}, + "d_sum": {"value": 4.5}, + "e_count": {"value": 9876543211}, + "f_stats": { + "min": 1, + "max": 2, + "avg": 3, + "sum": 4, + "count": 9876543212, + }, + }, ] } } @@ -2819,19 +3221,19 @@ def test_ogr_elasticsearch_aggregation_all_options(): f = lyr.GetNextFeature() gdal.Unlink(request) - assert f['key'] == 'dummy_key' - assert f['doc_count'] == 9876543210 - assert f['a_min'] == 1.5 - assert f['b_max'] == 2.5 - assert f['c_avg'] == 3.5 - assert f['d_sum'] == 4.5 - assert f['e_count'] == 9876543211 - assert f['f_min'] == 1 - assert f['f_max'] == 2 - assert f['f_avg'] == 3 - assert f['f_sum'] == 4 - assert f['f_count'] == 9876543212 - assert f.GetGeometryRef().ExportToWkt() == 'POINT (50 60)' + assert f["key"] == "dummy_key" + assert f["doc_count"] == 9876543210 + assert f["a_min"] == 1.5 + assert f["b_max"] == 2.5 + assert f["c_avg"] == 3.5 + assert f["d_sum"] == 4.5 + assert f["e_count"] == 9876543211 + assert f["f_min"] == 1 + assert f["f_max"] == 2 + assert f["f_avg"] == 3 + assert f["f_sum"] == 4 + assert f["f_count"] == 9876543212 + assert f.GetGeometryRef().ExportToWkt() == "POINT (50 60)" ############################################################################### @@ -2842,15 +3244,19 @@ def test_ogr_elasticsearch_wildcard_layer_name(): ogr_elasticsearch_delete_files() - gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", - """{"version":{"number":"6.8.0"}}""") + gdal.FileFromMemBuffer( + "/vsimem/fakeelasticsearch", """{"version":{"number":"6.8.0"}}""" + ) - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch') + ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch") gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_cat/indices/test*?h=i""", 'test1\ntest2\n') + """/vsimem/fakeelasticsearch/_cat/indices/test*?h=i""", "test1\ntest2\n" + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/test1/_mapping?pretty""", """ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/test1/_mapping?pretty""", + """ { "test1": { @@ -2877,10 +3283,12 @@ def test_ogr_elasticsearch_wildcard_layer_name(): } } } - """) + """, + ) - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/test1/default/_search?scroll=1m&size=100""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/test1/default/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2898,19 +3306,24 @@ def test_ogr_elasticsearch_wildcard_layer_name(): } }] } -}""") +}""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", "{}") + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + "{}", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", '{}') + """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", + "{}", + ) - lyr = ds.GetLayerByName('test*,-test3') + lyr = ds.GetLayerByName("test*,-test3") assert lyr.GetLayerDefn().GetFieldCount() == 3 assert lyr.GetLayerDefn().GetGeomFieldCount() == 1 - - gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/test*,-test3/default/_search?scroll=1m&size=100""", - """{ + gdal.FileFromMemBuffer( + """/vsimem/fakeelasticsearch/test*,-test3/default/_search?scroll=1m&size=100""", + """{ "_scroll_id": "my_scrollid", "hits": { @@ -2941,41 +3354,48 @@ def test_ogr_elasticsearch_wildcard_layer_name(): } ] } -}""") +}""", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", "{}") + """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", + "{}", + ) gdal.FileFromMemBuffer( - """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", '{}') + """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", + "{}", + ) f = lyr.GetNextFeature() - assert f['_id'] == 'my_id' - assert f['str_field'] == 'foo' - assert f['str_field2'] == 'bar' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' + assert f["_id"] == "my_id" + assert f["str_field"] == "foo" + assert f["str_field2"] == "bar" + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" f = lyr.GetNextFeature() - assert f['_id'] == 'my_id2' - assert f['str_field'] == 'foo2' - assert f['str_field2'] == 'bar2' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (3 50)' + assert f["_id"] == "my_id2" + assert f["str_field"] == "foo2" + assert f["str_field2"] == "bar2" + assert f.GetGeometryRef().ExportToWkt() == "POINT (3 50)" # Test with ADD_SOURCE_INDEX_NAME - ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', open_options = ['ADD_SOURCE_INDEX_NAME=YES']) + ds = gdal.OpenEx( + "ES:/vsimem/fakeelasticsearch", open_options=["ADD_SOURCE_INDEX_NAME=YES"] + ) - lyr = ds.GetLayerByName('test*,-test3') + lyr = ds.GetLayerByName("test*,-test3") assert lyr.GetLayerDefn().GetFieldCount() == 4 assert lyr.GetLayerDefn().GetGeomFieldCount() == 1 f = lyr.GetNextFeature() - assert f['_index'] == 'test1' - assert f['_id'] == 'my_id' - assert f['str_field'] == 'foo' - assert f['str_field2'] == 'bar' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' + assert f["_index"] == "test1" + assert f["_id"] == "my_id" + assert f["str_field"] == "foo" + assert f["str_field2"] == "bar" + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" f = lyr.GetNextFeature() - assert f['_index'] == 'test2' - assert f['_id'] == 'my_id2' - assert f['str_field'] == 'foo2' - assert f['str_field2'] == 'bar2' - assert f.GetGeometryRef().ExportToWkt() == 'POINT (3 50)' + assert f["_index"] == "test2" + assert f["_id"] == "my_id2" + assert f["str_field"] == "foo2" + assert f["str_field2"] == "bar2" + assert f.GetGeometryRef().ExportToWkt() == "POINT (3 50)" diff --git a/autotest/ogr/ogr_esrijson.py b/autotest/ogr/ogr_esrijson.py index 4c6486d8b5f4..1df92a4f7144 100755 --- a/autotest/ogr/ogr_esrijson.py +++ b/autotest/ogr/ogr_esrijson.py @@ -31,14 +31,13 @@ import contextlib -from osgeo import ogr -from osgeo import gdal - import gdaltest import ogrtest import pytest -pytestmark = pytest.mark.require_driver('ESRIJson') +from osgeo import gdal, ogr + +pytestmark = pytest.mark.require_driver("ESRIJson") ############################################################################### # Test utilities @@ -47,25 +46,25 @@ def validate_layer(lyr, name, features, typ, fields, box): if name is not None and name != lyr.GetName(): - print('Wrong layer name') + print("Wrong layer name") return False if features != lyr.GetFeatureCount(): - print('Wrong number of features') + print("Wrong number of features") return False lyrDefn = lyr.GetLayerDefn() if lyrDefn is None: - print('Layer definition is none') + print("Layer definition is none") return False if typ != lyrDefn.GetGeomType(): - print('Wrong geometry type') + print("Wrong geometry type") print(lyrDefn.GetGeomType()) return False if fields != lyrDefn.GetFieldCount(): - print('Wrong number of fields') + print("Wrong number of fields") return False extent = lyr.GetExtent() @@ -76,7 +75,7 @@ def validate_layer(lyr, name, features, typ, fields, box): maxy = abs(extent[3] - box[3]) if max(minx, maxx, miny, maxy) > 0.0001: - print('Wrong spatial extent of layer') + print("Wrong spatial extent of layer") print(extent) return False @@ -89,26 +88,26 @@ def validate_layer(lyr, name, features, typ, fields, box): def test_ogr_esrijson_read_point(): - ds = ogr.Open('data/esrijson/esripoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esripoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('esripoint') - assert lyr is not None, 'Missing layer called esripoint' + 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) + rc = validate_layer(lyr, "esripoint", 1, ogr.wkbPoint, 4, extent) assert rc ref = lyr.GetSpatialRef() - gcs = int(ref.GetAuthorityCode('GEOGCS')) + gcs = int(ref.GetAuthorityCode("GEOGCS")) assert gcs == 4326, "Spatial reference was not valid" feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('POINT(2 49)') + ref_geom = ogr.CreateGeometryFromWkt("POINT(2 49)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -117,31 +116,32 @@ def test_ogr_esrijson_read_point(): feature.DumpReadable() pytest.fail() - if feature.GetFieldAsInteger('fooInt') != 2: + if feature.GetFieldAsInteger("fooInt") != 2: feature.DumpReadable() pytest.fail() - if feature.GetFieldAsDouble('fooDouble') != 3.4: + if feature.GetFieldAsDouble("fooDouble") != 3.4: feature.DumpReadable() pytest.fail() - if feature.GetFieldAsString('fooString') != '56': + if feature.GetFieldAsString("fooString") != "56": feature.DumpReadable() pytest.fail() lyr = None ds = None + ############################################################################### # Test reading ESRI linestring file def test_ogr_esrijson_read_linestring(): - ds = ogr.Open('data/esrijson/esrilinestring.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrilinestring.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -151,7 +151,7 @@ def test_ogr_esrijson_read_linestring(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)') + ref_geom = ogr.CreateGeometryFromWkt("LINESTRING (2 49,3 50)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -160,7 +160,8 @@ def test_ogr_esrijson_read_linestring(): ds = None # MultiLineString - ds = ogr.Open("""{ + ds = ogr.Open( + """{ "geometryType": "esriGeometryPolyline", "fields": [], "features": [ @@ -173,10 +174,13 @@ def test_ogr_esrijson_read_linestring(): } } ] -}""") +}""" + ) lyr = ds.GetLayer(0) feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTILINESTRING ((2 49,2.1 49.1),(3 50,3.1 50.1))') + 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() @@ -188,10 +192,10 @@ def test_ogr_esrijson_read_linestring(): def test_ogr_esrijson_read_polygon(): - ds = ogr.Open('data/esrijson/esripolygon.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esripolygon.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -201,7 +205,9 @@ def test_ogr_esrijson_read_polygon(): 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)))') + 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() @@ -209,27 +215,28 @@ def test_ogr_esrijson_read_polygon(): lyr = None ds = None - ds = ogr.Open('data/esrijson/esripolygonempty.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esripolygonempty.json") + assert ds is not None, "Failed to open datasource" lyr = ds.GetLayer(0) feature = lyr.GetNextFeature() - if feature.GetGeometryRef().ExportToWkt() != 'POLYGON EMPTY': + if feature.GetGeometryRef().ExportToWkt() != "POLYGON EMPTY": feature.DumpReadable() pytest.fail() lyr = None ds = None + ############################################################################### # Test reading ESRI multipoint file def test_ogr_esrijson_read_multipoint(): - ds = ogr.Open('data/esrijson/esrimultipoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrimultipoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -239,7 +246,7 @@ def test_ogr_esrijson_read_multipoint(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,3 50)') + ref_geom = ogr.CreateGeometryFromWkt("MULTIPOINT (2 49,3 50)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -247,16 +254,17 @@ def test_ogr_esrijson_read_multipoint(): lyr = None ds = None + ############################################################################### # Test reading ESRI point file with z value def test_ogr_esrijson_read_pointz(): - ds = ogr.Open('data/esrijson/esrizpoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrizpoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -267,12 +275,12 @@ def test_ogr_esrijson_read_pointz(): assert rc ref = lyr.GetSpatialRef() - gcs = int(ref.GetAuthorityCode('GEOGCS')) + gcs = int(ref.GetAuthorityCode("GEOGCS")) assert gcs == 4326, "Spatial reference was not valid" feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('POINT(2 49 1)') + ref_geom = ogr.CreateGeometryFromWkt("POINT(2 49 1)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -281,31 +289,32 @@ def test_ogr_esrijson_read_pointz(): feature.DumpReadable() pytest.fail() - if feature.GetFieldAsInteger('fooInt') != 2: + if feature.GetFieldAsInteger("fooInt") != 2: feature.DumpReadable() pytest.fail() - if feature.GetFieldAsDouble('fooDouble') != 3.4: + if feature.GetFieldAsDouble("fooDouble") != 3.4: feature.DumpReadable() pytest.fail() - if feature.GetFieldAsString('fooString') != '56': + if feature.GetFieldAsString("fooString") != "56": feature.DumpReadable() pytest.fail() lyr = None ds = None + ############################################################################### # Test reading ESRI linestring file with z def test_ogr_esrijson_read_linestringz(): - ds = ogr.Open('data/esrijson/esrizlinestring.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrizlinestring.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -316,7 +325,7 @@ def test_ogr_esrijson_read_linestringz(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('LINESTRING (2 49 1,3 50 2)') + ref_geom = ogr.CreateGeometryFromWkt("LINESTRING (2 49 1,3 50 2)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -324,16 +333,17 @@ def test_ogr_esrijson_read_linestringz(): lyr = None ds = None + ############################################################################### # Test reading ESRI multipoint file with z def test_ogr_esrijson_read_multipointz(): - ds = ogr.Open('data/esrijson/esrizmultipoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrizmultipoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -344,7 +354,7 @@ def test_ogr_esrijson_read_multipointz(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49 1,3 50 2)') + ref_geom = ogr.CreateGeometryFromWkt("MULTIPOINT (2 49 1,3 50 2)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -352,16 +362,17 @@ def test_ogr_esrijson_read_multipointz(): lyr = None ds = None + ############################################################################### # Test reading ESRI polygon file with z def test_ogr_esrijson_read_polygonz(): - ds = ogr.Open('data/esrijson/esrizpolygon.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrizpolygon.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -372,7 +383,9 @@ def test_ogr_esrijson_read_polygonz(): 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))') + 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() @@ -380,16 +393,17 @@ def test_ogr_esrijson_read_polygonz(): lyr = None ds = None + ############################################################################### # Test reading ESRI multipoint file with m, but no z (hasM=true, hasZ omitted) def test_ogr_esrijson_read_multipointm(): - ds = ogr.Open('data/esrijson/esrihasmnozmultipoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrihasmnozmultipoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -399,7 +413,7 @@ def test_ogr_esrijson_read_multipointm(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT M ((2 49 1),(3 50 2))') + 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() @@ -407,16 +421,17 @@ def test_ogr_esrijson_read_multipointm(): lyr = None ds = None + ############################################################################### # Test reading ESRI multipoint file with hasZ=true, but only 2 components. def test_ogr_esrijson_read_pointz_withou_z(): - ds = ogr.Open('data/esrijson/esriinvalidhaszmultipoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esriinvalidhaszmultipoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -426,7 +441,7 @@ def test_ogr_esrijson_read_pointz_withou_z(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,3 50)') + ref_geom = ogr.CreateGeometryFromWkt("MULTIPOINT (2 49,3 50)") if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() @@ -434,16 +449,17 @@ def test_ogr_esrijson_read_pointz_withou_z(): lyr = None ds = None + ############################################################################### # Test reading ESRI multipoint file with z and m def test_ogr_esrijson_read_multipointzm(): - ds = ogr.Open('data/esrijson/esrizmmultipoint.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/esrijson/esrizmmultipoint.json") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" lyr = ds.GetLayer(0) @@ -453,7 +469,7 @@ def test_ogr_esrijson_read_multipointzm(): assert rc feature = lyr.GetNextFeature() - ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT ZM ((2 49 1 100),(3 50 2 100))') + 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() @@ -461,23 +477,23 @@ def test_ogr_esrijson_read_multipointzm(): lyr = None ds = None + ############################################################################### # Test ESRI FeatureService scrolling + @pytest.mark.parametrize("prefix", ["", "ESRIJSON:"]) def test_ogr_esrijson_featureservice_scrolling(prefix): - @contextlib.contextmanager def cleanup_after_me(): yield - files = gdal.ReadDir('/vsimem/esrijson') + files = gdal.ReadDir("/vsimem/esrijson") if files: for f in files: - gdal.Unlink('/vsimem/esrijson/' + f) - + gdal.Unlink("/vsimem/esrijson/" + f) with cleanup_after_me(): - with gdaltest.config_option('CPL_CURL_ENABLE_VSIMEM', 'YES'): + with gdaltest.config_option("CPL_CURL_ENABLE_VSIMEM", "YES"): resultOffset0 = """ { "type":"FeatureCollection", @@ -498,19 +514,23 @@ def cleanup_after_me(): } } ] }""" - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=1', resultOffset0) - ds = ogr.Open('/vsimem/esrijson/test.json?resultRecordCount=1') + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=1", resultOffset0 + ) + ds = ogr.Open("/vsimem/esrijson/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/esrijson/test.json?resultRecordCount=1') + gdal.Unlink("/vsimem/esrijson/test.json?resultRecordCount=1") - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=10', resultOffset0) + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=10", resultOffset0 + ) gdal.PushErrorHandler() - ds = ogr.Open('/vsimem/esrijson/test.json?resultRecordCount=10') + ds = ogr.Open("/vsimem/esrijson/test.json?resultRecordCount=10") gdal.PopErrorHandler() lyr = ds.GetLayer(0) f = lyr.GetNextFeature() @@ -518,12 +538,15 @@ def cleanup_after_me(): f = lyr.GetNextFeature() assert f is None ds = None - gdal.Unlink('/vsimem/esrijson/test.json?resultRecordCount=10') + gdal.Unlink("/vsimem/esrijson/test.json?resultRecordCount=10") - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?', resultOffset0) - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=0', resultOffset0) + gdal.FileFromMemBuffer("/vsimem/esrijson/test.json?", resultOffset0) + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=0", + resultOffset0, + ) - ds = ogr.Open('/vsimem/esrijson/test.json?') + ds = ogr.Open("/vsimem/esrijson/test.json?") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 @@ -548,7 +571,10 @@ def cleanup_after_me(): "a_property": 1, } } ] }""" - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1', resultOffset1) + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1", + resultOffset1, + ) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 2 f = lyr.GetNextFeature() @@ -559,8 +585,10 @@ def cleanup_after_me(): gdal.PopErrorHandler() assert fc == 2 - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?returnCountOnly=true', - """{ "count": 123456}""") + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?returnCountOnly=true", + """{ "count": 123456}""", + ) fc = lyr.GetFeatureCount() assert fc == 123456 @@ -569,8 +597,10 @@ def cleanup_after_me(): gdal.PopErrorHandler() assert extent == (2, 2, 49, 49) - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?returnExtentOnly=true&f=geojson', - """{"type":"FeatureCollection","bbox":[1, 2, 3, 4],"features":[]}""") + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?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) @@ -578,7 +608,7 @@ def cleanup_after_me(): assert lyr.TestCapability(ogr.OLCFastGetExtent) == 0 - assert lyr.TestCapability('foo') == 0 + assert lyr.TestCapability("foo") == 0 # Test scrolling with ESRI json resultOffset0 = """ @@ -632,26 +662,33 @@ def cleanup_after_me(): } """ - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=1', resultOffset0) - gdal.FileFromMemBuffer('/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1', resultOffset1) - ds = ogr.Open(prefix + '/vsimem/esrijson/test.json?resultRecordCount=1') + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=1", resultOffset0 + ) + gdal.FileFromMemBuffer( + "/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1", + resultOffset1, + ) + ds = ogr.Open(prefix + "/vsimem/esrijson/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/esrijson/test.json?resultRecordCount=1') - gdal.Unlink('/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1') + gdal.Unlink("/vsimem/esrijson/test.json?resultRecordCount=1") + gdal.Unlink("/vsimem/esrijson/test.json?resultRecordCount=1&resultOffset=1") + ############################################################################### # Test reading ESRIJSON files starting with {"features":[{"geometry":.... (#7198) + def test_ogr_esrijson_read_starting_with_features_geometry(): - ds = ogr.Open('data/esrijson/esrijsonstartingwithfeaturesgeometry.json') + ds = ogr.Open("data/esrijson/esrijsonstartingwithfeaturesgeometry.json") assert ds is not None - assert ds.GetDriver().GetName() == 'ESRIJSON' + assert ds.GetDriver().GetName() == "ESRIJSON" lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 @@ -663,15 +700,16 @@ def test_ogr_esrijson_read_starting_with_features_geometry(): def test_ogr_esrijson_create_geometry_from_esri_json(): with gdaltest.error_handler(): - assert not ogr.CreateGeometryFromEsriJson('error') + assert not ogr.CreateGeometryFromEsriJson("error") g = ogr.CreateGeometryFromEsriJson('{ "x": 2, "y": 49 }') - assert g.ExportToWkt() == 'POINT (2 49)' + assert g.ExportToWkt() == "POINT (2 49)" ############################################################################### # Test for https://github.com/OSGeo/gdal/issues/2007 + def test_ogr_esrijson_identify_srs(): data = """ @@ -689,4 +727,4 @@ def test_ogr_esrijson_identify_srs(): lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() assert sr - assert sr.GetAuthorityCode(None) == '2223' + assert sr.GetAuthorityCode(None) == "2223" diff --git a/autotest/ogr/ogr_factory.py b/autotest/ogr/ogr_factory.py index df7ed44a1842..b67e834474b6 100755 --- a/autotest/ogr/ogr_factory.py +++ b/autotest/ogr/ogr_factory.py @@ -31,16 +31,16 @@ ############################################################################### - import ogrtest -from osgeo import gdal -from osgeo import ogr import pytest +from osgeo import gdal, ogr + def save_as_csv(geom, filename): csv = 'ID,WKT\n0,"%s"\n' % geom.ExportToWkt() - open('/home/warmerda/' + filename, 'w').write(csv) + open("/home/warmerda/" + filename, "w").write(csv) + ############################################################################### # 30 degree rotated ellipse, just one quarter. @@ -50,140 +50,144 @@ 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)' + 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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) @@ -194,49 +198,51 @@ def test_ogr_factory_5(): ############################################################################### # 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))', - ] + 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: @@ -250,7 +256,7 @@ def test_ogr_factory_6(): ogr.ForceToMultiLineString(src_geom) ogr.ForceToLineString(src_geom) for target_type in range(ogr.wkbMultiSurface): - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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()) @@ -262,282 +268,633 @@ def test_ogr_factory_6(): def test_ogr_factory_7(): - src_wkt = 'LINESTRING(2 5,10 20)' - exp_wkt = 'LINESTRING(2 5,10 20)' + 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_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_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_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_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_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_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_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_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_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_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_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)', 'POINT ZM (2 5 0 0)', ogr.wkbPointZM), - ('POINT ZM (2 5 3 4)', 'POINT ZM (2 5 3 4)', ogr.wkbPointZM), - ('POINT ZM (2 5 3 4)', 'MULTIPOINT ZM ((2 5 3 4))', ogr.wkbMultiPointZM), - - ('POINT EMPTY', 'POINT EMPTY', ogr.wkbPoint), - ('POINT EMPTY', 'POINT ZM EMPTY', ogr.wkbPointZM), - ('POINT EMPTY', 'MULTIPOINT EMPTY', ogr.wkbMultiPoint), - ('POINT EMPTY', 'MULTIPOINT ZM EMPTY', ogr.wkbMultiPointZM), - - ('POINT ZM EMPTY', 'POINT EMPTY', ogr.wkbPoint), - ('POINT ZM EMPTY', 'POINT ZM EMPTY', ogr.wkbPointZM), - ('POINT ZM EMPTY', 'MULTIPOINT EMPTY', ogr.wkbMultiPoint), - ('POINT ZM EMPTY', 'MULTIPOINT ZM EMPTY', ogr.wkbMultiPointZM), - - ('MULTIPOINT ZM EMPTY', 'POINT EMPTY', ogr.wkbPoint), - ('MULTIPOINT ZM EMPTY', 'POINT ZM EMPTY', ogr.wkbPointZM), - ('MULTIPOINT ZM EMPTY', 'MULTIPOINT EMPTY', ogr.wkbMultiPoint), - ('MULTIPOINT ZM EMPTY', 'MULTIPOINT ZM EMPTY', ogr.wkbMultiPointZM), - - ('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), - ] + tests = [ + ("POINT (2 5)", "POINT ZM (2 5 0 0)", ogr.wkbPointZM), + ("POINT ZM (2 5 3 4)", "POINT ZM (2 5 3 4)", ogr.wkbPointZM), + ("POINT ZM (2 5 3 4)", "MULTIPOINT ZM ((2 5 3 4))", ogr.wkbMultiPointZM), + ("POINT EMPTY", "POINT EMPTY", ogr.wkbPoint), + ("POINT EMPTY", "POINT ZM EMPTY", ogr.wkbPointZM), + ("POINT EMPTY", "MULTIPOINT EMPTY", ogr.wkbMultiPoint), + ("POINT EMPTY", "MULTIPOINT ZM EMPTY", ogr.wkbMultiPointZM), + ("POINT ZM EMPTY", "POINT EMPTY", ogr.wkbPoint), + ("POINT ZM EMPTY", "POINT ZM EMPTY", ogr.wkbPointZM), + ("POINT ZM EMPTY", "MULTIPOINT EMPTY", ogr.wkbMultiPoint), + ("POINT ZM EMPTY", "MULTIPOINT ZM EMPTY", ogr.wkbMultiPointZM), + ("MULTIPOINT ZM EMPTY", "POINT EMPTY", ogr.wkbPoint), + ("MULTIPOINT ZM EMPTY", "POINT ZM EMPTY", ogr.wkbPointZM), + ("MULTIPOINT ZM EMPTY", "MULTIPOINT EMPTY", ogr.wkbMultiPoint), + ("MULTIPOINT ZM EMPTY", "MULTIPOINT ZM EMPTY", ogr.wkbMultiPointZM), + ("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') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") dst_geom = ogr.ForceTo(src_geom, target_type) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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: + elif ( + target_type != ogr.wkbUnknown and dst_geom.GetGeometryType() != target_type + ): print(target_type) print(dst_geom.ExportToIsoWkt()) assert False, (src_wkt, exp_wkt, target_type) @@ -554,7 +911,13 @@ def test_ogr_factory_8(): def test_ogr_factory_failed_forceTo(): - tests = [('MULTICURVE ZM ((0.0 0.0,0 0,0 0,0 0,0.0 0.0))', ogr.wkbTINM, 'MULTICURVE ZM ((0.0 0.0,0 0,0 0,0 0,0.0 0.0))'),] + tests = [ + ( + "MULTICURVE ZM ((0.0 0.0,0 0,0 0,0 0,0.0 0.0))", + ogr.wkbTINM, + "MULTICURVE ZM ((0.0 0.0,0 0,0 0,0 0,0.0 0.0))", + ), + ] for (src_wkt, target_type, exp_wkt) in tests: src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceTo(src_geom, target_type) diff --git a/autotest/ogr/ogr_feature.py b/autotest/ogr/ogr_feature.py index 61ee2ba84255..847263d512c3 100755 --- a/autotest/ogr/ogr_feature.py +++ b/autotest/ogr/ogr_feature.py @@ -29,11 +29,11 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import ogr import gdaltest import pytest +from osgeo import gdal, ogr + ############################################################################### # 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. @@ -41,7 +41,7 @@ def mk_dst_feature(src_feature, field_type): - dst_feat_defn = ogr.FeatureDefn('dst') + dst_feat_defn = ogr.FeatureDefn("dst") src_feat_defn = src_feature.GetDefnRef() for i in range(src_feat_defn.GetFieldCount()): @@ -51,86 +51,90 @@ def mk_dst_feature(src_feature, field_type): return ogr.Feature(dst_feat_defn) + ############################################################################### # Create a source feature def mk_src_feature(): - feat_def = ogr.FeatureDefn('src') + feat_def = ogr.FeatureDefn("src") - field_def = ogr.FieldDefn('field_integer', ogr.OFTInteger) + field_def = ogr.FieldDefn("field_integer", ogr.OFTInteger) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integer64', ogr.OFTInteger64) + field_def = ogr.FieldDefn("field_integer64", ogr.OFTInteger64) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_real', ogr.OFTReal) + field_def = ogr.FieldDefn("field_real", ogr.OFTReal) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_string', ogr.OFTString) + field_def = ogr.FieldDefn("field_string", ogr.OFTString) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_binary', ogr.OFTBinary) + field_def = ogr.FieldDefn("field_binary", ogr.OFTBinary) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_date', ogr.OFTDate) + field_def = ogr.FieldDefn("field_date", ogr.OFTDate) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_time', ogr.OFTTime) + field_def = ogr.FieldDefn("field_time", ogr.OFTTime) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) + field_def = ogr.FieldDefn("field_datetime", ogr.OFTDateTime) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integerlist', ogr.OFTIntegerList) + field_def = ogr.FieldDefn("field_integerlist", ogr.OFTIntegerList) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integer64list', ogr.OFTInteger64List) + field_def = ogr.FieldDefn("field_integer64list", ogr.OFTInteger64List) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_reallist', ogr.OFTRealList) + field_def = ogr.FieldDefn("field_reallist", ogr.OFTRealList) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_stringlist', ogr.OFTStringList) + 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')) + 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 got_vals[i] != pytest.approx(exp_val, abs=1e-4): print(got_vals) print(expected_vals) - src_feature.field_integerlist = '(3:10,20,30)' + 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'] + 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) + 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 @@ -145,35 +149,48 @@ def test_ogr_feature_cp_integer(): dst_feature.SetFrom(src_feature) gdal.PopErrorHandler() - assert check(dst_feature, 'field_integer', 17) + assert check(dst_feature, "field_integer", 17) - assert check(dst_feature, 'field_integer64', 2147483647) + assert check(dst_feature, "field_integer64", 2147483647) - assert check(dst_feature, 'field_real', 18) + assert check(dst_feature, "field_real", 18) - assert check(dst_feature, 'field_string', 0) + assert check(dst_feature, "field_string", 0) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_integerlist', 15) + assert check(dst_feature, "field_integerlist", 15) - assert check(dst_feature, 'field_integer64list', 2147483647) + assert check(dst_feature, "field_integer64list", 2147483647) - assert check(dst_feature, 'field_reallist', 17) + assert check(dst_feature, "field_reallist", 17) - assert check(dst_feature, 'field_stringlist', None) + 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]) + assert vals == [ + 17, + 2147483647, + 18, + 0, + None, + None, + None, + None, + 15, + 2147483647, + 17, + None, + ] + ############################################################################### # Copy to Integer64 @@ -187,34 +204,35 @@ def test_ogr_feature_cp_integer64(): 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_integer", 17) - assert check(dst_feature, 'field_integer64', 9876543210) + assert check(dst_feature, "field_integer64", 9876543210) gdal.PushErrorHandler() - int32_ovflw = dst_feature.GetFieldAsInteger('field_integer64') + 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_real", 18) + + assert check(dst_feature, "field_string", 0) - assert check(dst_feature, 'field_string', 0) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_integerlist", 15) - assert check(dst_feature, 'field_integerlist', 15) + assert check(dst_feature, "field_integer64list", 9876543210) - assert check(dst_feature, 'field_integer64list', 9876543210) + assert check(dst_feature, "field_reallist", 17) - assert check(dst_feature, 'field_reallist', 17) + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to Real @@ -229,25 +247,26 @@ def test_ogr_feature_cp_real(): with gdaltest.error_handler(): dst_feature.SetFrom(src_feature) - assert check(dst_feature, 'field_integer', 17.0) + assert check(dst_feature, "field_integer", 17.0) - assert check(dst_feature, 'field_real', 18.4) + assert check(dst_feature, "field_real", 18.4) - assert check(dst_feature, 'field_string', 0) + assert check(dst_feature, "field_string", 0) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_integerlist', 15.0) + assert check(dst_feature, "field_integerlist", 15.0) - assert check(dst_feature, 'field_reallist', 17.5) + assert check(dst_feature, "field_reallist", 17.5) + + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to String @@ -259,29 +278,30 @@ def test_ogr_feature_cp_string(): 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_integer", "17") + + assert check(dst_feature, "field_integer64", "9876543210") - assert check(dst_feature, 'field_integer64', '9876543210') + assert check(dst_feature, "field_real", "18.4") - assert check(dst_feature, 'field_real', '18.4') + assert check(dst_feature, "field_string", "abc def") - assert check(dst_feature, 'field_string', 'abc def') + assert check(dst_feature, "field_binary", "0123465789ABCDEF") - assert check(dst_feature, 'field_binary', '0123465789ABCDEF') + assert check(dst_feature, "field_date", "2011/11/11") - assert check(dst_feature, 'field_date', '2011/11/11') + assert check(dst_feature, "field_time", "14:10:35") - 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_datetime', '2011/11/11 14:10:35.123') + assert check(dst_feature, "field_integerlist", "(3:10,20,30)") - assert check(dst_feature, 'field_integerlist', '(3:10,20,30)') + assert check(dst_feature, "field_integer64list", "(1:9876543210)") - assert check(dst_feature, 'field_integer64list', '(1:9876543210)') + assert check(dst_feature, "field_reallist", "(2:123.5,567)") - assert check(dst_feature, 'field_reallist', '(2:123.5,567)') + assert check(dst_feature, "field_stringlist", "(2:abc,def)") - assert check(dst_feature, 'field_stringlist', '(2:abc,def)') ############################################################################### # Copy to Binary @@ -293,33 +313,39 @@ def test_ogr_feature_cp_binary(): 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_integer", None) + + assert check(dst_feature, "field_integer64", None) - assert check(dst_feature, 'field_integer64', None) + assert check(dst_feature, "field_real", None) - assert check(dst_feature, 'field_real', None) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_binary", "0123465789ABCDEF") - assert check(dst_feature, 'field_binary', '0123465789ABCDEF') + expected = b"\x01\x23\x46\x57\x89\xAB\xCD\xEF" + assert dst_feature.GetFieldAsBinary("field_binary") == expected + assert ( + dst_feature.GetFieldAsBinary( + dst_feature.GetDefnRef().GetFieldIndex("field_binary") + ) + == expected + ) - expected = b'\x01\x23\x46\x57\x89\xAB\xCD\xEF' - 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_date', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_integerlist", None) - assert check(dst_feature, 'field_integerlist', None) + assert check(dst_feature, "field_integer64list", None) - assert check(dst_feature, 'field_integer64list', None) + assert check(dst_feature, "field_reallist", None) - assert check(dst_feature, 'field_reallist', None) + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to date @@ -331,29 +357,30 @@ def test_ogr_feature_cp_date(): 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_integer", None) - assert check(dst_feature, 'field_integer64', None) + assert check(dst_feature, "field_integer64", None) - assert check(dst_feature, 'field_real', None) + assert check(dst_feature, "field_real", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_date', '2011/11/11') + assert check(dst_feature, "field_date", "2011/11/11") - assert check(dst_feature, 'field_time', '0000/00/00') + assert check(dst_feature, "field_time", "0000/00/00") - assert check(dst_feature, 'field_datetime', '2011/11/11') + assert check(dst_feature, "field_datetime", "2011/11/11") - assert check(dst_feature, 'field_integerlist', None) + assert check(dst_feature, "field_integerlist", None) - assert check(dst_feature, 'field_integer64list', None) + assert check(dst_feature, "field_integer64list", None) - assert check(dst_feature, 'field_reallist', None) + assert check(dst_feature, "field_reallist", None) + + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to time @@ -365,29 +392,30 @@ def test_ogr_feature_cp_time(): 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_integer", None) + + assert check(dst_feature, "field_integer64", None) - assert check(dst_feature, 'field_integer64', None) + assert check(dst_feature, "field_real", None) - assert check(dst_feature, 'field_real', None) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_date", "00:00:00") - assert check(dst_feature, 'field_date', '00:00:00') + assert check(dst_feature, "field_time", "14:10:35") - assert check(dst_feature, 'field_time', '14:10:35') + assert check(dst_feature, "field_datetime", "14:10:35.123") - assert check(dst_feature, 'field_datetime', '14:10:35.123') + assert check(dst_feature, "field_integerlist", None) - assert check(dst_feature, 'field_integerlist', None) + assert check(dst_feature, "field_integer64list", None) - assert check(dst_feature, 'field_integer64list', None) + assert check(dst_feature, "field_reallist", None) - assert check(dst_feature, 'field_reallist', None) + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to datetime @@ -399,29 +427,30 @@ def test_ogr_feature_cp_datetime(): 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_integer", None) - assert check(dst_feature, 'field_integer64', None) + assert check(dst_feature, "field_integer64", None) - assert check(dst_feature, 'field_real', None) + assert check(dst_feature, "field_real", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_binary', 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_date", "2011/11/11 00:00:00") - assert check(dst_feature, 'field_time', '0000/00/00 14:10:35') + 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_datetime", "2011/11/11 14:10:35.123") - assert check(dst_feature, 'field_integerlist', None) + assert check(dst_feature, "field_integerlist", None) - assert check(dst_feature, 'field_integer64list', None) + assert check(dst_feature, "field_integer64list", None) - assert check(dst_feature, 'field_reallist', None) + assert check(dst_feature, "field_reallist", None) + + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to integerlist @@ -435,29 +464,30 @@ def test_ogr_feature_cp_integerlist(): dst_feature.SetFrom(src_feature) gdal.PopErrorHandler() - assert check(dst_feature, 'field_integer', [17]) + assert check(dst_feature, "field_integer", [17]) + + assert check(dst_feature, "field_integer64", [2147483647]) - assert check(dst_feature, 'field_integer64', [2147483647]) + assert check(dst_feature, "field_real", [18]) - assert check(dst_feature, 'field_real', [18]) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_integerlist", [10, 20, 30]) - assert check(dst_feature, 'field_integerlist', [10, 20, 30]) + assert check(dst_feature, "field_integer64list", [2147483647]) - assert check(dst_feature, 'field_integer64list', [2147483647]) + assert check(dst_feature, "field_reallist", [123, 567]) - assert check(dst_feature, 'field_reallist', [123, 567]) + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to integer64list @@ -469,29 +499,30 @@ def test_ogr_feature_cp_integer64list(): 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_integer", [17]) + + assert check(dst_feature, "field_integer64", [9876543210]) - assert check(dst_feature, 'field_integer64', [9876543210]) + assert check(dst_feature, "field_real", [18]) - assert check(dst_feature, 'field_real', [18]) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_datetime", None) - assert check(dst_feature, 'field_datetime', None) + assert check(dst_feature, "field_integerlist", [10, 20, 30]) - assert check(dst_feature, 'field_integerlist', [10, 20, 30]) + assert check(dst_feature, "field_integer64list", [9876543210]) - assert check(dst_feature, 'field_integer64list', [9876543210]) + assert check(dst_feature, "field_reallist", [123, 567]) - assert check(dst_feature, 'field_reallist', [123, 567]) + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to reallist @@ -503,29 +534,30 @@ def test_ogr_feature_cp_reallist(): 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_integer", [17.0]) - assert check(dst_feature, 'field_integer64', [9876543210.0]) + assert check(dst_feature, "field_integer64", [9876543210.0]) - assert check(dst_feature, 'field_real', [18.4]) + assert check(dst_feature, "field_real", [18.4]) - assert check(dst_feature, 'field_string', None) + assert check(dst_feature, "field_string", None) - assert check(dst_feature, 'field_binary', None) + assert check(dst_feature, "field_binary", None) - assert check(dst_feature, 'field_date', None) + assert check(dst_feature, "field_date", None) - assert check(dst_feature, 'field_time', None) + assert check(dst_feature, "field_time", None) - assert check(dst_feature, 'field_datetime', 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_integerlist", [10.0, 20.0, 30.0]) - assert check(dst_feature, 'field_integer64list', [9876543210.0]) + assert check(dst_feature, "field_integer64list", [9876543210.0]) - assert check(dst_feature, 'field_reallist', [123.5, 567.0]) + assert check(dst_feature, "field_reallist", [123.5, 567.0]) + + assert check(dst_feature, "field_stringlist", None) - assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to stringlist @@ -537,54 +569,56 @@ def test_ogr_feature_cp_stringlist(): 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_integer", ["17"]) - assert check(dst_feature, 'field_integer64', ["9876543210"]) + assert check(dst_feature, "field_integer64", ["9876543210"]) - assert check(dst_feature, 'field_real', ["18.4"]) + assert check(dst_feature, "field_real", ["18.4"]) - assert check(dst_feature, 'field_string', ['abc def']) + assert check(dst_feature, "field_string", ["abc def"]) - assert check(dst_feature, 'field_binary', ['0123465789ABCDEF']) + assert check(dst_feature, "field_binary", ["0123465789ABCDEF"]) - assert check(dst_feature, 'field_date', ['2011/11/11']) + assert check(dst_feature, "field_date", ["2011/11/11"]) - assert check(dst_feature, 'field_time', ['14:10:35']) + 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_datetime", ["2011/11/11 14:10:35.123"]) - assert check(dst_feature, 'field_integerlist', ['10', '20', '30']) + assert check(dst_feature, "field_integerlist", ["10", "20", "30"]) - assert check(dst_feature, 'field_integer64list', ['9876543210']) + assert check(dst_feature, "field_integer64list", ["9876543210"]) - assert check(dst_feature, 'field_reallist', ['123.5', '567']) + assert check(dst_feature, "field_reallist", ["123.5", "567"]) - assert check(dst_feature, 'field_stringlist', ['abc', 'def']) + assert check(dst_feature, "field_stringlist", ["abc", "def"]) ############################################################################### # Test SetField() / GetField() with unicode string + def test_ogr_feature_unicode(): - feat_def = ogr.FeatureDefn('test') + feat_def = ogr.FeatureDefn("test") - field_def = ogr.FieldDefn('field_string', ogr.OFTString) + field_def = ogr.FieldDefn("field_string", ogr.OFTString) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integer64', ogr.OFTInteger64) + 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') - assert src_feature.GetField('field_string') == 'abc def' + src_feature.SetField("field_string", "abc def") + assert src_feature.GetField("field_string") == "abc def" src_feature = ogr.Feature(feat_def) - src_feature.SetField('field_string', 'abc def') - assert src_feature.GetField('field_string') == 'abc def' + src_feature.SetField("field_string", "abc def") + assert src_feature.GetField("field_string") == "abc def" src_feature = ogr.Feature(feat_def) - src_feature.SetField('field_integer64', 1) - assert src_feature.GetField('field_integer64') == 1 + src_feature.SetField("field_integer64", 1) + assert src_feature.GetField("field_integer64") == 1 + ############################################################################### # Test 64bit FID @@ -592,46 +626,48 @@ def test_ogr_feature_unicode(): def test_ogr_feature_64bit_fid(): - feat_def = ogr.FeatureDefn('test') + 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)) + feat_def = ogr.FeatureDefn("test") + feat_def.AddFieldDefn(ogr.FieldDefn("test", ogr.OFTInteger64)) f = ogr.Feature(feat_def) gdal.PushErrorHandler() - f.SetField(0, '9999999999999999999') + f.SetField(0, "9999999999999999999") gdal.PopErrorHandler() if f.GetField(0) != 9223372036854775807: f.DumpReadable() pytest.fail() gdal.PushErrorHandler() - f.SetField(0, '-9999999999999999999') + 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') + 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) + 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) @@ -639,8 +675,8 @@ def test_ogr_feature_nullable_validate(): 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) + 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) @@ -651,50 +687,50 @@ def test_ogr_feature_nullable_validate(): 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) + 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') + 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) + 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') + 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) + 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') + 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 = ogr.FeatureDefn("test") feat_def.SetGeomType(ogr.wkbNone) - gfield_def = ogr.GeomFieldDefn('test', ogr.wkbUnknown) + 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)')) + 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 = ogr.FeatureDefn("test") feat_def.SetGeomType(ogr.wkbNone) - gfield_def = ogr.GeomFieldDefn('test', ogr.wkbPoint) + gfield_def = ogr.GeomFieldDefn("test", ogr.wkbPoint) gfield_def.SetNullable(0) feat_def.AddGeomFieldDefn(gfield_def) f = ogr.Feature(feat_def) @@ -704,30 +740,31 @@ def test_ogr_feature_nullable_validate(): assert ret == 0 # Geometry field with Point geometry type that is met - feat_def = ogr.FeatureDefn('test') + feat_def = ogr.FeatureDefn("test") feat_def.SetGeomType(ogr.wkbPoint) f = ogr.Feature(feat_def) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) + 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 = ogr.FeatureDefn("test") feat_def.SetGeomType(ogr.wkbLineString) f = ogr.Feature(feat_def) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) + 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) + feat_def = ogr.FeatureDefn("test") + field_def = ogr.FieldDefn("field_string", ogr.OFTString) assert field_def.GetDefault() is None assert not field_def.IsDefaultDriverSpecific() @@ -754,35 +791,37 @@ def test_ogr_feature_default(): assert not field_def.IsDefaultDriverSpecific() feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) + 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 = 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') + 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) + 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'): + 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.SetField("field_string", "b") f.FillUnsetWithDefault() - if f.GetField('field_string') != 'b': + if f.GetField("field_string") != "b": f.DumpReadable() pytest.fail() @@ -793,51 +832,51 @@ def test_ogr_feature_default(): def test_ogr_feature_native_data(): - feat_def = ogr.FeatureDefn('test') + 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' + 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' + 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' + 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') + 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') + 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'] + 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 + 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 + assert f.GetNativeData() == "native_data", dialect + assert f.GetNativeMediaType() == "native_media_type", dialect ds.ReleaseResultSet(sql_lyr) @@ -847,14 +886,15 @@ def test_ogr_feature_native_data(): def test_ogr_feature_set_geometry_self(): - feat_def = ogr.FeatureDefn('test') + feat_def = ogr.FeatureDefn("test") f = ogr.Feature(feat_def) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (2 49)')) + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" + ############################################################################### # Test SetFieldNull(), IsFieldNull() @@ -862,8 +902,8 @@ def test_ogr_feature_set_geometry_self(): def test_ogr_feature_null_field(): - feat_def = ogr.FeatureDefn('test') - field_def = ogr.FieldDefn('field_string', ogr.OFTString) + 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")) @@ -876,49 +916,50 @@ def test_ogr_feature_null_field(): assert f.IsFieldNull(feat_def.GetFieldIndex("field_string")) != 0 f = None - field_def = ogr.FieldDefn('field_binary', ogr.OFTBinary) + field_def = ogr.FieldDefn("field_binary", ogr.OFTBinary) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integerlist', ogr.OFTIntegerList) + field_def = ogr.FieldDefn("field_integerlist", ogr.OFTIntegerList) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_integer64list', ogr.OFTInteger64List) + field_def = ogr.FieldDefn("field_integer64list", ogr.OFTInteger64List) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_reallist', ogr.OFTRealList) + field_def = ogr.FieldDefn("field_reallist", ogr.OFTRealList) feat_def.AddFieldDefn(field_def) - field_def = ogr.FieldDefn('field_stringlist', ogr.OFTStringList) + 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.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.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_clone.IsFieldNull("field_binary") != 0 assert f.Equal(f_clone) f = None + ############################################################################### # Test setting a 64 bit integer to a 32 bit field through the SetField() string # interface @@ -926,19 +967,19 @@ def test_ogr_feature_null_field(): def test_ogr_feature_int32_overflow(): - feat_def = ogr.FeatureDefn('test') - field_def = ogr.FieldDefn('field', ogr.OFTInteger) + feat_def = ogr.FeatureDefn("test") + field_def = ogr.FieldDefn("field", ogr.OFTInteger) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) with gdaltest.error_handler(): gdal.ErrorReset() - f.SetField('field', '123456789012345') - assert gdal.GetLastErrorMsg() != '' - assert f.GetField('field') == 2147483647 + f.SetField("field", "123456789012345") + assert gdal.GetLastErrorMsg() != "" + assert f.GetField("field") == 2147483647 with gdaltest.error_handler(): gdal.ErrorReset() - f.SetField('field', '-123456789012345') - assert gdal.GetLastErrorMsg() != '' - assert f.GetField('field') == -2147483648 + f.SetField("field", "-123456789012345") + assert gdal.GetLastErrorMsg() != "" + assert f.GetField("field") == -2147483648 diff --git a/autotest/ogr/ogr_fgdb.py b/autotest/ogr/ogr_fgdb.py index 48c1e3c1e463..2cb673600782 100755 --- a/autotest/ogr/ogr_fgdb.py +++ b/autotest/ogr/ogr_fgdb.py @@ -33,20 +33,19 @@ import shutil import sys - import gdaltest import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest -pytestmark = pytest.mark.require_driver('FileGDB') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("FileGDB") ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): try: shutil.rmtree("tmp/test.gdb") @@ -69,28 +68,32 @@ def startup_and_cleanup(): except OSError: pass try: - shutil.rmtree('tmp/test3005.gdb') + shutil.rmtree("tmp/test3005.gdb") except OSError: pass try: - shutil.rmtree('tmp/roads_clip Drawing.gdb') + shutil.rmtree("tmp/roads_clip Drawing.gdb") except OSError: pass + ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def openfilegdb_drv(): - drv = ogr.GetDriverByName('OpenFileGDB') + drv = ogr.GetDriverByName("OpenFileGDB") yield drv + ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def fgdb_drv(openfilegdb_drv): - drv = ogr.GetDriverByName('FileGDB') + drv = ogr.GetDriverByName("FileGDB") if drv is None: - pytest.skip('FileGDB driver not available', allow_module_level=True) + pytest.skip("FileGDB driver not available", allow_module_level=True) if openfilegdb_drv is not None: openfilegdb_drv.Deregister() @@ -103,8 +106,10 @@ def fgdb_drv(openfilegdb_drv): openfilegdb_drv.Register() drv.Register() + ############################################################################### + @pytest.fixture() def fgdb_sdk_1_4_or_later(fgdb_drv): fgdb_is_sdk_1_4 = False @@ -116,30 +121,35 @@ def fgdb_sdk_1_4_or_later(fgdb_drv): ds = fgdb_drv.CreateDataSource("tmp/ogr_fgdb_is_sdk_1_4_or_later.gdb") srs = osr.SpatialReference() - srs.ImportFromProj4('+proj=tmerc +datum=WGS84 +no_defs') + srs.ImportFromProj4("+proj=tmerc +datum=WGS84 +no_defs") with gdaltest.error_handler(): - lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) if lyr is not None: fgdb_is_sdk_1_4 = True ds = None shutil.rmtree("tmp/ogr_fgdb_is_sdk_1_4_or_later.gdb") if not fgdb_is_sdk_1_4: - pytest.skip('SDK 1.4 required') + pytest.skip("SDK 1.4 required") + ############################################################################### + @pytest.fixture() def ogrsf_path(): import test_cli_utilities + path = test_cli_utilities.get_test_ogrsf_path() if path is None: - pytest.skip('ogrsf test utility not found') + pytest.skip("ogrsf test utility not found") return path + ############################################################################### # Write and read back various geometry types + def test_ogr_fgdb_1(fgdb_drv): srs = osr.SpatialReference() @@ -147,32 +157,84 @@ def test_ogr_fgdb_1(fgdb_drv): ds = 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'] + 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]]) + 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)) @@ -216,7 +278,12 @@ def test_ogr_fgdb_1(fgdb_drv): 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 + assert ( + lyr.GetSpatialRef().IsSame( + srs, options=["IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES"] + ) + == 1 + ) feat = lyr.GetNextFeature() if data[1] != ogr.wkbNone: try: @@ -231,17 +298,19 @@ def test_ogr_fgdb_1(fgdb_drv): 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: + 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() @@ -269,6 +338,7 @@ def test_ogr_fgdb_1(fgdb_drv): ds = None + ############################################################################### # Test DeleteField() @@ -278,14 +348,44 @@ def test_ogr_fgdb_DeleteField(): 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 + 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 @@ -301,17 +401,19 @@ def test_ogr_fgdb_DeleteField(): # Test updating non-existing feature feat.SetFID(-10) - assert lyr.SetFeature(feat) == ogr.OGRERR_NON_EXISTING_FEATURE, \ - 'Expected failure of SetFeature().' + 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().' + assert ( + lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE + ), "Expected failure of DeleteFeature()." sql_lyr = ds.ExecuteSQL("REPACK") assert sql_lyr f = sql_lyr.GetNextFeature() - assert f[0] == 'true' + assert f[0] == "true" ds.ReleaseResultSet(sql_lyr) feat = None @@ -319,20 +421,29 @@ def test_ogr_fgdb_DeleteField(): 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 + 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(ogrsf_path): - ret = gdaltest.runexternal(ogrsf_path + ' -ro tmp/test.gdb --config OGR_SKIP OpenFileGDB') + ret = gdaltest.runexternal( + ogrsf_path + " -ro tmp/test.gdb --config OGR_SKIP OpenFileGDB" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run ogr2ogr @@ -341,6 +452,7 @@ def test_ogr_fgdb_2(ogrsf_path): def test_ogr_fgdb_3(): import test_cli_utilities + if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() @@ -349,19 +461,26 @@ def test_ogr_fgdb_3(): except OSError: pass - gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f filegdb tmp/poly.gdb data/poly.shp -nlt MULTIPOLYGON -a_srs None') + 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 = 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 --config DRIVER_WISHED FileGDB') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + + " tmp/poly.gdb --config DRIVER_WISHED FileGDB" + ) # print ret - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 + ############################################################################### # Test SQL support @@ -370,14 +489,15 @@ def test_ogr_fgdb_3(): def test_ogr_fgdb_sql(): import test_cli_utilities + if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() - ds = ogr.Open('tmp/poly.gdb') + 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') + 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() @@ -386,6 +506,7 @@ def test_ogr_fgdb_sql(): ds.ReleaseResultSet(sql_lyr) ds = None + ############################################################################### # Test delete layer @@ -401,7 +522,7 @@ def test_ogr_fgdb_4(): 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.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 49)")) feat.SetField("str", "foo") feat = None lyr = None @@ -412,15 +533,15 @@ def test_ogr_fgdb_4(): # Delete it for i in range(ds.GetLayerCount()): - if ds.GetLayer(i).GetName() == 'layer_to_remove': + if ds.GetLayer(i).GetName() == "layer_to_remove": ds.DeleteLayer(i) break # Check it no longer exists - lyr = ds.GetLayerByName('layer_to_remove') + lyr = ds.GetLayerByName("layer_to_remove") ds = None - assert lyr is None, ('failed at iteration %d' % j) + assert lyr is None, "failed at iteration %d" % j ############################################################################### @@ -429,8 +550,7 @@ def test_ogr_fgdb_4(): def test_ogr_fgdb_5(fgdb_drv): - assert fgdb_drv.DeleteDataSource("tmp/test.gdb") == 0, \ - 'DeleteDataSource() failed' + assert fgdb_drv.DeleteDataSource("tmp/test.gdb") == 0, "DeleteDataSource() failed" assert not os.path.exists("tmp/test.gdb") @@ -444,15 +564,26 @@ def test_ogr_fgdb_6(fgdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = 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 = 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') + ds = ogr.Open("tmp/test.gdb") assert ds.GetLayerCount() == 2 ds = None + ############################################################################### # Test bulk loading (#4420) @@ -467,14 +598,14 @@ def test_ogr_fgdb_7(fgdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = 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') + ds = 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)') + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None @@ -484,7 +615,8 @@ def test_ogr_fgdb_7(fgdb_drv): assert feat.GetField(0) == 0 ds = None - gdal.SetConfigOption('FGDB_BULK_LOAD', None) + gdal.SetConfigOption("FGDB_BULK_LOAD", None) + ############################################################################### # Test field name laundering (#4458) @@ -500,27 +632,49 @@ def test_ogr_fgdb_8(fgdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = 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('é' * 64, ogr.OFTInteger)) # OK - 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 + ds = 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("é" * 64, ogr.OFTInteger)) # OK + 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', - 'é' * 64, - 'A123456789012345678901234567890123456789012345678901234567890123', - 'A1234567890123456789012345678901234567890123456789012345678901_1', - 'A1234567890123456789012345678901234567890123456789012345678901_2'] + expected_names = [ + "FROM_", + "_1NUMBER", + "WITH_SPACE_AND_______special_characters", + "é" * 64, + "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]) + assert lyr_defn.GetFieldIndex(expected_names[i]) == i, ( + "did not find %s" % expected_names[i] + ) ############################################################################### @@ -537,33 +691,36 @@ def test_ogr_fgdb_9(fgdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - _160char = 'A123456789' * 16 + _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 - ] + 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 = fgdb_drv.CreateDataSource('tmp/test.gdb') - gdal.PushErrorHandler('CPLQuietErrorHandler') + ds = 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'] + 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) + assert ds.GetLayerByIndex(i).GetName() == exp_name, "did not find %s" % exp_name ############################################################################### @@ -591,7 +748,8 @@ def test_ogr_fgdb_10(fgdb_drv): srs_approx_2193.MorphToESRI() srs_approx_2193.ImportFromWkt(srs_approx_2193.ExportToWkt()) - srs_not_in_db = osr.SpatialReference("""PROJCS["foo", + srs_not_in_db = osr.SpatialReference( + """PROJCS["foo", GEOGCS["foo", DATUM["foo", SPHEROID["foo",6000000,300]], @@ -603,7 +761,8 @@ def test_ogr_fgdb_10(fgdb_drv): PARAMETER["scale_factor",1], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], - UNIT["Meter",1]]""") + UNIT["Meter",1]]""" + ) srs_exact_4230 = osr.SpatialReference() srs_exact_4230.ImportFromEPSG(4230) @@ -612,12 +771,12 @@ def test_ogr_fgdb_10(fgdb_drv): srs_approx_4230.ImportFromWkt(srs_approx_4230.ExportToWkt()) srs_approx_intl = osr.SpatialReference() - srs_approx_intl.ImportFromProj4('+proj=longlat +ellps=intl +no_defs') + srs_approx_intl.ImportFromProj4("+proj=longlat +ellps=intl +no_defs") srs_exact_4233 = osr.SpatialReference() srs_exact_4233.ImportFromEPSG(4233) - ds = fgdb_drv.CreateDataSource('tmp/test.gdb') + ds = 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) @@ -626,35 +785,36 @@ def test_ogr_fgdb_10(fgdb_drv): lyr = ds.CreateLayer("srs_approx_4230", srs=srs_approx_4230, geom_type=ogr.wkbPoint) # will fail - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr = ds.CreateLayer("srs_exact_4233", srs=srs_exact_4233, geom_type=ogr.wkbPoint) gdal.PopErrorHandler() # will fail - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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') + ds = ogr.Open("tmp/test.gdb") lyr = ds.GetLayerByName("srs_exact_4326") - assert lyr.GetSpatialRef().ExportToWkt().find('4326') != -1 + assert lyr.GetSpatialRef().ExportToWkt().find("4326") != -1 lyr = ds.GetLayerByName("srs_approx_4326") - assert lyr.GetSpatialRef().ExportToWkt().find('4326') != -1 + assert lyr.GetSpatialRef().ExportToWkt().find("4326") != -1 lyr = ds.GetLayerByName("srs_exact_2193") - assert lyr.GetSpatialRef().ExportToWkt().find('2193') != -1 + assert lyr.GetSpatialRef().ExportToWkt().find("2193") != -1 lyr = ds.GetLayerByName("srs_approx_2193") - assert lyr.GetSpatialRef().ExportToWkt().find('2193') != -1 + assert lyr.GetSpatialRef().ExportToWkt().find("2193") != -1 lyr = ds.GetLayerByName("srs_approx_4230") - assert lyr.GetSpatialRef().ExportToWkt().find('4230') != -1 + assert lyr.GetSpatialRef().ExportToWkt().find("4230") != -1 ds = None + ############################################################################### # Test all data types @@ -666,12 +826,14 @@ def test_ogr_fgdb_11(fgdb_drv): except OSError: pass - f = open('data/filegdb/test_filegdb_field_types.xml', 'rt') + f = open("data/filegdb/test_filegdb_field_types.xml", "rt") xml_def = f.read() f.close() - ds = fgdb_drv.CreateDataSource('tmp/test.gdb') - lyr = ds.CreateLayer("test", geom_type=ogr.wkbNone, options=['XML_DEFINITION=%s' % xml_def]) + ds = 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) @@ -679,7 +841,9 @@ def test_ogr_fgdb_11(fgdb_drv): 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( + "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 @@ -689,72 +853,81 @@ def test_ogr_fgdb_11(fgdb_drv): 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)) + 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') + ds = ogr.Open("tmp/test.gdb") + lyr = ds.GetLayerByName("test") feat = lyr.GetNextFeature() - if feat.GetField('esriFieldTypeSmallInteger') != 12 or \ - feat.GetField('esriFieldTypeInteger') != 3456 or \ - feat.GetField('esriFieldTypeSingle') != pytest.approx(78.9, abs=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')): + if ( + feat.GetField("esriFieldTypeSmallInteger") != 12 + or feat.GetField("esriFieldTypeInteger") != 3456 + or feat.GetField("esriFieldTypeSingle") != pytest.approx(78.9, abs=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'): + if not feat.IsFieldSet("esriFieldTypeGlobalID"): feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('test2') + lyr = ds.GetLayerByName("test2") feat = lyr.GetNextFeature() - if not feat.IsFieldSet('global_id'): + if not feat.IsFieldSet("global_id"): feat.DumpReadable() pytest.fail() ds = None + ############################################################################### # Test failed Open() def test_ogr_fgdb_12(): - ds = ogr.Open('tmp/non_existing.gdb') + ds = ogr.Open("tmp/non_existing.gdb") assert ds is None - gdal.Unlink('tmp/dummy.gdb') + gdal.Unlink("tmp/dummy.gdb") try: - shutil.rmtree('tmp/dummy.gdb') + shutil.rmtree("tmp/dummy.gdb") except OSError: pass - f = open('tmp/dummy.gdb', 'wb') + f = open("tmp/dummy.gdb", "wb") f.close() - ds = ogr.Open('tmp/dummy.gdb') + ds = ogr.Open("tmp/dummy.gdb") assert ds is None - os.unlink('tmp/dummy.gdb') + os.unlink("tmp/dummy.gdb") - os.mkdir('tmp/dummy.gdb') + os.mkdir("tmp/dummy.gdb") - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = ogr.Open('tmp/dummy.gdb') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = ogr.Open("tmp/dummy.gdb") gdal.PopErrorHandler() assert ds is None - shutil.rmtree('tmp/dummy.gdb') + shutil.rmtree("tmp/dummy.gdb") + ############################################################################### # Test failed CreateDataSource() and DeleteDataSource() @@ -762,41 +935,42 @@ def test_ogr_fgdb_12(): def test_ogr_fgdb_13(fgdb_drv): - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = fgdb_drv.CreateDataSource('tmp/foo') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = fgdb_drv.CreateDataSource("tmp/foo") gdal.PopErrorHandler() assert ds is None - f = open('tmp/dummy.gdb', 'wb') + f = open("tmp/dummy.gdb", "wb") f.close() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = fgdb_drv.CreateDataSource('tmp/dummy.gdb') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = fgdb_drv.CreateDataSource("tmp/dummy.gdb") gdal.PopErrorHandler() assert ds is None - os.unlink('tmp/dummy.gdb') + os.unlink("tmp/dummy.gdb") try: shutil.rmtree("/nonexistingdir") except OSError: pass - if sys.platform == 'win32': - name = '/nonexistingdrive:/nonexistingdir/dummy.gdb' + if sys.platform == "win32": + name = "/nonexistingdrive:/nonexistingdir/dummy.gdb" else: - name = '/proc/dummy.gdb' + name = "/proc/dummy.gdb" - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ds = fgdb_drv.CreateDataSource(name) gdal.PopErrorHandler() assert ds is None - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = fgdb_drv.DeleteDataSource(name) gdal.PopErrorHandler() assert ret != 0 + ############################################################################### # Test interleaved opening and closing of databases (#4270) @@ -819,11 +993,11 @@ def test_ogr_fgdb_14(): def test_ogr_fgdb_15(): try: - shutil.rmtree('tmp/test3005.gdb') + shutil.rmtree("tmp/test3005.gdb") except OSError: pass - gdaltest.unzip('tmp', 'data/filegdb/test3005.gdb.zip') - ds = ogr.Open('tmp/test3005.gdb') + gdaltest.unzip("tmp", "data/filegdb/test3005.gdb.zip") + ds = ogr.Open("tmp/test3005.gdb") lyr = ds.GetLayer(0) got_wkt = lyr.GetSpatialRef().ExportToWkt() sr = osr.SpatialReference() @@ -832,6 +1006,7 @@ def test_ogr_fgdb_15(): assert got_wkt == expected_wkt ds = None + ############################################################################### # Test fix for #5674 @@ -841,11 +1016,11 @@ def test_ogr_fgdb_16(openfilegdb_drv, fgdb_drv): pytest.skip() try: - gdaltest.unzip('tmp/cache', 'data/filegdb/ESSENCE_NAIPF_ORI_PROV_sub93.gdb.zip') + gdaltest.unzip("tmp/cache", "data/filegdb/ESSENCE_NAIPF_ORI_PROV_sub93.gdb.zip") except OSError: pass try: - os.stat('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') + os.stat("tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb") except OSError: pytest.skip() @@ -855,19 +1030,20 @@ def test_ogr_fgdb_16(openfilegdb_drv, fgdb_drv): fgdb_drv.Register() openfilegdb_drv.Register() - ds = ogr.Open('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') + ds = ogr.Open("tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb") if ds is None: - ret = 'fail' + ret = "fail" else: - ret = 'success' + ret = "success" # Deregister OpenFileGDB again openfilegdb_drv.Deregister() - shutil.rmtree('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') + shutil.rmtree("tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb") return ret + ############################################################################### # Test not nullable fields @@ -879,27 +1055,29 @@ def test_ogr_fgdb_17(fgdb_drv): except OSError: pass - ds = fgdb_drv.CreateDataSource('tmp/test.gdb') + ds = 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']) + 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 = ogr.FieldDefn("field_not_nullable", ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) + 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)')) + 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') + f.SetField("field_not_nullable", "not_null") gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -908,7 +1086,7 @@ def test_ogr_fgdb_17(fgdb_drv): # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -917,14 +1095,25 @@ def test_ogr_fgdb_17(fgdb_drv): 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 + 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 @@ -936,29 +1125,29 @@ def test_ogr_fgdb_18(openfilegdb_drv, fgdb_drv): except OSError: pass - ds = fgdb_drv.CreateDataSource('tmp/test.gdb') - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) + ds = fgdb_drv.CreateDataSource("tmp/test.gdb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbNone) - field_defn = ogr.FieldDefn('field_string', ogr.OFTString) + 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') + 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') + 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) + field_defn = ogr.FieldDefn("field_nodefault", ogr.OFTInteger) lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) + 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 = ogr.FieldDefn("field_datetime2", ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) @@ -979,13 +1168,33 @@ def test_ogr_fgdb_18(openfilegdb_drv, fgdb_drv): def ogr_fgdb_18_test_results(openfilegdb_drv): - ds = ogr.Open('tmp/test.gdb', update=1) - lyr = ds.GetLayerByName('test') - assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" + 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 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 + 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' @@ -994,14 +1203,19 @@ def ogr_fgdb_18_test_results(openfilegdb_drv): # 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': + 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 @@ -1012,9 +1226,9 @@ def ogr_fgdb_19_open_update(openfilegdb_drv, fgdb_drv, filename): bPerLayerCopyingForTransaction = False if openfilegdb_drv is not None: 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': + 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 = fgdb_drv.Open(filename, update=1) @@ -1035,7 +1249,14 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): # 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_2004') or 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'): + if ( + gdaltest.is_travis_branch("ubuntu_2004") + or 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: @@ -1048,14 +1269,16 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): pass # Error case: try in read-only - ds = fgdb_drv.Open('tmp/test.gdb') + ds = fgdb_drv.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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) assert ds.TestCapability(ogr.ODsCEmulatedTransactions) == 1 @@ -1066,7 +1289,7 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): assert ret != 0 # Error case: try StartTransaction() with a ExecuteSQL layer still active - sql_lyr = ds.ExecuteSQL('SELECT * FROM test') + sql_lyr = ds.ExecuteSQL("SELECT * FROM test") gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() @@ -1086,7 +1309,7 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): assert ret != 0 # Error case: try StartTransaction() with another active connection - ds2 = fgdb_drv.Open('tmp/test.gdb', update=1) + ds2 = fgdb_drv.Open("tmp/test.gdb", update=1) gdal.PushErrorHandler() ret = ds2.StartTransaction(force=True) gdal.PopErrorHandler() @@ -1098,23 +1321,26 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): 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() + 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') - + 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)) + ret = lyr.CreateField(ogr.FieldDefn("foobar", ogr.OFTString)) assert ret == 0 - ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('foobar')) + ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex("foobar")) assert ret == 0 gdal.PushErrorHandler() - ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foobar', ogr.wkbPoint)) + ret = lyr.CreateGeomField(ogr.GeomFieldDefn("foobar", ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 @@ -1124,12 +1350,12 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): assert ret != 0 gdal.PushErrorHandler() - ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('foo', ogr.OFTString), 0) + 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') + f.SetField("field_string", "foo") lyr.CreateFeature(f) lyr.SetFeature(f) fid = f.GetFID() @@ -1137,9 +1363,9 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.ResetReading() for i in range(fid): f = lyr.GetNextFeature() - assert f.GetFID() == fid and f.GetField('field_string') == 'foo' + assert f.GetFID() == fid and f.GetField("field_string") == "foo" f = lyr.GetFeature(fid) - assert f.GetFID() == fid and f.GetField('field_string') == 'foo' + assert f.GetFID() == fid and f.GetField("field_string") == "foo" f = ogr.Feature(layer_created_before_transaction_defn) layer_created_before_transaction.CreateFeature(f) @@ -1151,7 +1377,7 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): assert ret != 0 # Error case: try CommitTransaction() with a ExecuteSQL layer still active - sql_lyr = ds.ExecuteSQL('SELECT * FROM test') + sql_lyr = ds.ExecuteSQL("SELECT * FROM test") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() @@ -1159,7 +1385,7 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): ds.ReleaseResultSet(sql_lyr) # Error case: try RollbackTransaction() with a ExecuteSQL layer still active - sql_lyr = ds.ExecuteSQL('SELECT * FROM test') + sql_lyr = ds.ExecuteSQL("SELECT * FROM test") gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() @@ -1169,12 +1395,12 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): # 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') + assert not os.path.exists("tmp/test.gdb.ogredited") + assert not os.path.exists("tmp/test.gdb.ogrtmp") - lst = gdal.ReadDir('tmp/test.gdb') + lst = gdal.ReadDir("tmp/test.gdb") for filename in lst: - assert '.tmp' not in filename, lst + assert ".tmp" not in filename, lst lyr_tmp = ds.GetLayer(0) lyr_tmp = ds.GetLayer(0) @@ -1192,7 +1418,7 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): # Test suppression of layer within transaction lyr_count = ds.GetLayerCount() - ds.CreateLayer('layer_tmp', geom_type=ogr.wkbNone) + ds.CreateLayer("layer_tmp", geom_type=ogr.wkbNone) ret = ds.StartTransaction(force=True) assert ret == 0 ds.DeleteLayer(ds.GetLayerCount() - 1) @@ -1208,42 +1434,44 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): 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)) + 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 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 + 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.SetConfigOption("FGDB_SIMUL_FAIL", "CASE1") gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + 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.SetConfigOption("FGDB_SIMUL_FAIL", "CASE2") gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 assert ds.GetLayerCount() == 0 - shutil.rmtree('tmp/test.gdb.ogredited') + shutil.rmtree("tmp/test.gdb.ogredited") # Test method on ghost datasource and layer ds.GetName() @@ -1251,19 +1479,19 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): ds.GetLayer(0) ds.GetLayerByName("test") ds.DeleteLayer(0) - ds.TestCapability('foo') - ds.CreateLayer('bar', geom_type=ogr.wkbNone) - ds.CopyLayer(lyr, 'baz') + 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') + sql_lyr = ds.ExecuteSQL("SELECT * FROM test") ds.ReleaseResultSet(sql_lyr) ds.FlushCache() ds.GetMetadata() - ds.GetMetadataItem('foo') + ds.GetMetadataItem("foo") ds.SetMetadata(None) - ds.SetMetadataItem('foo', None) + ds.SetMetadataItem("foo", None) lyr.GetSpatialFilter() lyr.SetSpatialFilter(None) @@ -1285,11 +1513,11 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.GetFeatureCount() lyr.GetExtent() lyr.GetExtent(0) - lyr.TestCapability('foo') - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + 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.AlterFieldDefn(0, ogr.FieldDefn("foo", ogr.OFTString), 0) lyr.SyncToDisk() lyr.GetStyleTable() # lyr.SetStyleTableDirectly(None) @@ -1299,9 +1527,9 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.RollbackTransaction() lyr.SetIgnoredFields([]) lyr.GetMetadata() - lyr.GetMetadataItem('foo') + lyr.GetMetadataItem("foo") lyr.SetMetadata(None) - lyr.SetMetadataItem('foo', None) + lyr.SetMetadataItem("foo", None) ds = None @@ -1309,36 +1537,40 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): # Test an error case where we simulate a failure of destroying a # layer destroyed during transaction - (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) - layer_tmp = ds.CreateLayer('layer_tmp', geom_type=ogr.wkbNone) - layer_tmp.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + 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.SetConfigOption("FGDB_SIMUL_FAIL", "CASE1") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 ds = None - shutil.rmtree('tmp/test.gdb.ogredited') + shutil.rmtree("tmp/test.gdb.ogredited") - lst = gdal.ReadDir('tmp/test.gdb') + lst = gdal.ReadDir("tmp/test.gdb") for filename in lst: - assert '.tmp' not in filename, 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) for i in range(ds.GetLayerCount()): - if ds.GetLayer(i).GetName() == 'layer_tmp': + if ds.GetLayer(i).GetName() == "layer_tmp": ds.DeleteLayer(i) break @@ -1349,24 +1581,26 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.SetFeature(f) f = None - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE2") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 ds = None - shutil.rmtree('tmp/test.gdb.ogredited') + shutil.rmtree("tmp/test.gdb.ogredited") - lst = gdal.ReadDir('tmp/test.gdb') + lst = gdal.ReadDir("tmp/test.gdb") for filename in lst: - assert '.tmp' not in filename, 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) assert ds.StartTransaction(force=True) == 0 @@ -1375,26 +1609,28 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.SetFeature(f) f = None - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE3') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE3") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 ds = None - shutil.rmtree('tmp/test.gdb.ogredited') + shutil.rmtree("tmp/test.gdb.ogredited") # Remove left over .tmp files - lst = gdal.ReadDir('tmp/test.gdb') + lst = gdal.ReadDir("tmp/test.gdb") for filename in lst: - if '.tmp' in filename: - os.remove('tmp/test.gdb/' + filename) + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + for case in ("CASE4", "CASE5"): + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) assert ds.StartTransaction(force=True) == 0 @@ -1403,89 +1639,97 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): lyr.SetFeature(f) f = None - gdal.SetConfigOption('FGDB_SIMUL_FAIL', case) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", case) gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + 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 + if case == "CASE4": + assert not os.path.exists("tmp/test.gdb.ogredited"), case else: - shutil.rmtree('tmp/test.gdb.ogredited') + shutil.rmtree("tmp/test.gdb.ogredited") # Remove left over .tmp files - lst = gdal.ReadDir('tmp/test.gdb') + lst = gdal.ReadDir("tmp/test.gdb") for filename in lst: - if '.tmp' in filename: - os.remove('tmp/test.gdb/' + filename) + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE1") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE2") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 ds = None - os.rename('tmp/test.gdb.ogrtmp', 'tmp/test.gdb') + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE3') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE3") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret == 0 ds = None - shutil.rmtree('tmp/test.gdb.ogrtmp') + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "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.SetConfigOption("FGDB_SIMUL_FAIL", "CASE_REOPEN") gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 assert ds.GetLayerCount() == 0 @@ -1493,34 +1737,38 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE1") gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 ds = None - shutil.rmtree('tmp/test.gdb.ogredited') + 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 - gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') + gdal.SetConfigOption("FGDB_SIMUL_FAIL", "CASE2") gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() - gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) + gdal.SetConfigOption("FGDB_SIMUL_FAIL", None) assert ret != 0 assert ds.GetLayerCount() == 0 @@ -1537,19 +1785,29 @@ def test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv): def test_ogr_fgdb_19bis(openfilegdb_drv, fgdb_drv): - if gdaltest.is_travis_branch('ubuntu_2004') or 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'): + if ( + gdaltest.is_travis_branch("ubuntu_2004") + or 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(openfilegdb_drv, fgdb_drv, 'tmp/test.gdb') + (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update( + openfilegdb_drv, fgdb_drv, "tmp/test.gdb" + ) del ds if not bPerLayerCopyingForTransaction: pytest.skip() - gdal.SetConfigOption('FGDB_PER_LAYER_COPYING_TRANSACTION', 'FALSE') + gdal.SetConfigOption("FGDB_PER_LAYER_COPYING_TRANSACTION", "FALSE") ret = test_ogr_fgdb_19(openfilegdb_drv, fgdb_drv) - gdal.SetConfigOption('FGDB_PER_LAYER_COPYING_TRANSACTION', None) + gdal.SetConfigOption("FGDB_PER_LAYER_COPYING_TRANSACTION", None) return ret + ############################################################################### # Test CreateFeature() with user defined FID @@ -1557,27 +1815,33 @@ def test_ogr_fgdb_19bis(openfilegdb_drv, fgdb_drv): def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): if openfilegdb_drv is None: - pytest.skip('No OpenFileGDB driver available') - - if gdaltest.is_travis_branch('ubuntu_2004') or 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("No OpenFileGDB driver available") + + if ( + gdaltest.is_travis_branch("ubuntu_2004") + or 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'): + if not os.path.exists("tmp/test.gdb"): ds = fgdb_drv.CreateDataSource("tmp/test.gdb") ds = None # We need the OpenFileGDB driver for CreateFeature() with user defined FID openfilegdb_drv.Register() - ds = fgdb_drv.Open('tmp/test.gdb', update=1) + ds = fgdb_drv.Open("tmp/test.gdb", update=1) openfilegdb_drv.Deregister() fgdb_drv.Deregister() # Force OpenFileGDB first openfilegdb_drv.Register() fgdb_drv.Register() - - lyr = ds.CreateLayer('test_2147483647', geom_type=ogr.wkbNone) - lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) + lyr = ds.CreateLayer("test_2147483647", geom_type=ogr.wkbNone) + lyr.CreateField(ogr.FieldDefn("int", ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) fid = 2147483647 f.SetFID(fid) @@ -1585,29 +1849,33 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): lyr.CreateFeature(f) ds = None - ds = openfilegdb_drv.Open('tmp/test.gdb') - lyr = ds.GetLayerByName('test_2147483647') + ds = openfilegdb_drv.Open("tmp/test.gdb") + lyr = ds.GetLayerByName("test_2147483647") f = lyr.GetNextFeature() assert f assert f.GetFID() == 2147483647 ds = None - ds = fgdb_drv.Open('tmp/test.gdb', update=1) - lyr = ds.GetLayerByName('test_2147483647') + ds = fgdb_drv.Open("tmp/test.gdb", update=1) + lyr = ds.GetLayerByName("test_2147483647") # GetNextFeature() is excruciatingly slow on such huge FID with the SDK driver f = lyr.GetFeature(2147483647) assert f - lyr = ds.CreateLayer('ogr_fgdb_20', geom_type=ogr.wkbNone) - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) - lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) + 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)') + ds.ExecuteSQL("CREATE INDEX ogr_fgdb_20_id ON ogr_fgdb_20(id)") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('id', 1) + 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 + assert ( + ret == 0 + and f.GetFID() == 1 + and lyr.GetMetadataItem("1", "MAP_OGR_FID_TO_FGDB_FID") is None + ) # Existing FID gdal.PushErrorHandler() @@ -1625,19 +1893,23 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(2) - f.SetField('id', 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: + 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) + f.SetField("id", 4) # Cannot call CreateFeature() with a set FID when a dataset is opened more than once - ds2 = fgdb_drv.Open('tmp/test.gdb', update=1) + ds2 = fgdb_drv.Open("tmp/test.gdb", update=1) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -1645,13 +1917,17 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): ds2 = None ret = lyr.CreateFeature(f) - if ret != 0 or f.GetFID() != 4 or lyr.GetMetadataItem('4', 'MAP_OGR_FID_TO_FGDB_FID') != '3': + 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')) + 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 = fgdb_drv.Open('tmp/test.gdb', update=1) + ds2 = fgdb_drv.Open("tmp/test.gdb", update=1) gdal.PopErrorHandler() assert ds2 is None ds2 = None @@ -1674,10 +1950,14 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): # Trying to set OGR FID = 3 --> FileGDB FID = 4 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(3) - f.SetField('id', 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': + if ( + ret != 0 + or f.GetFID() != 3 + or lyr.GetMetadataItem("3", "MAP_OGR_FID_TO_FGDB_FID") != "4" + ): f.DumpReadable() pytest.fail() @@ -1690,10 +1970,12 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): else: f = lyr.GetFeature(fid) assert f is not None - if f.GetFID() != fid or f.GetField('id') != fid: + 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') + 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: @@ -1715,12 +1997,12 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): assert ret == ogr.OGRERR_NON_EXISTING_FEATURE f = lyr.GetFeature(3) - f.SetField('str', '3') + f.SetField("str", "3") ret = lyr.SetFeature(f) assert ret == 0 f = lyr.GetFeature(3) - assert f.GetField('str') == '3' + assert f.GetField("str") == "3" ret = lyr.DeleteFeature(1) assert ret == 0 @@ -1728,14 +2010,27 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): 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)]: + 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) + 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): + 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')) + 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 @@ -1744,20 +2039,34 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): if ret != 0 or f.GetFID() != 13: f.DumpReadable() pytest.fail() - f.SetField('id', f.GetFID()) + 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)] + 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): + 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')) + print(lyr.GetMetadataItem(str(fid), "MAP_OGR_FID_TO_FGDB_FID")) pytest.fail(fid) - lyr.SetAttributeFilter('id = 3') + lyr.SetAttributeFilter("id = 3") lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 3: @@ -1765,7 +2074,7 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): pytest.fail() # This will cause a resync of indexes - lyr.SetAttributeFilter('OBJECTID = 3') + lyr.SetAttributeFilter("OBJECTID = 3") lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 3: @@ -1773,16 +2082,16 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): pytest.fail() # No sparse pages - lyr = ds.CreateLayer('ogr_fgdb_20_simple', geom_type=ogr.wkbNone) - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) + 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) + f.SetField("id", 2) lyr.CreateFeature(f) # This will cause a resync of indexes - sql_lyr = ds.ExecuteSQL('SELECT * FROM ogr_fgdb_20_simple') + sql_lyr = ds.ExecuteSQL("SELECT * FROM ogr_fgdb_20_simple") f = sql_lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() @@ -1791,7 +2100,7 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): # 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) + f.SetField("id", 3) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -1804,7 +2113,7 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(3) - f.SetField('id', 3) + f.SetField("id", 3) lyr.CreateFeature(f) f = None @@ -1813,26 +2122,26 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): # 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') + 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)) + f.SetField("id", i + 2) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (%d 0)" % i)) lyr.CreateFeature(f) - gdal.SetConfigOption('FGDB_BULK_LOAD', None) + gdal.SetConfigOption("FGDB_BULK_LOAD", None) ds = None # Check consistency after re-opening gdal.ErrorReset() for update in [0, 1]: - ds = fgdb_drv.Open('tmp/test.gdb', update=update) - lyr = ds.GetLayerByName('ogr_fgdb_20') + ds = fgdb_drv.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] @@ -1840,29 +2149,29 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): f = lyr.GetNextFeature() assert gdal.GetLastErrorType() == 0 assert f is not None, fid - if f.GetFID() != fid or f.GetField('id') != 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.SetAttributeFilter("id = %d" % fid) lyr.ResetReading() f = lyr.GetNextFeature() - if f.GetFID() != fid or f.GetField('id') != fid: + if f.GetFID() != fid or f.GetField("id") != fid: f.DumpReadable() pytest.fail(fid) - lyr = ds.GetLayerByName('ogr_fgdb_20_simple') + 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') + lyr = ds.GetLayerByName("ogr_fgdb_20_indexes") for i in range(1000): fid = i + 2 - lyr.SetAttributeFilter('id = %d' % fid) + lyr.SetAttributeFilter("id = %d" % fid) lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == fid @@ -1878,52 +2187,83 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): assert f.GetFID() == fid # Insert new features - ds = fgdb_drv.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)]: + ds = fgdb_drv.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) + 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): + 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')) + 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 = fgdb_drv.Open('tmp/test.gdb', update=1) - lyr = ds.GetLayerByName('ogr_fgdb_20') + ds = fgdb_drv.Open("tmp/test.gdb", update=1) + lyr = ds.GetLayerByName("ogr_fgdb_20") f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) - f.SetField('id', 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): + 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')) + 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 = fgdb_drv.Open('tmp/test.gdb', update=update) - lyr = ds.GetLayerByName('ogr_fgdb_20') + ds = fgdb_drv.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] + 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: + 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'): + for case in ("CASE1", "CASE2", "CASE3"): try: shutil.rmtree("tmp/test2.gdb") except OSError: @@ -1931,19 +2271,19 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): ds = fgdb_drv.CreateDataSource("tmp/test2.gdb") - lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone) - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) + 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) + 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.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': + if case == "CASE3": assert sql_lyr is not None, case ds.ReleaseResultSet(sql_lyr) else: @@ -1956,11 +2296,11 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): 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 + 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 + sql_lyr = ds.ExecuteSQL("SELECT * FROM foo") + assert case == "CASE3" or sql_lyr is None ds.ReleaseResultSet(sql_lyr) ds = None @@ -1975,7 +2315,12 @@ def test_ogr_fgdb_20(openfilegdb_drv, fgdb_drv): def test_ogr_fgdb_21(fgdb_drv, fgdb_sdk_1_4_or_later): # Fails on MULTIPOINT ZM - if gdaltest.is_travis_branch('ubuntu_2004') or gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1604') or gdaltest.is_travis_branch('python3'): + if ( + gdaltest.is_travis_branch("ubuntu_2004") + or gdaltest.is_travis_branch("ubuntu_1804") + or gdaltest.is_travis_branch("ubuntu_1604") + or gdaltest.is_travis_branch("python3") + ): pytest.skip() try: @@ -1983,22 +2328,59 @@ def test_ogr_fgdb_21(fgdb_drv, fgdb_sdk_1_4_or_later): except OSError: pass - ds = 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], - ] + ds = 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") @@ -2012,7 +2394,7 @@ def test_ogr_fgdb_21(fgdb_drv, fgdb_sdk_1_4_or_later): lyr.CreateFeature(feat) ds = None - ds = ogr.Open('tmp/test.gdb') + ds = ogr.Open("tmp/test.gdb") for data in datalist: lyr = ds.GetLayerByName(data[0]) @@ -2047,9 +2429,9 @@ def test_ogr_fgdb_21(fgdb_drv, fgdb_sdk_1_4_or_later): def test_ogr_fgdb_22(): - ds = ogr.Open('data/filegdb/curves.gdb') - lyr = ds.GetLayerByName('line') - ds_ref = ogr.Open('data/filegdb/curves_line.csv') + ds = ogr.Open("data/filegdb/curves.gdb") + lyr = ds.GetLayerByName("line") + ds_ref = ogr.Open("data/filegdb/curves_line.csv") lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() @@ -2057,8 +2439,8 @@ def test_ogr_fgdb_22(): print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) - lyr = ds.GetLayerByName('polygon') - ds_ref = ogr.Open('data/filegdb/curves_polygon.csv') + lyr = ds.GetLayerByName("polygon") + ds_ref = ogr.Open("data/filegdb/curves_polygon.csv") lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() @@ -2066,9 +2448,9 @@ def test_ogr_fgdb_22(): print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) - ds = ogr.Open('data/filegdb/curve_circle_by_center.gdb') + ds = ogr.Open("data/filegdb/curve_circle_by_center.gdb") lyr = ds.GetLayer(0) - ds_ref = ogr.Open('data/filegdb/curve_circle_by_center.csv') + ds_ref = ogr.Open("data/filegdb/curve_circle_by_center.csv") lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() @@ -2083,11 +2465,12 @@ def test_ogr_fgdb_22(): def test_ogr_fgdb_23(): - os.chdir('data/filegdb/curves.gdb') - ds = ogr.Open('.') - os.chdir('../../..') + os.chdir("data/filegdb/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) @@ -2095,9 +2478,11 @@ def test_ogr_fgdb_23(): def test_ogr_fgdb_24(): - ds = ogr.Open('data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb') + ds = ogr.Open("data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb") lyr = ds.GetLayer(0) - ds_ref = ogr.Open('data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb.csv') + ds_ref = ogr.Open( + "data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb.csv" + ) lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() @@ -2105,9 +2490,9 @@ def test_ogr_fgdb_24(): print(f.GetGeometryRef().ExportToIsoWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToIsoWkt()) - ds = ogr.Open('data/filegdb/filegdb_polygonzm_nan_m_with_curves.gdb') + ds = ogr.Open("data/filegdb/filegdb_polygonzm_nan_m_with_curves.gdb") lyr = ds.GetLayer(0) - ds_ref = ogr.Open('data/filegdb/filegdb_polygonzm_nan_m_with_curves.gdb.csv') + ds_ref = ogr.Open("data/filegdb/filegdb_polygonzm_nan_m_with_curves.gdb.csv") lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() @@ -2122,8 +2507,8 @@ def test_ogr_fgdb_24(): def test_ogr_fgdb_25(): - ds = ogr.Open('data/filegdb/curves.gdb') - sql_lyr = ds.ExecuteSQL('SELECT OBJECTID FROM polygon WHERE OBJECTID = 2') + ds = ogr.Open("data/filegdb/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: @@ -2133,8 +2518,8 @@ def test_ogr_fgdb_25(): assert f is None ds.ReleaseResultSet(sql_lyr) - lyr = ds.GetLayerByName('polygon') - lyr.SetAttributeFilter('OBJECTID = 2') + lyr = ds.GetLayerByName("polygon") + lyr.SetAttributeFilter("OBJECTID = 2") f = lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() @@ -2145,34 +2530,38 @@ def test_ogr_fgdb_25(): # 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(fgdb_sdk_1_4_or_later): if not ogrtest.have_geos(): pytest.skip() try: - shutil.rmtree('tmp/roads_clip Drawing.gdb') + shutil.rmtree("tmp/roads_clip Drawing.gdb") except OSError: pass - gdaltest.unzip('tmp', 'data/filegdb/weird_winding_order_fgdb.zip') + gdaltest.unzip("tmp", "data/filegdb/weird_winding_order_fgdb.zip") - ds = ogr.Open('tmp/roads_clip Drawing.gdb') + 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 + ############################################################################### # 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_utc_datetime(): - ds = ogr.Open('data/filegdb/testdatetimeutc.gdb') + ds = ogr.Open("data/filegdb/testdatetimeutc.gdb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() # Check that the timezone +00 is present - assert f.GetFieldAsString('EditDate') == '2020/06/22 07:49:36+00' + assert f.GetFieldAsString("EditDate") == "2020/06/22 07:49:36+00" + ############################################################################### # Test field alias @@ -2188,26 +2577,27 @@ def test_ogr_fgdb_alias(fgdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = fgdb_drv.CreateDataSource('tmp/alias.gdb') - lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) - fld_defn = ogr.FieldDefn('short_name', ogr.OFTInteger) - fld_defn.SetAlternativeName('longer name') + ds = fgdb_drv.CreateDataSource("tmp/alias.gdb") + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) + fld_defn = ogr.FieldDefn("short_name", ogr.OFTInteger) + fld_defn.SetAlternativeName("longer name") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('regular_name', ogr.OFTInteger) + fld_defn = ogr.FieldDefn("regular_name", ogr.OFTInteger) lyr.CreateField(fld_defn) ds = None - ds = ogr.Open('tmp/alias.gdb') + ds = ogr.Open("tmp/alias.gdb") lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldDefn(0).GetAlternativeName() == 'longer name' - assert lyr_defn.GetFieldDefn(1).GetAlternativeName() == '' + assert lyr_defn.GetFieldDefn(0).GetAlternativeName() == "longer name" + assert lyr_defn.GetFieldDefn(1).GetAlternativeName() == "" try: shutil.rmtree("tmp/alias.gdb") except OSError: pass + ############################################################################### # Test field alias with ampersand character. Requires OpenFileGDB to be read back @@ -2222,22 +2612,22 @@ def test_ogr_fgdb_alias_with_ampersand(fgdb_drv, openfilegdb_drv): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = fgdb_drv.CreateDataSource('tmp/alias.gdb') - lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) - fld_defn = ogr.FieldDefn('short_name', ogr.OFTInteger) - fld_defn.SetAlternativeName('longer & name') + ds = fgdb_drv.CreateDataSource("tmp/alias.gdb") + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) + fld_defn = ogr.FieldDefn("short_name", ogr.OFTInteger) + fld_defn.SetAlternativeName("longer & name") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('regular_name', ogr.OFTInteger) + fld_defn = ogr.FieldDefn("regular_name", ogr.OFTInteger) lyr.CreateField(fld_defn) ds = None openfilegdb_drv.Register() - ds = fgdb_drv.Open('tmp/alias.gdb') + ds = fgdb_drv.Open("tmp/alias.gdb") openfilegdb_drv.Deregister() lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldDefn(0).GetAlternativeName() == 'longer & name' - assert lyr_defn.GetFieldDefn(1).GetAlternativeName() == '' + assert lyr_defn.GetFieldDefn(0).GetAlternativeName() == "longer & name" + assert lyr_defn.GetFieldDefn(1).GetAlternativeName() == "" try: shutil.rmtree("tmp/alias.gdb") @@ -2248,44 +2638,49 @@ def test_ogr_fgdb_alias_with_ampersand(fgdb_drv, openfilegdb_drv): ############################################################################### # Test reading field domains + def _check_domains(ds): - assert set(ds.GetFieldDomainNames()) == {'MedianType', 'RoadSurfaceType', 'SpeedLimit'} + assert set(ds.GetFieldDomainNames()) == { + "MedianType", + "RoadSurfaceType", + "SpeedLimit", + } with gdaltest.error_handler(): - assert ds.GetFieldDomain('i_dont_exist') is None + assert ds.GetFieldDomain("i_dont_exist") is None lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('MaxSpeed')) - assert fld_defn.GetDomainName() == 'SpeedLimit' + fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("MaxSpeed")) + assert fld_defn.GetDomainName() == "SpeedLimit" - domain = ds.GetFieldDomain('SpeedLimit') + domain = ds.GetFieldDomain("SpeedLimit") assert domain is not None - assert domain.GetName() == 'SpeedLimit' - assert domain.GetDescription() == 'The maximun speed of the road' + assert domain.GetName() == "SpeedLimit" + assert domain.GetDescription() == "The maximun speed of the road" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == fld_defn.GetType() assert domain.GetFieldSubType() == fld_defn.GetSubType() assert domain.GetMinAsDouble() == 40.0 assert domain.GetMaxAsDouble() == 100.0 - fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('MedianType')) - assert fld_defn.GetDomainName() == 'MedianType' + fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("MedianType")) + assert fld_defn.GetDomainName() == "MedianType" - domain = ds.GetFieldDomain('MedianType') + domain = ds.GetFieldDomain("MedianType") assert domain is not None - assert domain.GetName() == 'MedianType' - assert domain.GetDescription() == 'Road median types.' + assert domain.GetName() == "MedianType" + assert domain.GetDescription() == "Road median types." assert domain.GetDomainType() == ogr.OFDT_CODED assert domain.GetFieldType() == fld_defn.GetType() assert domain.GetFieldSubType() == fld_defn.GetSubType() - assert domain.GetEnumeration() == {'0': 'None', '1': 'Cement'} + assert domain.GetEnumeration() == {"0": "None", "1": "Cement"} def test_ogr_fgdb_read_domains(): - ds = gdal.OpenEx('data/filegdb/Domains.gdb', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/filegdb/Domains.gdb", gdal.OF_VECTOR) _check_domains(ds) @@ -2301,8 +2696,7 @@ def test_ogr_fgdb_write_domains(fgdb_drv): except OSError: pass - ds = gdal.VectorTranslate(out_dir, 'data/filegdb/Domains.gdb', - options = '-f FileGDB') + ds = gdal.VectorTranslate(out_dir, "data/filegdb/Domains.gdb", options="-f FileGDB") _check_domains(ds) assert ds.TestCapability(ogr.ODsCAddFieldDomain) == 1 @@ -2310,22 +2704,26 @@ def test_ogr_fgdb_write_domains(fgdb_drv): assert ds.TestCapability(ogr.ODsCUpdateFieldDomain) == 1 with gdaltest.error_handler(): - assert not ds.DeleteFieldDomain('not_existing') + assert not ds.DeleteFieldDomain("not_existing") - domain = ogr.CreateCodedFieldDomain('unused_domain', 'desc', ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None}) + domain = ogr.CreateCodedFieldDomain( + "unused_domain", "desc", ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None} + ) assert ds.AddFieldDomain(domain) - assert ds.DeleteFieldDomain('unused_domain') - domain = ds.GetFieldDomain('unused_domain') + assert ds.DeleteFieldDomain("unused_domain") + domain = ds.GetFieldDomain("unused_domain") assert domain is None - domain = ogr.CreateRangeFieldDomain('SpeedLimit', 'desc', ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True) + domain = ogr.CreateRangeFieldDomain( + "SpeedLimit", "desc", ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True + ) assert ds.UpdateFieldDomain(domain) ds = None - ds = gdal.OpenEx(out_dir, allowed_drivers = ['FileGDB']) - domain = ds.GetFieldDomain('SpeedLimit') - assert domain.GetDescription() == 'desc' + ds = gdal.OpenEx(out_dir, allowed_drivers=["FileGDB"]) + domain = ds.GetFieldDomain("SpeedLimit") + assert domain.GetDescription() == "desc" ds = None try: @@ -2343,46 +2741,53 @@ def test_ogr_fgdb_read_layer_hierarchy(): if False: # Test dataset produced with: from osgeo import ogr, osr + srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") - ds = ogr.GetDriverByName('FileGDB').CreateDataSource('featuredataset.gdb') - ds.CreateLayer('fd1_lyr1', srs=srs, geom_type=ogr.wkbPoint, options=['FEATURE_DATASET=fd1']) - ds.CreateLayer('fd1_lyr2', srs=srs, geom_type=ogr.wkbPoint, options=['FEATURE_DATASET=fd1']) + ds = ogr.GetDriverByName("FileGDB").CreateDataSource("featuredataset.gdb") + ds.CreateLayer( + "fd1_lyr1", srs=srs, geom_type=ogr.wkbPoint, options=["FEATURE_DATASET=fd1"] + ) + ds.CreateLayer( + "fd1_lyr2", srs=srs, geom_type=ogr.wkbPoint, options=["FEATURE_DATASET=fd1"] + ) srs2 = osr.SpatialReference() srs2.ImportFromEPSG(32631) - ds.CreateLayer('standalone', srs=srs2, geom_type=ogr.wkbPoint) + ds.CreateLayer("standalone", srs=srs2, geom_type=ogr.wkbPoint) srs3 = osr.SpatialReference() srs3.ImportFromEPSG(32632) - ds.CreateLayer('fd2_lyr', srs=srs3, geom_type=ogr.wkbPoint, options=['FEATURE_DATASET=fd2']) + ds.CreateLayer( + "fd2_lyr", srs=srs3, geom_type=ogr.wkbPoint, options=["FEATURE_DATASET=fd2"] + ) - ds = gdal.OpenEx('data/filegdb/featuredataset.gdb') + ds = gdal.OpenEx("data/filegdb/featuredataset.gdb") rg = ds.GetRootGroup() - assert rg.GetGroupNames() == ['fd1', 'fd2'] - assert rg.OpenGroup('not_existing') is None + assert rg.GetGroupNames() == ["fd1", "fd2"] + assert rg.OpenGroup("not_existing") is None - fd1 = rg.OpenGroup('fd1') + fd1 = rg.OpenGroup("fd1") assert fd1 is not None - assert fd1.GetVectorLayerNames() == ['fd1_lyr1', 'fd1_lyr2'] - assert fd1.OpenVectorLayer('not_existing') is None + assert fd1.GetVectorLayerNames() == ["fd1_lyr1", "fd1_lyr2"] + assert fd1.OpenVectorLayer("not_existing") is None assert fd1.GetGroupNames() is None - fd1_lyr1 = fd1.OpenVectorLayer('fd1_lyr1') + fd1_lyr1 = fd1.OpenVectorLayer("fd1_lyr1") assert fd1_lyr1 is not None - assert fd1_lyr1.GetName() == 'fd1_lyr1' + assert fd1_lyr1.GetName() == "fd1_lyr1" - fd1_lyr2 = fd1.OpenVectorLayer('fd1_lyr2') + fd1_lyr2 = fd1.OpenVectorLayer("fd1_lyr2") assert fd1_lyr2 is not None - assert fd1_lyr2.GetName() == 'fd1_lyr2' + assert fd1_lyr2.GetName() == "fd1_lyr2" - fd2 = rg.OpenGroup('fd2') + fd2 = rg.OpenGroup("fd2") assert fd2 is not None - assert fd2.GetVectorLayerNames() == ['fd2_lyr'] - fd2_lyr = fd2.OpenVectorLayer('fd2_lyr') + assert fd2.GetVectorLayerNames() == ["fd2_lyr"] + fd2_lyr = fd2.OpenVectorLayer("fd2_lyr") assert fd2_lyr is not None - assert rg.GetVectorLayerNames() == ['standalone'] - standalone = rg.OpenVectorLayer('standalone') + assert rg.GetVectorLayerNames() == ["standalone"] + standalone = rg.OpenVectorLayer("standalone") assert standalone is not None @@ -2390,7 +2795,7 @@ def test_ogr_fgdb_read_layer_hierarchy(): # Test renaming a layer -@pytest.mark.parametrize("options", [ [], ['FEATURE_DATASET=fd1'] ]) +@pytest.mark.parametrize("options", [[], ["FEATURE_DATASET=fd1"]]) def test_ogr_fgdb_rename_layer(fgdb_drv, options): try: @@ -2401,28 +2806,28 @@ def test_ogr_fgdb_rename_layer(fgdb_drv, options): srs4326 = osr.SpatialReference() srs4326.ImportFromEPSG(4326) - ds = fgdb_drv.CreateDataSource('tmp/rename.gdb') - ds.CreateLayer('other_layer', geom_type=ogr.wkbNone) - lyr = ds.CreateLayer('foo', geom_type=ogr.wkbPoint, srs=srs4326, options=options) + ds = fgdb_drv.CreateDataSource("tmp/rename.gdb") + ds.CreateLayer("other_layer", geom_type=ogr.wkbNone) + lyr = ds.CreateLayer("foo", geom_type=ogr.wkbPoint, srs=srs4326, options=options) assert lyr.TestCapability(ogr.OLCRename) == 1 f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 2)")) lyr.CreateFeature(f) - assert lyr.Rename('bar') == ogr.OGRERR_NONE - assert lyr.GetDescription() == 'bar' - assert lyr.GetLayerDefn().GetName() == 'bar' + assert lyr.Rename("bar") == ogr.OGRERR_NONE + assert lyr.GetDescription() == "bar" + assert lyr.GetLayerDefn().GetName() == "bar" with gdaltest.error_handler(): - assert lyr.Rename('bar') != ogr.OGRERR_NONE + assert lyr.Rename("bar") != ogr.OGRERR_NONE with gdaltest.error_handler(): - assert lyr.Rename('other_layer') != ogr.OGRERR_NONE + assert lyr.Rename("other_layer") != ogr.OGRERR_NONE # Second renaming - assert lyr.Rename('baz') == ogr.OGRERR_NONE - assert lyr.GetDescription() == 'baz' - assert lyr.GetLayerDefn().GetName() == 'baz' + assert lyr.Rename("baz") == ogr.OGRERR_NONE + assert lyr.GetDescription() == "baz" + assert lyr.GetLayerDefn().GetName() == "baz" lyr.ResetReading() f = lyr.GetNextFeature() @@ -2430,9 +2835,11 @@ def test_ogr_fgdb_rename_layer(fgdb_drv, options): ds = None - ds = ogr.Open('tmp/rename.gdb') - lyr = ds.GetLayerByName('baz') - assert lyr is not None, [ ds.GetLayer(i).GetName() for i in range(ds.GetLayerCount()) ] + ds = ogr.Open("tmp/rename.gdb") + lyr = ds.GetLayerByName("baz") + assert lyr is not None, [ + ds.GetLayer(i).GetName() for i in range(ds.GetLayerCount()) + ] lyr.ResetReading() f = lyr.GetNextFeature() @@ -2459,13 +2866,13 @@ def test_ogr_filegdb_non_spatial_table_outside_gdb_items(openfilegdb_drv, fgdb_d fgdb_drv.Register() openfilegdb_drv.Register() - ds = ogr.Open('data/filegdb/table_outside_gdbitems.gdb') + ds = ogr.Open("data/filegdb/table_outside_gdbitems.gdb") assert ds is not None - assert ds.GetDriver().GetName() == 'FileGDB' + assert ds.GetDriver().GetName() == "FileGDB" - assert ds.GetLayerCount() == 3, 'did not get expected layer count' + assert ds.GetLayerCount() == 3, "did not get expected layer count" layer_names = set(ds.GetLayer(i).GetName() for i in range(ds.GetLayerCount())) - assert layer_names == {'aquaduct', 'flat_table1', 'flat_table2'} + assert layer_names == {"aquaduct", "flat_table1", "flat_table2"} ############################################################################### @@ -2474,12 +2881,12 @@ def test_ogr_filegdb_non_spatial_table_outside_gdb_items(openfilegdb_drv, fgdb_d def test_ogr_filegdb_inconsistent_crs_feature_dataset_and_feature_table(): - ds = ogr.Open('data/filegdb/inconsistent_crs_feature_dataset_and_feature_table.gdb') + ds = ogr.Open("data/filegdb/inconsistent_crs_feature_dataset_and_feature_table.gdb") assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" ############################################################################### @@ -2487,11 +2894,17 @@ def test_ogr_filegdb_inconsistent_crs_feature_dataset_and_feature_table(): def test_ogr_filegdb_shape_length_shape_area_as_default_in_field_defn(fgdb_drv): - ds = ogr.Open('data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb') + ds = ogr.Open("data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb") lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Area')).GetDefault() == 'FILEGEODATABASE_SHAPE_AREA' - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Length')).GetDefault() == 'FILEGEODATABASE_SHAPE_LENGTH' + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Area")).GetDefault() + == "FILEGEODATABASE_SHAPE_AREA" + ) + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Length")).GetDefault() + == "FILEGEODATABASE_SHAPE_LENGTH" + ) ############################################################################### @@ -2500,43 +2913,66 @@ def test_ogr_filegdb_shape_length_shape_area_as_default_in_field_defn(fgdb_drv): def test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_explicit(fgdb_drv): - dirname = 'tmp/test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_explicit.gdb' + dirname = "tmp/test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_explicit.gdb" ds = fgdb_drv.CreateDataSource(dirname) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) - lyr = ds.CreateLayer('line', srs=srs, geom_type=ogr.wkbLineString, options=['CREATE_SHAPE_AREA_AND_LENGTH_FIELDS=YES']) + lyr = ds.CreateLayer( + "line", + srs=srs, + geom_type=ogr.wkbLineString, + options=["CREATE_SHAPE_AREA_AND_LENGTH_FIELDS=YES"], + ) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(0 0,2 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("LINESTRING(0 0,2 0)")) lyr.CreateFeature(f) - lyr = ds.CreateLayer('area', srs=srs, geom_type=ogr.wkbPolygon, options=['CREATE_SHAPE_AREA_AND_LENGTH_FIELDS=YES']) + lyr = ds.CreateLayer( + "area", + srs=srs, + geom_type=ogr.wkbPolygon, + options=["CREATE_SHAPE_AREA_AND_LENGTH_FIELDS=YES"], + ) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0),(0.2 0.2,0.2 0.8,0.8 0.8,0.8 0.2,0.2 0.2))')) + f.SetGeometryDirectly( + ogr.CreateGeometryFromWkt( + "POLYGON((0 0,0 1,1 1,1 0,0 0),(0.2 0.2,0.2 0.8,0.8 0.8,0.8 0.2,0.2 0.2))" + ) + ) lyr.CreateFeature(f) ds = None ds = ogr.Open(dirname) - lyr = ds.GetLayerByName('line') + lyr = ds.GetLayerByName("line") f = lyr.GetNextFeature() lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldIndex('Shape_Length') >= 0 - assert lyr_defn.GetFieldIndex('Shape_Area') < 0 - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Length')).GetDefault() == 'FILEGEODATABASE_SHAPE_LENGTH' - assert f['Shape_Length'] == 2 - - lyr = ds.GetLayerByName('area') + assert lyr_defn.GetFieldIndex("Shape_Length") >= 0 + assert lyr_defn.GetFieldIndex("Shape_Area") < 0 + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Length")).GetDefault() + == "FILEGEODATABASE_SHAPE_LENGTH" + ) + assert f["Shape_Length"] == 2 + + lyr = ds.GetLayerByName("area") f = lyr.GetNextFeature() lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldIndex('Shape_Length') >= 0 - assert lyr_defn.GetFieldIndex('Shape_Area') >= 0 - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Area')).GetDefault() == 'FILEGEODATABASE_SHAPE_AREA' - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Length')).GetDefault() == 'FILEGEODATABASE_SHAPE_LENGTH' - assert f['Shape_Length'] == pytest.approx(6.4) - assert f['Shape_Area'] == pytest.approx(0.64) + assert lyr_defn.GetFieldIndex("Shape_Length") >= 0 + assert lyr_defn.GetFieldIndex("Shape_Area") >= 0 + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Area")).GetDefault() + == "FILEGEODATABASE_SHAPE_AREA" + ) + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Length")).GetDefault() + == "FILEGEODATABASE_SHAPE_LENGTH" + ) + assert f["Shape_Length"] == pytest.approx(6.4) + assert f["Shape_Area"] == pytest.approx(0.64) ds = None @@ -2552,14 +2988,24 @@ def test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_explicit(fgdb_drv): def test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_implicit(fgdb_drv): - dirname = 'tmp/test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_implicit.gdb' - gdal.VectorTranslate(dirname, 'data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb', options = '-f FileGDB -unsetfid -fid 1') + dirname = "tmp/test_ogr_filegdb_CREATE_SHAPE_AREA_AND_LENGTH_FIELDS_implicit.gdb" + gdal.VectorTranslate( + dirname, + "data/filegdb/filegdb_polygonzm_m_not_closing_with_curves.gdb", + options="-f FileGDB -unsetfid -fid 1", + ) ds = ogr.Open(dirname) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Area')).GetDefault() == 'FILEGEODATABASE_SHAPE_AREA' - assert lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('Shape_Length')).GetDefault() == 'FILEGEODATABASE_SHAPE_LENGTH' + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Area")).GetDefault() + == "FILEGEODATABASE_SHAPE_AREA" + ) + assert ( + lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("Shape_Length")).GetDefault() + == "FILEGEODATABASE_SHAPE_LENGTH" + ) ds = None @@ -2578,116 +3024,118 @@ def test_ogr_filegdb_read_relationships(openfilegdb_drv, fgdb_drv): openfilegdb_drv.Register() # no relationships - ds = gdal.OpenEx('data/filegdb/Domains.gdb', gdal.OF_VECTOR) + ds = gdal.OpenEx("data/filegdb/Domains.gdb", gdal.OF_VECTOR) assert ds.GetRelationshipNames() is None # has relationships - ds = gdal.OpenEx('data/filegdb/relationships.gdb', gdal.OF_VECTOR) - assert ds.GetDriver().GetDescription() == 'FileGDB' - assert set(ds.GetRelationshipNames()) == {'composite_many_to_many', - 'composite_one_to_many', - 'composite_one_to_one', - 'simple_attributed', - 'simple_backward_message_direction', - 'simple_both_message_direction', - 'simple_forward_message_direction', - 'simple_many_to_many', - 'simple_one_to_many', - 'simple_relationship_one_to_one', - 'points__ATTACHREL'} - - assert ds.GetRelationship('xxxx') is None - - rel = ds.GetRelationship('simple_relationship_one_to_one') + ds = gdal.OpenEx("data/filegdb/relationships.gdb", gdal.OF_VECTOR) + assert ds.GetDriver().GetDescription() == "FileGDB" + assert set(ds.GetRelationshipNames()) == { + "composite_many_to_many", + "composite_one_to_many", + "composite_one_to_one", + "simple_attributed", + "simple_backward_message_direction", + "simple_both_message_direction", + "simple_forward_message_direction", + "simple_many_to_many", + "simple_one_to_many", + "simple_relationship_one_to_one", + "points__ATTACHREL", + } + + assert ds.GetRelationship("xxxx") is None + + rel = ds.GetRelationship("simple_relationship_one_to_one") assert rel is not None - assert rel.GetName() == 'simple_relationship_one_to_one' - assert rel.GetLeftTableName() == 'table1' - assert rel.GetRightTableName() == 'table2' - assert rel.GetMappingTableName() == '' + assert rel.GetName() == "simple_relationship_one_to_one" + assert rel.GetLeftTableName() == "table1" + assert rel.GetRightTableName() == "table2" + assert rel.GetMappingTableName() == "" assert rel.GetCardinality() == gdal.GRC_ONE_TO_ONE assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetRightTableFields() == ['parent_pk'] + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetRightTableFields() == ["parent_pk"] assert rel.GetLeftMappingTableFields() is None assert rel.GetRightMappingTableFields() is None - assert rel.GetForwardPathLabel() == 'my forward path label' - assert rel.GetBackwardPathLabel() == 'my backward path label' - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetForwardPathLabel() == "my forward path label" + assert rel.GetBackwardPathLabel() == "my backward path label" + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('simple_one_to_many') + rel = ds.GetRelationship("simple_one_to_many") assert rel is not None - assert rel.GetName() == 'simple_one_to_many' - assert rel.GetLeftTableName() == 'table1' - assert rel.GetRightTableName() == 'table2' - assert rel.GetMappingTableName() == '' + assert rel.GetName() == "simple_one_to_many" + assert rel.GetLeftTableName() == "table1" + assert rel.GetRightTableName() == "table2" + assert rel.GetMappingTableName() == "" assert rel.GetCardinality() == gdal.GRC_ONE_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetRightTableFields() == ['parent_pk'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetRightTableFields() == ["parent_pk"] + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('simple_many_to_many') + rel = ds.GetRelationship("simple_many_to_many") assert rel is not None - assert rel.GetName() == 'simple_many_to_many' - assert rel.GetLeftTableName() == 'table1' - assert rel.GetRightTableName() == 'table2' - assert rel.GetMappingTableName() == 'simple_many_to_many' + assert rel.GetName() == "simple_many_to_many" + assert rel.GetLeftTableName() == "table1" + assert rel.GetRightTableName() == "table2" + assert rel.GetMappingTableName() == "simple_many_to_many" assert rel.GetCardinality() == gdal.GRC_MANY_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetLeftMappingTableFields() == ['origin_foreign_key'] - assert rel.GetRightTableFields() == ['parent_pk'] - assert rel.GetRightMappingTableFields() == ['destination_foreign_key'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetLeftMappingTableFields() == ["origin_foreign_key"] + assert rel.GetRightTableFields() == ["parent_pk"] + assert rel.GetRightMappingTableFields() == ["destination_foreign_key"] + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('composite_one_to_one') + rel = ds.GetRelationship("composite_one_to_one") assert rel is not None - assert rel.GetName() == 'composite_one_to_one' - assert rel.GetLeftTableName() == 'table1' - assert rel.GetRightTableName() == 'table3' - assert rel.GetMappingTableName() == '' + assert rel.GetName() == "composite_one_to_one" + assert rel.GetLeftTableName() == "table1" + assert rel.GetRightTableName() == "table3" + assert rel.GetMappingTableName() == "" assert rel.GetCardinality() == gdal.GRC_ONE_TO_ONE assert rel.GetType() == gdal.GRT_COMPOSITE - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetRightTableFields() == ['parent_pk'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetRightTableFields() == ["parent_pk"] + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('composite_one_to_many') + rel = ds.GetRelationship("composite_one_to_many") assert rel is not None - assert rel.GetName() == 'composite_one_to_many' - assert rel.GetLeftTableName() == 'table5' - assert rel.GetRightTableName() == 'table4' - assert rel.GetMappingTableName() == '' + assert rel.GetName() == "composite_one_to_many" + assert rel.GetLeftTableName() == "table5" + assert rel.GetRightTableName() == "table4" + assert rel.GetMappingTableName() == "" assert rel.GetCardinality() == gdal.GRC_ONE_TO_MANY assert rel.GetType() == gdal.GRT_COMPOSITE - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetRightTableFields() == ['parent_pk'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetRightTableFields() == ["parent_pk"] + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('composite_many_to_many') + rel = ds.GetRelationship("composite_many_to_many") assert rel is not None - assert rel.GetName() == 'composite_many_to_many' - assert rel.GetLeftTableName() == 'table6' - assert rel.GetRightTableName() == 'table7' - assert rel.GetMappingTableName() == 'composite_many_to_many' + assert rel.GetName() == "composite_many_to_many" + assert rel.GetLeftTableName() == "table6" + assert rel.GetRightTableName() == "table7" + assert rel.GetMappingTableName() == "composite_many_to_many" assert rel.GetCardinality() == gdal.GRC_MANY_TO_MANY assert rel.GetType() == gdal.GRT_COMPOSITE - assert rel.GetLeftTableFields() == ['pk'] - assert rel.GetLeftMappingTableFields() == ['origin_foreign_key'] - assert rel.GetRightTableFields() == ['parent_pk'] - assert rel.GetRightMappingTableFields() == ['dest_foreign_key'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["pk"] + assert rel.GetLeftMappingTableFields() == ["origin_foreign_key"] + assert rel.GetRightTableFields() == ["parent_pk"] + assert rel.GetRightMappingTableFields() == ["dest_foreign_key"] + assert rel.GetRelatedTableType() == "feature" - rel = ds.GetRelationship('points__ATTACHREL') + rel = ds.GetRelationship("points__ATTACHREL") assert rel is not None - assert rel.GetName() == 'points__ATTACHREL' - assert rel.GetLeftTableName() == 'points' - assert rel.GetRightTableName() == 'points__ATTACH' - assert rel.GetMappingTableName() == '' + assert rel.GetName() == "points__ATTACHREL" + assert rel.GetLeftTableName() == "points" + assert rel.GetRightTableName() == "points__ATTACH" + assert rel.GetMappingTableName() == "" assert rel.GetCardinality() == gdal.GRC_ONE_TO_MANY assert rel.GetType() == gdal.GRT_COMPOSITE - assert rel.GetLeftTableFields() == ['OBJECTID'] - assert rel.GetRightTableFields() == ['REL_OBJECTID'] - assert rel.GetForwardPathLabel() == 'attachment' - assert rel.GetBackwardPathLabel() == 'object' - assert rel.GetRelatedTableType() == 'media' + assert rel.GetLeftTableFields() == ["OBJECTID"] + assert rel.GetRightTableFields() == ["REL_OBJECTID"] + assert rel.GetForwardPathLabel() == "attachment" + assert rel.GetBackwardPathLabel() == "object" + assert rel.GetRelatedTableType() == "media" diff --git a/autotest/ogr/ogr_fgdb_stress_test.py b/autotest/ogr/ogr_fgdb_stress_test.py index b53a0fb9245b..587d567aeddb 100755 --- a/autotest/ogr/ogr_fgdb_stress_test.py +++ b/autotest/ogr/ogr_fgdb_stress_test.py @@ -33,13 +33,11 @@ import random import shutil - import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import gdal, ogr, osr + ############################################################################### # Test if driver is available @@ -50,10 +48,10 @@ 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') + 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() @@ -69,6 +67,7 @@ def test_ogr_fgdb_stress_init(): gdal.Unlink("tmp/test." + ogrtest.reference_ext) + ############################################################################### # Generate databases from random operations @@ -80,14 +79,14 @@ def test_ogr_fgdb_stress_1(): verbose = False - ds_test = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') - ds_ref = ogrtest.reference_drv.CreateDataSource('tmp/test.' + ogrtest.reference_ext) + 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)) + 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) @@ -98,11 +97,11 @@ def test_ogr_fgdb_stress_1(): if function == 0: if not in_transaction: if verbose: - print('StartTransaction') + print("StartTransaction") ds_test.StartTransaction(force=1) else: if verbose: - print('CommitTransaction') + print("CommitTransaction") ds_test.CommitTransaction() in_transaction = not in_transaction elif function < 500 / 3: @@ -110,13 +109,13 @@ def test_ogr_fgdb_stress_1(): 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)) + wkt = "POINT (%d %d)" % (random.randrange(0, 100), random.randrange(0, 100)) if verbose: - print('Create(%d)' % fid) + 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.SetField(0, "%d" % random.randrange(0, 1000)) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) gdal.PushErrorHandler() ret.append(lyr.CreateFeature(f)) @@ -133,12 +132,12 @@ def test_ogr_fgdb_stress_1(): 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)) + 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.SetField(0, "%d" % random.randrange(0, 1000)) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) # gdal.PushErrorHandler() ret.append(lyr.SetFeature(f)) @@ -149,7 +148,7 @@ def test_ogr_fgdb_stress_1(): ret = [] fid = 1 + random.randrange(0, 1000) if verbose: - print('Delete(%d)' % fid) + print("Delete(%d)" % fid) for lyr in [lyr_test, lyr_ref]: # gdal.PushErrorHandler() ret.append(lyr.DeleteFeature(fid)) @@ -159,7 +158,7 @@ def test_ogr_fgdb_stress_1(): if in_transaction: ds_test.CommitTransaction() - + ############################################################################### # Compare databases @@ -169,8 +168,8 @@ 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) + 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) @@ -178,12 +177,16 @@ def test_ogr_fgdb_stress_2(): 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) + 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: + 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() @@ -195,11 +198,11 @@ def test_ogr_fgdb_stress_2(): # sys.exit(0) - ############################################################################### # Cleanup + @pytest.mark.require_run_on_demand def test_ogr_fgdb_stress_cleanup(): if ogrtest.fgdb_drv is None: diff --git a/autotest/ogr/ogr_fielddomain.py b/autotest/ogr/ogr_fielddomain.py index 9407b91ff997..d3831ea6b29e 100755 --- a/autotest/ogr/ogr_fielddomain.py +++ b/autotest/ogr/ogr_fielddomain.py @@ -28,24 +28,32 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from osgeo import gdal -from osgeo import ogr - import gdaltest import pytest +from osgeo import gdal, ogr + def test_ogr_fielddomain_range(): with pytest.raises(Exception): - ogr.CreateRangeFieldDomain(None, 'desc', ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True) + ogr.CreateRangeFieldDomain( + None, "desc", ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True + ) with gdaltest.error_handler(): - assert ogr.CreateRangeFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, 1, True, 2, True) is None - - domain = ogr.CreateRangeFieldDomain('name', 'desc', ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True) - assert domain.GetName() == 'name' - assert domain.GetDescription() == 'desc' + assert ( + ogr.CreateRangeFieldDomain( + "name", "desc", ogr.OFTString, ogr.OFSTNone, 1, True, 2, True + ) + is None + ) + + domain = ogr.CreateRangeFieldDomain( + "name", "desc", ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True + ) + assert domain.GetName() == "name" + assert domain.GetDescription() == "desc" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTInteger assert domain.GetMinAsDouble() == 1.0 @@ -61,9 +69,18 @@ def test_ogr_fielddomain_range(): domain.SetMergePolicy(ogr.OFDMP_SUM) assert domain.GetMergePolicy() == ogr.OFDMP_SUM - domain = ogr.CreateRangeFieldDomain('name', None, ogr.OFTInteger64, ogr.OFSTNone, 1234567890123, False, -1234567890123, False) - assert domain.GetName() == 'name' - assert domain.GetDescription() == '' + domain = ogr.CreateRangeFieldDomain( + "name", + None, + ogr.OFTInteger64, + ogr.OFSTNone, + 1234567890123, + False, + -1234567890123, + False, + ) + assert domain.GetName() == "name" + assert domain.GetDescription() == "" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTInteger64 assert domain.GetMinAsDouble() == 1234567890123.0 @@ -81,55 +98,65 @@ def test_ogr_fielddomain_range(): def test_ogr_fielddomain_coded(): - domain = ogr.CreateCodedFieldDomain('name', 'desc', ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None}) - assert domain.GetName() == 'name' - assert domain.GetDescription() == 'desc' + domain = ogr.CreateCodedFieldDomain( + "name", "desc", ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None} + ) + assert domain.GetName() == "name" + assert domain.GetDescription() == "desc" assert domain.GetDomainType() == ogr.OFDT_CODED assert domain.GetFieldType() == ogr.OFTInteger - assert domain.GetEnumeration() == { "1": "one", "2": None } + assert domain.GetEnumeration() == {"1": "one", "2": None} - domain = ogr.CreateCodedFieldDomain('name', None, ogr.OFTInteger, ogr.OFSTNone, {}) + domain = ogr.CreateCodedFieldDomain("name", None, ogr.OFTInteger, ogr.OFSTNone, {}) assert domain.GetEnumeration() == {} with pytest.raises(Exception): - domain = ogr.CreateCodedFieldDomain('name', 'desc', ogr.OFTInteger, ogr.OFSTNone, None) + domain = ogr.CreateCodedFieldDomain( + "name", "desc", ogr.OFTInteger, ogr.OFSTNone, None + ) with pytest.raises(Exception): - domain = ogr.CreateCodedFieldDomain('name', 'desc', ogr.OFTInteger, ogr.OFSTNone, 5) + domain = ogr.CreateCodedFieldDomain( + "name", "desc", ogr.OFTInteger, ogr.OFSTNone, 5 + ) with pytest.raises(Exception): - domain = ogr.CreateCodedFieldDomain('name', 'desc', ogr.OFTInteger, 'x') + domain = ogr.CreateCodedFieldDomain("name", "desc", ogr.OFTInteger, "x") def test_ogr_fielddomain_glob(): - domain = ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, "*") - assert domain.GetName() == 'name' - assert domain.GetDescription() == 'desc' + domain = ogr.CreateGlobFieldDomain("name", "desc", ogr.OFTString, ogr.OFSTNone, "*") + assert domain.GetName() == "name" + assert domain.GetDescription() == "desc" assert domain.GetDomainType() == ogr.OFDT_GLOB assert domain.GetFieldType() == ogr.OFTString - assert domain.GetGlob() == '*' + assert domain.GetGlob() == "*" - domain = ogr.CreateGlobFieldDomain('name', None, ogr.OFTString, ogr.OFSTNone, "*") - assert domain.GetDescription() == '' + domain = ogr.CreateGlobFieldDomain("name", None, ogr.OFTString, ogr.OFSTNone, "*") + assert domain.GetDescription() == "" with pytest.raises(Exception): - domain = ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, None) + domain = ogr.CreateGlobFieldDomain( + "name", "desc", ogr.OFTString, ogr.OFSTNone, None + ) def test_ogr_fielddomain_mem_driver(): - ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) + ds = gdal.GetDriverByName("Memory").Create("", 0, 0, 0, gdal.GDT_Unknown) assert ds.GetFieldDomainNames() is None - assert ds.GetFieldDomain('foo') is None + assert ds.GetFieldDomain("foo") is None - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) - assert ds.GetFieldDomainNames() == ['name'] + assert ds.GetFieldDomainNames() == ["name"] - assert ds.GetFieldDomain('name').GetDomainType() == ogr.OFDT_GLOB + assert ds.GetFieldDomain("name").GetDomainType() == ogr.OFDT_GLOB with pytest.raises(Exception): assert ds.GetFieldDomain(None) @@ -138,67 +165,75 @@ def test_ogr_fielddomain_mem_driver(): assert ds.AddFieldDomain(None) # Duplicate domain - assert not ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) + assert not ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) - assert ds.GetFieldDomainNames() == ['name'] + assert ds.GetFieldDomainNames() == ["name"] - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name2', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name2", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) - assert set(ds.GetFieldDomainNames()) == {'name', 'name2'} + assert set(ds.GetFieldDomainNames()) == {"name", "name2"} # try deleting a domain which doesn't exist - assert not ds.DeleteFieldDomain('xxx') + assert not ds.DeleteFieldDomain("xxx") - assert ds.DeleteFieldDomain('name') + assert ds.DeleteFieldDomain("name") - assert ds.GetFieldDomain('name') is None - assert ds.GetFieldDomainNames() == ['name2'] + assert ds.GetFieldDomain("name") is None + assert ds.GetFieldDomainNames() == ["name2"] - assert not ds.DeleteFieldDomain('name') + assert not ds.DeleteFieldDomain("name") - assert ds.DeleteFieldDomain('name2') + assert ds.DeleteFieldDomain("name2") - assert ds.GetFieldDomain('name2') is None + assert ds.GetFieldDomain("name2") is None assert ds.GetFieldDomainNames() is None def test_ogr_fielddomain_get_set_domain_name(): - fld_defn = ogr.FieldDefn('foo', ogr.OFTInteger) - fld_defn.SetDomainName('fooDomain') - assert fld_defn.GetDomainName() == 'fooDomain' + fld_defn = ogr.FieldDefn("foo", ogr.OFTInteger) + fld_defn.SetDomainName("fooDomain") + assert fld_defn.GetDomainName() == "fooDomain" def test_delete_domain_assigned_to_field(): - ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name2', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) - - lyr = ds.CreateLayer('ogr_mem_1') - field_defn = ogr.FieldDefn('new_string', ogr.OFTString) - field_defn.SetDomainName('name') + ds = gdal.GetDriverByName("Memory").Create("", 0, 0, 0, gdal.GDT_Unknown) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name2", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) + + lyr = ds.CreateLayer("ogr_mem_1") + field_defn = ogr.FieldDefn("new_string", ogr.OFTString) + field_defn.SetDomainName("name") lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('new_string2', ogr.OFTString) - field_defn.SetDomainName('name2') + field_defn = ogr.FieldDefn("new_string2", ogr.OFTString) + field_defn.SetDomainName("name2") lyr.CreateField(field_defn) - lyr2 = ds.CreateLayer('ogr_mem_2') - field_defn = ogr.FieldDefn('new_string3', ogr.OFTString) - field_defn.SetDomainName('name') + lyr2 = ds.CreateLayer("ogr_mem_2") + field_defn = ogr.FieldDefn("new_string3", ogr.OFTString) + field_defn.SetDomainName("name") lyr2.CreateField(field_defn) - assert lyr.GetLayerDefn().GetFieldDefn(0).GetDomainName() == 'name' - assert lyr.GetLayerDefn().GetFieldDefn(1).GetDomainName() == 'name2' - assert lyr2.GetLayerDefn().GetFieldDefn(0).GetDomainName() == 'name' + assert lyr.GetLayerDefn().GetFieldDefn(0).GetDomainName() == "name" + assert lyr.GetLayerDefn().GetFieldDefn(1).GetDomainName() == "name2" + assert lyr2.GetLayerDefn().GetFieldDefn(0).GetDomainName() == "name" # deleting domain should remove it from field definitions too - assert ds.DeleteFieldDomain('name') + assert ds.DeleteFieldDomain("name") assert not lyr.GetLayerDefn().GetFieldDefn(0).GetDomainName() - assert lyr.GetLayerDefn().GetFieldDefn(1).GetDomainName() == 'name2' + assert lyr.GetLayerDefn().GetFieldDefn(1).GetDomainName() == "name2" assert not lyr2.GetLayerDefn().GetFieldDefn(0).GetDomainName() - assert ds.DeleteFieldDomain('name2') + assert ds.DeleteFieldDomain("name2") assert not lyr.GetLayerDefn().GetFieldDefn(0).GetDomainName() assert not lyr.GetLayerDefn().GetFieldDefn(1).GetDomainName() @@ -206,38 +241,48 @@ def test_delete_domain_assigned_to_field(): def test_update_field_domain(): - ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name', 'desc', ogr.OFTString, ogr.OFSTNone, '*')) - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('name2', 'desc2', ogr.OFTString, ogr.OFSTNone, '*a')) - - assert ds.GetFieldDomain('name').GetName() == 'name' - assert ds.GetFieldDomain('name').GetDescription() == 'desc' - assert ds.GetFieldDomain('name').GetGlob() == '*' - - assert ds.GetFieldDomain('name2').GetName() == 'name2' - assert ds.GetFieldDomain('name2').GetDescription() == 'desc2' - assert ds.GetFieldDomain('name2').GetGlob() == '*a' + ds = gdal.GetDriverByName("Memory").Create("", 0, 0, 0, gdal.GDT_Unknown) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name", "desc", ogr.OFTString, ogr.OFSTNone, "*") + ) + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain("name2", "desc2", ogr.OFTString, ogr.OFSTNone, "*a") + ) + + assert ds.GetFieldDomain("name").GetName() == "name" + assert ds.GetFieldDomain("name").GetDescription() == "desc" + assert ds.GetFieldDomain("name").GetGlob() == "*" + + assert ds.GetFieldDomain("name2").GetName() == "name2" + assert ds.GetFieldDomain("name2").GetDescription() == "desc2" + assert ds.GetFieldDomain("name2").GetGlob() == "*a" # try updating domain which doesn't exist - no_matching_domain = ogr.CreateGlobFieldDomain('nomatch', 'desc', ogr.OFTString, ogr.OFSTNone, '*') + no_matching_domain = ogr.CreateGlobFieldDomain( + "nomatch", "desc", ogr.OFTString, ogr.OFSTNone, "*" + ) assert not ds.UpdateFieldDomain(no_matching_domain) - new_domain1 = ogr.CreateGlobFieldDomain('name', 'different desc', ogr.OFTString, ogr.OFSTNone, '*b') + new_domain1 = ogr.CreateGlobFieldDomain( + "name", "different desc", ogr.OFTString, ogr.OFSTNone, "*b" + ) assert ds.UpdateFieldDomain(new_domain1) - assert ds.GetFieldDomain('name').GetName() == 'name' - assert ds.GetFieldDomain('name').GetDescription() == 'different desc' - assert ds.GetFieldDomain('name').GetGlob() == '*b' + assert ds.GetFieldDomain("name").GetName() == "name" + assert ds.GetFieldDomain("name").GetDescription() == "different desc" + assert ds.GetFieldDomain("name").GetGlob() == "*b" - assert ds.GetFieldDomain('name2').GetName() == 'name2' - assert ds.GetFieldDomain('name2').GetDescription() == 'desc2' - assert ds.GetFieldDomain('name2').GetGlob() == '*a' + assert ds.GetFieldDomain("name2").GetName() == "name2" + assert ds.GetFieldDomain("name2").GetDescription() == "desc2" + assert ds.GetFieldDomain("name2").GetGlob() == "*a" - new_domain2 = ogr.CreateGlobFieldDomain('name2', 'different desc 2', ogr.OFTString, ogr.OFSTNone, '*c') + new_domain2 = ogr.CreateGlobFieldDomain( + "name2", "different desc 2", ogr.OFTString, ogr.OFSTNone, "*c" + ) assert ds.UpdateFieldDomain(new_domain2) - assert ds.GetFieldDomain('name').GetName() == 'name' - assert ds.GetFieldDomain('name').GetDescription() == 'different desc' - assert ds.GetFieldDomain('name').GetGlob() == '*b' + assert ds.GetFieldDomain("name").GetName() == "name" + assert ds.GetFieldDomain("name").GetDescription() == "different desc" + assert ds.GetFieldDomain("name").GetGlob() == "*b" - assert ds.GetFieldDomain('name2').GetName() == 'name2' - assert ds.GetFieldDomain('name2').GetDescription() == 'different desc 2' - assert ds.GetFieldDomain('name2').GetGlob() == '*c' + assert ds.GetFieldDomain("name2").GetName() == "name2" + assert ds.GetFieldDomain("name2").GetDescription() == "different desc 2" + assert ds.GetFieldDomain("name2").GetGlob() == "*c" diff --git a/autotest/ogr/ogr_flatgeobuf.py b/autotest/ogr/ogr_flatgeobuf.py index 74935447d640..7a448044d578 100644 --- a/autotest/ogr/ogr_flatgeobuf.py +++ b/autotest/ogr/ogr_flatgeobuf.py @@ -29,57 +29,56 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from http.server import BaseHTTPRequestHandler - import os - -from osgeo import ogr -from osgeo import osr -from osgeo import gdal +from http.server import BaseHTTPRequestHandler import gdaltest import ogrtest import pytest import webserver -pytestmark = pytest.mark.require_driver('FlatGeobuf') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("FlatGeobuf") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): yield gdaltest.clean_tmp() + ### utils + def verify_flatgeobuf_copy(name, fids, names): if gdaltest.features is None: - print('Missing features collection') + print("Missing features collection") return False - fname = os.path.join('tmp', name + '.fgb') + fname = os.path.join("tmp", name + ".fgb") ds = ogr.Open(fname) if ds is None: - print('Can not open \'' + fname + '\'') + print("Can not open '" + fname + "'") return False lyr = ds.GetLayer(0) if lyr is None: - print('Missing layer') + print("Missing layer") return False ###################################################### # Test attributes - ret = ogrtest.check_features_against_list(lyr, 'FID', fids) + ret = ogrtest.check_features_against_list(lyr, "FID", fids) if ret != 1: - print('Wrong values in \'FID\' field') + print("Wrong values in 'FID' field") return False lyr.ResetReading() - ret = ogrtest.check_features_against_list(lyr, 'NAME', names) + ret = ogrtest.check_features_against_list(lyr, "NAME", names) if ret != 1: - print('Wrong values in \'NAME\' field') + print("Wrong values in 'NAME' field") return False ###################################################### @@ -91,12 +90,16 @@ def verify_flatgeobuf_copy(name, fids, names): feat = lyr.GetNextFeature() if feat is None: - print('Failed trying to read feature') + 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') + if ( + ogrtest.check_feature_geometry( + feat, orig_feat.GetGeometryRef(), max_error=0.001 + ) + != 0 + ): + print("Geometry test failed") gdaltest.features = None return False @@ -110,18 +113,18 @@ def verify_flatgeobuf_copy(name, fids, names): def copy_shape_to_flatgeobuf(name, wkbType, compress=None, options=[]): if compress is not None: - if compress[0:5] == '/vsig': - dst_name = os.path.join('/vsigzip/', 'tmp', name + '.fgb' + '.gz') - elif compress[0:4] == '/vsiz': - dst_name = os.path.join('/vsizip/', 'tmp', name + '.fgb' + '.zip') - elif compress == '/vsistdout/': + if compress[0:5] == "/vsig": + dst_name = os.path.join("/vsigzip/", "tmp", name + ".fgb" + ".gz") + elif compress[0:4] == "/vsiz": + dst_name = os.path.join("/vsizip/", "tmp", name + ".fgb" + ".zip") + elif compress == "/vsistdout/": dst_name = compress else: return False else: - dst_name = os.path.join('tmp', name + '.fgb') + dst_name = os.path.join("tmp", name + ".fgb") - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource(dst_name) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource(dst_name) if ds is None: return False @@ -133,16 +136,14 @@ def copy_shape_to_flatgeobuf(name, wkbType, compress=None, options=[]): ###################################################### # Setup schema (all test shapefiles use common schema) - ogrtest.quick_create_layer_def(lyr, - [('FID', ogr.OFTReal), - ('NAME', ogr.OFTString)]) + ogrtest.quick_create_layer_def(lyr, [("FID", ogr.OFTReal), ("NAME", ogr.OFTString)]) ###################################################### # Copy in shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - src_name = os.path.join('data', 'shp', name + '.shp') + src_name = os.path.join("data", "shp", name + ".shp") shp_ds = ogr.Open(src_name) shp_lyr = shp_ds.GetLayer(0) @@ -164,10 +165,12 @@ def copy_shape_to_flatgeobuf(name, wkbType, compress=None, options=[]): return True + ### tests + def test_ogr_flatgeobuf_2(): - fgb_ds = ogr.Open('data/testfgb/poly.fgb') + fgb_ds = ogr.Open("data/testfgb/poly.fgb") fgb_lyr = fgb_ds.GetLayer(0) assert fgb_lyr.TestCapability(ogr.OLCFastGetExtent) @@ -177,13 +180,17 @@ def test_ogr_flatgeobuf_2(): assert fgb_lyr.TestCapability(ogr.OLCFastFeatureCount) c = fgb_lyr.GetFeatureCount() assert c == 10 - c = fgb_lyr.SetSpatialFilterRect(478315.531250, 4762880.500000, 481645.312500, 4765610.500000) + c = fgb_lyr.SetSpatialFilterRect( + 478315.531250, 4762880.500000, 481645.312500, 4765610.500000 + ) c = fgb_lyr.GetFeatureCount() assert c == 10 - c = fgb_lyr.SetSpatialFilterRect(878315.531250, 4762880.500000, 881645.312500, 4765610.500000) + c = fgb_lyr.SetSpatialFilterRect( + 878315.531250, 4762880.500000, 881645.312500, 4765610.500000 + ) c = fgb_lyr.GetFeatureCount() assert c == 0 - c = fgb_lyr.SetSpatialFilterRect(479586.0,4764618.6,479808.2,4764797.8) + c = fgb_lyr.SetSpatialFilterRect(479586.0, 4764618.6, 479808.2, 4764797.8) c = fgb_lyr.GetFeatureCount() if ogrtest.have_geos(): assert c == 4 @@ -209,8 +216,9 @@ def test_ogr_flatgeobuf_2(): else: assert num == 5 + def test_ogr_flatgeobuf_2_1(): - fgb_ds = ogr.Open('data/testfgb/poly_no_index.fgb') + fgb_ds = ogr.Open("data/testfgb/poly_no_index.fgb") fgb_lyr = fgb_ds.GetLayer(0) assert fgb_lyr.TestCapability(ogr.OLCFastGetExtent) is False @@ -220,13 +228,17 @@ def test_ogr_flatgeobuf_2_1(): assert fgb_lyr.TestCapability(ogr.OLCFastFeatureCount) is False c = fgb_lyr.GetFeatureCount() assert c == 10 - c = fgb_lyr.SetSpatialFilterRect(478315.531250, 4762880.500000, 481645.312500, 4765610.500000) + c = fgb_lyr.SetSpatialFilterRect( + 478315.531250, 4762880.500000, 481645.312500, 4765610.500000 + ) c = fgb_lyr.GetFeatureCount() assert c == 10 - c = fgb_lyr.SetSpatialFilterRect(878315.531250, 4762880.500000, 881645.312500, 4765610.500000) + c = fgb_lyr.SetSpatialFilterRect( + 878315.531250, 4762880.500000, 881645.312500, 4765610.500000 + ) c = fgb_lyr.GetFeatureCount() assert c == 0 - c = fgb_lyr.SetSpatialFilterRect(479586.0,4764618.6,479808.2,4764797.8) + c = fgb_lyr.SetSpatialFilterRect(479586.0, 4764618.6, 479808.2, 4764797.8) c = fgb_lyr.GetFeatureCount() if ogrtest.have_geos(): assert c == 4 @@ -252,70 +264,79 @@ def test_ogr_flatgeobuf_2_1(): else: assert num == 5 + def wktRoundtrip(in_wkt, expected_wkt): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") g = ogr.CreateGeometryFromWkt(in_wkt) - lyr = ds.CreateLayer('test', None, g.GetGeometryType(), []) + lyr = ds.CreateLayer("test", None, g.GetGeometryType(), []) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(g) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() actual = g.ExportToIsoWkt() ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") assert actual == expected_wkt + def test_ogr_flatgeobuf_3(): - wkts = ogrtest.get_wkt_data_series(with_z=True, with_m=True, with_gc=True, with_circular=True, with_surface=True) + wkts = ogrtest.get_wkt_data_series( + with_z=True, with_m=True, with_gc=True, with_circular=True, with_surface=True + ) for wkt in wkts: wktRoundtrip(wkt, wkt) + # Run test_ogrsf def test_ogr_flatgeobuf_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/testfgb/poly.fgb') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " -ro data/testfgb/poly.fgb" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 def test_ogr_flatgeobuf_9(): gdaltest.tests = [ - ['gjpoint', [1], ['Point 1'], ogr.wkbPoint], - ['gjline', [1], ['Line 1'], ogr.wkbLineString], - ['gjpoly', [1], ['Polygon 1'], ogr.wkbPolygon], - ['gjmultipoint', [1], ['MultiPoint 1'], ogr.wkbMultiPoint], - ['gjmultiline', [2], ['MultiLine 1'], ogr.wkbMultiLineString], - ['gjmultipoly', [2], ['MultiPoly 1'], ogr.wkbMultiPolygon] + ["gjpoint", [1], ["Point 1"], ogr.wkbPoint], + ["gjline", [1], ["Line 1"], ogr.wkbLineString], + ["gjpoly", [1], ["Polygon 1"], ogr.wkbPolygon], + ["gjmultipoint", [1], ["MultiPoint 1"], ogr.wkbMultiPoint], + ["gjmultiline", [2], ["MultiLine 1"], ogr.wkbMultiLineString], + ["gjmultipoly", [2], ["MultiPoly 1"], ogr.wkbMultiPolygon], ] for i in range(len(gdaltest.tests)): test = gdaltest.tests[i] rc = copy_shape_to_flatgeobuf(test[0], test[3]) - assert rc, ('Failed making copy of ' + test[0] + '.shp') + assert rc, "Failed making copy of " + test[0] + ".shp" rc = verify_flatgeobuf_copy(test[0], test[1], test[2]) - assert rc, ('Verification of copy of ' + test[0] + '.shp failed') + assert rc, "Verification of copy of " + test[0] + ".shp failed" for i in range(len(gdaltest.tests)): test = gdaltest.tests[i] - rc = copy_shape_to_flatgeobuf(test[0], test[3], None, ['SPATIAL_INDEX=NO']) - assert rc, ('Failed making copy of ' + test[0] + '.shp') + rc = copy_shape_to_flatgeobuf(test[0], test[3], None, ["SPATIAL_INDEX=NO"]) + assert rc, "Failed making copy of " + test[0] + ".shp" rc = verify_flatgeobuf_copy(test[0], test[1], test[2]) - assert rc, ('Verification of copy of ' + test[0] + '.shp failed') + assert rc, "Verification of copy of " + test[0] + ".shp failed" # Test support for multiple layers in a directory @@ -323,116 +344,125 @@ def test_ogr_flatgeobuf_9(): def test_ogr_flatgeobuf_directory(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/multi_layer') - with gdaltest.error_handler(): # name will be laundered - ds.CreateLayer('foo<', geom_type = ogr.wkbPoint) - ds.CreateLayer('bar', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/multi_layer") + with gdaltest.error_handler(): # name will be laundered + ds.CreateLayer("foo<", geom_type=ogr.wkbPoint) + ds.CreateLayer("bar", geom_type=ogr.wkbPoint) ds = None - ds = gdal.OpenEx('/vsimem/multi_layer') - assert set(ds.GetFileList()) == set(['/vsimem/multi_layer/bar.fgb', '/vsimem/multi_layer/foo_.fgb']) - assert ds.GetLayer('foo<') - assert ds.GetLayer('bar') + ds = gdal.OpenEx("/vsimem/multi_layer") + assert set(ds.GetFileList()) == set( + ["/vsimem/multi_layer/bar.fgb", "/vsimem/multi_layer/foo_.fgb"] + ) + assert ds.GetLayer("foo<") + assert ds.GetLayer("bar") ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/multi_layer') - assert not gdal.VSIStatL('/vsimem/multi_layer') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/multi_layer") + assert not gdal.VSIStatL("/vsimem/multi_layer") def test_ogr_flatgeobuf_srs_epsg(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") srs = osr.SpatialReference() srs.ImportFromEPSG(32631) - ds.CreateLayer('test', srs = srs, geom_type = ogr.wkbPoint) + ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) srs_got = lyr.GetSpatialRef() assert srs_got.IsSame(srs) - assert srs_got.GetAuthorityName(None) == 'EPSG' - assert srs_got.GetAuthorityCode(None) == '32631' + assert srs_got.GetAuthorityName(None) == "EPSG" + assert srs_got.GetAuthorityCode(None) == "32631" ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") def test_ogr_flatgeobuf_srs_other_authority(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") srs = osr.SpatialReference() srs.SetFromUserInput("ESRI:104009") srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) - ds.CreateLayer('test', srs = srs, geom_type = ogr.wkbPoint) + ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) srs_got = lyr.GetSpatialRef() assert srs_got.IsSame(srs) - assert srs_got.GetAuthorityName(None) == 'ESRI' - assert srs_got.GetAuthorityCode(None) == '104009' + assert srs_got.GetAuthorityName(None) == "ESRI" + assert srs_got.GetAuthorityCode(None) == "104009" ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") def test_ogr_flatgeobuf_srs_no_authority(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") srs = osr.SpatialReference() srs.SetFromUserInput("+proj=longlat +ellps=clrk66") - ds.CreateLayer('test', srs = srs, geom_type = ogr.wkbPoint) + ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbPoint) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) srs_got = lyr.GetSpatialRef() assert srs_got.IsSame(srs) assert srs_got.GetAuthorityName(None) is None ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") + def test_ogr_flatgeobuf_datatypes(): - ds = ogr.Open('data/testfgb/testdatatypes.fgb') + ds = ogr.Open("data/testfgb/testdatatypes.fgb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f['int'] == 1 - assert f['int64'] == 1234567890123 - assert f['double'] == 1.25 - assert f['string'] == 'my string' - assert f['datetime'] == '2019/10/15 12:34:56.789+00' + assert f["int"] == 1 + assert f["int64"] == 1234567890123 + assert f["double"] == 1.25 + assert f["string"] == "my string" + assert f["datetime"] == "2019/10/15 12:34:56.789+00" def test_ogr_flatgeobuf_alldatatypes(): - ds = ogr.Open('data/testfgb/alldatatypes.fgb') + ds = ogr.Open("data/testfgb/alldatatypes.fgb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f['byte'] == -1 - assert f['ubyte'] == 255 - assert f['bool'] == 1 - assert f['short'] == -1 - assert f['ushort'] == 65535 - assert f['int'] == -1 - assert f['uint'] == 4294967295 - assert f['long'] == -1 - assert f['ulong'] == float(2**64 - 1) - assert f['float'] == 0 - assert f['double'] == 0 - assert f['string'] == 'X' - assert f['json'] == 'X' - assert f['datetime'] == '2020/02/29 12:34:56+00' - assert f.GetFieldAsBinary('binary') == b'\x58' + assert f["byte"] == -1 + assert f["ubyte"] == 255 + assert f["bool"] == 1 + assert f["short"] == -1 + assert f["ushort"] == 65535 + assert f["int"] == -1 + assert f["uint"] == 4294967295 + assert f["long"] == -1 + assert f["ulong"] == float(2**64 - 1) + assert f["float"] == 0 + assert f["double"] == 0 + assert f["string"] == "X" + assert f["json"] == "X" + assert f["datetime"] == "2020/02/29 12:34:56+00" + assert f.GetFieldAsBinary("binary") == b"\x58" + def test_ogr_flatgeobuf_mixed(): - srcDS = gdal.OpenEx('data/testfgb/testmixed.geojson') - destDS = gdal.VectorTranslate('/vsimem/test.fgb', srcDS=srcDS, format = 'FlatGeobuf', layerCreationOptions = ['SPATIAL_INDEX=NO']) + srcDS = gdal.OpenEx("data/testfgb/testmixed.geojson") + destDS = gdal.VectorTranslate( + "/vsimem/test.fgb", + srcDS=srcDS, + format="FlatGeobuf", + layerCreationOptions=["SPATIAL_INDEX=NO"], + ) srcDS = None destDS = None - srcDS = ogr.Open('data/testfgb/testmixed.geojson') - destDS = ogr.Open('/vsimem/test.fgb') + srcDS = ogr.Open("data/testfgb/testmixed.geojson") + destDS = ogr.Open("/vsimem/test.fgb") srcLyr = srcDS.GetLayer(0) destLyr = destDS.GetLayer(0) assert destLyr.TestCapability(ogr.OLCFastFeatureCount) @@ -441,53 +471,63 @@ def test_ogr_flatgeobuf_mixed(): assert destLyr.GetExtent(force=0) == srcLyr.GetExtent() ogrtest.compare_layers(srcLyr, destLyr) - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") + ############################################################################### do_log = False -class WFSHTTPHandler(BaseHTTPRequestHandler): - def log_request(self, code='-', size='-'): +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 = open("/tmp/log.txt", "a") + f.write("GET %s\n" % self.path) f.close() - if self.path.find('/fakewfs') != -1: + 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': + 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.send_header("Content-type", "application/xml") self.end_headers() - f = open('data/testfgb/wfs/get_capabilities.xml', 'rb') + f = open("data/testfgb/wfs/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=topp:tasmania_water_bodies': + if ( + self.path + == "/fakewfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=topp:tasmania_water_bodies" + ): self.send_response(200) - self.send_header('Content-type', 'application/xml') + self.send_header("Content-type", "application/xml") self.end_headers() - f = open('data/testfgb/wfs/describe_feature_type.xml', 'rb') + f = open("data/testfgb/wfs/describe_feature_type.xml", "rb") content = f.read() f.close() self.wfile.write(content) return - if self.path == '/fakewfs?OUTPUTFORMAT=application/flatgeobuf&SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=topp:tasmania_water_bodies': + if ( + self.path + == "/fakewfs?OUTPUTFORMAT=application/flatgeobuf&SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=topp:tasmania_water_bodies" + ): self.send_response(200) - self.send_header('Content-type', 'application/flatgeobuf') + self.send_header("Content-type", "application/flatgeobuf") self.end_headers() - f = open('data/testfgb/wfs/get_feature.fgb', 'rb') + f = open("data/testfgb/wfs/get_feature.fgb", "rb") content = f.read() f.close() self.wfile.write(content) @@ -497,12 +537,13 @@ def do_GET(self): except IOError: pass - self.send_error(404, 'File Not Found: %s' % self.path) + self.send_error(404, "File Not Found: %s" % self.path) -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def ogr_wfs_init(): - gdaltest.wfs_drv = ogr.GetDriverByName('WFS') + gdaltest.wfs_drv = ogr.GetDriverByName("WFS") + def test_ogr_wfs_fake_wfs_server(): if gdaltest.wfs_drv is None: @@ -512,68 +553,76 @@ def test_ogr_wfs_fake_wfs_server(): 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?OUTPUTFORMAT=application/flatgeobuf" % port) - gdal.SetConfigOption('OGR_WFS_LOAD_MULTIPLE_LAYER_DEFN', None) + gdal.SetConfigOption("OGR_WFS_LOAD_MULTIPLE_LAYER_DEFN", "NO") + ds = ogr.Open( + "WFS:http://127.0.0.1:%d/fakewfs?OUTPUTFORMAT=application/flatgeobuf" % 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') + pytest.fail("did not managed to open WFS datastore") - lyr = ds.GetLayerByName('topp:tasmania_water_bodies') + lyr = ds.GetLayerByName("topp:tasmania_water_bodies") if lyr == None: webserver.server_stop(process, port) - pytest.fail('did not get expected layer') + pytest.fail("did not get expected layer") name = lyr.GetName() - if name != 'topp:tasmania_water_bodies': + if name != "topp:tasmania_water_bodies": print(name) webserver.server_stop(process, port) - pytest.fail('did not get expected layer name (got %s)' % name) + pytest.fail("did not get expected layer name (got %s)" % name) feat = lyr.GetNextFeature() - if feat.GetField('CONTINENT') != 'Australia' or \ - ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((146.232727 -42.157501,146.238007 -42.16111,146.24411 -42.169724,146.257202 -42.193329,146.272217 -42.209442,146.274689 -42.214165,146.27832 -42.21833,146.282471 -42.228882,146.282745 -42.241943,146.291351 -42.255836,146.290253 -42.261948,146.288025 -42.267502,146.282471 -42.269997,146.274994 -42.271111,146.266663 -42.270279,146.251373 -42.262505,146.246918 -42.258057,146.241333 -42.256111,146.23468 -42.257782,146.221344 -42.269165,146.210785 -42.274445,146.20163 -42.27417,146.196075 -42.271385,146.186646 -42.258057,146.188568 -42.252785,146.193298 -42.249443,146.200806 -42.248055,146.209137 -42.249168,146.217468 -42.248611,146.222473 -42.245277,146.22525 -42.240555,146.224121 -42.22805,146.224396 -42.221382,146.228302 -42.217216,146.231354 -42.212502,146.231628 -42.205559,146.219421 -42.186943,146.21637 -42.17028,146.216644 -42.16333,146.219696 -42.158607,146.225525 -42.156105,146.232727 -42.157501)))', - max_error=0.00001) != 0: + if ( + feat.GetField("CONTINENT") != "Australia" + or ogrtest.check_feature_geometry( + feat, + "MULTIPOLYGON (((146.232727 -42.157501,146.238007 -42.16111,146.24411 -42.169724,146.257202 -42.193329,146.272217 -42.209442,146.274689 -42.214165,146.27832 -42.21833,146.282471 -42.228882,146.282745 -42.241943,146.291351 -42.255836,146.290253 -42.261948,146.288025 -42.267502,146.282471 -42.269997,146.274994 -42.271111,146.266663 -42.270279,146.251373 -42.262505,146.246918 -42.258057,146.241333 -42.256111,146.23468 -42.257782,146.221344 -42.269165,146.210785 -42.274445,146.20163 -42.27417,146.196075 -42.271385,146.186646 -42.258057,146.188568 -42.252785,146.193298 -42.249443,146.200806 -42.248055,146.209137 -42.249168,146.217468 -42.248611,146.222473 -42.245277,146.22525 -42.240555,146.224121 -42.22805,146.224396 -42.221382,146.228302 -42.217216,146.231354 -42.212502,146.231628 -42.205559,146.219421 -42.186943,146.21637 -42.17028,146.216644 -42.16333,146.219696 -42.158607,146.225525 -42.156105,146.232727 -42.157501)))", + max_error=0.00001, + ) + != 0 + ): feat.DumpReadable() webserver.server_stop(process, port) - pytest.fail('did not get expected feature') + pytest.fail("did not get expected feature") webserver.server_stop(process, port) def test_ogr_flatgeobuf_bool_short_float_binary(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) - fld_defn = ogr.FieldDefn('bool', ogr.OFTInteger) + fld_defn = ogr.FieldDefn("bool", ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('short', ogr.OFTInteger) + 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 = ogr.FieldDefn("float", ogr.OFTReal) fld_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld_defn) - lyr.CreateField(ogr.FieldDefn('bin', ogr.OFTBinary)) + lyr.CreateField(ogr.FieldDefn("bin", ogr.OFTBinary)) f = ogr.Feature(lyr.GetLayerDefn()) - f['bool'] = True - f['short'] = -32768; - f['float'] = 1.5; - f.SetFieldBinaryFromHexString('bin', '01FF') - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f["bool"] = True + f["short"] = -32768 + f["float"] = 1.5 + f.SetFieldBinaryFromHexString("bin", "01FF") + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) # Field of size 0 f = ogr.Feature(lyr.GetLayerDefn()) - f.SetFieldBinaryFromHexString('bin', '') - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetFieldBinaryFromHexString("bin", "") + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTBoolean @@ -583,103 +632,112 @@ def test_ogr_flatgeobuf_bool_short_float_binary(): assert lyr.GetLayerDefn().GetFieldDefn(2).GetSubType() == ogr.OFSTFloat32 assert lyr.GetLayerDefn().GetFieldDefn(3).GetType() == ogr.OFTBinary f = lyr.GetNextFeature() - assert f['bool'] == True - assert f['short'] == -32768 - assert f['float'] == 1.5 - assert f.GetFieldAsBinary('bin') == b'\x01\xFF' + assert f["bool"] == True + assert f["short"] == -32768 + assert f["float"] == 1.5 + assert f.GetFieldAsBinary("bin") == b"\x01\xFF" f = lyr.GetNextFeature() - assert f.GetFieldAsBinary('bin') == b'' + assert f.GetFieldAsBinary("bin") == b"" ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") -@pytest.mark.parametrize("options", - [[], ['SPATIAL_INDEX=NO']], - ids=['spatial_index', 'no_spatial_index']) +@pytest.mark.parametrize( + "options", [[], ["SPATIAL_INDEX=NO"]], ids=["spatial_index", "no_spatial_index"] +) def test_ogr_flatgeobuf_write_to_vsizip(options): - srcDS = gdal.OpenEx('data/poly.shp') - destDS = gdal.VectorTranslate('/vsizip//vsimem/test.fgb.zip/test.fgb', - srcDS=srcDS, - format='FlatGeobuf', - layerCreationOptions=options) + srcDS = gdal.OpenEx("data/poly.shp") + destDS = gdal.VectorTranslate( + "/vsizip//vsimem/test.fgb.zip/test.fgb", + srcDS=srcDS, + format="FlatGeobuf", + layerCreationOptions=options, + ) assert destDS is not None destDS = None - destDS = ogr.Open('/vsizip//vsimem/test.fgb.zip/test.fgb') + destDS = ogr.Open("/vsizip//vsimem/test.fgb.zip/test.fgb") srcLyr = srcDS.GetLayer(0) dstLyr = destDS.GetLayer(0) assert dstLyr.GetFeatureCount() == srcLyr.GetFeatureCount() dstF = dstLyr.GetNextFeature() assert dstF is not None destDS = None - gdal.Unlink('/vsimem/test.fgb.zip') + gdal.Unlink("/vsimem/test.fgb.zip") def test_ogr_flatgeobuf_huge_number_of_columns(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) for i in range(65536): - assert lyr.CreateField(ogr.FieldDefn('col%d' % i, ogr.OFTInteger)) == ogr.OGRERR_NONE, i + assert ( + lyr.CreateField(ogr.FieldDefn("col%d" % i, ogr.OFTInteger)) + == ogr.OGRERR_NONE + ), i with gdaltest.error_handler(): - assert lyr.CreateField(ogr.FieldDefn('col65536', ogr.OFTInteger)) == ogr.OGRERR_FAILURE + assert ( + lyr.CreateField(ogr.FieldDefn("col65536", ogr.OFTInteger)) + == ogr.OGRERR_FAILURE + ) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) for i in range(65536): f.SetField(i, i) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() for i in range(65536): assert f.GetField(i) == i ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + def test_ogr_flatgeobuf_column_metadata(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) - fld_defn = ogr.FieldDefn('int', ogr.OFTInteger) - fld_defn.SetAlternativeName('an integer') + fld_defn = ogr.FieldDefn("int", ogr.OFTInteger) + fld_defn.SetAlternativeName("an integer") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('str1', ogr.OFTString) + fld_defn = ogr.FieldDefn("str1", ogr.OFTString) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('str2', ogr.OFTString) + fld_defn = ogr.FieldDefn("str2", ogr.OFTString) fld_defn.SetWidth(2) fld_defn.SetNullable(False) fld_defn.SetUnique(True) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('float1', ogr.OFTReal) + fld_defn = ogr.FieldDefn("float1", ogr.OFTReal) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('float2', ogr.OFTReal) + fld_defn = ogr.FieldDefn("float2", ogr.OFTReal) fld_defn.SetWidth(5) fld_defn.SetPrecision(3) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f['int'] = 1 - f['str1'] = 'test1' - f['str2'] = 'test2' - f['float1'] = 1.1234 - f['float2'] = 12.123 - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f["int"] = 1 + f["str1"] = "test1" + f["str2"] = "test2" + f["float1"] = 1.1234 + f["float2"] = 12.123 + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger - assert lyr.GetLayerDefn().GetFieldDefn(0).GetAlternativeName() == 'an integer' + assert lyr.GetLayerDefn().GetFieldDefn(0).GetAlternativeName() == "an integer" assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTString assert lyr.GetLayerDefn().GetFieldDefn(1).GetWidth() == 0 assert lyr.GetLayerDefn().GetFieldDefn(1).IsNullable() == 1 @@ -696,26 +754,27 @@ def test_ogr_flatgeobuf_column_metadata(): assert lyr.GetLayerDefn().GetFieldDefn(4).GetPrecision() == 3 ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") + def test_ogr_flatgeobuf_editing(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) - fld_defn = ogr.FieldDefn('int', ogr.OFTInteger) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) + fld_defn = ogr.FieldDefn("int", ogr.OFTInteger) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('str1', ogr.OFTString) + fld_defn = ogr.FieldDefn("str1", ogr.OFTString) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) - f['int'] = 1 - f['str1'] = 'test1' + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) + f["int"] = 1 + f["str1"] = "test1" lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) - f['int'] = 2 - f['str1'] = 'test2' + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 1)")) + f["int"] = 2 + f["str1"] = "test2" lyr.CreateFeature(f) c = lyr.GetFeatureCount() @@ -723,27 +782,27 @@ def test_ogr_flatgeobuf_editing(): ds = None - ds = ogr.Open('/vsimem/test.fgb', update=1) + ds = ogr.Open("/vsimem/test.fgb", update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 1)")) assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert lyr.TestCapability(ogr.OLCDeleteFeature) == 1 assert lyr.DeleteFeature(1) == 0 assert lyr.DeleteFeature(1) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.TestCapability(ogr.OLCReorderFields) == 1 - #assert lyr.ReorderFields([0, 1]) == 0 + # assert lyr.ReorderFields([0, 1]) == 0 assert lyr.DeleteField(1) == 0 f = lyr.GetFeature(0) - f.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (2 2)')) + f.SetGeomField(0, ogr.CreateGeometryFromWkt("POINT (2 2)")) assert lyr.SetFeature(f) == 0 lyr.ResetReading() ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) c = lyr.GetFeatureCount() @@ -751,75 +810,89 @@ def test_ogr_flatgeobuf_editing(): f = lyr.GetNextFeature() assert f is not None - assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 2)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 2)" assert f[0] == 2 assert f.GetFieldCount() == 1 f = lyr.GetNextFeature() assert f is not None - assert f.GetGeometryRef().ExportToWkt() == 'POINT (1 1)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (1 1)" f = lyr.GetNextFeature() assert f is None f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 1)")) with gdaltest.error_handler(): assert lyr.CreateFeature(f) != ogr.OGRERR_NONE - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') - - -@pytest.mark.parametrize('in_wkt,expected_wkt', [ - ('MULTIPOINT ((0 0), EMPTY)', 'MULTIPOINT ((0 0))'), - ('MULTILINESTRING ((0 0,1 1), EMPTY)', 'MULTILINESTRING ((0 0,1 1))'), - ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)), EMPTY)', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))'), - ('GEOMETRYCOLLECTION (POINT (0 0), POINT EMPTY)', 'GEOMETRYCOLLECTION (POINT (0 0))'), -]) + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") + + +@pytest.mark.parametrize( + "in_wkt,expected_wkt", + [ + ("MULTIPOINT ((0 0), EMPTY)", "MULTIPOINT ((0 0))"), + ("MULTILINESTRING ((0 0,1 1), EMPTY)", "MULTILINESTRING ((0 0,1 1))"), + ( + "MULTIPOLYGON (((0 0,0 1,1 1,0 0)), EMPTY)", + "MULTIPOLYGON (((0 0,0 1,1 1,0 0)))", + ), + ( + "GEOMETRYCOLLECTION (POINT (0 0), POINT EMPTY)", + "GEOMETRYCOLLECTION (POINT (0 0))", + ), + ], +) def test_ogr_flatgeobuf_multi_geometries_with_empty(in_wkt, expected_wkt): wktRoundtrip(in_wkt, expected_wkt) def test_ogr_flatgeobuf_ossfuzz_bug_29462(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) - fld_defn = ogr.FieldDefn('str', ogr.OFTString) + fld_defn = ogr.FieldDefn("str", ogr.OFTString) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f['str'] = 'X' * 100000 - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f["str"] = "X" * 100000 + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f['str'] = 'X' - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f["str"] = "X" + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f['str'] == 'X' * 100000 + assert f["str"] == "X" * 100000 f = lyr.GetNextFeature() - assert f['str'] == 'X' + assert f["str"] == "X" ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') - assert not gdal.VSIStatL('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") + assert not gdal.VSIStatL("/vsimem/test.fgb") ############################################################################### # Check that we don't crash or leak -@pytest.mark.parametrize("filename", ['data/flatgeobuf/invalid_polyhedralsurface_of_curvepolygon.fgb', - 'data/flatgeobuf/invalid_compoundcurve_non_contiguous_curves.fgb', - 'data/flatgeobuf/invalid_curvepolygon_linestring_three_points.fgb', - 'data/flatgeobuf/invalid_multisurface_of_polyhedralsurface.fgb']) +@pytest.mark.parametrize( + "filename", + [ + "data/flatgeobuf/invalid_polyhedralsurface_of_curvepolygon.fgb", + "data/flatgeobuf/invalid_compoundcurve_non_contiguous_curves.fgb", + "data/flatgeobuf/invalid_curvepolygon_linestring_three_points.fgb", + "data/flatgeobuf/invalid_multisurface_of_polyhedralsurface.fgb", + ], +) def test_ogr_flatgeobuf_read_invalid_geometries(filename): with gdaltest.error_handler(): ds = gdal.OpenEx(filename) @@ -827,12 +900,13 @@ def test_ogr_flatgeobuf_read_invalid_geometries(filename): for f in lyr: pass + ############################################################################### def test_ogr_flatgeobuf_read_coordinate_metadata_wkt(): - ds = gdal.OpenEx('data/flatgeobuf/test_ogr_flatgeobuf_coordinate_epoch.fgb') + ds = gdal.OpenEx("data/flatgeobuf/test_ogr_flatgeobuf_coordinate_epoch.fgb") lyr = ds.GetLayer(0) got_srs = lyr.GetSpatialRef() assert got_srs is not None @@ -848,20 +922,20 @@ def test_ogr_flatgeobuf_coordinate_epoch(): srs.ImportFromEPSG(4326) srs.SetCoordinateEpoch(2021.3) - filename = '/vsimem/test_ogr_flatgeobuf_coordinate_epoch.fgb' - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource(filename) - ds.CreateLayer('foo', srs=srs) + filename = "/vsimem/test_ogr_flatgeobuf_coordinate_epoch.fgb" + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource(filename) + ds.CreateLayer("foo", srs=srs) ds = None ds = gdal.OpenEx(filename) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" assert srs.GetCoordinateEpoch() == 2021.3 assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource(filename) + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource(filename) ############################################################################### @@ -870,7 +944,8 @@ def test_ogr_flatgeobuf_coordinate_epoch(): def test_ogr_flatgeobuf_coordinate_epoch_custom_wkt(): srs = osr.SpatialReference() - srs.SetFromUserInput("""GEOGCRS["myTRF2021", + srs.SetFromUserInput( + """GEOGCRS["myTRF2021", DYNAMIC[ FRAMEEPOCH[2010]], DATUM["myTRF2021", @@ -884,13 +959,14 @@ def test_ogr_flatgeobuf_coordinate_epoch_custom_wkt(): ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], - ANGLEUNIT["degree",0.0174532925199433]]]""") + ANGLEUNIT["degree",0.0174532925199433]]]""" + ) srs.SetCoordinateEpoch(2021.3) srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) - filename = '/vsimem/test_ogr_flatgeobuf_coordinate_epoch.fgb' - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource(filename) - ds.CreateLayer('foo', srs=srs) + filename = "/vsimem/test_ogr_flatgeobuf_coordinate_epoch.fgb" + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource(filename) + ds.CreateLayer("foo", srs=srs) ds = None ds = gdal.OpenEx(filename) @@ -900,7 +976,7 @@ def test_ogr_flatgeobuf_coordinate_epoch_custom_wkt(): assert got_srs.GetCoordinateEpoch() == 2021.3 ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource(filename) + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource(filename) ############################################################################### @@ -908,20 +984,20 @@ def test_ogr_flatgeobuf_coordinate_epoch_custom_wkt(): def test_ogr_flatgeobuf_invalid_output_filename(): - ds = ogr.GetDriverByName('FlatGeobuf').CreateDataSource("/i_do/not_exist/my.fgb") + ds = ogr.GetDriverByName("FlatGeobuf").CreateDataSource("/i_do/not_exist/my.fgb") with gdaltest.error_handler(): - assert ds.CreateLayer('foo') is None + assert ds.CreateLayer("foo") is None ############################################################################### def test_ogr_flatgeobuf_arrow_stream_numpy(): - pytest.importorskip('osgeo.gdal_array') - numpy = pytest.importorskip('numpy') + pytest.importorskip("osgeo.gdal_array") + numpy = pytest.importorskip("numpy") - ds = ogr.GetDriverByName('FlatGeoBuf').CreateDataSource('/vsimem/test.fgb') - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = ogr.GetDriverByName("FlatGeoBuf").CreateDataSource("/vsimem/test.fgb") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) assert lyr.TestCapability(ogr.OLCFastGetArrowStream) == 1 field = ogr.FieldDefn("str", ogr.OFTString) @@ -963,56 +1039,66 @@ def test_ogr_flatgeobuf_arrow_stream_numpy(): f.SetField("float64", 1.250123) f.SetField("str", "abc") f.SetField("datetime", "2022-05-31T12:34:56.789Z") - f.SetFieldBinaryFromHexString("binary", 'DEAD') - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1 2)')) + f.SetFieldBinaryFromHexString("binary", "DEAD") + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(1 2)")) lyr.CreateFeature(f) f2 = ogr.Feature(lyr.GetLayerDefn()) f2.SetField("bool", 0) f2.SetField("int16", -123) - f2.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(-1 2)')) + f2.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(-1 2)")) lyr.CreateFeature(f2) ds = None - ds = ogr.Open('/vsimem/test.fgb') + ds = ogr.Open("/vsimem/test.fgb") lyr = ds.GetLayer(0) try: import pyarrow + pyarrow.__version__ has_pyarrow = True except ImportError: has_pyarrow = False if has_pyarrow: stream = lyr.GetArrowStreamAsPyArrow() - batches = [ batch for batch in stream ] - #print(batches) + batches = [batch for batch in stream] + # print(batches) - stream = lyr.GetArrowStreamAsNumPy(options = ['USE_MASKED_ARRAYS=NO']) - batches = [ batch for batch in stream ] + stream = lyr.GetArrowStreamAsNumPy(options=["USE_MASKED_ARRAYS=NO"]) + batches = [batch for batch in stream] assert len(batches) == 1 batch = batches[0] assert batch.keys() == { - 'OGC_FID', 'str', 'bool', 'int16', 'int32', 'int64', - 'float32', 'float64', 'datetime', 'binary', 'wkb_geometry' } + "OGC_FID", + "str", + "bool", + "int16", + "int32", + "int64", + "float32", + "float64", + "datetime", + "binary", + "wkb_geometry", + } assert batch["OGC_FID"][0] == 0 - for fieldname in ('bool', 'int16', 'int32', 'int64', - 'float32', 'float64'): + for fieldname in ("bool", "int16", "int32", "int64", "float32", "float64"): assert batch[fieldname][0] == f.GetField(fieldname) - assert batch['str'][0] == f.GetField('str').encode('utf-8') - assert batch['datetime'][0] == numpy.datetime64('2022-05-31T12:34:56.789') - assert bytes(batch['binary'][0]) == b'\xDE\xAD' + assert batch["str"][0] == f.GetField("str").encode("utf-8") + assert batch["datetime"][0] == numpy.datetime64("2022-05-31T12:34:56.789") + assert bytes(batch["binary"][0]) == b"\xDE\xAD" assert len(bytes(batch["wkb_geometry"][0])) == 21 assert batch["OGC_FID"][1] == 1 - assert batch['bool'][1] == False + assert batch["bool"][1] == False # Test attribute filter lyr.SetAttributeFilter("int16 = -123") stream = lyr.GetArrowStreamAsNumPy() - batches = [ batch for batch in stream ] + batches = [batch for batch in stream] lyr.SetAttributeFilter(None) assert len(batches) == 1 assert len(batches[0]["OGC_FID"]) == 1 @@ -1021,7 +1107,7 @@ def test_ogr_flatgeobuf_arrow_stream_numpy(): # Test spatial filter lyr.SetSpatialFilterRect(0, 0, 10, 10) stream = lyr.GetArrowStreamAsNumPy() - batches = [ batch for batch in stream ] + batches = [batch for batch in stream] lyr.SetSpatialFilter(None) assert len(batches) == 1 assert len(batches[0]["OGC_FID"]) == 1 @@ -1029,14 +1115,21 @@ def test_ogr_flatgeobuf_arrow_stream_numpy(): # Test ignored fields assert lyr.SetIgnoredFields(["OGR_GEOMETRY", "int16"]) == ogr.OGRERR_NONE - stream = lyr.GetArrowStreamAsNumPy(options = ['INCLUDE_FID=NO']) - batches = [ batch for batch in stream ] + stream = lyr.GetArrowStreamAsNumPy(options=["INCLUDE_FID=NO"]) + batches = [batch for batch in stream] lyr.SetIgnoredFields([]) batch = batches[0] assert batch.keys() == { - 'str', 'bool', 'int32', 'int64', - 'float32', 'float64', 'datetime', 'binary' } + "str", + "bool", + "int32", + "int64", + "float32", + "float64", + "datetime", + "binary", + } ds = None - ogr.GetDriverByName('FlatGeobuf').DeleteDataSource('/vsimem/test.fgb') + ogr.GetDriverByName("FlatGeobuf").DeleteDataSource("/vsimem/test.fgb") diff --git a/autotest/ogr/ogr_geoconcept.py b/autotest/ogr/ogr_geoconcept.py index 968ed7b7743c..963763f9a3d9 100755 --- a/autotest/ogr/ogr_geoconcept.py +++ b/autotest/ogr/ogr_geoconcept.py @@ -31,66 +31,76 @@ import os - import ogrtest -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import ogr, osr ############################################################################### -@pytest.fixture(autouse=True, scope='module') + +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): yield try: - os.remove('tmp/tmp.gxt') + os.remove("tmp/tmp.gxt") except OSError: pass + ############################################################################### # Simple read test of known file. def test_ogr_gxt_1(): - ds = ogr.Open('data/geoconcept/expected_000_GRD.gxt') + ds = ogr.Open("data/geoconcept/expected_000_GRD.gxt") assert ds is not None - assert ds.GetLayerCount() == 1, 'Got wrong layer count.' + assert ds.GetLayerCount() == 1, "Got wrong layer count." lyr = 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 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) + 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]]') + 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." - assert lyr.GetSpatialRef().IsSame(srs), 'SRS is not the one expected.' ############################################################################### # Similar test than previous one with TAB separator. @@ -98,33 +108,41 @@ def test_ogr_gxt_1(): def test_ogr_gxt_2(): - ds = ogr.Open('data/geoconcept/expected_000_GRD_TAB.txt') + ds = ogr.Open("data/geoconcept/expected_000_GRD_TAB.txt") assert ds is not None - assert ds.GetLayerCount() == 1, 'Got wrong layer count.' + assert ds.GetLayerCount() == 1, "Got wrong layer count." lyr = ds.GetLayer(0) - assert lyr.GetName() == '000_GRD.000_GRD', 'got unexpected layer name.' + assert lyr.GetName() == "000_GRD.000_GRD", "got unexpected layer name." - assert lyr.GetFeatureCount() == 5, 'got wrong feature count.' + 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'] + 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) + 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) + 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 @@ -134,22 +152,22 @@ def test_ogr_gxt_3(): ds = None - src_ds = ogr.Open('data/geoconcept/points.gxt') + src_ds = ogr.Open("data/geoconcept/points.gxt") try: - os.remove('tmp/tmp.gxt') + os.remove("tmp/tmp.gxt") except OSError: pass # Duplicate all the points from the source GXT - src_lyr = src_ds.GetLayerByName('points.points') + src_lyr = src_ds.GetLayerByName("points.points") - ds = ogr.GetDriverByName('Geoconcept').CreateDataSource('tmp/tmp.gxt') + ds = ogr.GetDriverByName("Geoconcept").CreateDataSource("tmp/tmp.gxt") srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('WGS84') + srs.SetWellKnownGeogCS("WGS84") - gxt_lyr = ds.CreateLayer('points', srs, geom_type=ogr.wkbPoint) + gxt_lyr = ds.CreateLayer("points", srs, geom_type=ogr.wkbPoint) src_lyr.ResetReading() @@ -162,48 +180,53 @@ def test_ogr_gxt_3(): feat = src_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert gxt_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert gxt_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = src_lyr.GetNextFeature() ds = None # Read the newly written GXT file and check its features and geometries - ds = ogr.Open('tmp/tmp.gxt') - gxt_lyr = ds.GetLayerByName('points.points') + ds = ogr.Open("tmp/tmp.gxt") + gxt_lyr = 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.' + 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'] + expect = ["PID1", "PID2"] - tr = ogrtest.check_features_against_list(gxt_lyr, 'Primary_ID', expect) + tr = ogrtest.check_features_against_list(gxt_lyr, "Primary_ID", expect) assert tr gxt_lyr.ResetReading() - expect = ['SID1', 'SID2'] + expect = ["SID1", "SID2"] - tr = ogrtest.check_features_against_list(gxt_lyr, 'Secondary_ID', expect) + tr = ogrtest.check_features_against_list(gxt_lyr, "Secondary_ID", expect) assert tr gxt_lyr.ResetReading() - expect = ['TID1', None] + expect = ["TID1", None] - tr = ogrtest.check_features_against_list(gxt_lyr, 'Third_ID', expect) + 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) + 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) + assert ( + ogrtest.check_feature_geometry(feat, "POINT(2 3)", max_error=0.000000001) == 0 + ) + ############################################################################### # @@ -211,16 +234,20 @@ def test_ogr_gxt_3(): def test_ogr_gxt_multipolygon_singlepart_nohole(): - ds = ogr.Open('data/geoconcept/geoconcept_multipolygon_singlepart_nohole.txt') + ds = ogr.Open("data/geoconcept/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: + 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() - + ############################################################################### # @@ -230,16 +257,22 @@ def test_ogr_gxt_multipolygon_singlepart_hole(): if not ogrtest.have_geos(): pytest.skip() - ds = ogr.Open('data/geoconcept/geoconcept_multipolygon_singlepart_hole.txt') + ds = ogr.Open("data/geoconcept/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: + 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() - + ############################################################################### # @@ -249,16 +282,24 @@ def test_ogr_gxt_multipolygon_twoparts_second_with_hole(): if not ogrtest.have_geos(): pytest.skip() - ds = ogr.Open('data/geoconcept/geoconcept_multipolygon_twoparts_second_with_hole.txt') + ds = ogr.Open( + "data/geoconcept/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: + 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() - + ############################################################################### # @@ -268,11 +309,15 @@ def test_ogr_gxt_line(): if not ogrtest.have_geos(): pytest.skip() - ds = ogr.Open('data/geoconcept/line.gxt') + ds = ogr.Open("data/geoconcept/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: + if ( + ogrtest.check_feature_geometry( + feat, "LINESTRING (440720 3751320,441920 3750120)", max_error=0.000000001 + ) + != 0 + ): feat.DumpReadable() pytest.fail() diff --git a/autotest/ogr/ogr_geojson.py b/autotest/ogr/ogr_geojson.py index 962cf21400e1..5bb678cdbdde 100755 --- a/autotest/ogr/ogr_geojson.py +++ b/autotest/ogr/ogr_geojson.py @@ -33,15 +33,13 @@ import os import struct -from osgeo import osr -from osgeo import ogr -from osgeo import gdal - import gdaltest import ogrtest import pytest -pytestmark = pytest.mark.require_driver('GeoJSON') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("GeoJSON") ############################################################################### # Test utilities @@ -50,25 +48,25 @@ def validate_layer(lyr, name, features, typ, fields, box): if name is not None and name != lyr.GetName(): - print('Wrong layer name') + print("Wrong layer name") return False if features != lyr.GetFeatureCount(): - print('Wrong number of features') + print("Wrong number of features") return False lyrDefn = lyr.GetLayerDefn() if lyrDefn is None: - print('Layer definition is none') + print("Layer definition is none") return False if typ != lyrDefn.GetGeomType(): - print('Wrong geometry type') + print("Wrong geometry type") print(lyrDefn.GetGeomType()) return False if fields != lyrDefn.GetFieldCount(): - print('Wrong number of fields') + print("Wrong number of fields") return False extent = lyr.GetExtent() @@ -79,7 +77,7 @@ def validate_layer(lyr, name, features, typ, fields, box): maxy = abs(extent[3] - box[3]) if max(minx, maxx, miny, maxy) > 0.0001: - print('Wrong spatial extent of layer') + print("Wrong spatial extent of layer") print(extent) return False @@ -89,30 +87,30 @@ def validate_layer(lyr, name, features, typ, fields, box): def verify_geojson_copy(fname, fids, names): if gdaltest.gjpoint_feat is None: - print('Missing features collection') + print("Missing features collection") return False ds = ogr.Open(fname) if ds is None: - print('Can not open \'' + fname + '\'') + print("Can not open '" + fname + "'") return False lyr = ds.GetLayer(0) if lyr is None: - print('Missing layer') + print("Missing layer") return False ###################################################### # Test attributes - ret = ogrtest.check_features_against_list(lyr, 'FID', fids) + ret = ogrtest.check_features_against_list(lyr, "FID", fids) if ret != 1: - print('Wrong values in \'FID\' field') + print("Wrong values in 'FID' field") return False lyr.ResetReading() - ret = ogrtest.check_features_against_list(lyr, 'NAME', names) + ret = ogrtest.check_features_against_list(lyr, "NAME", names) if ret != 1: - print('Wrong values in \'NAME\' field') + print("Wrong values in 'NAME' field") return False ###################################################### @@ -124,12 +122,16 @@ def verify_geojson_copy(fname, fids, names): feat = lyr.GetNextFeature() if feat is None: - print('Failed trying to read feature') + 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') + if ( + ogrtest.check_feature_geometry( + feat, orig_feat.GetGeometryRef(), max_error=0.001 + ) + != 0 + ): + print("Geometry test failed") gdaltest.gjpoint_feat = None return False @@ -143,18 +145,18 @@ def verify_geojson_copy(fname, fids, names): def copy_shape_to_geojson(gjname, compress=None): 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/': + 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, None else: - dst_name = os.path.join('tmp', gjname + '.geojson') + dst_name = os.path.join("tmp", gjname + ".geojson") - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(dst_name) + ds = ogr.GetDriverByName("GeoJSON").CreateDataSource(dst_name) if ds is None: return False, dst_name @@ -166,16 +168,14 @@ def copy_shape_to_geojson(gjname, compress=None): ###################################################### # Setup schema (all test shapefiles use common schema) - ogrtest.quick_create_layer_def(lyr, - [('FID', ogr.OFTReal), - ('NAME', ogr.OFTString)]) + 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', 'shp', gjname + '.shp') + src_name = os.path.join("data", "shp", gjname + ".shp") shp_ds = ogr.Open(src_name) shp_lyr = shp_ds.GetLayer(0) @@ -198,153 +198,163 @@ def copy_shape_to_geojson(gjname, compress=None): return True, dst_name + ############################################################################### # Test file-based DS with standalone "Point" feature object. def test_ogr_geojson_2(): - ds = ogr.Open('data/geojson/point.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/point.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('point') - assert lyr is not None, 'Missing layer called point' + 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) + 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(): - ds = ogr.Open('data/geojson/linestring.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/linestring.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('linestring') - assert lyr is not None, 'Missing layer called linestring' + 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) + 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(): - ds = ogr.Open('data/geojson/polygon.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/polygon.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('polygon') - assert lyr is not None, 'Missing layer called polygon' + 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) + 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(): - ds = ogr.Open('data/geojson/geometrycollection.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/geometrycollection.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('geometrycollection') - assert lyr is not None, 'Missing layer called geometrycollection' + 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) + 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(): - ds = ogr.Open('data/geojson/multipoint.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/multipoint.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('multipoint') - assert lyr is not None, 'Missing layer called multipoint' + 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) + 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(): - ds = ogr.Open('data/geojson/multilinestring.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/multilinestring.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('multilinestring') - assert lyr is not None, 'Missing layer called multilinestring' + 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) + 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(): - ds = ogr.Open('data/geojson/multipolygon.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/multipolygon.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('multipolygon') - assert lyr is not None, 'Missing layer called multipolygon' + 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) + rc = validate_layer(lyr, "multipolygon", 1, ogr.wkbMultiPolygon, 0, extent) assert rc lyr = None + ############################################################################## # Test translation of data/gjpoint.shp to GeoJSON file @@ -352,26 +362,27 @@ def test_ogr_geojson_8(): def test_ogr_geojson_9(): 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']] + ["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 test in tests: rc, dstname = copy_shape_to_geojson(test[0]) try: - assert rc, ('Failed making copy of ' + test[0] + '.shp') + assert rc, "Failed making copy of " + test[0] + ".shp" rc = verify_geojson_copy(dstname, test[1], test[2]) - assert rc, ('Verification of copy of ' + test[0] + '.shp failed') + assert rc, "Verification of copy of " + test[0] + ".shp failed" finally: if dstname: gdal.Unlink(dstname) + ############################################################################## # Test translation of data/gjpoint.shp to GZip compressed GeoJSON file @@ -379,66 +390,68 @@ def test_ogr_geojson_9(): def test_ogr_geojson_10(): 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']] + ["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 test in tests: - rc, dstname = copy_shape_to_geojson(test[0], '/vsigzip/') + rc, dstname = copy_shape_to_geojson(test[0], "/vsigzip/") try: - assert rc, ('Failed making copy of ' + test[0] + '.shp') + assert rc, "Failed making copy of " + test[0] + ".shp" rc = verify_geojson_copy(dstname, test[1], test[2]) - assert rc, ('Verification of copy of ' + test[0] + '.shp failed') + assert rc, "Verification of copy of " + test[0] + ".shp failed" finally: if dstname: - dstname = dstname[len("/vsigzip/"):] + dstname = dstname[len("/vsigzip/") :] gdal.Unlink(dstname) gdal.Unlink(dstname + ".properties") + ############################################################################### def test_ogr_geojson_11(): - ds = ogr.Open('data/geojson/srs_name.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/srs_name.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('srs_name') - assert lyr is not None, 'Missing layer called srs_name' + 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) + 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' + 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' + 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 os.name == 'nt': + if os.name == "nt": pytest.skip() import test_cli_utilities @@ -446,19 +459,24 @@ def test_ogr_geojson_12(): 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 + 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(): - test = ['gjpoint', [1], ['Point 1']] + test = ["gjpoint", [1], ["Point 1"]] + + rc, _ = copy_shape_to_geojson(test[0], "/vsistdout/") + assert rc, "Failed making copy of " + test[0] + ".shp" - rc, _ = copy_shape_to_geojson(test[0], '/vsistdout/') - assert rc, ('Failed making copy of ' + test[0] + '.shp') ############################################################################### # Test reading & writing various degenerated geometries @@ -467,12 +485,14 @@ def test_ogr_geojson_13(): def test_ogr_geojson_14(): with gdaltest.error_handler(): - ds = ogr.Open('data/geojson/ogr_geojson_14.geojson') + ds = ogr.Open("data/geojson/ogr_geojson_14.geojson") lyr = ds.GetLayer(0) try: - out_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('tmp/out_ogr_geojson_14.geojson') - out_lyr = out_ds.CreateLayer('lyr') + out_ds = ogr.GetDriverByName("GeoJSON").CreateDataSource( + "tmp/out_ogr_geojson_14.geojson" + ) + out_lyr = out_ds.CreateLayer("lyr") with gdaltest.error_handler(): for feat in lyr: @@ -486,10 +506,11 @@ def test_ogr_geojson_14(): out_ds = None finally: try: - os.remove('tmp/out_ogr_geojson_14.geojson') + os.remove("tmp/out_ogr_geojson_14.geojson") except OSError: pass + ############################################################################### # Test Feature.ExportToJson (#3870) @@ -523,10 +544,16 @@ def test_ogr_geojson_15(): 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} + 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 files with no extension (#4314) @@ -535,27 +562,27 @@ def test_ogr_geojson_20(): from glob import glob - geojson_files = glob('data/*.json') - geojson_files.extend(glob('data/*.geojson')) + 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() + data = open(gj, "rb").read() - f = gdal.VSIFOpenL('/vsimem/testgj', 'wb') + 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.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') + print(data.decode("LATIN1")) + pytest.fail("Failed to open datasource") ds = None - gdal.Unlink('/vsimem/testgj') + gdal.Unlink("/vsimem/testgj") ############################################################################### @@ -564,34 +591,40 @@ def test_ogr_geojson_20(): def test_ogr_geojson_21(): - ds = ogr.Open("""{"type": "FeatureCollection", "features":[ + 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' + "properties":{"intvalue" : 2, "floatvalue" : 3.2, "strvalue" : "foo", "properties": { "foo": "bar"}}}}]}""" + ) + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('OGRGeoJSON') + 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: + 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(): - ds = ogr.Open("""{"type": "FeatureCollection", "features":[ + ds = ogr.Open( + """{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": {"_id":"aid", "_rev":"arev", "type":"Feature", @@ -599,48 +632,54 @@ def test_ogr_geojson_22(): {"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' + "properties":{"intvalue" : 3.5, "str2value" : "bar"}}}]}""" + ) + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('OGRGeoJSON') + 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: + 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: + 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(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_23.json') + ds = ogr.GetDriverByName("GeoJSON").CreateDataSource("/vsimem/ogr_geojson_23.json") sr = osr.SpatialReference() sr.ImportFromEPSG(4322) - lyr = ds.CreateLayer('foo', srs=sr, options=['WRITE_BBOX=YES']) + lyr = ds.CreateLayer("foo", srs=sr, options=["WRITE_BBOX=YES"]) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 10)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 10)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 20)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 20)")) lyr.CreateFeature(feat) assert lyr.GetExtent() == (1.0, 2.0, 10.0, 20.0) assert lyr.GetExtent(geom_field=0) == (1.0, 2.0, 10.0, 20.0) @@ -648,24 +687,26 @@ def test_ogr_geojson_23(): lyr = None ds = None - ds = ogr.Open('/vsimem/ogr_geojson_23.json') + 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' + 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') + 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') + 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, 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" - assert data.find('"bbox": [ 1.0, 10.0, 1.0, 10.0 ]') != -1, \ - 'did not find first feature bbox' ############################################################################### # Test alternate form of geojson @@ -692,29 +733,33 @@ def test_ogr_geojson_24(): 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') + 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' + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('layerFoo') - assert lyr is not None, 'cannot find layer' + 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: + 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' + 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: + 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() @@ -727,17 +772,19 @@ def test_ogr_geojson_24(): def test_ogr_geojson_26(): - ds = ogr.Open("""{"type": "FeatureCollection", "features":[ + 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' + ]}""" + ) + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('OGRGeoJSON') + lyr = ds.GetLayerByName("OGRGeoJSON") assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None feature = lyr.GetNextFeature() @@ -765,10 +812,10 @@ def test_ogr_geojson_26(): lyr = None ds = None - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_26.json') - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) - lyr.CreateField(ogr.FieldDefn('int64list', ogr.OFTInteger64List)) + ds = ogr.GetDriverByName("GeoJSON").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) @@ -777,13 +824,17 @@ def test_ogr_geojson_26(): f = None ds = None - fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_26.json', 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + 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') + gdal.Unlink("/vsimem/ogr_geojson_26.json") + + assert ( + '{ "type": "Feature", "id": 1234567890123, "properties": { "int64": 1234567890123, "int64list": [ 1234567890123 ] }, "geometry": null }' + in data + ) - assert '{ "type": "Feature", "id": 1234567890123, "properties": { "int64": 1234567890123, "int64list": [ 1234567890123 ] }, "geometry": null }' in data ############################################################################### # Test workaround for 64bit values (returned as strings) @@ -791,21 +842,23 @@ def test_ogr_geojson_26(): def test_ogr_geojson_27(): - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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":[ + 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' + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('OGRGeoJSON') + lyr = ds.GetLayerByName("OGRGeoJSON") feature = lyr.GetNextFeature() if feature.GetField("intvalue") != 1: @@ -820,22 +873,23 @@ def test_ogr_geojson_27(): lyr = None ds = None + ############################################################################### # Test handling of huge coordinates (#5377) def test_ogr_geojson_35(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_35.json') - lyr = ds.CreateLayer('foo') + ds = ogr.GetDriverByName("GeoJSON").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) + geom.AddPoint_2D(-1.79769313486231571e308, -1.79769313486231571e308) feat.SetGeometry(geom) lyr.CreateFeature(feat) - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(2) @@ -903,15 +957,21 @@ def test_ogr_geojson_35(): ds = None - fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_35.json', 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + 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') + gdal.Unlink("/vsimem/ogr_geojson_35.json") - assert '-1.79' in data and 'e+308' in data + assert "-1.79" in data and "e+308" in data for ident in range(2, 8): - assert data.find('{ "type": "Feature", "id": %d, "properties": { }, "geometry": null }' % ident) != -1 + assert ( + data.find( + '{ "type": "Feature", "id": %d, "properties": { }, "geometry": null }' + % ident + ) + != -1 + ) ############################################################################### @@ -920,10 +980,11 @@ def test_ogr_geojson_35(): def test_ogr_geojson_36(): - ds = ogr.Open('data/geojson/point_with_utf8bom.json') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/point_with_utf8bom.json") + assert ds is not None, "Failed to open datasource" ds = None + ######################################################################### # Test boolean type support @@ -931,26 +992,45 @@ def test_ogr_geojson_36(): def test_ogr_geojson_37(): # Test read support - ds = ogr.Open("""{"type": "FeatureCollection","features": [ + 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')).GetType() == ogr.OFTString and \ - feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('notbool_list')).GetSubType() == ogr.OFSTJSON + 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")).GetType() + == ogr.OFTString + and feat_defn.GetFieldDefn(feat_defn.GetFieldIndex("notbool_list")).GetSubType() + == ogr.OFSTJSON + ) f = lyr.GetNextFeature() - if f.GetField('bool') != 0 or f.GetField('bool_list') != [0, 1]: + 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') + 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()) @@ -958,13 +1038,17 @@ def test_ogr_geojson_37(): 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_37.json") + + assert ( + '"bool": false, "not_bool": 0, "bool_list": [ false, true ], "notbool_list": [ false, 3 ]' + in data + ) - assert '"bool": false, "not_bool": 0, "bool_list": [ false, true ], "notbool_list": [ false, 3 ]' in data ############################################################################### # Test datetime/date/time type support @@ -973,200 +1057,287 @@ def test_ogr_geojson_37(): def test_ogr_geojson_38(): # Test read support - ds = gdal.OpenEx("""{"type": "FeatureCollection", "features": [ + 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 }, { "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 + 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': + 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': + 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() - tmpfilename = '/vsimem/out.json' - gdal.VectorTranslate(tmpfilename, ds, options = '-lco NATIVE_DATA=dummy') # dummy NATIVE_DATA so that input values are not copied directly + tmpfilename = "/vsimem/out.json" + gdal.VectorTranslate( + tmpfilename, ds, options="-lco NATIVE_DATA=dummy" + ) # dummy NATIVE_DATA so that input values are not copied directly - fp = gdal.VSIFOpenL(tmpfilename, 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + fp = gdal.VSIFOpenL(tmpfilename, "rb") + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) gdal.Unlink(tmpfilename) - assert '"dt": "2014-11-20T12:34:56+01:00", "dt2": "2014-11-20T00:00:00", "date": "2014-11-20", "time": "12:34:56"' in data, data + assert ( + '"dt": "2014-11-20T12:34:56+01:00", "dt2": "2014-11-20T00:00:00", "date": "2014-11-20", "time": "12:34:56"' + in data + ), data - ds = gdal.OpenEx("""{"type": "FeatureCollection", "features": [ + 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']) +] }""", + 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(): - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + 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': + 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": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != 6: + if feat.GetField("id") != 6: feat.DumpReadable() pytest.fail() # Same with 2 features - ds = ogr.Open("""{"type": "FeatureCollection", "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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != 6: + 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": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTString + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != 'baz': + if feat.GetField("id") != "baz": feat.DumpReadable() pytest.fail() # id and properties.ID (#6538) - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + 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: + 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": [ + 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' +] }""" + ) + 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': + 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': + 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': + if feat.GetFID() != 3 or feat.GetField("foo") != "baw": feat.DumpReadable() pytest.fail() # negative id - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != -1: + if feat.GetField("id") != -1: feat.DumpReadable() pytest.fail() # negative id 64bit - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger64 + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != -1234567890123: + if feat.GetField("id") != -1234567890123: feat.DumpReadable() pytest.fail() # negative id - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger64 + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != -2: + if feat.GetField("id") != -2: feat.DumpReadable() pytest.fail() # positive and then negative id - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != 1: + if feat.GetField("id") != 1: feat.DumpReadable() pytest.fail() # mix of int and string id - ds = ogr.Open("""{"type": "FeatureCollection", "features": [ + 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 + assert ( + feat_defn.GetFieldDefn(0).GetName() == "id" + and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTString + ) feat = lyr.GetNextFeature() - if feat.GetField('id') != '-2': + if feat.GetField("id") != "-2": feat.DumpReadable() pytest.fail() @@ -1177,7 +1348,8 @@ def test_ogr_geojson_39(): def test_ogr_geojson_40(): - ds = gdal.OpenEx("""{ + ds = gdal.OpenEx( + """{ "type": "FeatureCollection", "features" : [ @@ -1210,12 +1382,18 @@ def test_ogr_geojson_40(): } } ] -}""", gdal.OF_VECTOR, open_options=['FLATTEN_NESTED_ATTRIBUTES=YES', 'NESTED_ATTRIBUTE_SEPARATOR=.']) +}""", + 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: + 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() @@ -1228,42 +1406,50 @@ def test_ogr_geojson_41(): # Check that by default we return a WGS 84 SRS g = ogr.CreateGeometryFromJson("{ 'type': 'Point', 'coordinates' : [ 2, 49] }") - assert g.ExportToWkt() == 'POINT (2 49)' + assert g.ExportToWkt() == "POINT (2 49)" srs = g.GetSpatialReference() g = None - assert srs.ExportToWkt().find('WGS 84') >= 0 + 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" } } }') + 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 + 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 }') + g = ogr.CreateGeometryFromJson( + '{ "type": "Point", "coordinates" : [ 2, 49], "crs": null }' + ) srs = g.GetSpatialReference() assert not srs + ############################################################################### # Test Feature without geometry def test_ogr_geojson_43(): - ds = ogr.Open("""{"type": "FeatureCollection", "features":[ -{"type": "Feature", "properties": {"foo": "bar"}}]}""") - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open( + """{"type": "FeatureCollection", "features":[ +{"type": "Feature", "properties": {"foo": "bar"}}]}""" + ) + assert ds is not None, "Failed to open datasource" - lyr = ds.GetLayerByName('OGRGeoJSON') + lyr = ds.GetLayerByName("OGRGeoJSON") feature = lyr.GetNextFeature() - if feature.GetFieldAsString("foo") != 'bar': + if feature.GetFieldAsString("foo") != "bar": feature.DumpReadable() pytest.fail() lyr = None ds = None + ############################################################################### # Test null Feature (#6166) @@ -1285,34 +1471,45 @@ def test_ogr_geojson_45(): "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']) + 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']) + 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' + 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 }'] + '{ "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}'] + 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' + 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']) + 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] }, @@ -1322,31 +1519,44 @@ def test_ogr_geojson_45(): { "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.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') + 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) + 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("""{ + src_ds = gdal.OpenEx( + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", @@ -1356,11 +1566,13 @@ def test_ogr_geojson_45(): } ] } -""", open_options=['NATIVE_DATA=YES']) - gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON') +""", + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "features": [ @@ -1371,7 +1583,8 @@ def test_ogr_geojson_45(): assert json.loads(got) == json.loads(expected) # Test native support with numeric id - src_ds = gdal.OpenEx("""{ + src_ds = gdal.OpenEx( + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", @@ -1381,11 +1594,13 @@ def test_ogr_geojson_45(): } ] } -""", open_options=['NATIVE_DATA=YES']) - gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON') +""", + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "features": [ @@ -1395,28 +1610,30 @@ def test_ogr_geojson_45(): """ 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(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_46.json') - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('myprop')) + 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" }' + 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_46.json") assert '{ "myprop": { "a": "b" } }' in data + ############################################################################### # Test update support @@ -1428,41 +1645,46 @@ def test_ogr_geojson_47(): 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 } ]}""") + 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) + 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') + fp = gdal.VSIFOpenL("/vsimem/ogr_geojson_47.json", "rb") if fp is not None: - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + 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) + 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) + 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)')) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 3)")) lyr.CreateFeature(f) f = lyr.GetNextFeature() if f.GetFID() != 0: @@ -1471,104 +1693,120 @@ def test_ogr_geojson_47(): ds = None # Test append support - ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) + 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)')) + 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') + 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') + fp = gdal.VSIFOpenL("/vsimem/ogr_geojson_47.json", "rb") if fp is not None: - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + 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) + 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') + 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) + 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') + 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) + 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') + 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) + 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') + 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') + fp = gdal.VSIFOpenL("/vsimem/ogr_geojson_47.json", "rb") if fp is not None: - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) else: data = None - assert 'something' in data + assert "something" in data - with gdaltest.config_option('OGR_GEOJSON_REWRITE_IN_PLACE', 'YES'): + 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) + 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') + 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') + fp = gdal.VSIFOpenL("/vsimem/ogr_geojson_47.json", "rb") if fp is not None: - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) else: data = None - assert 'bbox' in data + assert "bbox" in data + + gdal.Unlink("/vsimem/ogr_geojson_47.json") - gdal.Unlink('/vsimem/ogr_geojson_47.json') ############################################################################### # Test update support with file that has a single feature not in a FeatureCollection @@ -1576,33 +1814,38 @@ def test_ogr_geojson_47(): def test_ogr_geojson_48(): - 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]} }""") + 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) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (3 50)")) lyr.SetFeature(f) ds = None - fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_48.json', 'rb') + fp = gdal.VSIFOpenL("/vsimem/ogr_geojson_48.json", "rb") if fp is not None: - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) else: data = None - gdal.Unlink('/vsimem/ogr_geojson_48.json') + 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) + 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 @@ -1610,20 +1853,25 @@ def test_ogr_geojson_48(): def test_ogr_geojson_49(): - gdal.FileFromMemBuffer('/vsimem/ogr_geojson_49.json', - """{ "type": "Feature", "properties": { "foo": ["bar"] }, "geometry": null }""") + 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']) + 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" ]': + if f["foo"] != '[ "bar" ]': f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('/vsimem/ogr_geojson_49.json') + gdal.Unlink("/vsimem/ogr_geojson_49.json") + ############################################################################### # Test that we serialize floating point values with enough significant figures @@ -1631,65 +1879,68 @@ def test_ogr_geojson_49(): def test_ogr_geojson_50(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_50.json') - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('val', ogr.OFTReal)) + 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 + f["val"] = 1.23456789012456 lyr.CreateFeature(f) # To test smart rounding f = ogr.Feature(lyr.GetLayerDefn()) - f['val'] = 5268.813 + 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_50.json") - assert '1.23456789012456' in data or '5268.813 ' in data + 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)) + 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)')) + 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_50.json") - assert '1.23456789012456' in data or '-5' in data + 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)) + 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)')) + 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_50.json") + + assert "0.00001234" in data and "1.23456789012456" in data - assert '0.00001234' in data and '1.23456789012456' in data ############################################################################### # Test writing empty geometries @@ -1697,59 +1948,77 @@ def test_ogr_geojson_50(): def test_ogr_geojson_51(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_51.json') - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) + 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')) + 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')) + 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')) + 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')) + 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')) + 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')) + 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')) + 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') + 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') + 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": 2 }, "geometry": { "type": "LineString", "coordinates": [ ] } }' + in data + ) + + assert ( + '{ "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ ] } }' in data + ) - assert '{ "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ ] } }' in data + assert ( + '{ "id": 4 }, "geometry": { "type": "MultiPoint", "coordinates": [ ] } }' + in data + ) - assert '{ "id": 4 }, "geometry": { "type": "MultiPoint", "coordinates": [ ] } }' in data + assert ( + '{ "id": 5 }, "geometry": { "type": "MultiLineString", "coordinates": [ ] } }' + in data + ) - assert '{ "id": 5 }, "geometry": { "type": "MultiLineString", "coordinates": [ ] } }' in data + assert ( + '{ "id": 6 }, "geometry": { "type": "MultiPolygon", "coordinates": [ ] } }' + in data + ) - assert '{ "id": 6 }, "geometry": { "type": "MultiPolygon", "coordinates": [ ] } }' in data + assert ( + '{ "id": 7 }, "geometry": { "type": "GeometryCollection", "geometries": [ ] } }' + in data + ) - assert '{ "id": 7 }, "geometry": { "type": "GeometryCollection", "geometries": [ ] } }' in data ############################################################################### # Test NULL type detection @@ -1757,52 +2026,55 @@ def test_ogr_geojson_51(): def test_ogr_geojson_52(): - ds = ogr.Open('data/geojson/nullvalues.geojson') - assert ds is not None, 'Failed to open datasource' + ds = ogr.Open("data/geojson/nullvalues.geojson") + assert ds is not None, "Failed to open datasource" - assert ds.GetLayerCount() == 1, 'Wrong number of layers' + assert ds.GetLayerCount() == 1, "Wrong number of layers" - lyr = ds.GetLayerByName('nullvalues') - assert lyr is not None, 'Missing layer called nullvalues' + lyr = ds.GetLayerByName("nullvalues") + assert lyr is not None, "Missing layer called nullvalues" fld = lyr.GetLayerDefn().GetFieldDefn(0) - assert fld.GetNameRef() == 'int' + assert fld.GetNameRef() == "int" assert fld.GetType() == ogr.OFTInteger fld = lyr.GetLayerDefn().GetFieldDefn(1) - assert fld.GetNameRef() == 'string' + assert fld.GetNameRef() == "string" assert fld.GetType() == ogr.OFTString fld = lyr.GetLayerDefn().GetFieldDefn(2) - assert fld.GetNameRef() == 'double' + 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(): - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_53.json') - lyr = ds.CreateLayer('test') + 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)')) + 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') + 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') + 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(): - ds = ogr.Open("""{ + ds = ogr.Open( + """{ "type": "FeatureCollection", "features": [ @@ -1810,7 +2082,8 @@ def test_ogr_geojson_54(): { "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) @@ -1828,6 +2101,7 @@ def test_ogr_geojson_54(): fld = lyr.GetLayerDefn().GetFieldDefn(5) assert fld.GetType() == ogr.OFTString + ############################################################################### # Test RFC 7946 @@ -1836,7 +2110,7 @@ def read_file(filename): f = gdal.VSIFOpenL(filename, "rb") if f is None: return None - content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') + content = gdal.VSIFReadL(1, 10000, f).decode("UTF-8") gdal.VSIFCloseL(f) return content @@ -1844,16 +2118,20 @@ def read_file(filename): def test_ogr_geojson_55(): # Basic test for standard bbox and coordinate truncation - gdal.VectorTranslate('/vsimem/out.json', """{ + 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') +}""", + options="-f GeoJSON -lco RFC7946=YES -lco WRITE_BBOX=YES -preserve_fid", + ) - got = read_file('/vsimem/out.json') - gdal.Unlink('/vsimem/out.json') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 2.1234568, 49.0000000, 3.0000000, 50.0000000 ], @@ -1866,17 +2144,22 @@ def test_ogr_geojson_55(): assert json.loads(got) == json.loads(expected) # Test polygon winding order - gdal.VectorTranslate('/vsimem/out.json', """{ + 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']) +""", + format="GeoJSON", + layerCreationOptions=["RFC7946=YES", "WRITE_BBOX=YES"], + ) - got = read_file('/vsimem/out.json') - gdal.Unlink('/vsimem/out.json') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 2.0000000, 49.0000000, 3.0000000, 50.0000000 ], @@ -1889,7 +2172,8 @@ def test_ogr_geojson_55(): assert json.loads(got) == json.loads(expected) # Test foreign member - src_ds = gdal.OpenEx("""{ + src_ds = gdal.OpenEx( + """{ "type": "FeatureCollection", "coordinates": "should not be found in output", "geometries": "should not be found in output", @@ -1918,11 +2202,18 @@ def test_ogr_geojson_55(): } ] } -""", 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') +""", + 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", @@ -1937,6 +2228,7 @@ def test_ogr_geojson_55(): """ assert json.loads(got) == json.loads(expected) + ############################################################################### # Test RFC 7946 (that require geos) @@ -1947,7 +2239,9 @@ def test_ogr_geojson_56(): pytest.skip() # Test offsetting longitudes beyond antimeridian - gdal.VectorTranslate('/vsimem/out.json', """{ + gdal.VectorTranslate( + "/vsimem/out.json", + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [182, 49] } }, @@ -1957,10 +2251,13 @@ def test_ogr_geojson_56(): { "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']) +}""", + format="GeoJSON", + layerCreationOptions=["RFC7946=YES", "WRITE_BBOX=YES"], + ) - got = read_file('/vsimem/out.json') - gdal.Unlink('/vsimem/out.json') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -178.0000000, 47.0000000, 178.0000000, 52.0000000 ], @@ -1977,7 +2274,9 @@ def test_ogr_geojson_56(): assert json.loads(got) == json.loads(expected) # Test geometries across the antimeridian - gdal.VectorTranslate('/vsimem/out.json', """{ + gdal.VectorTranslate( + "/vsimem/out.json", + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[179, 51],[-179, 48]] } }, @@ -1986,10 +2285,13 @@ def test_ogr_geojson_56(): { "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']) +}""", + format="GeoJSON", + layerCreationOptions=["RFC7946=YES", "WRITE_BBOX=YES"], + ) - got = read_file('/vsimem/out.json') - gdal.Unlink('/vsimem/out.json') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 177.0000000, 47.0000000, -175.0000000, 52.0000000 ], @@ -2007,23 +2309,67 @@ def test_ogr_geojson_56(): j_expected = json.loads(expected) assert j_got["bbox"] == j_expected["bbox"] assert len(j_expected["features"]) == 5 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][0]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][1]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][2]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][2]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][3]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][3]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][4]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][4]["geometry"]))) == 0 - + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][0]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][1]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][2]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][2]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][3]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][3]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][4]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][4]["geometry"]) + ), + ) + == 0 + ) # Test polygon geometry that covers the whole world (#2833) - gdal.VectorTranslate('/vsimem/out.json', """{ + gdal.VectorTranslate( + "/vsimem/out.json", + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[-180,-90.0],[180,-90.0],[180,90.0],[-180,90.0],[-180,-90.0]]]} } ] -}""", format='GeoJSON', layerCreationOptions=['RFC7946=YES', 'WRITE_BBOX=YES']) +}""", + format="GeoJSON", + layerCreationOptions=["RFC7946=YES", "WRITE_BBOX=YES"], + ) - got = read_file('/vsimem/out.json') - gdal.Unlink('/vsimem/out.json') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -180.0000000, -90.0000000, 180.0000000, 90.0000000 ], @@ -2045,18 +2391,29 @@ def test_ogr_geojson_57(): pytest.skip() # Standard case: EPSG:32662: WGS 84 / Plate Carre - src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) + 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) + 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))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -17.9663057, -17.9663057, 17.9663057, 17.9663057 ], @@ -2068,21 +2425,36 @@ def test_ogr_geojson_57(): 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) + 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) + 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))')) + 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))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -180.0000000, 64.3861643, 180.0000000, 90.0000000 ], @@ -2097,23 +2469,49 @@ def test_ogr_geojson_57(): j_expected = json.loads(expected) assert j_got["bbox"] == j_expected["bbox"] assert len(j_expected["features"]) == 2 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][0]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][1]["geometry"]))) == 0 - + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][0]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][1]["geometry"]) + ), + ) + == 0 + ) # Polar case: slice of spherical cap (not intersecting antimeridian, west hemisphere) - src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) + 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) + 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))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -135.0000000, 64.3861643, -45.0000000, 90.0000000 ], @@ -2125,18 +2523,29 @@ def test_ogr_geojson_57(): 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) + 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) + 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)))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 45.0000000, 64.3861643, 135.0000000, 90.0000000 ], @@ -2148,18 +2557,29 @@ def test_ogr_geojson_57(): 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) + 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) + 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))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 135.0000000, 88.6984598, -135.0000000, 90.0000000 ], @@ -2182,23 +2602,36 @@ def test_ogr_geojson_57(): { "type": "Feature", "properties": { }, "bbox": [ 135.0, 88.6984598, -135.0, 90.0 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 135.0, 88.6984598 ], [ 180.0, 89.0796531 ], [ 180.0, 90.0 ], [ 135.0, 88.6984598 ] ] ], [ [ [ -135.0, 88.6984598 ], [ -180.0, 90.0 ], [ -180.0, 89.0796531 ], [ -135.0, 88.6984598 ] ] ] ] } } ] }""" - assert json.loads(got) == json.loads(expected) or \ - json.loads(got) == json.loads(expected_geos_overlay_ng) or \ - json.loads(got) == json.loads(expected_geos_3_9_1), got + assert ( + json.loads(got) == json.loads(expected) + or json.loads(got) == json.loads(expected_geos_overlay_ng) + or json.loads(got) == json.loads(expected_geos_3_9_1) + ), got # Polar case: EPSG:3031: WGS 84 / Antarctic Polar Stereographic - src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) + 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) + 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)))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ -180.0000000, -90.0000000, 180.0000000, -64.3861643 ], @@ -2211,27 +2644,46 @@ def test_ogr_geojson_57(): j_expected = json.loads(expected) assert j_got["bbox"] == j_expected["bbox"] assert len(j_expected["features"]) == 1 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][0]["geometry"]))) == 0 + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][0]["geometry"]) + ), + ) + == 0 + ) # Antimeridian case: EPSG:32660: WGS 84 / UTM zone 60N with polygon and line crossing - src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) + 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) + 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))')) + 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))')) + 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)')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 178.5275649, 0.0000000, -179.0681936, 37.0308258 ], @@ -2246,23 +2698,56 @@ def test_ogr_geojson_57(): j_expected = json.loads(expected) assert j_got["bbox"] == j_expected["bbox"] assert len(j_expected["features"]) == 3 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][0]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][1]["geometry"]))) == 0 - assert ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(json.dumps(j_got["features"][2]["geometry"])), ogr.CreateGeometryFromJson(json.dumps(j_expected["features"][2]["geometry"]))) == 0 + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][0]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][0]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][1]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][1]["geometry"]) + ), + ) + == 0 + ) + assert ( + ogrtest.check_feature_geometry( + ogr.CreateGeometryFromJson(json.dumps(j_got["features"][2]["geometry"])), + ogr.CreateGeometryFromJson( + json.dumps(j_expected["features"][2]["geometry"]) + ), + ) + == 0 + ) # Antimeridian case: EPSG:32660: WGS 84 / UTM zone 60N with polygon on west of antimeridian - src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) + 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) + 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))')) + 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']) + 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') + got = read_file("/vsimem/out.json") + gdal.Unlink("/vsimem/out.json") expected = """{ "type": "FeatureCollection", "bbox": [ 178.8892102, 36.1240958, 179.2483693, 37.0308258 ], @@ -2273,26 +2758,30 @@ def test_ogr_geojson_57(): """ assert json.loads(got) == json.loads(expected) + ############################################################################### # Test using the name member of FeatureCollection def test_ogr_geojson_58(): - ds = ogr.Open('{ "type": "FeatureCollection", "name": "layer_name", "features": []}') - assert ds is not None, 'Failed to open datasource' + 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' + 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 = 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 = 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') + gdal.Unlink("/vsimem/ogr_geojson_58.json") + ############################################################################### # Test using the description member of FeatureCollection @@ -2300,22 +2789,26 @@ def test_ogr_geojson_58(): def test_ogr_geojson_59(): - ds = ogr.Open('{ "type": "FeatureCollection", "description": "my_description", "features": []}') - assert ds is not None, 'Failed to open datasource' + 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' + 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 = 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 = 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') + gdal.Unlink("/vsimem/ogr_geojson_59.json") + ############################################################################### # Test null vs unset field @@ -2323,49 +2816,56 @@ def test_ogr_geojson_59(): def test_ogr_geojson_60(): - ds = gdal.OpenEx("""{ "type": "FeatureCollection", "features": [ + ds = gdal.OpenEx( + """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties" : { "foo" : "bar" } }, { "type": "Feature", "properties" : { "foo": null } }, -{ "type": "Feature", "properties" : { } } ] }""") +{ "type": "Feature", "properties" : { } } ] }""" + ) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['foo'] != 'bar': + if f["foo"] != "bar": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if not f.IsFieldNull('foo'): + if not f.IsFieldNull("foo"): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.IsFieldSet('foo'): + if f.IsFieldSet("foo"): f.DumpReadable() pytest.fail() # Test writing side - gdal.VectorTranslate('/vsimem/ogr_geojson_60.json', ds, format='GeoJSON') + 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') + 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) + 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": [""") + gdal.FileFromMemBuffer( + "/vsimem/ogr_geojson_61.json", + """{ "type": "FeatureCollection", "features": [""", + ) with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/ogr_geojson_61.json') + ds = gdal.OpenEx("/vsimem/ogr_geojson_61.json") assert ds is None - gdal.Unlink('/vsimem/ogr_geojson_61.json') + gdal.Unlink("/vsimem/ogr_geojson_61.json") # Invalid single geometry with gdaltest.error_handler(): @@ -2373,14 +2873,17 @@ def test_ogr_geojson_61(): 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') + 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') + gdal.Unlink("/vsimem/ogr_geojson_61.json") + ############################################################################### # Test crs object @@ -2389,86 +2892,142 @@ def test_ogr_geojson_61(): def test_ogr_geojson_62(): # crs type=name tests - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name" }, "features":[] }""") + 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":null }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":1 }, "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":null} }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":1} }, "features":[] }""") + gdal.OpenEx( + """{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":1} }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":"x"} }, "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":[] }""") + 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.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":[] }""") + 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.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" }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":null }, "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":1 }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code":null} }, "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":[] }""") + 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":[] }""") + gdal.OpenEx( + """{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code":"x"} }, "features":[] }""" + ) - ds = gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code": 32631} }, "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 + 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" }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":null }, "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":1 }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":{"href":null} }, "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":[] }""") + 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":[] }""") + 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" }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":null }, "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":1 }, "features":[] }""" + ) - gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":{"urn":null} }, "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":[] }""") + 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":[] }""") + 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":[] }""") + 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 + assert srs.ExportToWkt().find("32631") >= 0 + ############################################################################### # Extensive test of field type promotion @@ -2476,33 +3035,55 @@ def test_ogr_geojson_62(): def test_ogr_geojson_63(): - ds_ref = ogr.Open('data/geojson/test_type_promotion_ref.json') + ds_ref = ogr.Open("data/geojson/test_type_promotion_ref.json") lyr_ref = ds_ref.GetLayer(0) - ds = ogr.Open('data/geojson/test_type_promotion.json') + ds = ogr.Open("data/geojson/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("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 + ) - 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 @@ -2511,7 +3092,8 @@ def test_ogr_geojson_64(): def test_ogr_geojson_65(): - ds = ogr.Open("""{ + ds = ogr.Open( + """{ "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32631" } }, "features": [{ @@ -2520,12 +3102,14 @@ def test_ogr_geojson_65(): "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' + pcs = int(srs.GetAuthorityCode("PROJCS")) + assert pcs == 32631, "Spatial reference for individual geometry was not valid" + ############################################################################### # Test features with properties not being a dictionary @@ -2533,7 +3117,8 @@ def test_ogr_geojson_65(): def test_ogr_geojson_66(): - ds = ogr.Open("""{ + ds = ogr.Open( + """{ "type": "FeatureCollection", "features": [ { @@ -2546,7 +3131,8 @@ def test_ogr_geojson_66(): "geometry": null, "properties": [] } -]}""") +]}""" + ) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 0 @@ -2554,118 +3140,228 @@ def test_ogr_geojson_66(): ############################################################################### # Test reading GeoJSON files starting with {"features":[{"geometry":.... (#7198) + def test_ogr_geojson_67(): - ds = ogr.Open('data/geojson/grenada.geojson') + ds = ogr.Open("data/geojson/grenada.geojson") assert ds is not None - assert ds.GetDriver().GetName() == 'GeoJSON' + assert ds.GetDriver().GetName() == "GeoJSON" 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') + 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']) + 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']) + 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') + 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']) + 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']) + 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') + 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 - gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_GENERATE=YES'], limit=1) - got = read_file('/vsimem/out.json') - assert '"id": 0, "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' in got - - gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_GENERATE=YES', 'ID_TYPE=Integer'], limit=1) - got = read_file('/vsimem/out.json') - assert '"id": 0, "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' in got + gdal.VectorTranslate( + "/vsimem/out.json", + "data/poly.shp", + format="GeoJSON", + layerCreationOptions=["ID_GENERATE=YES"], + limit=1, + ) + got = read_file("/vsimem/out.json") + assert ( + '"id": 0, "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' + in got + ) + + gdal.VectorTranslate( + "/vsimem/out.json", + "data/poly.shp", + format="GeoJSON", + layerCreationOptions=["ID_GENERATE=YES", "ID_TYPE=Integer"], + limit=1, + ) + got = read_file("/vsimem/out.json") + assert ( + '"id": 0, "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' + in got + ) + + gdal.VectorTranslate( + "/vsimem/out.json", + "data/poly.shp", + format="GeoJSON", + layerCreationOptions=["ID_GENERATE=YES", "ID_TYPE=String"], + limit=1, + ) + got = read_file("/vsimem/out.json") + assert ( + '"id": "0", "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' + in got + ) - gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_GENERATE=YES', 'ID_TYPE=String'], limit=1) - got = read_file('/vsimem/out.json') - assert '"id": "0", "properties": { "AREA": 215229.266, "EAS_ID": 168, "PRFEDEA": "35043411" }' in got ############################################################################### def test_ogr_geojson_geom_export_failure(): - g = ogr.CreateGeometryFromWkt('POINT EMPTY') + g = ogr.CreateGeometryFromWkt("POINT EMPTY") geojson = g.ExportToJson() assert geojson is None - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(TIN EMPTY)') + 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) + g.AddPoint_2D(float("nan"), 0) with gdaltest.error_handler(): geojson = g.ExportToJson() assert geojson is None @@ -2679,7 +3375,7 @@ def test_ogr_geojson_geom_export_failure(): g.AddGeometry(lr) lr = ogr.Geometry(ogr.wkbLinearRing) lr.AddPoint_2D(0, 0) - lr.AddPoint_2D(float('nan'), 1) + lr.AddPoint_2D(float("nan"), 1) lr.AddPoint_2D(1, 1) lr.AddPoint_2D(0, 0) g.AddGeometry(lr) @@ -2687,12 +3383,14 @@ def test_ogr_geojson_geom_export_failure(): geojson = g.ExportToJson() assert geojson is None + ############################################################################### def test_ogr_geojson_starting_with_crs(): - ds = ogr.Open("""{ + ds = ogr.Open( + """{ "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32631" } }, "type": "FeatureCollection", "features": [{ @@ -2701,17 +3399,19 @@ def test_ogr_geojson_starting_with_crs(): "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') + tmpfilename = "tmp/ogr_geojson_append_flush.json" + f = gdal.VSIFOpenL(tmpfilename, "wb") content = """{ "type": "FeatureCollection", "features": [ @@ -2722,7 +3422,7 @@ def test_ogr_geojson_append_flush(): ds = ogr.Open(tmpfilename, update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) - f['x'] = 10 + f["x"] = 10 lyr.CreateFeature(f) lyr.SyncToDisk() @@ -2730,7 +3430,7 @@ def test_ogr_geojson_append_flush(): lyr = ds2.GetLayer(0) lyr.GetNextFeature() f = lyr.GetNextFeature() - assert f is not None and f['x'] == 10 + assert f is not None and f["x"] == 10 ds = None ds2 = None @@ -2743,7 +3443,7 @@ def test_ogr_geojson_append_flush(): def test_ogr_geojson_empty_geometrycollection(): g = ogr.CreateGeometryFromJson('{"type": "GeometryCollection", "geometries": []}') - assert g.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' + assert g.ExportToWkt() == "GEOMETRYCOLLECTION EMPTY" ############################################################################### @@ -2751,16 +3451,23 @@ def test_ogr_geojson_empty_geometrycollection(): def test_ogr_geojson_read_fields_with_different_case(): - ds = ogr.Open("""{ + 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': + 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() @@ -2774,33 +3481,43 @@ def test_ogr_geojson_clip_geometries_rfc7946(): if not ogrtest.have_geos(): pytest.skip() - tmpfilename = '/vsimem/out.json' - gdal.VectorTranslate(tmpfilename, """{ + 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') +}""", + 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)))') + 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)))') + 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))') + 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() @@ -2808,6 +3525,7 @@ def test_ogr_geojson_clip_geometries_rfc7946(): gdal.Unlink(tmpfilename) + ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1109 @@ -2830,46 +3548,50 @@ def test_ogr_geojson_non_finite(): for i in range(3): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTReal - if f['inf_prop'] != float('inf'): + if f["inf_prop"] != float("inf"): f.DumpReadable() pytest.fail() - if f['minus_inf_prop'] != float('-inf'): + if f["minus_inf_prop"] != float("-inf"): f.DumpReadable() pytest.fail() - if not math.isnan(f['nan_prop']): + if not math.isnan(f["nan_prop"]): f.DumpReadable() - pytest.fail(str(f['nan_prop'])) + pytest.fail(str(f["nan_prop"])) ds = None - tmpfilename = '/vsimem/out.json' + tmpfilename = "/vsimem/out.json" with gdaltest.error_handler(): - gdal.VectorTranslate(tmpfilename, json_content, options='-f GeoJSON') + 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') + 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'): + if f["inf_prop"] != float("inf"): f.DumpReadable() pytest.fail() - if f['minus_inf_prop'] != float('-inf'): + if f["minus_inf_prop"] != float("-inf"): f.DumpReadable() pytest.fail() - if not math.isnan(f['nan_prop']): + if not math.isnan(f["nan_prop"]): f.DumpReadable() - pytest.fail(str(f['nan_prop'])) + pytest.fail(str(f["nan_prop"])) ds = None gdal.Unlink(tmpfilename) + ############################################################################### + def test_ogr_geojson_random_reading_with_id(): json_content = """{ @@ -2879,7 +3601,7 @@ def test_ogr_geojson_random_reading_with_id(): { "type": "Feature", "id": 2, "properties": { "a": "bc" }, "geometry": null } ] }""" - tmpfilename = '/vsimem/temp.json' + tmpfilename = "/vsimem/temp.json" gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) @@ -2893,8 +3615,10 @@ def test_ogr_geojson_random_reading_with_id(): ds = None gdal.Unlink(tmpfilename) + ############################################################################### + def test_ogr_geojson_random_reading_without_id(): json_content = """{ @@ -2904,7 +3628,7 @@ def test_ogr_geojson_random_reading_without_id(): { "type": "Feature", "properties": { "a": "bc" }, "geometry": null } ] }""" - tmpfilename = '/vsimem/temp.json' + tmpfilename = "/vsimem/temp.json" gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) @@ -2918,14 +3642,16 @@ def test_ogr_geojson_random_reading_without_id(): 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' + tmpfilename = "/vsimem/temp.json" gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) @@ -2935,39 +3661,52 @@ def test_ogr_geojson_single_feature_random_reading_with_id(): ds = None gdal.Unlink(tmpfilename) + ############################################################################### + def test_ogr_geojson_3D_geom_type(): - ds = ogr.Open("""{"type": "FeatureCollection", "features":[ + 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":[ + 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":[ + 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(): - tmpfilename = '/vsimem/temp.json' + 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 }]}') + 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 = [] @@ -2978,7 +3717,10 @@ def test_ogr_geojson_update_in_loop(): 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 }]}') + 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() @@ -2990,7 +3732,10 @@ def test_ogr_geojson_update_in_loop(): 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 }]}') + 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 = [] @@ -3002,25 +3747,36 @@ def test_ogr_geojson_update_in_loop(): gdal.Unlink(tmpfilename) + ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/2720 + def test_ogr_geojson_starting_with_coordinates(): - tmpfilename = '/vsimem/temp.json' - gdal.FileFromMemBuffer(tmpfilename, '{ "coordinates": [' + (' ' * 10000) + '2,49], "type": "Point"}') + tmpfilename = "/vsimem/temp.json" + gdal.FileFromMemBuffer( + tmpfilename, '{ "coordinates": [' + (" " * 10000) + '2,49], "type": "Point"}' + ) ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR) assert ds is not None gdal.Unlink(tmpfilename) + ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/2787 + def test_ogr_geojson_starting_with_geometry_coordinates(): - tmpfilename = '/vsimem/temp.json' - gdal.FileFromMemBuffer(tmpfilename, '{ "geometry": {"coordinates": [' + (' ' * 10000) + '2,49], "type": "Point"}, "type": "Feature", "properties": {} }') + tmpfilename = "/vsimem/temp.json" + gdal.FileFromMemBuffer( + tmpfilename, + '{ "geometry": {"coordinates": [' + + (" " * 10000) + + '2,49], "type": "Point"}, "type": "Feature", "properties": {} }', + ) ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR) assert ds is not None @@ -3030,75 +3786,79 @@ def test_ogr_geojson_starting_with_geometry_coordinates(): ############################################################################### # Test serialization of Float32 values -def test_ogr_geojson_write_float32(): +def test_ogr_geojson_write_float32(): def cast_as_float(x): - return struct.unpack('f', struct.pack('f', x))[0] + return struct.unpack("f", struct.pack("f", x))[0] - filename = '/vsimem/test_ogr_geojson_write_float32.json' - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(filename) - lyr = ds.CreateLayer('foo') + filename = "/vsimem/test_ogr_geojson_write_float32.json" + ds = ogr.GetDriverByName("GeoJSON").CreateDataSource(filename) + lyr = ds.CreateLayer("foo") - fldn_defn = ogr.FieldDefn('float32', ogr.OFTReal) + fldn_defn = ogr.FieldDefn("float32", ogr.OFTReal) fldn_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fldn_defn) - fldn_defn = ogr.FieldDefn('float32list', ogr.OFTRealList) + fldn_defn = ogr.FieldDefn("float32list", ogr.OFTRealList) fldn_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fldn_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f['float32'] = cast_as_float(0.35) - f['float32list'] = [ + f["float32"] = cast_as_float(0.35) + f["float32list"] = [ cast_as_float(123.0), cast_as_float(0.35), cast_as_float(0.15), cast_as_float(0.12345678), cast_as_float(1.2345678e-15), cast_as_float(1.2345678e15), - cast_as_float(0.123456789), # more decimals than Float32 can hold + cast_as_float(0.123456789), # more decimals than Float32 can hold ] lyr.CreateFeature(f) ds = None - fp = gdal.VSIFOpenL(filename, 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + fp = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) gdal.Unlink(filename) - data = data.replace('e+0', 'e+').replace('e-0', 'e-') + data = data.replace("e+0", "e+").replace("e-0", "e-") assert '"float32": 0.35,' in data - assert '"float32list": [ 123.0, 0.35, 0.15, 0.12345678, 1.2345678e-15, 1.2345678e+15, 0.12345679 ]' in data + assert ( + '"float32list": [ 123.0, 0.35, 0.15, 0.12345678, 1.2345678e-15, 1.2345678e+15, 0.12345679 ]' + in data + ) ############################################################################### # Test bugfix for #3172 + def test_ogr_geojson_write_float_exponential_without_dot(): - filename = '/vsimem/test_ogr_geojson_write_float_exponential_without_dot.json' - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(filename) - lyr = ds.CreateLayer('foo') + filename = "/vsimem/test_ogr_geojson_write_float_exponential_without_dot.json" + ds = ogr.GetDriverByName("GeoJSON").CreateDataSource(filename) + lyr = ds.CreateLayer("foo") - fldn_defn = ogr.FieldDefn('float32', ogr.OFTReal) + fldn_defn = ogr.FieldDefn("float32", ogr.OFTReal) fldn_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fldn_defn) - fldn_defn = ogr.FieldDefn('float64', ogr.OFTReal) + fldn_defn = ogr.FieldDefn("float64", ogr.OFTReal) lyr.CreateField(fldn_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f['float32'] = 1e-7 - f['float64'] = 1e-8 + f["float32"] = 1e-7 + f["float64"] = 1e-8 lyr.CreateFeature(f) ds = None - fp = gdal.VSIFOpenL(filename, 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + fp = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) gdal.Unlink(filename) @@ -3110,95 +3870,105 @@ def test_ogr_geojson_write_float_exponential_without_dot(): ############################################################################### # Test bugfix for #3280 + def test_ogr_geojson_feature_starting_with_big_properties(): - filename = '/vsimem/test_ogr_geojson_feature_starting_with_big_properties.json' - gdal.FileFromMemBuffer(filename, - '{"properties":{"foo":"%s"},"type":"Feature","geometry":null}' % ('x' * 10000)) + filename = "/vsimem/test_ogr_geojson_feature_starting_with_big_properties.json" + gdal.FileFromMemBuffer( + filename, + '{"properties":{"foo":"%s"},"type":"Feature","geometry":null}' % ("x" * 10000), + ) assert ogr.Open(filename) is not None gdal.Unlink(filename) ############################################################################### + def test_ogr_geojson_export_geometry_axis_order(): # EPSG:4326 and lat,long data order sr = osr.SpatialReference() sr.ImportFromEPSG(4326) sr.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) - g = ogr.CreateGeometryFromWkt('POINT (49 2)') + g = ogr.CreateGeometryFromWkt("POINT (49 2)") g.AssignSpatialReference(sr) before_wkt = g.ExportToWkt() - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} assert g.ExportToWkt() == before_wkt # EPSG:4326 and long,lat data order sr = osr.SpatialReference() sr.ImportFromEPSG(4326) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) - g = ogr.CreateGeometryFromWkt('POINT (2 49)') + g = ogr.CreateGeometryFromWkt("POINT (2 49)") g.AssignSpatialReference(sr) - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} # CRS84 with long,lat CRS and data order sr = osr.SpatialReference() sr.SetFromUserInput("OGC:CRS84") - g = ogr.CreateGeometryFromWkt('POINT (2 49)') + g = ogr.CreateGeometryFromWkt("POINT (2 49)") g.AssignSpatialReference(sr) - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} # Projected CRS with easting, northing order sr = osr.SpatialReference() sr.ImportFromEPSG(32631) - g = ogr.CreateGeometryFromWkt('POINT (2 49)') + g = ogr.CreateGeometryFromWkt("POINT (2 49)") g.AssignSpatialReference(sr) - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} # Projected CRS with northing, easting order sr = osr.SpatialReference() sr.ImportFromEPSG(2393) sr.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) - g = ogr.CreateGeometryFromWkt('POINT (49 2)') + g = ogr.CreateGeometryFromWkt("POINT (49 2)") g.AssignSpatialReference(sr) - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} # No CRS - g = ogr.CreateGeometryFromWkt('POINT (2 49)') - assert json.loads(g.ExportToJson()) == { "type": "Point", "coordinates": [ 2.0, 49.0 ] } + g = ogr.CreateGeometryFromWkt("POINT (2 49)") + assert json.loads(g.ExportToJson()) == {"type": "Point", "coordinates": [2.0, 49.0]} + ############################################################################### + def test_ogr_geojson_sparse_fields(): - ds = ogr.Open('data/geojson/sparse_fields.geojson') + ds = ogr.Open("data/geojson/sparse_fields.geojson") lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - field_names = [ lyr_defn.GetFieldDefn(i).GetName() for i in range(lyr_defn.GetFieldCount()) ] - assert field_names == [ 'C', 'B', 'A', 'D', 'E_prev', 'E', 'E_next', 'F', 'X'] + field_names = [ + lyr_defn.GetFieldDefn(i).GetName() for i in range(lyr_defn.GetFieldCount()) + ] + assert field_names == ["C", "B", "A", "D", "E_prev", "E", "E_next", "F", "X"] + ############################################################################### -@pytest.mark.parametrize('filename', ['point.geojson', 'featurecollection_point.json']) +@pytest.mark.parametrize("filename", ["point.geojson", "featurecollection_point.json"]) def test_ogr_geojson_crs_4326(filename): - ds = ogr.Open('data/geojson/' + filename) + ds = ogr.Open("data/geojson/" + filename) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] + ############################################################################### -@pytest.mark.parametrize('filename', ['pointz.json', 'featurecollection_pointz.json']) +@pytest.mark.parametrize("filename", ["pointz.json", "featurecollection_pointz.json"]) def test_ogr_geojson_crs_4979(filename): - ds = ogr.Open('data/geojson/' + filename) + ds = ogr.Open("data/geojson/" + filename) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() - assert srs.GetAuthorityCode(None) == '4979' + assert srs.GetAuthorityCode(None) == "4979" assert srs.GetDataAxisToSRSAxisMapping() == [2, 1, 3] @@ -3220,16 +3990,16 @@ def test_ogr_geojson_write_rfc7946_from_3D_crs(): lon, lat, z = ct.TransformPoint(2, 49, ellipsoidal_height) # If we have the egm96 grid, then z should be different from 100 - filename = '/vsimem/out.geojson' - ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(filename) - lyr = ds.CreateLayer('out', srs=srs_4326_5773, options = ['RFC7946=YES']) + filename = "/vsimem/out.geojson" + ds = ogr.GetDriverByName("GeoJSON").CreateDataSource(filename) + lyr = ds.CreateLayer("out", srs=srs_4326_5773, options=["RFC7946=YES"]) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%.18g %.18g %.18g)' % (lon, lat, z))) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(%.18g %.18g %.18g)" % (lon, lat, z))) lyr.CreateFeature(f) ds = None - fp = gdal.VSIFOpenL(filename, 'rb') - data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') + fp = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 10000, fp).decode("ascii") gdal.VSIFCloseL(fp) gdal.Unlink(filename) @@ -3240,16 +4010,19 @@ def test_ogr_geojson_write_rfc7946_from_3D_crs(): ############################################################################### # Test effect of OGR_GEOJSON_MAX_OBJ_SIZE + def test_ogr_geojson_feature_large(): - filename = '/vsimem/test_ogr_geojson_feature_large.json' - gdal.FileFromMemBuffer(filename, - '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[%s]}}]}' % ','.join(["[0,0]" for _ in range(10 * 1024)])) + filename = "/vsimem/test_ogr_geojson_feature_large.json" + gdal.FileFromMemBuffer( + filename, + '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[%s]}}]}' + % ",".join(["[0,0]" for _ in range(10 * 1024)]), + ) assert ogr.Open(filename) is not None - with gdaltest.config_option('OGR_GEOJSON_MAX_OBJ_SIZE', '0'): + with gdaltest.config_option("OGR_GEOJSON_MAX_OBJ_SIZE", "0"): assert ogr.Open(filename) is not None - with gdaltest.config_option('OGR_GEOJSON_MAX_OBJ_SIZE', '0.1'): + with gdaltest.config_option("OGR_GEOJSON_MAX_OBJ_SIZE", "0.1"): with gdaltest.error_handler(): assert ogr.Open(filename) is None gdal.Unlink(filename) - diff --git a/autotest/ogr/ogr_geojsonseq.py b/autotest/ogr/ogr_geojsonseq.py index c22ba02d37b5..e8f1afeb9027 100755 --- a/autotest/ogr/ogr_geojsonseq.py +++ b/autotest/ogr/ogr_geojsonseq.py @@ -29,81 +29,79 @@ ############################################################################### - -from osgeo import gdal -from osgeo import osr -from osgeo import ogr - import gdaltest import pytest +from osgeo import gdal, ogr, osr + def _ogr_geojsonseq_create(filename, lco, expect_rs): - ds = ogr.GetDriverByName('GeoJSONSeq').CreateDataSource(filename) + 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')) + 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)')) + 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)')) + 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 + assert ds.CreateLayer("foo") is None ds = None - f = gdal.VSIFOpenL(filename, 'rb') - first = gdal.VSIFReadL(1, 1, f).decode('ascii') + f = gdal.VSIFOpenL(filename, "rb") + first = gdal.VSIFReadL(1, 1, f).decode("ascii") gdal.VSIFCloseL(f) if expect_rs: - assert first == '\x1e' + assert first == "\x1e" else: - assert first == '{' + 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)': + 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)': + 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) + ogr.GetDriverByName("GeoJSONSeq").DeleteDataSource(filename) def test_ogr_geojsonseq_lf(): - return _ogr_geojsonseq_create('/vsimem/test', [], False) + return _ogr_geojsonseq_create("/vsimem/test", [], False) def test_ogr_geojsonseq_rs(): - return _ogr_geojsonseq_create('/vsimem/test', ['RS=YES'], True) + return _ogr_geojsonseq_create("/vsimem/test", ["RS=YES"], True) def test_ogr_geojsonseq_rs_auto(): - return _ogr_geojsonseq_create('/vsimem/test.geojsons', [], True) + 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}""") + ds = ogr.Open( + """{"type":"Feature","properties":{},"geometry":null} +{"type":"Feature","properties":{},"geometry":null}""" + ) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 @@ -117,13 +115,15 @@ def test_ogr_geojsonseq_prefix(): 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]}""") + 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)': + if f.GetGeometryRef().ExportToWkt() != "POINT (2 49)": f.DumpReadable() pytest.fail() @@ -131,65 +131,65 @@ def test_ogr_geojsonseq_seq_geometries(): def test_ogr_geojsonseq_seq_geometries_with_errors(): with gdaltest.error_handler(): - ds = ogr.Open("""{"type":"Point","coordinates":[2,49]} + ds = ogr.Open( + """{"type":"Point","coordinates":[2,49]} {"type":"Point","coordinates":[3,50]} foo "bar" null - {"type":"Point","coordinates":[3,51]}""") + {"type":"Point","coordinates":[3,51]}""" + ) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': + if f.GetGeometryRef().ExportToWkt() != "POINT (2 49)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': + if f.GetGeometryRef().ExportToWkt() != "POINT (3 50)": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (3 51)': + 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) + 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) + 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)')) + 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)': + if f.GetGeometryRef().ExportToWkt() != "POINT (2 49)": f.DumpReadable() pytest.fail() ds = None - ogr.GetDriverByName('GeoJSONSeq').DeleteDataSource(filename) + ogr.GetDriverByName("GeoJSONSeq").DeleteDataSource(filename) def test_ogr_geojsonseq_read_rs_json_pretty(): - ds = ogr.Open('data/geojsonseq/test.geojsons') + ds = ogr.Open("data/geojsonseq/test.geojsons") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['foo'] != 'bar' or \ - f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': + 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)': + if f["foo"] != "baz" or f.GetGeometryRef().ExportToWkt() != "POINT (3 4)": f.DumpReadable() pytest.fail() assert lyr.GetNextFeature() is None @@ -198,29 +198,33 @@ def test_ogr_geojsonseq_read_rs_json_pretty(): 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/geojsonseq/test.geojsonl') - - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 + test_cli_utilities.get_test_ogrsf_path() + " -ro data/geojsonseq/test.geojsonl" + ) + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 ############################################################################### # Test effect of OGR_GEOJSON_MAX_OBJ_SIZE + def test_ogr_geojsonseq_feature_large(): - filename = '/vsimem/test_ogr_geojson_feature_large.geojsonl' - feature = '{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[%s]}}' % ','.join(["[0,0]" for _ in range(20 * 1024)]) - gdal.FileFromMemBuffer(filename, feature + '\n' + feature) + filename = "/vsimem/test_ogr_geojson_feature_large.geojsonl" + feature = ( + '{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[%s]}}' + % ",".join(["[0,0]" for _ in range(20 * 1024)]) + ) + gdal.FileFromMemBuffer(filename, feature + "\n" + feature) assert ogr.Open(filename) is not None - with gdaltest.config_option('OGR_GEOJSON_MAX_OBJ_SIZE', '0'): + with gdaltest.config_option("OGR_GEOJSON_MAX_OBJ_SIZE", "0"): assert ogr.Open(filename) is not None - with gdaltest.config_option('OGR_GEOJSON_MAX_OBJ_SIZE', '0.1'): + with gdaltest.config_option("OGR_GEOJSON_MAX_OBJ_SIZE", "0.1"): with gdaltest.error_handler(): assert ogr.Open(filename) is None gdal.Unlink(filename) - diff --git a/autotest/ogr/ogr_geom.py b/autotest/ogr/ogr_geom.py index ce8002a877e3..deecdacb986c 100755 --- a/autotest/ogr/ogr_geom.py +++ b/autotest/ogr/ogr_geom.py @@ -32,14 +32,12 @@ import pickle import random - import gdaltest import ogrtest -from osgeo import ogr -from osgeo import osr -from osgeo import gdal import pytest +from osgeo import gdal, ogr, osr + ############################################################################### # Test Area calculation for a MultiPolygon (which exercises lower level # get_Area() methods as well). @@ -47,15 +45,20 @@ 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_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 area == pytest.approx(99.5, abs=0.00000000001), ('GetArea() result wrong, got %g.' % area) + assert area == pytest.approx(99.5, abs=0.00000000001), ( + "GetArea() result wrong, got %g." % area + ) # OGR >= 1.8.0 area = geom.Area() - assert area == pytest.approx(99.5, abs=0.00000000001), ('Area() result wrong, got %g.' % area) + assert area == pytest.approx(99.5, abs=0.00000000001), ( + "Area() result wrong, got %g." % area + ) + ############################################################################### # Test Area calculation for a LinearRing (which exercises special case of @@ -72,7 +75,10 @@ def test_ogr_geom_area_linearring(): geom.AddPoint_2D(0, 0) area = geom.GetArea() - assert area == pytest.approx(100.0, abs=0.00000000001), ('Area result wrong, got %g.' % area) + assert area == pytest.approx(100.0, abs=0.00000000001), ( + "Area result wrong, got %g." % area + ) + ############################################################################### # Test Area calculation for a GeometryCollection @@ -81,11 +87,14 @@ def test_ogr_geom_area_linearring(): 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_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 area == pytest.approx(1, abs=0.00000000001), ('Area() result wrong, got %g.' % area) + assert area == pytest.approx(1, abs=0.00000000001), ( + "Area() result wrong, got %g." % area + ) + ############################################################################### # Test Area calculation for a LinearRing whose coordinates are shifted by a @@ -103,7 +112,10 @@ def test_ogr_geom_area_linearring_big_offset(): geom.AddPoint_2D(BIGOFFSET + 0, BIGOFFSET + 0) area = geom.GetArea() - assert area == pytest.approx(100.0, abs=0.00000000001), ('Area result wrong, got %g.' % area) + assert area == pytest.approx(100.0, abs=0.00000000001), ( + "Area result wrong, got %g." % area + ) + ############################################################################### # Test Area calculation for a Triangle @@ -111,38 +123,42 @@ def test_ogr_geom_area_linearring_big_offset(): def test_ogr_geom_area_triangle(): - geom_wkt = 'TRIANGLE((0 0,100 0,0 100,0 0))' + geom_wkt = "TRIANGLE((0 0,100 0,0 100,0 0))" geom = ogr.CreateGeometryFromWkt(geom_wkt) area = geom.GetArea() - assert area != pytest.approx(4999.5, abs=0.00000000001), \ - ('GetArea() result wrong, got %g.' % area) + assert area != pytest.approx(4999.5, abs=0.00000000001), ( + "GetArea() result wrong, got %g." % area + ) # OGR >= 1.8.0 area = geom.Area() - assert area != pytest.approx(4999.5, abs=0.00000000001), ('Area() result wrong, got %g.' % area) + assert area != pytest.approx(4999.5, abs=0.00000000001), ( + "Area() result wrong, got %g." % area + ) def test_ogr_geom_is_empty(): - geom_wkt = 'LINESTRING 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_wkt = "POINT( 1 2 )" geom = ogr.CreateGeometryFromWkt(geom_wkt) - assert geom, ("A geometry could not be created from wkt: %s" % 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_wkt = "TRIANGLE EMPTY" geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" @@ -151,16 +167,16 @@ def test_ogr_geom_is_empty_triangle(): assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" - geom_wkt = 'TRIANGLE((0 0,100 0,0 100,0 0))' + 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 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_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(): @@ -168,18 +184,19 @@ def test_ogr_geom_pickle(): 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)),\ + 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)))' +((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) @@ -194,7 +211,10 @@ def test_ogr_geom_polyhedral_surface(): 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)))' + 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() @@ -220,33 +240,46 @@ def test_ogr_geom_polyhedral_surface(): ps.Empty() wkt_string = ps.ExportToWkt() - assert wkt_string == 'POLYHEDRALSURFACE Z EMPTY', \ - "Failure in Empty() of PolyhedralSurface" + 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)))') + 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']: + 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 + assert g.AddGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) != 0 # Error - assert g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) != 0 + 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))')) + 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)))' + 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 @@ -264,7 +297,7 @@ def test_ogr_geom_tin(): 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)))' + 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) @@ -299,22 +332,24 @@ def test_ogr_geom_tin(): tin.Empty() wkt_string = tin.ExportToWkt() - assert wkt_string == 'TIN Z EMPTY', "Failure in Empty() of TIN" + 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))') + wrong_polygon = ogr.CreateGeometryFromWkt("POLYGON ((0 0 0,0 1 0,1 1 0,0 0 1))") geom_count = tin.GetGeometryCount() - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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)) + 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" + 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() @@ -329,26 +364,27 @@ def test_ogr_geom_tin(): assert not tin.IsValid(), "Problem with IsValid() in TIN" # 4 points - invalid_wkt = 'TIN (((0 0,0 1,1 1,1 0,0 0)))' + 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)))' + 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)))' + 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)))' + 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. @@ -359,16 +395,19 @@ def test_ogr_geom_boundary_point(): if not ogrtest.have_geos(): pytest.skip() - geom_wkt = 'POINT(1 1)' + geom_wkt = "POINT(1 1)" geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() - assert bnd.GetGeometryType() == ogr.wkbGeometryCollection, \ - 'GetBoundary not reported as GEOMETRYCOLLECTION EMPTY' + 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' + assert ( + bnd.GetGeometryType() == ogr.wkbGeometryCollection + ), "Boundary not reported as GEOMETRYCOLLECTION EMPTY" + ############################################################################### # Test OGRGeometry::getBoundary() result for multipoint. @@ -379,12 +418,14 @@ def test_ogr_geom_boundary_multipoint(): if not ogrtest.have_geos(): pytest.skip() - geom_wkt = 'MULTIPOINT((0 0),(1 1))' + 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' + assert ( + bnd.GetGeometryType() == ogr.wkbGeometryCollection + ), "Boundary not reported as GEOMETRYCOLLECTION EMPTY" + ############################################################################### # Test OGRGeometry::getBoundary() result for linestring. @@ -395,24 +436,28 @@ 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_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.GetGeometryType() == ogr.wkbMultiPoint + ), "Boundary not reported as MULTIPOINT" - assert bnd.GetGeometryCount() == 2, \ - 'Boundary not reported as MULTIPOINT consisting of 2 points' + 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_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.GetGeometryType() == ogr.wkbMultiPoint + ), "Boundary not reported as MULTIPOINT" + + assert bnd.GetGeometryCount() == 0, "Boundary not reported as MULTIPOINT EMPTY" - assert bnd.GetGeometryCount() == 0, 'Boundary not reported as MULTIPOINT EMPTY' ############################################################################### # Test OGRGeometry::getBoundary() result for polygon. @@ -423,12 +468,14 @@ 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_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' + assert ( + bnd.GetGeometryType() == ogr.wkbLineString + ), "Boundary not reported as non-empty LINESTRING" + ############################################################################### # Test OGRBuildPolygonFromEdges() on a geometry collection of line strings @@ -442,12 +489,13 @@ def test_ogr_geom_build_from_edges_1(): 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)'] + "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) @@ -473,12 +521,13 @@ def test_ogr_geom_build_from_edges_2(): 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)'] + "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) @@ -500,18 +549,20 @@ def test_ogr_geom_build_from_edges_3(): if not ogrtest.have_geos(): pytest.skip() - src_geom = ogr.CreateGeometryFromWkt('POINT (0 1)') + src_geom = ogr.CreateGeometryFromWkt("POINT (0 1)") try: - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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))') + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") poly = ogr.BuildPolygonFromEdges(src_geom) gdal.PopErrorHandler() assert poly is None @@ -525,8 +576,8 @@ def test_ogr_geom_build_from_edges_3(): def test_ogr_geom_build_from_edges_4(): - if int(gdal.VersionInfo('VERSION_NUM')) < 1900: - pytest.skip('would crash') + if int(gdal.VersionInfo("VERSION_NUM")) < 1900: + pytest.skip("would crash") if not ogrtest.have_geos(): pytest.skip() @@ -534,16 +585,16 @@ def test_ogr_geom_build_from_edges_4(): 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)' + "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: @@ -555,7 +606,7 @@ def test_ogr_geom_build_from_edges_4(): 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))' + 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() @@ -571,6 +622,7 @@ def test_ogr_geom_area_empty_linearring(): area = geom.GetArea() assert area == 0 + ############################################################################### # Test TransformTo() @@ -578,7 +630,7 @@ def test_ogr_geom_area_empty_linearring(): def test_ogr_geom_transform_to(): # Somewhere in Paris suburbs... - geom = ogr.CreateGeometryFromWkt('POINT(2 49)') + geom = ogr.CreateGeometryFromWkt("POINT(2 49)") # Input SRS is EPSG:4326 sr = osr.SpatialReference() @@ -591,15 +643,19 @@ def test_ogr_geom_transform_to(): sr2.ImportFromEPSG(32631) ret = geom.TransformTo(sr2) - assert ret == 0 and geom.GetX() == pytest.approx(426857, abs=1) and geom.GetY() == pytest.approx(5427937, abs=1), \ - geom.ExportToWkt() + assert ( + ret == 0 + and geom.GetX() == pytest.approx(426857, abs=1) + and geom.GetY() == pytest.approx(5427937, abs=1) + ), geom.ExportToWkt() # Geometry without SRS - geom = ogr.CreateGeometryFromWkt('POINT(2 49)') + geom = ogr.CreateGeometryFromWkt("POINT(2 49)") gdal.ErrorReset() with gdaltest.error_handler(): ret = geom.TransformTo(sr2) - assert not (ret == 0 or gdal.GetLastErrorMsg() == '') + assert not (ret == 0 or gdal.GetLastErrorMsg() == "") + ############################################################################### # Test Transform() @@ -608,7 +664,7 @@ def test_ogr_geom_transform_to(): def test_ogr_geom_transform(): # Somewhere in Paris suburbs... - geom = ogr.CreateGeometryFromWkt('POINT(2 49)') + geom = ogr.CreateGeometryFromWkt("POINT(2 49)") # Input SRS is EPSG:4326 sr = osr.SpatialReference() @@ -623,8 +679,10 @@ def test_ogr_geom_transform(): geom.Transform(ct) - assert geom.GetX() == pytest.approx(426857, abs=1) and geom.GetY() == pytest.approx(5427937, abs=1), \ - geom.ExportToWkt() + assert geom.GetX() == pytest.approx(426857, abs=1) and geom.GetY() == pytest.approx( + 5427937, abs=1 + ), geom.ExportToWkt() + ############################################################################### # Test Transform() from a geographic CRS to WGS 84 (https://github.com/OSGeo/gdal/issues/5660) @@ -640,20 +698,29 @@ def test_ogr_geom_transform_geogcrs_to_wgs84(): srs_7683.ImportFromEPSG(7683) srs_7683.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) - wkt = 'POLYGON ((44.0 43.1666666666667,44.0 43.3333333333333,44.25 43.3333333333333,44.25 43.1666666666667,44.0 43.1666666666667))' + wkt = "POLYGON ((44.0 43.1666666666667,44.0 43.3333333333333,44.25 43.3333333333333,44.25 43.1666666666667,44.0 43.1666666666667))" options = osr.CoordinateTransformationOptions() # Setting the pipeline is not compulsory, but this enables us to be independent # of PROJ transformation database - assert options.SetOperation('+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=push +v_3 +step +proj=cart +ellps=GSK2011 +step +inv +proj=cart +ellps=WGS84 +step +proj=pop +v_3 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1') + assert options.SetOperation( + "+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=push +v_3 +step +proj=cart +ellps=GSK2011 +step +inv +proj=cart +ellps=WGS84 +step +proj=pop +v_3 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1" + ) ct = osr.CoordinateTransformation(srs_7683, srs_4326) tr = ogr.GeomTransformer(ct) polygon = ogr.CreateGeometryFromWkt(wkt) polygon.AssignSpatialReference(srs_7683) gdal.ErrorReset() polygon = tr.Transform(polygon) - assert gdal.GetLastErrorMsg() == '' - assert ogrtest.check_feature_geometry(polygon, 'POLYGON ((44.0 43.1666661611411,44.0 43.3333328276326,44.25 43.3333328276326,44.25 43.1666661611411,44.0 43.1666661611411))') == 0 + assert gdal.GetLastErrorMsg() == "" + assert ( + ogrtest.check_feature_geometry( + polygon, + "POLYGON ((44.0 43.1666661611411,44.0 43.3333328276326,44.25 43.3333328276326,44.25 43.1666661611411,44.0 43.1666661611411))", + ) + == 0 + ) + ############################################################################### # Test ogr.GeomTransformer() @@ -672,11 +739,17 @@ def test_ogr_geomtransfomer_default(): dst.ImportFromEPSG(4326) ct = osr.CoordinateTransformation(src, dst) - geom = ogr.CreateGeometryFromWkt('LINESTRING(832864.275023695 0,835092.849076364 0)') + geom = ogr.CreateGeometryFromWkt( + "LINESTRING(832864.275023695 0,835092.849076364 0)" + ) transformer = ogr.GeomTransformer(ct) geom_dst = transformer.Transform(geom) - assert geom_dst.ExportToWkt() == 'MULTILINESTRING ((179.99 0.0,180 0),(-180 0,-179.99 0.0))' + assert ( + geom_dst.ExportToWkt() + == "MULTILINESTRING ((179.99 0.0,180 0),(-180 0,-179.99 0.0))" + ) + ############################################################################### # Test ogr.GeomTransformer() @@ -695,11 +768,19 @@ def test_ogr_geomtransfomer_wrapdateline_with_ct(): dst.ImportFromEPSG(4326) ct = osr.CoordinateTransformation(src, dst) - geom = ogr.CreateGeometryFromWkt('LINESTRING(20026376.3937099 0,-20026376.3937099 0)') - transformer = ogr.GeomTransformer(ct, ['WRAPDATELINE=YES']) + geom = ogr.CreateGeometryFromWkt( + "LINESTRING(20026376.3937099 0,-20026376.3937099 0)" + ) + transformer = ogr.GeomTransformer(ct, ["WRAPDATELINE=YES"]) geom_dst = geom.Transform(transformer) - assert ogrtest.check_feature_geometry(geom_dst, 'MULTILINESTRING ((179.9 0.0,180 0),(-180 0,-179.9 0.0))') == 0 + assert ( + ogrtest.check_feature_geometry( + geom_dst, "MULTILINESTRING ((179.9 0.0,180 0),(-180 0,-179.9 0.0))" + ) + == 0 + ) + ############################################################################### # Test ogr.GeomTransformer() @@ -709,11 +790,11 @@ def test_ogr_geomtransfomer_wrapdateline_no_ct(): if not ogrtest.have_geos(): pytest.skip() - geom = ogr.CreateGeometryFromWkt('LINESTRING(-179 0,179 0)') - transformer = ogr.GeomTransformer(None, ['WRAPDATELINE=YES']) + geom = ogr.CreateGeometryFromWkt("LINESTRING(-179 0,179 0)") + transformer = ogr.GeomTransformer(None, ["WRAPDATELINE=YES"]) geom_dst = geom.Transform(transformer) - assert geom_dst.ExportToWkt() == 'MULTILINESTRING ((-179 0,-180 0),(180 0,179 0))' + assert geom_dst.ExportToWkt() == "MULTILINESTRING ((-179 0,-180 0),(180 0,179 0))" ############################################################################### @@ -722,13 +803,14 @@ def test_ogr_geomtransfomer_wrapdateline_no_ct(): def test_ogr_geom_closerings(): - geom = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0))') + 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))' + 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))' + assert geom.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,1 0,0 0))" + ############################################################################### # Test Segmentize() @@ -737,109 +819,128 @@ def test_ogr_geom_closerings(): def test_ogr_geom_segmentize(): # 2D - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 10)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(0 0,0 10)") geom.Segmentize(1.00001) - assert ogrtest.check_feature_geometry(geom, 'LINESTRING (0 0,0 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10)') == 0 + assert ( + ogrtest.check_feature_geometry( + geom, "LINESTRING (0 0,0 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10)" + ) + == 0 + ) # 2D + Z - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0 1,0 10 1)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(0 0 1,0 10 1)") geom.Segmentize(1.00001) - assert ogrtest.check_feature_geometry(geom, '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)') == 0 + assert ( + ogrtest.check_feature_geometry( + geom, + "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)", + ) + == 0 + ) # 2D + M - geom = ogr.CreateGeometryFromWkt('LINESTRING M(0 0 1,0 10 2)') + 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)' + 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 = 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)' + 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 = ogr.CreateGeometryFromWkt("LINESTRING(0 0,0 1)") geom.Segmentize(10000) - assert geom.ExportToWkt() == 'LINESTRING (0 0,0 1)' + 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)' + 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)' + 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])) + 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 extremely small threshold - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(0 0,0 1)") with gdaltest.error_handler(): geom.Segmentize(1e-30) - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" 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)' + 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 = 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 = 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 = 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)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(2 3,5 3,5 0)") p = geom.Value(-1e-3) - expected_p = ogr.CreateGeometryFromWkt('POINT (2 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)') + 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)') + 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)') + 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)') + 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)') + geom = ogr.CreateGeometryFromWkt("POINT (1 2 3)") # Point is 0 dimension, LineString 1, ... assert geom.GetDimension() == 0 @@ -849,7 +950,8 @@ def test_ogr_geom_flattenTo2D(): geom.FlattenTo2D() assert geom.GetCoordinateDimension() == 2 - assert geom.ExportToWkt() == 'POINT (1 2)' + assert geom.ExportToWkt() == "POINT (1 2)" + ############################################################################### # Test FlattenTo2D(), GetDimension() and GetCoordinateDimension() for Triangle @@ -857,7 +959,7 @@ def test_ogr_geom_flattenTo2D(): def test_ogr_geom_flattenTo2D_triangle(): - geom = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0 0,100 0 100,0 100 100,0 0 0))') + 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 @@ -867,48 +969,49 @@ def test_ogr_geom_flattenTo2D_triangle(): geom.FlattenTo2D() assert geom.GetCoordinateDimension() == 2 - assert geom.ExportToWkt() == 'TRIANGLE ((0 0,100 0,0 100,0 0))' + assert geom.ExportToWkt() == "TRIANGLE ((0 0,100 0,0 100,0 0))" + ############################################################################### def test_ogr_geom_linestring_limits(): - geom = ogr.CreateGeometryFromWkt('LINESTRING EMPTY') + geom = ogr.CreateGeometryFromWkt("LINESTRING EMPTY") assert geom.Length() == 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.GetPoint(-1) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.GetPoint(0) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.GetPoint_2D(-1) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.GetPoint_2D(0) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.SetPoint(-1, 5, 6, 7) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") geom.SetPoint_2D(-1, 5, 6) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 @@ -923,28 +1026,31 @@ def test_ogr_geom_linestring_limits(): geom.SetPoint_2D(2147000000, 5, 6) assert gdal.GetLastErrorType() != 0 - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0)') + geom = ogr.CreateGeometryFromWkt("LINESTRING(0 0)") assert geom.Length() == 0 - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 1 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)') + geom = ogr.CreateGeometryFromWkt("POINT(370441.860 5591000.590)") wkt = geom.ExportToWkt() - assert wkt == 'POINT (370441.86 5591000.59)', 'did not get expected WKT' + 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)') + geom = ogr.CreateGeometryFromWkt("POINT(1.0 169.600374)") wkt = geom.ExportToWkt() - assert wkt == 'POINT (1.0 169.600374)', 'did not get expected WKT' + assert wkt == "POINT (1.0 169.600374)", "did not get expected WKT" + ############################################################################### # Test Area calculation for a Point @@ -952,12 +1058,13 @@ def test_ogr_geom_coord_round_2(): def test_ogr_geom_area_point(): - geom_wkt = 'POINT(0 0)' + 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) + assert area == 0, "Area() result wrong, got %g." % area + ############################################################################### # Test Length calculation for a Point @@ -966,12 +1073,13 @@ def test_ogr_geom_area_point(): def test_ogr_geom_length_point(): # OGR >= 1.8.0 - geom_wkt = 'POINT(0 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) + assert length == 0, "Length() result wrong, got %g." % length + ############################################################################### # Test Length calculation for a MultiLineString @@ -980,11 +1088,14 @@ def test_ogr_geom_length_point(): def test_ogr_geom_length_multilinestring(): # OGR >= 1.8.0 - geom_wkt = 'MULTILINESTRING((0 0,0 1),(0 0,0 1))' + geom_wkt = "MULTILINESTRING((0 0,0 1),(0 0,0 1))" geom = ogr.CreateGeometryFromWkt(geom_wkt) length = geom.Length() - assert length == pytest.approx(2, abs=0.00000000001), ('Length() result wrong, got %g.' % length) + assert length == pytest.approx(2, abs=0.00000000001), ( + "Length() result wrong, got %g." % length + ) + ############################################################################### # Test Length calculation for a GeometryCollection @@ -993,11 +1104,14 @@ def test_ogr_geom_length_multilinestring(): 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_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 length == pytest.approx(4, abs=0.00000000001), ('Length() result wrong, got %g.' % length) + assert length == pytest.approx(4, abs=0.00000000001), ( + "Length() result wrong, got %g." % length + ) + ############################################################################### # Test Geometry.GetPoints() (#4016) @@ -1005,31 +1119,36 @@ def test_ogr_geom_length_geometrycollection(): def test_ogr_geom_getpoints(): - geom = ogr.CreateGeometryFromWkt('LINESTRING(0 1,2 3)') + 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)' + 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)' + 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)') + 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)' + 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)' + assert points == [(0.0, 1.0), (3.0, 4.0)], "did not get expected points (4)" - geom = ogr.CreateGeometryFromWkt('POINT(0 1)') + geom = ogr.CreateGeometryFromWkt("POINT(0 1)") points = geom.GetPoints() - assert points == [(0.0, 1.0)], 'did not get expected points (5)' + 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)' + assert points == [(0.0, 1.0, 0.0)], "did not get expected points (6)" - geom = ogr.CreateGeometryFromWkt('POINT(0 1 2)') + geom = ogr.CreateGeometryFromWkt("POINT(0 1 2)") points = geom.GetPoints() - assert points == [(0.0, 1.0, 2.0)], 'did not get expected points (7)' + 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)' + assert points == [(0.0, 1.0)], "did not get expected points (8)" + ############################################################################### # Test OGRGeometry::empty() @@ -1037,11 +1156,12 @@ def test_ogr_geom_getpoints(): def test_ogr_geom_empty(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0,1 1,1 2,1 1,0 0))') + g1 = ogr.CreateGeometryFromWkt("POLYGON((0 0,1 1,1 2,1 1,0 0))") g1.Empty() wkt = g1.ExportToWkt() - assert wkt == 'POLYGON EMPTY' + assert wkt == "POLYGON EMPTY" + ############################################################################### # Test OGRGeometry::empty() for Triangle @@ -1049,11 +1169,12 @@ def test_ogr_geom_empty(): def test_ogr_geom_empty_triangle(): - g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,100 0,0 100,0 0))') + g1 = ogr.CreateGeometryFromWkt("TRIANGLE ((0 0,100 0,0 100,0 0))") g1.Empty() wkt = g1.ExportToWkt() - assert wkt == 'TRIANGLE EMPTY' + assert wkt == "TRIANGLE EMPTY" + ############################################################################### # Test parsing WKT made of 2D and 3D parts @@ -1062,20 +1183,27 @@ def test_ogr_geom_empty_triangle(): 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)))' + 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)) + 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)))' + 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)) + assert got_wkt == expected_wkt, "for %s: got %s, expected %s" % ( + wkt, + got_wkt, + expected_wkt, + ) + ############################################################################### # Test GetEnvelope3D() @@ -1083,45 +1211,48 @@ def test_ogr_geom_mixed_coordinate_dimension(): def test_ogr_geom_getenvelope3d(): - g = ogr.CreateGeometryFromWkt('POINT EMPTY') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (1)" - g = ogr.CreateGeometryFromWkt('POINT(1 2)') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (2)" - g = ogr.CreateGeometryFromWkt('POINT(1 2 3)') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (3)" - g = ogr.CreateGeometryFromWkt('POLYGON EMPTY') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (4)" - g = ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 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)' + 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)))') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (6)" - g = ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY') + 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)' + 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))') + 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)' + assert envelope == expected_envelope, "did not get expected envelope (8)" + ############################################################################### # Test importing/exporting XXX Z EMPTY @@ -1129,10 +1260,21 @@ def test_ogr_geom_getenvelope3d(): 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' + 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 @@ -1148,67 +1290,80 @@ def test_ogr_geom_z_empty(): 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')]: + 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' + 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 + assert g2.ExportToWkt() == geom_out + " EMPTY", g - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 1))') + 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))') + 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)]: + 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))') + g = ogr.CreateGeometryFromWkt("GEOMETRYCOLLECTION(LINESTRING EMPTY, POINT (0 1))") assert g.GetDimension() == 1 - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 1), LINESTRING EMPTY, POLYGON EMPTY)') + 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))' + wkt_original = "TRIANGLE ((0 0,0 1,1 1,0 0))" geom = ogr.CreateGeometryFromWkt(wkt_original) wkb_string = geom.ExportToWkb(ogr.wkbXDR) @@ -1220,10 +1375,11 @@ def test_ogr_geom_triangle(): 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))' + 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)))' + assert polygon_wkt == "MULTIPOLYGON (((0 0,0 1,1 1,0 0)))" + ############################################################################### # Test importing invalid triangle WKT @@ -1231,31 +1387,32 @@ def test_ogr_geom_triangle(): def test_ogr_geom_triangle_invalid_wkt(): - geom_wkt = 'TRIANGLE (0 0)' + geom_wkt = "TRIANGLE (0 0)" with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None - geom_wkt = 'TRIANGLE ((0 0))' + 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))' + 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))' + 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))' + 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 @@ -1265,23 +1422,24 @@ 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))') + 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))') + 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))') + 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)' + in_wkt = "CIRCULARSTRING (0 0,1 1,1 -1)" # Test export/import Wkt g1 = ogr.CreateGeometryFromWkt(in_wkt) @@ -1305,36 +1463,40 @@ def test_ogr_geom_circularstring(): # Test Value() p = g1.Value(-1) - expected_p = ogr.CreateGeometryFromWkt('POINT (0 0)') + 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)') + 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)') + 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)') + 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)') + 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)') + 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)') + 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)') + expected_p = ogr.CreateGeometryFromWkt("POINT (1 -1)") assert ogrtest.check_feature_geometry(p, expected_p) == 0 # Test export/import Wkb @@ -1343,7 +1505,7 @@ def test_ogr_geom_circularstring(): assert in_wkt == out_wkt # With Z - in_wkt = 'CIRCULARSTRING Z (0 0 10,1 1 20,2 0 30)' + 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() @@ -1357,25 +1519,27 @@ def test_ogr_geom_circularstring(): 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)' + 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) + 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)') + 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)' + 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') + 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) + gdal.SetConfigOption("OGR_STROKE_CURVE", "FALSE") + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 @@ -1388,16 +1552,18 @@ def test_ogr_geom_circularstring(): assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToLineString - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToLineString(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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))') + 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) + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Test GEOS operations @@ -1406,7 +1572,7 @@ def test_ogr_geom_circularstring(): assert g2 is not None # Test CIRCULARSTRING wrapped in a GEOMETRYCOLLECTION - in_wkt = 'GEOMETRYCOLLECTION(CIRCULARSTRING (0 0,1 1,1 -1))' + in_wkt = "GEOMETRYCOLLECTION(CIRCULARSTRING (0 0,1 1,1 -1))" g1 = ogr.CreateGeometryFromWkt(in_wkt) # Test GEOS operations @@ -1415,15 +1581,15 @@ def test_ogr_geom_circularstring(): assert g2 is not None # Test ForceToLineString - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToLineString(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiLineString - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToMultiLineString(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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 @@ -1431,9 +1597,11 @@ def test_ogr_geom_circularstring(): # 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)' + 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)') + 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 @@ -1442,9 +1610,11 @@ def test_ogr_geom_circularstring(): assert length == pytest.approx(expected_length, abs=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)' + 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)') + 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 @@ -1454,7 +1624,9 @@ def test_ogr_geom_circularstring(): # 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)') + 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 @@ -1463,33 +1635,45 @@ def test_ogr_geom_circularstring(): assert length == pytest.approx(expected_length, abs=1e-8) # Check segmentize symmetry : do exact binary comparison - in_wkt = 'CIRCULARSTRING (0 0,1.2 1,2 0)' + 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)' + 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])) + 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)' + 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)') + 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)') + 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)' + 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)') + 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 @@ -1498,9 +1682,9 @@ def test_ogr_geom_circularstring(): assert length == pytest.approx(expected_length, abs=1e-8) # Test stroking of a circular string with 3 colinear points - in_wkt = 'CIRCULARSTRING (0 0,1 1,2 2)' + 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)') + expected_g = ogr.CreateGeometryFromWkt("LINESTRING (0 0,1 1,2 2)") g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 @@ -1510,15 +1694,17 @@ def test_ogr_geom_circularstring(): # Test Value() p = g1.Value(length / 4.0) - expected_p = ogr.CreateGeometryFromWkt('POINT (0.5 0.5)') + 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)') + 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)') + 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 @@ -1527,25 +1713,27 @@ def test_ogr_geom_circularstring(): assert length == pytest.approx(expected_length, abs=1e-8) # Same with Z - in_wkt = 'CIRCULARSTRING (0 0 1,1 1 2,2 2 1)' + 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)') + 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)') + 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)') + 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)') + 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)' + in_wkt = "CIRCULARSTRING (0 0,1 1,1 -1)" # Test GetEnvelope() in various cases cx = 1 @@ -1556,13 +1744,22 @@ def test_ogr_geom_circularstring(): 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)) + 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)) + 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 env[i] == pytest.approx(expected_env[i], abs=1e-8) @@ -1570,13 +1767,22 @@ def test_ogr_geom_circularstring(): 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)) + 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)) + 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 env[i] == pytest.approx(expected_env[i], abs=1e-8) @@ -1584,10 +1790,14 @@ def test_ogr_geom_circularstring(): 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)) + 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) @@ -1598,10 +1808,14 @@ def test_ogr_geom_circularstring(): 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)) + 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) @@ -1612,10 +1826,14 @@ def test_ogr_geom_circularstring(): 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)) + 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) @@ -1623,14 +1841,14 @@ def test_ogr_geom_circularstring(): assert env[i] == pytest.approx(expected_env[i], abs=1e-8) # Error case : not enough points - in_wkt = 'CIRCULARSTRING (0 0)' - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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']: + for in_wkt in ["CIRCULARSTRING EMPTY", "CIRCULARSTRING Z EMPTY"]: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt @@ -1647,14 +1865,14 @@ def test_ogr_geom_circularstring(): def test_ogr_geom_compoundcurve(): - in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1))' + 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)' + 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) @@ -1674,13 +1892,13 @@ def test_ogr_geom_compoundcurve(): assert g1.HasCurveGeometry(True) # CreateGeometryFromWkt of LINESTRING - in_wkt = 'COMPOUNDCURVE ((0 0,0 10))' + 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))' + 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() @@ -1698,23 +1916,23 @@ def test_ogr_geom_compoundcurve(): # Test Value() p = g1.Value(-1e-3) - expected_p = ogr.CreateGeometryFromWkt('POINT (0 0 10)') + 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)') + 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)') + 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)') + 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)') + expected_p = ogr.CreateGeometryFromWkt("POINT (0 0 10)") assert ogrtest.check_feature_geometry(p, expected_p) == 0 wkb = g1.ExportToWkb() @@ -1725,7 +1943,7 @@ def test_ogr_geom_compoundcurve(): assert in_wkt == out_wkt # Several parts - in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,0 0))' + 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() @@ -1735,11 +1953,17 @@ def test_ogr_geom_compoundcurve(): assert g1.Equals(g1.Clone()) - assert not g1.Equals(ogr.CreateGeometryFromWkt('POINT(0 0)')) + 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))") + ) - assert not g1.Equals(ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,0 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) @@ -1750,27 +1974,31 @@ def test_ogr_geom_compoundcurve(): 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))' + 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) + 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)') + 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))' + 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') + 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) + 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)') + 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) @@ -1783,93 +2011,102 @@ def test_ogr_geom_compoundcurve(): g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToLineString(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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))') + 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) + 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))') + 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') + 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') + 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') + 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') + 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') + 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))' + 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.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))' + 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))' + 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.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))' + 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.PushErrorHandler("CPLQuietErrorHandler") + g.AddGeometryDirectly(ogr.CreateGeometryFromWkt("COMPOUNDCURVE((1 1,2 2))")) gdal.PopErrorHandler() - assert g.ExportToWkt() == 'COMPOUNDCURVE EMPTY' + 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))') + 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))') + 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): + 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))) @@ -1880,22 +2117,23 @@ def test_ogr_geom_compoundcurve(): 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 - ] + 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') + gdal.PushErrorHandler("CPLQuietErrorHandler") g = ogr.CreateGeometryFromWkb(wkb) gdal.PopErrorHandler() assert g is None, wkb # EMPTY - for in_wkt in ['COMPOUNDCURVE EMPTY', 'COMPOUNDCURVE Z EMPTY']: + for in_wkt in ["COMPOUNDCURVE EMPTY", "COMPOUNDCURVE Z EMPTY"]: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt @@ -1912,7 +2150,7 @@ def test_ogr_geom_compoundcurve(): def test_ogr_geom_curvepolygon(): - in_wkt = 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))' + in_wkt = "CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))" g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCurvePolygon out_wkt = g1.ExportToWkt() @@ -1920,7 +2158,9 @@ def test_ogr_geom_curvepolygon(): if ogrtest.have_geos(): p1 = g1.PointOnSurface() - assert (p1.GetX() - 0.5) * (p1.GetX() - 0.5) + p1.GetY() * p1.GetY() <= 0.5 * 0.5 + 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) @@ -1936,13 +2176,13 @@ def test_ogr_geom_curvepolygon(): assert in_wkt == out_wkt # CURVEPOLYGON of LINESTRING - in_wkt = 'CURVEPOLYGON ((0 0,0 10,10 10,10 0,0 0))' + 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))' + 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() @@ -1956,25 +2196,27 @@ def test_ogr_geom_curvepolygon(): 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))' + 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) + 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))') + 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))' + 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') + 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) + gdal.SetConfigOption("OGR_STROKE_CURVE", "FALSE") + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 @@ -1987,23 +2229,27 @@ def test_ogr_geom_curvepolygon(): assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToPolygon - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToPolygon(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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)))') + 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) + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Test ForceToMultiLineString - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + 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))') + 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 @@ -2012,13 +2258,13 @@ def test_ogr_geom_curvepolygon(): 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))' + 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)))' + 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) @@ -2029,117 +2275,146 @@ def test_ogr_geom_curvepolygon(): assert g2 is not None # Test ForceToPolygon - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToPolygon(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + gdal.SetConfigOption("OGR_ARC_STEPSIZE", None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiPolygon - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + gdal.SetConfigOption("OGR_ARC_STEPSIZE", "45") g2 = ogr.ForceToMultiPolygon(g1) - gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) + 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') + 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') + 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))' + in_wkt = "CURVEPOLYGON ((0 0,0 1,1 1,1 0))" with gdaltest.error_handler(): - with gdaltest.config_option('OGR_GEOMETRY_ACCEPT_UNCLOSED_RING', 'NO'): + with gdaltest.config_option("OGR_GEOMETRY_ACCEPT_UNCLOSED_RING", "NO"): g = ogr.CreateGeometryFromWkt(in_wkt) assert g is None # Area - g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,1 1,1 0,0 0))') + 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)))') + 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)))') + 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))') + 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))') + 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("POINT(0 0)")) - assert not g1.Equals(ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,1 1,1 0,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))') + 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))) + 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') + 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) + 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))) + 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))') + 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))') + 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))') + 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))') + g1 = ogr.CreateGeometryFromWkt( + "CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,2 0,1 -1,0 0))" + ) area = g1.Area() expected_area = math.pi assert area == pytest.approx(expected_area, abs=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))') + 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 area == pytest.approx(expected_area, abs=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)))') + 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 area == pytest.approx(expected_area, abs=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)))') + 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 area == pytest.approx(expected_area, abs=1e-10) # EMPTY - for in_wkt in ['CURVEPOLYGON EMPTY', 'CURVEPOLYGON Z EMPTY']: + for in_wkt in ["CURVEPOLYGON EMPTY", "CURVEPOLYGON Z EMPTY"]: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt @@ -2155,9 +2430,12 @@ def test_ogr_geom_curvepolygon(): 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) ) )') + 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 g.Area() == pytest.approx(2.0, abs=1e-10) + ############################################################################### # Test OGRMultiCurve @@ -2165,7 +2443,7 @@ def test_ogr_geom_curvepolygon(): def test_ogr_geom_multicurve(): # Simple test - in_wkt = 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))' + in_wkt = "MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))" g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbMultiCurve out_wkt = g1.ExportToWkt() @@ -2190,13 +2468,13 @@ def test_ogr_geom_multicurve(): assert g1.HasCurveGeometry(True) # MULTICURVE of LINESTRING - in_wkt = 'MULTICURVE ((0 0,1 0))' + 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))' + 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() @@ -2207,7 +2485,7 @@ def test_ogr_geom_multicurve(): 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)))' + 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 @@ -2217,10 +2495,10 @@ def test_ogr_geom_multicurve(): assert in_wkt == out_wkt # Test ForceToMultiLineString - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + 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))' + 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 @@ -2228,12 +2506,13 @@ def test_ogr_geom_multicurve(): assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Error case : wrong sub-geometry type - in_wkt = 'MULTILINESTRING (POINT EMPTY)' - gdal.PushErrorHandler('CPLQuietErrorHandler') + in_wkt = "MULTILINESTRING (POINT EMPTY)" + gdal.PushErrorHandler("CPLQuietErrorHandler") g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None + ############################################################################### # Test OGRMultiSurface @@ -2241,7 +2520,7 @@ def test_ogr_geom_multicurve(): def test_ogr_geom_multisurface(): # Simple test - in_wkt = 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0)))' + 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() @@ -2266,7 +2545,7 @@ def test_ogr_geom_multisurface(): assert g1.HasCurveGeometry(True) # Z - in_wkt = 'MULTISURFACE Z (CURVEPOLYGON Z (CIRCULARSTRING Z (0 0 10,1 0 10,0 0 10)))' + 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() @@ -2277,13 +2556,13 @@ def test_ogr_geom_multisurface(): assert in_wkt == out_wkt # MULTISURFACE of POLYGON - in_wkt = 'MULTISURFACE (((0 0,0 10,10 10,10 0,0 0)))' + 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)))' + 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 @@ -2293,10 +2572,10 @@ def test_ogr_geom_multisurface(): assert in_wkt == out_wkt # Test ForceToMultiPolygon - gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') + 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)))' + 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 @@ -2308,86 +2587,100 @@ def test_ogr_geom_multisurface(): # 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)))' + 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)' + assert p1.ExportToWkt() == "POINT (0.5 5.0)" # Error case : wrong sub-geometry type - in_wkt = 'MULTIPOLYGON (POINT EMPTY)' - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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' + 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))') + 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))') + 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))') + 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))') + 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)') + 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) + 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))') + 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)') + 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)' + 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)']: + 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() @@ -2397,7 +2690,14 @@ def test_ogr_geom_getcurvegeometry(): 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]) + 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: @@ -2406,7 +2706,7 @@ def test_ogr_geom_getcurvegeometry(): # 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("Difference found :") print(g1) print(g3) # return 'fail' @@ -2417,7 +2717,14 @@ def test_ogr_geom_getcurvegeometry(): 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]) + 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: @@ -2426,7 +2733,7 @@ def test_ogr_geom_getcurvegeometry(): # 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("Difference found :") print(g1) print(g3) # return 'fail' @@ -2435,7 +2742,14 @@ def test_ogr_geom_getcurvegeometry(): 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]) + 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: @@ -2444,132 +2758,164 @@ def test_ogr_geom_getcurvegeometry(): # 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("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)') + 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)') + 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) + 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))']: + 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)') + 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)') + 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))') + 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))') + 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)') + 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)') + 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)') + 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)') + 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)') + 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)') + 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)') + 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']) + 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']) + 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)') + 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)') + 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']) + 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)') + 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.PushErrorHandler("CPLQuietErrorHandler") + g2_new = g1.GetLinearGeometry( + options=["bla", "ADD_INTERMEDIATE_POINT=FALSE", "foo=bar"] + ) gdal.PopErrorHandler() assert g2_new.Equals(g2) @@ -2589,76 +2935,119 @@ def test_ogr_geom_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)]: + 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), \ - '' + 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))') + 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))') + 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))))') + 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))') + 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))') + 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))') + 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)))' + 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))') + 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))' or \ - g3.ExportToWkt() == 'MULTICURVE (CIRCULARSTRING (2 0,1 -1,0 0),CIRCULARSTRING (0 0,1 1,2 0))' # GEOS OverlayNG - - g1 = ogr.CreateGeometryFromWkt('POINT(1 2)') + assert ( + g3.ExportToWkt() + == "MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,1 -1,0 0))" + or g3.ExportToWkt() + == "MULTICURVE (CIRCULARSTRING (2 0,1 -1,0 0),CIRCULARSTRING (0 0,1 1,2 0))" + ) # GEOS OverlayNG + + 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))' + assert ( + g1.ExportToWkt() + == "CURVEPOLYGON (CIRCULARSTRING (1.5 2.0,0.5 2.0,1.5 2.0))" + ) ############################################################################### @@ -2668,212 +3057,237 @@ def test_ogr_geom_getcurvegeometry(): 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)] + 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)] + 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)] + 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)] + 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)] + 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)] + 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), - ] + 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)] + 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)] + 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)] + 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)] + 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)] + 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)] + 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 @@ -2933,8 +3347,8 @@ def test_ogr_geom_api_limit_tests(): 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)') + 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()) @@ -2943,8 +3357,8 @@ def test_ogr_geom_equals(): 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)') + 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) @@ -2952,8 +3366,8 @@ def test_ogr_geom_equals(): 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))') + 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()) @@ -2961,41 +3375,115 @@ def test_ogr_geom_equals(): 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)))'], - ] + 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) @@ -3023,17 +3511,18 @@ def test_ogr_geom_measured_geometries_to_2D_or_3D(): geom.SetMeasured(geom.IsMeasured()) assert geom.ExportToIsoWkt() == before - assert ogr.CreateGeometryFromWkt('POINT (1 2)').CoordinateDimension() == 2 + assert ogr.CreateGeometryFromWkt("POINT (1 2)").CoordinateDimension() == 2 - assert ogr.CreateGeometryFromWkt('POINT M (1 2 3)').CoordinateDimension() == 3 + assert ogr.CreateGeometryFromWkt("POINT M (1 2 3)").CoordinateDimension() == 3 - assert ogr.CreateGeometryFromWkt('POINT Z (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 + 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))' + g = ogr.CreateGeometryFromWkt("MULTIPOINT (1 2 3 4)") + assert g.ExportToIsoWkt() == "MULTIPOINT ZM ((1 2 3 4))" + ############################################################################### # Test PostGIS EWKT with XYM @@ -3041,9 +3530,13 @@ def test_ogr_geom_measured_geometries_to_2D_or_3D(): 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))'], - ] + 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 @@ -3055,14 +3548,16 @@ def test_ogr_geom_postgis_ewkt_xym(): 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"]] + 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 @@ -3074,21 +3569,22 @@ def test_ogr_geom_curve_surface(): 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)))', - ] + 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) @@ -3126,13 +3622,15 @@ def test_ogr_geom_import_corrupted_wkb(): 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)))"] + 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: @@ -3140,51 +3638,85 @@ def test_ogr_geom_triangle_ps_tin_conversion(): 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]): + 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: + 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) + 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) + 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( + "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)))" - 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)') + 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)') + 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) + ############################################################################### @@ -3195,6 +3727,7 @@ def test_ogr_geom_polygon_empty_ring(): g.AddGeometryDirectly(g2) assert g.IsEmpty() + ############################################################################### @@ -3203,33 +3736,36 @@ 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))') + 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)'] + 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 @@ -3241,25 +3777,43 @@ def test_ogr_geom_geometrycollection(): 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))))') + 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(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(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() + 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 = 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))))' + 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))))" + ) + ############################################################################### @@ -3267,54 +3821,63 @@ def test_ogr_geom_swapxy(): def test_ogr_geom_remove_geometry(): # With GEOMETRYCOLLECTION - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,2 3),POINT (3 4))') + 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.ExportToWkt() == "GEOMETRYCOLLECTION (POINT (1 2),POINT (3 4))" assert g.RemoveGeometry(1) == 0 - assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (1 2))' + assert g.ExportToWkt() == "GEOMETRYCOLLECTION (POINT (1 2))" assert g.RemoveGeometry(0) == 0 - assert g.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' + assert g.ExportToWkt() == "GEOMETRYCOLLECTION EMPTY" - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,2 3),POINT (3 4))') + 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' + 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)))') + 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.ExportToWkt() == "TIN (((0 0,0 1,1 1,0 0)))" assert g.RemoveGeometry(0) == 0 - assert g.ExportToWkt() == 'TIN EMPTY' + 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)))') + 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' + 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))') + 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.ExportToWkt() == "POLYGON ((0 0,0 10,10 10,10 0,0 0))" assert g.RemoveGeometry(0) == 0 - assert g.ExportToWkt() == 'POLYGON EMPTY' + 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))') + 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' + assert g.ExportToWkt() == "POLYGON EMPTY" # Unsupported type - g = ogr.CreateGeometryFromWkt('POINT (0 0)') + g = ogr.CreateGeometryFromWkt("POINT (0 0)") assert g.RemoveGeometry(0) != 0 + ############################################################################### @@ -3323,18 +3886,19 @@ def test_ogr_geom_sfcgal(): if not ogrtest.have_sfcgal(): pytest.skip() - g1 = ogr.CreateGeometryFromWkt('TIN EMPTY') + g1 = ogr.CreateGeometryFromWkt("TIN EMPTY") - g2_poly = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))') + 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') + g2 = ogr.CreateGeometryFromWkt("CIRCULARSTRING EMPTY") g1.Distance(g2) - g2 = ogr.CreateGeometryFromWkt('CURVEPOLYGON EMPTY') + g2 = ogr.CreateGeometryFromWkt("CURVEPOLYGON EMPTY") g1.Distance(g2) + ############################################################################### @@ -3343,28 +3907,38 @@ 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))') + 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)' + 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))') + 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))' + 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)))' + 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)))" + ############################################################################### @@ -3374,43 +3948,74 @@ def test_ogr_geom_makevalid(): if not ogrtest.have_geos(): pytest.skip() - if ogr.GetGEOSVersionMajor() * 10000 + ogr.GetGEOSVersionMinor() * 100 + ogr.GetGEOSVersionMicro() < 30800: + if ( + ogr.GetGEOSVersionMajor() * 10000 + + ogr.GetGEOSVersionMinor() * 100 + + ogr.GetGEOSVersionMicro() + < 30800 + ): pytest.skip() - g = ogr.CreateGeometryFromWkt('POINT (0 0)') + g = ogr.CreateGeometryFromWkt("POINT (0 0)") g = g.MakeValid() - assert g is None or g.ExportToWkt() == 'POINT (0 0)' + assert g is None or g.ExportToWkt() == "POINT (0 0)" - g = ogr.CreateGeometryFromWkt('POINT EMPTY') + g = ogr.CreateGeometryFromWkt("POINT EMPTY") g = g.MakeValid() - assert g is None or g.ExportToWkt() == 'POINT EMPTY' + assert g is None or g.ExportToWkt() == "POINT EMPTY" - g = ogr.CreateGeometryFromWkt('LINESTRING (0 0)') + 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 = 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))' + 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 = ogr.CreateGeometryFromWkt("POLYGON ((0 0,10 10,0 10,10 0,0 0))") g = g.MakeValid() - assert g is None or ogrtest.check_feature_geometry(g, 'MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))') == 0, g.ExportToWkt() + assert ( + g is None + or ogrtest.check_feature_geometry( + g, "MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))" + ) + == 0 + ), g.ExportToWkt() # Invalid - g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,10 10,0 10,10 0,0 0))') + g = ogr.CreateGeometryFromWkt("CURVEPOLYGON ((0 0,10 10,0 10,10 0,0 0))") g = g.MakeValid() - assert g is None or ogrtest.check_feature_geometry(g, 'MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))') == 0, g.ExportToWkt() - - if ogr.GetGEOSVersionMajor() * 10000 + ogr.GetGEOSVersionMinor() * 100 + ogr.GetGEOSVersionMicro() >= 31000: - g = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 10,10 10,10 0,0 0),(5 5,15 10,15 0,5 5))') + assert ( + g is None + or ogrtest.check_feature_geometry( + g, "MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))" + ) + == 0 + ), g.ExportToWkt() + + if ( + ogr.GetGEOSVersionMajor() * 10000 + + ogr.GetGEOSVersionMinor() * 100 + + ogr.GetGEOSVersionMicro() + >= 31000 + ): + g = ogr.CreateGeometryFromWkt( + "POLYGON ((0 0,0 10,10 10,10 0,0 0),(5 5,15 10,15 0,5 5))" + ) # Only since GEOS 3.10 - g = g.MakeValid(['METHOD=STRUCTURE']) - assert g is None or ogrtest.check_feature_geometry(g, 'POLYGON ((0 10,10 10,10.0 7.5,5 5,10.0 2.5,10 0,0 0,0 10))') == 0, g.ExportToWkt() + g = g.MakeValid(["METHOD=STRUCTURE"]) + assert ( + g is None + or ogrtest.check_feature_geometry( + g, "POLYGON ((0 10,10 10,10.0 7.5,5 5,10.0 2.5,10 0,0 0,0 10))" + ) + == 0 + ), g.ExportToWkt() + + return "success" - return 'success' ############################################################################### @@ -3420,11 +4025,11 @@ def test_ogr_geom_normalize(): if not ogrtest.have_geos(): pytest.skip() - g = ogr.CreateGeometryFromWkt('POLYGON ((0 1,1 1,1 0,0 0,0 1))') + g = ogr.CreateGeometryFromWkt("POLYGON ((0 1,1 1,1 0,0 0,0 1))") g = g.Normalize() - assert g is None or g.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' + assert g is None or g.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,1 0,0 0))" - return 'success' + return "success" ############################################################################### @@ -3432,34 +4037,66 @@ def test_ogr_geom_normalize(): 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.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))' + assert g.ExportToIsoWkt() == "COMPOUNDCURVE Z ((0 0 0,0 1 0,1 1 0,0 0 0))" + ############################################################################### + @pytest.mark.parametrize( - 'input_wkt,expected_wkt', + "input_wkt,expected_wkt", [ - ('POINT EMPTY', 'POINT EMPTY'), - ('POINT (1 2)', 'POINT (1 2)'), - ('POINT Z (1 2 3)', 'POINT Z (1 2 3)'), - ('LINESTRING (1 2,3 4)', 'LINESTRING (1 2,3 4)'), - ('POLYGON ((0 0,0 1,1 1,0 0))', 'POLYGON ((0 0,0 1,1 1,0 0))'), - ('GEOMETRYCOLLECTION EMPTY', 'GEOMETRYCOLLECTION EMPTY'), - ('GEOMETRYCOLLECTION Z (POINT Z (1 2 3))', 'POINT Z (1 2 3)'), - ('GEOMETRYCOLLECTION (LINESTRING (1 2,3 4))', 'LINESTRING (1 2,3 4)'), - ('GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))', 'POLYGON ((0 0,0 1,1 1,0 0))'), - ('GEOMETRYCOLLECTION (LINESTRING (1 2,3 4),POINT (1 2))', 'LINESTRING (1 2,3 4)'), - ('GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,3 4))', 'LINESTRING (1 2,3 4)'), - ('GEOMETRYCOLLECTION (LINESTRING (1 2,3 4),LINESTRING (5 6,7 8))', 'MULTILINESTRING ((1 2,3 4),(5 6,7 8))'), - ('GEOMETRYCOLLECTION (POINT (1 2),POLYGON ((0 0,0 1,1 1,0 0)))', 'POLYGON ((0 0,0 1,1 1,0 0))'), - ('GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),POLYGON ((10 0,10 1,11 1,10 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))'), - ('GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),MULTIPOLYGON (((10 0,10 1,11 1,10 0))))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))'), - ('GEOMETRYCOLLECTION (CIRCULARSTRING (0 0,1 1,2 0),LINESTRING(3 4,5 6))', 'MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0),(3 4,5 6))'), - ('GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),CURVEPOLYGON ((10 0,10 1,11 1,10 0)))', 'MULTISURFACE (((0 0,0 1,1 1,0 0)),CURVEPOLYGON ((10 0,10 1,11 1,10 0)))'), - ('GEOMETRYCOLLECTION (MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0))),POINT (1 2))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))'), - ] + ("POINT EMPTY", "POINT EMPTY"), + ("POINT (1 2)", "POINT (1 2)"), + ("POINT Z (1 2 3)", "POINT Z (1 2 3)"), + ("LINESTRING (1 2,3 4)", "LINESTRING (1 2,3 4)"), + ("POLYGON ((0 0,0 1,1 1,0 0))", "POLYGON ((0 0,0 1,1 1,0 0))"), + ("GEOMETRYCOLLECTION EMPTY", "GEOMETRYCOLLECTION EMPTY"), + ("GEOMETRYCOLLECTION Z (POINT Z (1 2 3))", "POINT Z (1 2 3)"), + ("GEOMETRYCOLLECTION (LINESTRING (1 2,3 4))", "LINESTRING (1 2,3 4)"), + ( + "GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))", + "POLYGON ((0 0,0 1,1 1,0 0))", + ), + ( + "GEOMETRYCOLLECTION (LINESTRING (1 2,3 4),POINT (1 2))", + "LINESTRING (1 2,3 4)", + ), + ( + "GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,3 4))", + "LINESTRING (1 2,3 4)", + ), + ( + "GEOMETRYCOLLECTION (LINESTRING (1 2,3 4),LINESTRING (5 6,7 8))", + "MULTILINESTRING ((1 2,3 4),(5 6,7 8))", + ), + ( + "GEOMETRYCOLLECTION (POINT (1 2),POLYGON ((0 0,0 1,1 1,0 0)))", + "POLYGON ((0 0,0 1,1 1,0 0))", + ), + ( + "GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),POLYGON ((10 0,10 1,11 1,10 0)))", + "MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))", + ), + ( + "GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),MULTIPOLYGON (((10 0,10 1,11 1,10 0))))", + "MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))", + ), + ( + "GEOMETRYCOLLECTION (CIRCULARSTRING (0 0,1 1,2 0),LINESTRING(3 4,5 6))", + "MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0),(3 4,5 6))", + ), + ( + "GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)),CURVEPOLYGON ((10 0,10 1,11 1,10 0)))", + "MULTISURFACE (((0 0,0 1,1 1,0 0)),CURVEPOLYGON ((10 0,10 1,11 1,10 0)))", + ), + ( + "GEOMETRYCOLLECTION (MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0))),POINT (1 2))", + "MULTIPOLYGON (((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))", + ), + ], ) def test_ogr_geom_removeLowerDimensionSubGeoms(input_wkt, expected_wkt): @@ -3470,9 +4107,10 @@ def test_ogr_geom_removeLowerDimensionSubGeoms(input_wkt, expected_wkt): ############################################################################### + def test_ogr_geom_copy(): - g = ogr.CreateGeometryFromWkt('POINT (0 1)') + g = ogr.CreateGeometryFromWkt("POINT (0 1)") sr = osr.SpatialReference() sr.ImportFromEPSG(4326) g.AssignSpatialReference(sr) @@ -3486,9 +4124,10 @@ def test_ogr_geom_copy(): ############################################################################### + def test_ogr_geom_deepcopy(): - g = ogr.CreateGeometryFromWkt('POINT (0 1)') + g = ogr.CreateGeometryFromWkt("POINT (0 1)") sr = osr.SpatialReference() sr.ImportFromEPSG(4326) g.AssignSpatialReference(sr) @@ -3499,6 +4138,7 @@ def test_ogr_geom_deepcopy(): sr.ImportFromEPSG(32631) assert not g2.GetSpatialReference().IsSame(sr) + ############################################################################### # Test that setting a Point with NaN is like setting a POINT EMPTY @@ -3506,5 +4146,5 @@ def test_ogr_geom_deepcopy(): def test_ogr_geom_point_nan(): geom = ogr.Geometry(type=ogr.wkbPoint) - geom.AddPoint_2D(float('nan'), float('nan')) + geom.AddPoint_2D(float("nan"), float("nan")) assert geom.IsEmpty() diff --git a/autotest/ogr/ogr_georss.py b/autotest/ogr/ogr_georss.py index acf363abb2b8..1bb79e9adbaf 100755 --- a/autotest/ogr/ogr_georss.py +++ b/autotest/ogr/ogr_georss.py @@ -31,20 +31,18 @@ import os - import gdaltest -from osgeo import ogr -from osgeo import osr -from osgeo import gdal import pytest -pytestmark = pytest.mark.require_driver('GeoRSS') +from osgeo import gdal, ogr, osr + +pytestmark = pytest.mark.require_driver("GeoRSS") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - ds = ogr.Open('data/georss/atom_rfc_sample.xml') + ds = ogr.Open("data/georss/atom_rfc_sample.xml") if ds is None: gdaltest.georss_read_support = 0 else: @@ -53,46 +51,54 @@ def startup_and_cleanup(): gdaltest.have_gml_reader = 0 try: - ds = ogr.Open('data/gml/ionic_wfs.gml') + ds = ogr.Open("data/gml/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)] + 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), + ] yield - list_files = ['tmp/test_rss2.xml', 'tmp/test_atom.xml', 'tmp/test32631.rss', 'tmp/broken.rss', 'tmp/nonstandard.rss'] + 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') + files = os.listdir("data") for filename in files: - if len(filename) > 13 and filename[-13:] == '.resolved.gml': - os.unlink('data/georss/' + filename) + if len(filename) > 13 and filename[-13:] == ".resolved.gml": + os.unlink("data/georss/" + filename) ############################################################################### @@ -105,18 +111,28 @@ def ogr_georss_test_atom(filename): pytest.skip() ds = ogr.Open(filename) - lyr = ds.GetLayerByName('georss') + lyr = ds.GetLayerByName("georss") - assert lyr.GetSpatialRef() is None, 'No spatial ref expected' + 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(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")) - assert feat.GetFieldAsString('content').find('
') != -1, \ - ('For field "%s", got "%s"' % ('content', feat.GetFieldAsString('content'))) ############################################################################### # Test reading an ATOM document without any geometry @@ -124,7 +140,8 @@ def ogr_georss_test_atom(filename): def test_ogr_georss_1(): - return ogr_georss_test_atom('data/georss/atom_rfc_sample.xml') + return ogr_georss_test_atom("data/georss/atom_rfc_sample.xml") + ############################################################################### # Test reading an ATOM document with atom: prefiw @@ -132,7 +149,8 @@ def test_ogr_georss_1(): def test_ogr_georss_1_atom_ns(): - return ogr_georss_test_atom('data/georss/atom_rfc_sample_atom_ns.xml') + return ogr_georss_test_atom("data/georss/atom_rfc_sample_atom_ns.xml") + ############################################################################### # Test writing a Atom 1.0 document (doesn't need read support) @@ -141,23 +159,28 @@ def test_ogr_georss_1_atom_ns(): def test_ogr_georss_1bis(): try: - os.remove('tmp/test_atom.xml') + 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') + 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)) + 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.]

') + dst_feat.SetField( + "content", + '

[Update: The Atom draft is finished.]

', + ) - assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." ds = None @@ -165,14 +188,16 @@ def test_ogr_georss_1bis(): ############################################################################### # Test reading document created at previous step + def test_ogr_georss_1ter(): - return ogr_georss_test_atom('tmp/test_atom.xml') + 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: @@ -184,43 +209,52 @@ def ogr_georss_test_rss(filename, only_first_feature): lyr = ds.GetLayer(0) srs = osr.SpatialReference() - srs.SetWellKnownGeogCS('WGS84') + 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() 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' + 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' + 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' + 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' + 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 @@ -228,7 +262,8 @@ def ogr_georss_test_rss(filename, only_first_feature): def test_ogr_georss_2(): - return ogr_georss_test_rss('data/georss/test_georss_simple.xml', False) + return ogr_georss_test_rss("data/georss/test_georss_simple.xml", False) + ############################################################################### # Test reading a RSS 2.0 document with GeoRSS GML geometries @@ -239,7 +274,8 @@ def test_ogr_georss_3(): if not gdaltest.have_gml_reader: pytest.skip() - return ogr_georss_test_rss('data/georss/test_georss_gml.xml', False) + return ogr_georss_test_rss("data/georss/test_georss_gml.xml", False) + ############################################################################### # Test writing a RSS 2.0 document (doesn't need read support) @@ -251,71 +287,79 @@ def ogr_georss_create(filename, options): 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)) + 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.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)')) + 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.' + 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))')) + 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.' + 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))')) + 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.' + 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', []) + ogr_georss_create("tmp/test_rss2.xml", []) + + content = open("tmp/test_rss2.xml").read() + assert content.find("49 2") != -1, "%s" % content - content = open('tmp/test_rss2.xml').read() - assert content.find('49 2') != -1, ('%s' % content) ############################################################################### # Test reading document created at previous step @@ -323,7 +367,8 @@ def test_ogr_georss_4(): def test_ogr_georss_5(): - return ogr_georss_test_rss('tmp/test_rss2.xml', False) + 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) @@ -331,11 +376,11 @@ def test_ogr_georss_5(): def test_ogr_georss_6(): - ogr_georss_create('tmp/test_rss2.xml', ['GEOM_DIALECT=GML']) + 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 - content = open('tmp/test_rss2.xml').read() - assert content.find('49 2') != -1, \ - ('%s' % content) ############################################################################### # Test reading document created at previous step @@ -345,7 +390,8 @@ def test_ogr_georss_7(): if not gdaltest.have_gml_reader: pytest.skip() - return ogr_georss_test_rss('tmp/test_rss2.xml', False) + 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) @@ -353,11 +399,13 @@ def test_ogr_georss_7(): def test_ogr_georss_8(): - ogr_georss_create('tmp/test_rss2.xml', ['GEOM_DIALECT=W3C_GEO']) + 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) - 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 @@ -365,7 +413,8 @@ def test_ogr_georss_8(): def test_ogr_georss_9(): - return ogr_georss_test_rss('tmp/test_rss2.xml', True) + return ogr_georss_test_rss("tmp/test_rss2.xml", True) + ############################################################################### # Test writing a RSS 2.0 document in GML dialect with EPSG:32631 @@ -373,42 +422,49 @@ def test_ogr_georss_9(): def test_ogr_georss_10(): try: - os.remove('tmp/test32631.rss') + 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') + ds = ogr.GetDriverByName("GeoRSS").CreateDataSource("tmp/test32631.rss") + gdal.PushErrorHandler("CPLQuietErrorHandler") try: - lyr = ds.CreateLayer('georss', srs=srs) + 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' + assert lyr is None, "should not have accepted EPSG:32631 with GEOM_DIALECT != GML" ds = None try: - os.remove('tmp/test32631.rss') + 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) + 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)')) + dst_feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT (500000 4000000)")) - assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." ds = None - content = open('tmp/test32631.rss').read() - assert content.find('500000 4000000') != -1, \ - ('%s' % content) + content = open("tmp/test32631.rss").read() + assert ( + content.find( + '500000 4000000' + ) + != -1 + ), ("%s" % content) + ############################################################################### # Test reading document created at previous step @@ -421,23 +477,33 @@ def test_ogr_georss_11(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('tmp/test32631.rss') + 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]!') + 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()) + expected_wkt = "POINT (500000 4000000)" + assert feat.GetGeometryRef().ExportToWkt() == expected_wkt, ( + "%s" % feat.GetGeometryRef().ExportToWkt() + ) + ############################################################################### # Test various broken documents @@ -448,55 +514,65 @@ 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') + 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') + 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') + 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') + os.remove("tmp/nonstandard.rss") except OSError: pass - ds = ogr.GetDriverByName('GeoRSS').CreateDataSource('tmp/nonstandard.rss', options=['USE_EXTENSIONS=YES']) - lyr = ds.CreateLayer('georss') + 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)) + 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') + 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.' + 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) + 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 @@ -507,17 +583,24 @@ def test_ogr_georss_14(): if not gdaltest.georss_read_support: pytest.skip() - ds = ogr.Open('tmp/nonstandard.rss') + 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'))) + 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) @@ -548,15 +631,17 @@ def test_ogr_georss_15(): """ # Create in-memory file - gdal.FileFromMemBuffer('/vsimem/georssinmem', content) + gdal.FileFromMemBuffer("/vsimem/georssinmem", content) - ds = ogr.Open('/vsimem/georssinmem') + 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'))) + 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') + gdal.Unlink("/vsimem/georssinmem") diff --git a/autotest/ogr/ogr_geos.py b/autotest/ogr/ogr_geos.py index 690f3edd8a62..eb368b52925b 100755 --- a/autotest/ogr/ogr_geos.py +++ b/autotest/ogr/ogr_geos.py @@ -28,32 +28,34 @@ ############################################################################### - import gdaltest import ogrtest -from osgeo import ogr -from osgeo import gdal import pytest +from osgeo import gdal, ogr + + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): if not ogrtest.have_geos(): pytest.skip() + ############################################################################### # Establish whether we have GEOS support integrated, testing simple Union. def test_ogr_geos_union(): - pnt1 = ogr.CreateGeometryFromWkt('POINT(10 20)') - pnt2 = ogr.CreateGeometryFromWkt('POINT(30 20)') + 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)') + assert not ogrtest.check_feature_geometry(result, "MULTIPOINT (10 20,30 20)") + ############################################################################### # Test polygon intersection. @@ -61,13 +63,15 @@ def test_ogr_geos_union(): def test_ogr_geos_intersection(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') + 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()) + assert not ogrtest.check_feature_geometry(result, "POLYGON ((0 0,5 5,10 0,0 0))"), ( + "Got: %s" % result.ExportToWkt() + ) + ############################################################################### # Test polygon difference. @@ -75,14 +79,15 @@ def test_ogr_geos_intersection(): def test_ogr_geos_difference(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') + 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()) + assert not ogrtest.check_feature_geometry( + result, "POLYGON ((5 5,10 10,10 0,5 5))" + ), ("Got: %s" % result.ExportToWkt()) + ############################################################################### # Test polygon symmetric difference. @@ -90,14 +95,15 @@ def test_ogr_geos_difference(): def test_ogr_geos_symmetric_difference(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') + 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()) + 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. @@ -105,14 +111,15 @@ def test_ogr_geos_symmetric_difference(): def test_ogr_geos_sym_difference(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') + 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()) + 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(). @@ -120,19 +127,20 @@ def test_ogr_geos_sym_difference(): def test_ogr_geos_intersect(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') - g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') + 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)' + 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))') + 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)' + assert result == 0, "wrong result (got true)" + ############################################################################### # Test disjoint(). @@ -140,19 +148,20 @@ def test_ogr_geos_intersect(): def test_ogr_geos_disjoint(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') - g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') + 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)' + 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))') + 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)' + assert result != 0, "wrong result (got false)" + ############################################################################### # Test touches. @@ -160,19 +169,20 @@ def test_ogr_geos_disjoint(): def test_ogr_geos_touches(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') - g2 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 0 10)') + 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)' + 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))') + 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)' + assert result == 0, "wrong result (got true)" + ############################################################################### # Test crosses. @@ -180,166 +190,191 @@ def test_ogr_geos_touches(): def test_ogr_geos_crosses(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') - g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') + 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)' + assert result != 0, "wrong result (got false)" - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') - g2 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 0 10)') + 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)' + assert result == 0, "wrong result (got true)" + ############################################################################### def test_ogr_geos_within(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') + 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)' + assert result != 0, "wrong result (got false)" result = g2.Within(g1) - assert result == 0, 'wrong result (got true)' + assert result == 0, "wrong result (got true)" + ############################################################################### def test_ogr_geos_contains(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') + 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)' + assert result != 0, "wrong result (got false)" result = g1.Contains(g2) - assert result == 0, 'wrong result (got true)' + assert result == 0, "wrong result (got true)" + ############################################################################### def test_ogr_geos_overlaps(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') - g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') + 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)' + 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))') + 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)' + assert result != 0, "wrong result (got false)" + ############################################################################### def test_ogr_geos_buffer(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') + g1 = ogr.CreateGeometryFromWkt("POLYGON((0 0, 10 10, 10 0, 0 0))") result = g1.Buffer(1.0, 3) assert result is not None assert result.Area() > g1.Area() + ############################################################################### def test_ogr_geos_centroid(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') + 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()) + 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))') + # 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()) + assert ogrtest.check_feature_geometry(centroid2, "POINT (8.0 1.0)") == 0, ( + "Got: %s" % centroid2.ExportToWkt() + ) + ############################################################################### def test_ogr_geos_centroid_multipolygon(): - g1 = ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,1 0,0 0)),((2 0,2 1,3 1,3 0,2 0)))') + 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()) + assert ogrtest.check_feature_geometry(centroid, "POINT (1.5 0.5)") == 0, ( + "Got: %s" % centroid.ExportToWkt() + ) + ############################################################################### def test_ogr_geos_centroid_point_empty(): - g1 = ogr.CreateGeometryFromWkt('POINT EMPTY') + g1 = ogr.CreateGeometryFromWkt("POINT EMPTY") centroid = g1.Centroid() - assert centroid.ExportToWkt() == 'POINT EMPTY', ('Got: %s' % centroid.ExportToWkt()) + assert centroid.ExportToWkt() == "POINT EMPTY", "Got: %s" % centroid.ExportToWkt() + ############################################################################### def test_ogr_geos_simplify_linestring(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0,10 0)') + 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()) + assert simplify.ExportToWkt() == "LINESTRING (0 0,10 0)", ( + "Got: %s" % simplify.ExportToWkt() + ) + ############################################################################### def test_ogr_geos_simplifypreservetopology_linestring(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0,10 0)') + 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()) + assert simplify.ExportToWkt() == "LINESTRING (0 0,10 0)", ( + "Got: %s" % simplify.ExportToWkt() + ) + ############################################################################### def test_ogr_geos_unioncascaded(): - 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)))') + 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 ogrtest.check_feature_geometry(cascadedunion, '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))') == 0, \ - ('Got: %s' % cascadedunion.ExportToWkt()) + assert ( + ogrtest.check_feature_geometry( + cascadedunion, + "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))", + ) + == 0 + ), ( + "Got: %s" % cascadedunion.ExportToWkt() + ) + ############################################################################### @@ -350,30 +385,35 @@ def test_ogr_geos_unioncascaded_empty_multipolygon(): cascadedunion = g1.UnionCascaded() assert cascadedunion.IsEmpty() + ############################################################################### def test_ogr_geos_convexhull(): - g1 = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 1), POINT(0 0), POINT(1 0), POINT(1 1))') + 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()) + assert convexhull.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,1 0,0 0))", ( + "Got: %s" % convexhull.ExportToWkt() + ) + ############################################################################### def test_ogr_geos_concavehull(): - g1 = ogr.CreateGeometryFromWkt('MULTIPOINT(0 0,0.4 0.5,0 1,1 1,0.6 0.5,1 0)') + g1 = ogr.CreateGeometryFromWkt("MULTIPOINT(0 0,0.4 0.5,0 1,1 1,0.6 0.5,1 0)") with gdaltest.error_handler(): res = g1.ConcaveHull(0.5, False) if res is None: - assert 'GEOS 3.11' in gdal.GetLastErrorMsg() + assert "GEOS 3.11" in gdal.GetLastErrorMsg() pytest.skip(gdal.GetLastErrorMsg()) with gdaltest.error_handler(): @@ -386,97 +426,106 @@ def test_ogr_geos_concavehull(): def test_ogr_geos_distance(): - g1 = ogr.CreateGeometryFromWkt('POINT(0 0)') - g2 = ogr.CreateGeometryFromWkt('POINT(1 0)') + g1 = ogr.CreateGeometryFromWkt("POINT(0 0)") + g2 = ogr.CreateGeometryFromWkt("POINT(1 0)") distance = g1.Distance(g2) - assert distance == pytest.approx(1, abs=0.00000000001), \ - ('Distance() result wrong, got %g.' % distance) + assert distance == pytest.approx(1, abs=0.00000000001), ( + "Distance() result wrong, got %g." % distance + ) + ############################################################################### def test_ogr_geos_isring(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1,1 1,0 0)') + g1 = ogr.CreateGeometryFromWkt("LINESTRING(0 0,0 1,1 1,0 0)") isring = g1.IsRing() assert isring == 1 + ############################################################################### def test_ogr_geos_issimple_true(): - g1 = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))') + 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(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)') + 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(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 1 1)') + g1 = ogr.CreateGeometryFromWkt("LINESTRING(0 0, 1 1)") isring = g1.IsValid() assert isring == 1 + ############################################################################### def test_ogr_geos_isvalid_true_linestringM(): - g1 = ogr.CreateGeometryFromWkt('LINESTRING M(0 0 10, 1 1 20)') + g1 = ogr.CreateGeometryFromWkt("LINESTRING M(0 0 10, 1 1 20)") isring = g1.IsValid() assert isring == 1 + ############################################################################### def test_ogr_geos_isvalid_true_circularStringM(): - g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING M(0 0 10, 1 1 20,2 0 30)') + 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(): - g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,0 1,1 1,0 0))') + g1 = ogr.CreateGeometryFromWkt("TRIANGLE ((0 0,0 1,1 1,0 0))") isring = g1.IsValid() assert isring == 1 + ############################################################################### def test_ogr_geos_isvalid_false(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0,1 1,1 2,1 1,0 0))') + g1 = ogr.CreateGeometryFromWkt("POLYGON((0 0,1 1,1 2,1 1,0 0))") with gdaltest.error_handler(): isring = g1.IsValid() @@ -488,7 +537,9 @@ def test_ogr_geos_isvalid_false(): def test_ogr_geos_isvalid_false_too_few_points(): - g1 = ogr.CreateGeometryFromWkt('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (2 2, 3 2, 2 2))') + g1 = ogr.CreateGeometryFromWkt( + "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (2 2, 3 2, 2 2))" + ) with ogrtest.enable_exceptions(): # fail test if exception is thrown with gdaltest.error_handler(): @@ -502,61 +553,67 @@ def test_ogr_geos_isvalid_false_too_few_points(): def test_ogr_geos_pointonsurface(): - g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') + 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(): - g1 = ogr.CreateGeometryFromWkt('MULTIPOINT(0 0,0 1,1 1,1 0)') + g1 = ogr.CreateGeometryFromWkt("MULTIPOINT(0 0,0 1,1 1,1 0)") gdal.ErrorReset() triangulation = g1.DelaunayTriangulation() if triangulation is None: - assert gdal.GetLastErrorMsg() != '' + 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()) + 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(): - g = ogr.CreateGeometryFromWkt('MULTILINESTRING((0 0,0 1,1 1),(1 1,0 0))') + 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()) + assert got.ExportToWkt() == "GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))", ( + "Got: %s" % got.ExportToWkt() + ) - g = ogr.CreateGeometryFromWkt('POINT EMPTY') + g = ogr.CreateGeometryFromWkt("POINT EMPTY") got = g.Polygonize() - assert got is None, ('Got: %s' % got.ExportToWkt()) + assert got is None, "Got: %s" % got.ExportToWkt() - g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT EMPTY)') + g = ogr.CreateGeometryFromWkt("GEOMETRYCOLLECTION(POINT EMPTY)") got = g.Polygonize() - assert got is None, ('Got: %s' % got.ExportToWkt()) + assert got is None, "Got: %s" % got.ExportToWkt() + ############################################################################### def test_ogr_geos_prepared_geom(): - g = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))') + g = ogr.CreateGeometryFromWkt("POLYGON((0 0,0 1,1 1,1 0,0 0))") pg = g.CreatePreparedGeometry() - assert pg.Contains(ogr.CreateGeometryFromWkt('POINT(0.5 0.5)')) - assert not pg.Contains(ogr.CreateGeometryFromWkt('POINT(-0.5 0.5)')) + assert pg.Contains(ogr.CreateGeometryFromWkt("POINT(0.5 0.5)")) + assert not pg.Contains(ogr.CreateGeometryFromWkt("POINT(-0.5 0.5)")) - g2 = ogr.CreateGeometryFromWkt('POLYGON((0.5 0,0.5 1,1.5 1,1.5 0,0.5 0))') + g2 = ogr.CreateGeometryFromWkt("POLYGON((0.5 0,0.5 1,1.5 1,1.5 0,0.5 0))") assert pg.Intersects(g2) - assert not pg.Intersects(ogr.CreateGeometryFromWkt('POINT(-0.5 0.5)')) + assert not pg.Intersects(ogr.CreateGeometryFromWkt("POINT(-0.5 0.5)")) # Test workaround for https://github.com/libgeos/geos/pull/423 - assert not pg.Intersects(ogr.CreateGeometryFromWkt('POINT EMPTY')) - assert not pg.Contains(ogr.CreateGeometryFromWkt('POINT EMPTY')) + assert not pg.Intersects(ogr.CreateGeometryFromWkt("POINT EMPTY")) + assert not pg.Contains(ogr.CreateGeometryFromWkt("POINT EMPTY")) diff --git a/autotest/ogr/ogr_gml_fgd_read.py b/autotest/ogr/ogr_gml_fgd_read.py index cae01d593fc3..62574f332941 100755 --- a/autotest/ogr/ogr_gml_fgd_read.py +++ b/autotest/ogr/ogr_gml_fgd_read.py @@ -30,81 +30,85 @@ ############################################################################### - import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import gdal, ogr, osr ############################################################################### # Test reading Japanese FGD GML (v4) files ############################################################################### -_fgd_dir = 'data/gml_jpfgd/' +_fgd_dir = "data/gml_jpfgd/" ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): # open FGD GML file - ds = ogr.Open(_fgd_dir + 'ElevPt.xml') + ds = ogr.Open(_fgd_dir + "ElevPt.xml") if ds is None: - if gdal.GetLastErrorMsg().find('Xerces') != -1: + if gdal.GetLastErrorMsg().find("Xerces") != -1: pytest.skip() - pytest.fail('failed to open test file.') + pytest.fail("failed to open test file.") ############################################################################### # Test reading Japanese FGD GML (v4) ElevPt file + def test_ogr_gml_fgd_1(): # open FGD GML file - ds = ogr.Open(_fgd_dir + 'ElevPt.xml') + ds = ogr.Open(_fgd_dir + "ElevPt.xml") # check number of layers - assert ds.GetLayerCount() == 1, 'Wrong layer count' + 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' + 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 not ogrtest.check_feature_geometry( + feat, "POINT (133.123456789 34.123456789)" + ), "Wrong geometry" - assert feat.GetField('devDate') == '2015-01-07', 'Wrong attribute value' + assert feat.GetField("devDate") == "2015-01-07", "Wrong attribute value" ############################################################################### # Test reading Japanese FGD GML (v4) BldA file + def test_ogr_gml_fgd_2(): # open FGD GML file - ds = ogr.Open(_fgd_dir + 'BldA.xml') + ds = ogr.Open(_fgd_dir + "BldA.xml") # check number of layers - assert ds.GetLayerCount() == 1, 'Wrong layer count' + 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' + 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))' + 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 not ogrtest.check_feature_geometry(feat, wkt), "Wrong geometry" - assert feat.GetField('devDate') == '2017-03-07', 'Wrong attribute value' + assert feat.GetField("devDate") == "2017-03-07", "Wrong attribute value" diff --git a/autotest/ogr/ogr_gml_geom.py b/autotest/ogr/ogr_gml_geom.py index 2a0a86f5930d..1550263c3283 100755 --- a/autotest/ogr/ogr_gml_geom.py +++ b/autotest/ogr/ogr_gml_geom.py @@ -29,26 +29,25 @@ import os -import pytest - import gdaltest import ogrtest -from osgeo import ogr -from osgeo import osr -from osgeo import gdal +import pytest + +from osgeo import gdal, ogr, osr ############################################################################### @pytest.mark.parametrize( - 'filename', + "filename", [ - f for f in os.listdir(os.path.join(os.path.dirname(__file__), 'data/wkb_wkt')) - if f[-4:] == '.wkt' - ] + 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() + raw_wkt = open("data/wkb_wkt/" + filename).read() ###################################################################### # Convert WKT to GML. @@ -57,7 +56,7 @@ def test_gml_geom(filename): gml = geom_wkt.ExportToGML() - assert gml is not None and gml, 'Conversion to GML failed.' + assert gml is not None and gml, "Conversion to GML failed." ###################################################################### # Create geometry from GML. @@ -67,7 +66,10 @@ def test_gml_geom(filename): 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)) + pytest.fail( + "WKT from GML (%s) does not match clean WKT (%s).\ngml was (%s)" + % (gml_wkt, clean_wkt, gml) + ) ############################################################################### @@ -78,8 +80,12 @@ def test_gml_geom(filename): 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' + 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. @@ -91,7 +97,8 @@ def test_gml_pos_point(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POINT (31 29 16)', ' not correctly parsed' + assert geom.ExportToWkt() == "POINT (31 29 16)", " not correctly parsed" + ############################################################################### # Test GML 3.1.1 "pos" element for a polygon. (ticket #3244) @@ -99,7 +106,7 @@ def test_gml_pos_point(): def test_gml_pos_polygon(): - gml = ''' + gml = """ 0 0 @@ -118,12 +125,14 @@ def test_gml_pos_polygon(): 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' + 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. @@ -135,21 +144,25 @@ def test_gml_posList_line(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'LINESTRING (31 42,53 64,55 76)', \ - ' not correctly parsed' + 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' + 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 @@ -162,8 +175,10 @@ def test_gml_posList_line3d_2(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'LINESTRING (31 42 1,53 64 2,55 76 3)', \ - ' not correctly parsed' + 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. @@ -174,8 +189,10 @@ 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' + 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. @@ -186,7 +203,7 @@ def _CreateGMLWithSRSFromWkt(wkt, epsg): geom = ogr.CreateGeometryFromWkt(wkt) if geom is None: - gdaltest.post_reason('Import geometry from WKT failed') + gdaltest.post_reason("Import geometry from WKT failed") return None # Assign SRS from given EPSG code @@ -194,27 +211,30 @@ def _CreateGMLWithSRSFromWkt(wkt, epsg): srs.ImportFromEPSG(epsg) if srs is None: - gdaltest.post_reason('SRS import from EPSG failed') + 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)' + wkt = "POINT(21.675 53.763)" gml = _CreateGMLWithSRSFromWkt(wkt, 4326) - assert gml is not None and gml, 'Conversion to GML failed.' + assert gml is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:31] == '' + ), "No srsName attribute in GML output" - assert gml[0:31] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of Point 3D geometry with SRS assigned @@ -222,14 +242,16 @@ def test_gml_out_point_srs(): def test_gml_out_point3d_srs(): - wkt = 'POINT(21.675 53.763 100)' + wkt = "POINT(21.675 53.763 100)" gml = _CreateGMLWithSRSFromWkt(wkt, 4326) - assert gml is not None and gml, 'Conversion to GML failed.' + assert gml is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:31] == '' + ), "No srsName attribute in GML output" - assert gml[0:31] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of LineString geometry with SRS assigned @@ -237,14 +259,16 @@ def test_gml_out_point3d_srs(): def test_gml_out_linestring_srs(): - wkt = open('data/wkb_wkt/5.wkt').read() + 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 is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:36] == '' + ), "No srsName attribute in GML output" - assert gml[0:36] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of Polygon geometry with SRS assigned @@ -252,14 +276,16 @@ def test_gml_out_linestring_srs(): def test_gml_out_polygon_srs(): - wkt = open('data/wkb_wkt/6.wkt').read() + 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 is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:33] == '' + ), "No srsName attribute in GML output" - assert gml[0:33] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of MultiPoint geometry with SRS assigned @@ -267,14 +293,16 @@ def test_gml_out_polygon_srs(): def test_gml_out_multipoint_srs(): - wkt = open('data/wkb_wkt/11.wkt').read() + 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 is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:36] == '' + ), "No srsName attribute in GML output" - assert gml[0:36] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of MultiLineString geometry with SRS assigned @@ -282,14 +310,16 @@ def test_gml_out_multipoint_srs(): def test_gml_out_multilinestring_srs(): - wkt = open('data/wkb_wkt/2.wkt').read() + 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 is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:41] == '' + ), "No srsName attribute in GML output" - assert gml[0:41] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test of MultiPolygon geometry with SRS assigned @@ -297,18 +327,21 @@ def test_gml_out_multilinestring_srs(): def test_gml_out_multipolygon_srs(): - wkt = open('data/wkb_wkt/4.wkt').read() + 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 is not None and gml, "Conversion to GML failed." - assert gml[0:38] == '', \ - 'No srsName attribute in GML output' + 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.' + assert ( + gml[39:].find("srsName") == -1 + ), "Got extra srsName attributes on subelements." + ############################################################################### # Test of GeometryCollection with SRS assigned @@ -316,14 +349,16 @@ def test_gml_out_multipolygon_srs(): def test_gml_out_geometrycollection_srs(): - wkt = open('data/wkb_wkt/3.wkt').read() + 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 is not None and gml, "Conversion to GML failed." + + assert ( + gml[0:39] == '' + ), "No srsName attribute in GML output" - assert gml[0:39] == '', \ - 'No srsName attribute in GML output' ############################################################################### # Test GML Box @@ -344,8 +379,10 @@ def test_gml_Box(): 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' + 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 @@ -360,8 +397,10 @@ def test_gml_Envelope(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYGON ((1 2,3 2,3 4,1 4,1 2))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "POLYGON ((1 2,3 2,3 4,1 4,1 2))" + ), " not correctly parsed" + ############################################################################### # Test GML Curve @@ -379,8 +418,10 @@ def test_gml_Curve(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'LINESTRING (1 2,3 4)', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "LINESTRING (1 2,3 4)" + ), " not correctly parsed" + ############################################################################### # Test GML Curve with pointProperty elements @@ -403,8 +444,10 @@ def test_gml_Curve_with_pointProperty(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'LINESTRING (1 2,3 4)', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "LINESTRING (1 2,3 4)" + ), " not correctly parsed" + ############################################################################### # Test GML MultiCurve @@ -427,8 +470,10 @@ def test_gml_MultiCurve(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTILINESTRING ((1 2,2 3),(3 4,4 5))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "MULTILINESTRING ((1 2,2 3),(3 4,4 5))" + ), " not correctly parsed" + ############################################################################### # Test GML MultiSurface with PolygonPatch @@ -506,13 +551,16 @@ def test_gml_MultiSurface(): 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' + 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 = """ @@ -556,13 +604,16 @@ def test_gml_MultiSurface_surfaceMembers(): 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' + 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 = """ @@ -575,12 +626,15 @@ def test_gml_MultiCurve_curveMembers(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTILINESTRING ((0 0,1 1))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "MULTILINESTRING ((0 0,1 1))" + ), " not correctly parsed" + ############################################################################### # Test GML MultiGeometry with geometryMembers + def test_gml_MultiGeometry_geometryMembers(): gml = """ @@ -593,8 +647,10 @@ def test_gml_MultiGeometry_geometryMembers(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'GEOMETRYCOLLECTION (LINESTRING (0 0,1 1))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "GEOMETRYCOLLECTION (LINESTRING (0 0,1 1))" + ), " not correctly parsed" + ############################################################################### # Test GML CompositeCurve with curveMembers @@ -615,8 +671,10 @@ def test_gml_CompositeCurve_curveMembers(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'LINESTRING (0 0,1 1,2 2)', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "LINESTRING (0 0,1 1,2 2)" + ), " not correctly parsed" + ############################################################################### # Test GML MultiPoint with pointMembers @@ -637,8 +695,11 @@ def test_gml_MultiCurve_pointMembers(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTIPOINT (0 0,1 1)', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "MULTIPOINT (0 0,1 1)" + ), " not correctly parsed" + + ############################################################################### # Test GML Solid @@ -663,8 +724,10 @@ def test_gml_Solid(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYHEDRALSURFACE Z (((1 2 0,3 4 0,5 6 0,1 2 0)))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "POLYHEDRALSURFACE Z (((1 2 0,3 4 0,5 6 0,1 2 0)))" + ), " not correctly parsed" + ############################################################################### # Test GML OrientableSurface @@ -688,8 +751,11 @@ def test_gml_OrientableSurface(): 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' + 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 @@ -707,18 +773,22 @@ def test_gml_Triangle(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'TRIANGLE ((0 0,0 1,1 1,0 0))', \ - ' not correctly parsed' + 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))' + 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': + if ( + gml_string + != "0 0 0 1 0 1 0 0" + ): print(geom.ExportToWkt()) - pytest.fail('incorrect conversion from OGR -> GML for OGRTriangle') + pytest.fail("incorrect conversion from OGR -> GML for OGRTriangle") ############################################################################### @@ -737,8 +807,10 @@ def test_gml_Rectangle(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,1 0,0 0))" + ), " not correctly parsed" + ############################################################################### # Test GML PolyhedralSurface @@ -776,8 +848,10 @@ def test_gml_PolyhedralSurface(): # 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' + 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 = """ @@ -802,53 +876,64 @@ def test_gml_PolyhedralSurface(): # 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' + 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 = ['', - '', - """ + gml_strings = [ + "", + "", + """ - """] + """, + ] for string in gml_strings: geom = ogr.CreateGeometryFromGML(string) - assert geom.ExportToWkt() == 'POLYHEDRALSURFACE EMPTY', \ - 'Empty not correctly parsed' + 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)),\ + 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)))' +((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': + 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') + 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') + pytest.fail("incorrect round-tripping") # empty geometry - wkt_original = 'POLYHEDRALSURFACE EMPTY' + wkt_original = "POLYHEDRALSURFACE EMPTY" ps = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] string = ps.ExportToGML(opts) - if string != '': + if ( + string + != "" + ): print(geom.ExportToWkt()) - pytest.fail('incorrect parsing of OGR -> GML for empty PolyhedralSurface') + 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 = """ @@ -875,8 +960,10 @@ def test_gml_PolyhedralSurface(): """ 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' + 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 = """ @@ -906,13 +993,15 @@ def test_gml_PolyhedralSurface(): """ geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt().find('POLYHEDRALSURFACE (((0 -1,0 1,') >= 0, \ - ' not correctly parsed' + assert ( + geom.ExportToWkt().find("POLYHEDRALSURFACE (((0 -1,0 1,") >= 0 + ), " not correctly parsed" ############################################################################### # Test GML Tin + def test_gml_Tin(): gml = """ @@ -931,8 +1020,9 @@ def test_gml_Tin(): # 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' + 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 = """ @@ -956,8 +1046,10 @@ def test_gml_Tin(): 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' + 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 = """ @@ -981,19 +1073,24 @@ def test_gml_Tin(): 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' + 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)))' + 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': + 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') + pytest.fail("OGRGeometry::TriangulatedSurface incorrectly converted") ############################################################################### @@ -1029,10 +1126,16 @@ def test_gml_ConcatenatedDeduplication(): 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 + 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" - 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) @@ -1040,15 +1143,20 @@ def test_gml_ConcatenatedDeduplication(): def gml_out_precision(): - geom = ogr.CreateGeometryFromWkt('POINT(93538.15 1.23456789)') - expected_gml = '93538.15,1.23456789' + 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' + assert got_gml == expected_gml, "did not get expected gml" - geom = ogr.CreateGeometryFromWkt('POINT(93538.55 1234567.89)') - expected_gml = '93538.55,1234567.89' + 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' + assert got_gml == expected_gml, "did not get expected gml" + ############################################################################### # Test various error cases of gml2ogrgeometry.cpp @@ -1058,132 +1166,328 @@ 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), - ('0 0 4 0 4 4 0 4 0 0', 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), + ("", 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, + ), + ( + "0 0 4 0 4 4 0 4 0 0", + 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), + ( + '1bla2', + None, + ), + ( + '1,2', + None, + ), ('1,2', None), ('1,2', 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 - (""" + """, + "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,-10 0))", + ), # non contiguous segments + ( + """ 0 0 1 0 0 0 @@ -1191,39 +1495,92 @@ def test_gml_invalid_geoms(): 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, + ), # 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), - ('', None), + ( + "290270", + None, + ), + ( + "1 290270", + None, + ), + ( + "1 22270", + None, + ), + ( + "1 2290", + None, + ), + ( + "2", + None, + ), + ( + "1 2", + None, + ), + ("", None), + ( + "", + None, + ), + ( + "", + None, + ), + ( + "", + None, + ), ] for (gml, expected_wkt) in gml_expected_wkt_list: - gdal.PushErrorHandler('CPLQuietErrorHandler') + 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)) + 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)) + 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)) + assert ( + wkt == expected_wkt + ), "did not get expected result for %s. Got %s instead of %s" % ( + gml, + wkt, + expected_wkt, + ) ############################################################################### @@ -1232,27 +1589,29 @@ def test_gml_invalid_geoms(): 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'] + 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(' not correctly parsed' + assert ( + geom.ExportToWkt() == "POLYGON ((0 0,1 0,1 1,0 1,0 0))" + ), " not correctly parsed" + ############################################################################### # Test GML 3.3 SimpleRectangle @@ -1365,8 +1728,10 @@ def test_gml_SimpleRectangle(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYGON ((0 0,1 0,1 1,0 1,0 0))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "POLYGON ((0 0,1 0,1 1,0 1,0 0))" + ), " not correctly parsed" + ############################################################################### # Test GML 3.3 SimpleTriangle @@ -1378,8 +1743,10 @@ def test_gml_SimpleTriangle(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'TRIANGLE ((0 0,1 0,1 1,0 0))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "TRIANGLE ((0 0,1 0,1 1,0 0))" + ), " not correctly parsed" + ############################################################################### # Test GML 3.3 SimpleMultiPoint @@ -1391,8 +1758,10 @@ def test_gml_SimpleMultiPoint(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTIPOINT (0 1,2 3)', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() == "MULTIPOINT (0 1,2 3)" + ), " not correctly parsed" + ############################################################################### # Test gml:CompositeCurve> in @@ -1447,7 +1816,8 @@ def test_gml_CompositeCurveInRing(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,0 0))' + assert geom.ExportToWkt() == "POLYGON ((0 0,0 1,1 1,0 0))" + ############################################################################### # Test in (#5369) @@ -1482,7 +1852,11 @@ def test_gml_CompositeSurface_in_surfaceMembers(): 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)))' + 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) @@ -1534,7 +1908,11 @@ def test_gml_MultiSurfaceOfSurfaceOfPolygonPatchWithInteriorRing(): 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)))' + 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 @@ -1543,30 +1921,80 @@ def test_gml_MultiSurfaceOfSurfaceOfPolygonPatchWithInteriorRing(): 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)'), + ( + "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)) + 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)) + assert ( + wkt == expected_wkt + ), "did not get expected result for %s. Got %s instead of %s" % ( + gml, + wkt, + expected_wkt, + ) ############################################################################### @@ -1576,8 +2004,12 @@ def test_gml_Coordinates_ts_cs_decimal(): def test_gml_with_xml_header_and_comments(): gml_expected_wkt_list = [ - (' 1,2', 'POINT (1 2)'), - (""" + ( + ' 1,2', + "POINT (1 2)", + ), + ( + """ @@ -1597,17 +2029,27 @@ def test_gml_with_xml_header_and_comments(): - """, '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)))'), + """, + "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)) + 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)) + assert ( + wkt == expected_wkt + ), "did not get expected result for %s. Got %s instead of %s" % ( + gml, + wkt, + expected_wkt, + ) ############################################################################### @@ -1632,7 +2074,8 @@ def test_gml_srsDimension_topgeometry(): geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'POLYGON ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))' + assert geom.ExportToWkt() == "POLYGON ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))" + ############################################################################### # Test GML Arc @@ -1643,15 +2086,21 @@ 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 + 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' + 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 @@ -1661,7 +2110,13 @@ 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 + assert ( + ogrtest.check_feature_geometry( + geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (2 0,0 2,-2 0)") + ) + == 0 + ) + ############################################################################### # Test GML ArcByCenterPoint @@ -1672,13 +2127,19 @@ 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 + 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 = """ @@ -1730,7 +2191,16 @@ def test_gml_CompoundCurve_of_ArcByCenterPoint(): """ 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 + 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 @@ -1741,7 +2211,13 @@ 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 + assert ( + ogrtest.check_feature_geometry( + geom, ogr.CreateGeometryFromWkt("CIRCULARSTRING (-1 2,3 2,-1 2)") + ) + == 0 + ) + ############################################################################### # Test GML CircleByCenterPoint with uom="m" and uom="km" @@ -1764,9 +2240,11 @@ def test_gml_CircleByCenterPoint_srs_geog_uom_m_km(): # with ends of neighbouring curves, as found in some AIXM files # with all curves in the same element as found in #2356) + def test_gml_CompoundCurve_of_ArcByCenterPoint_curve_in_same_segments(): - geom = ogr.CreateGeometryFromGML(""" + geom = ogr.CreateGeometryFromGML( + """ @@ -1800,16 +2278,28 @@ def test_gml_CompoundCurve_of_ArcByCenterPoint_curve_in_same_segments(): 2.0 - """) + """ + ) + + assert ( + ogrtest.check_feature_geometry( + geom, + ogr.CreateGeometryFromWkt( + "POLYGON ((55.2333333333333 -36.1666666666667,55.2311637280767 -36.8943733791648,55.2602248071013 -36.8960852160185,55.2891782700249 -36.8912782655051,55.3178697537514 -36.88292675789,55.3461587637071 -36.8710639413776,55.3739064765608 -36.8557405708675,55.4009764350458 -36.8370248014709,55.4272352367262 -36.8150019876212,55.4525532129231 -36.7897743859994,55.476805093957 -36.7614607612323,55.4998706568286 -36.7301958939182,55.5216353514589 -36.6961299915025,55.5419909016414 -36.6594280032268,55.5608358769213 -36.6202688413925,55.5780762317212 -36.5788445119267,55.5936258081681 -36.5353591583435,55.6074067992521 -36.4900280239174,55.6193501691593 -36.4430763379496,55.6293960278662 -36.3947381326996,55.6374939573672 -36.3452549984946,55.6436032872147 -36.2948747851727,55.6476933173936 -36.2438502586493,55.6497434869178 -36.19243772209,55.6497434869178 -36.1408956112433,55.6476933173936 -36.089483074684,55.6436032872147 -36.0384585481606,55.6374939573672 -35.9880783348387,55.6293960278662 -35.9385952006337,55.6193501691593 -35.8902569953837,55.6074067992521 -35.8433053094159,55.5936258081681 -35.7979741749898,55.5780762317212 -35.7544888214066,55.5608358769213 -35.7130644919408,55.5419909016414 -35.6739053301065,55.5216353514589 -35.6372033418322,55.4998706568286 -35.6031374394151,55.476805093957 -35.571872572101,55.4525532129231 -35.5435589473339,55.4272352367262 -35.5183313457121,55.4009764350458 -35.4963085318624,55.3739064765608 -35.4775927624659,55.3461587637071 -35.4622693919557,55.3178697537514 -35.4504065754433,55.2891782700249 -35.4420550678282,55.2602248071013 -35.4372481173149,55.2311508336186 -35.4360014509317,55.2020980963355 -35.4383133491681,55.1732079288891 -35.4441648063421,55.1446205685763 -35.4535197729773,55.1164744843283 -35.4663254761286,55.0889057188812 -35.4825128133848,55.0620472479757 -35.5019968161103,55.0360283592393 -35.524677177381,55.0109740532301 -35.5504388400636,54.9870044689367 -35.5791526404379,54.9642343358562 -35.6106760028906,54.9427724545944 -35.6448536812344,54.9281635053072 -35.674116070019,55.2333333333333 -36.1666666666667))" + ), + ) + == 0 + ) - assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('POLYGON ((55.2333333333333 -36.1666666666667,55.2311637280767 -36.8943733791648,55.2602248071013 -36.8960852160185,55.2891782700249 -36.8912782655051,55.3178697537514 -36.88292675789,55.3461587637071 -36.8710639413776,55.3739064765608 -36.8557405708675,55.4009764350458 -36.8370248014709,55.4272352367262 -36.8150019876212,55.4525532129231 -36.7897743859994,55.476805093957 -36.7614607612323,55.4998706568286 -36.7301958939182,55.5216353514589 -36.6961299915025,55.5419909016414 -36.6594280032268,55.5608358769213 -36.6202688413925,55.5780762317212 -36.5788445119267,55.5936258081681 -36.5353591583435,55.6074067992521 -36.4900280239174,55.6193501691593 -36.4430763379496,55.6293960278662 -36.3947381326996,55.6374939573672 -36.3452549984946,55.6436032872147 -36.2948747851727,55.6476933173936 -36.2438502586493,55.6497434869178 -36.19243772209,55.6497434869178 -36.1408956112433,55.6476933173936 -36.089483074684,55.6436032872147 -36.0384585481606,55.6374939573672 -35.9880783348387,55.6293960278662 -35.9385952006337,55.6193501691593 -35.8902569953837,55.6074067992521 -35.8433053094159,55.5936258081681 -35.7979741749898,55.5780762317212 -35.7544888214066,55.5608358769213 -35.7130644919408,55.5419909016414 -35.6739053301065,55.5216353514589 -35.6372033418322,55.4998706568286 -35.6031374394151,55.476805093957 -35.571872572101,55.4525532129231 -35.5435589473339,55.4272352367262 -35.5183313457121,55.4009764350458 -35.4963085318624,55.3739064765608 -35.4775927624659,55.3461587637071 -35.4622693919557,55.3178697537514 -35.4504065754433,55.2891782700249 -35.4420550678282,55.2602248071013 -35.4372481173149,55.2311508336186 -35.4360014509317,55.2020980963355 -35.4383133491681,55.1732079288891 -35.4441648063421,55.1446205685763 -35.4535197729773,55.1164744843283 -35.4663254761286,55.0889057188812 -35.4825128133848,55.0620472479757 -35.5019968161103,55.0360283592393 -35.524677177381,55.0109740532301 -35.5504388400636,54.9870044689367 -35.5791526404379,54.9642343358562 -35.6106760028906,54.9427724545944 -35.6448536812344,54.9281635053072 -35.674116070019,55.2333333333333 -36.1666666666667))')) == 0 ############################################################################### # Test Ring starting with ArcByCenterPoint + def test_gml_Ring_starting_with_ArcByCenterPoint(): - geom = ogr.CreateGeometryFromGML(""" + geom = ogr.CreateGeometryFromGML( + """ @@ -1843,10 +2333,19 @@ def test_gml_Ring_starting_with_ArcByCenterPoint(): -""") - #print(g) +""" + ) + # print(g) - assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('POLYGON ((46.745 0.331944444444444,46.7432764927165 0.347962462754535,46.7409162535525 0.363717281627594,46.7378065348593 0.3791917846605,46.7339626150092 0.394310000163572,46.7294033759096 0.408997750371246,46.7241512079629 0.423183023082575,46.7182318974714 0.436796331344972,46.7116744971061 0.449771059387196,46.7045111801497 0.462043792829896,46.6967770793052 0.473554631563425,46.6885101109471 0.484247483569652,46.6797507857586 0.494070338341013,46.6705420067727 0.502975518511247,46.6609288558889 0.5109199085045,46.6509583699943 0.517865159176619,46.6483333333333 0.519444444444444,46.4386111111111 0.338055555555556,46.4230555555555 0.289444444444444,46.4239652827541 0.273432507330975,46.4255282239253 0.25756088338307,46.4278483647801 0.241884857622964,46.4309144976449 0.226480183207377,46.4347118090807 0.21142133567082,46.4392219496614 0.196781161237034,46.4444231204746 0.18263053185483,46.450290175977 0.169038008752016,46.4567947427662 0.156069515749848,46.4639053537626 0.143788023916768,46.4715875972233 0.132253248900933,46.4798042799442 0.121521362391196,46.4885156039408 0.111644719041597,46.4976793558324 0.102671600158084,46.5002777777778 0.100555555555556,46.5408333333333 0.105555555555556,46.575 0.225,46.5944444444444 0.258333333333333,46.6583333333333 0.283333333333333,46.6955555555556 0.255555555555556,46.745 0.331944444444444))')) == 0 + assert ( + ogrtest.check_feature_geometry( + geom, + ogr.CreateGeometryFromWkt( + "POLYGON ((46.745 0.331944444444444,46.7432764927165 0.347962462754535,46.7409162535525 0.363717281627594,46.7378065348593 0.3791917846605,46.7339626150092 0.394310000163572,46.7294033759096 0.408997750371246,46.7241512079629 0.423183023082575,46.7182318974714 0.436796331344972,46.7116744971061 0.449771059387196,46.7045111801497 0.462043792829896,46.6967770793052 0.473554631563425,46.6885101109471 0.484247483569652,46.6797507857586 0.494070338341013,46.6705420067727 0.502975518511247,46.6609288558889 0.5109199085045,46.6509583699943 0.517865159176619,46.6483333333333 0.519444444444444,46.4386111111111 0.338055555555556,46.4230555555555 0.289444444444444,46.4239652827541 0.273432507330975,46.4255282239253 0.25756088338307,46.4278483647801 0.241884857622964,46.4309144976449 0.226480183207377,46.4347118090807 0.21142133567082,46.4392219496614 0.196781161237034,46.4444231204746 0.18263053185483,46.450290175977 0.169038008752016,46.4567947427662 0.156069515749848,46.4639053537626 0.143788023916768,46.4715875972233 0.132253248900933,46.4798042799442 0.121521362391196,46.4885156039408 0.111644719041597,46.4976793558324 0.102671600158084,46.5002777777778 0.100555555555556,46.5408333333333 0.105555555555556,46.575 0.225,46.5944444444444 0.258333333333333,46.6583333333333 0.283333333333333,46.6955555555556 0.255555555555556,46.745 0.331944444444444))" + ), + ) + == 0 + ) ############################################################################### @@ -1861,19 +2360,22 @@ def test_gml_Circle(): 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 + 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' + 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)' + 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']) + 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 @@ -1895,8 +2397,12 @@ def test_gml_Circle(): 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 + 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 @@ -1906,18 +2412,19 @@ 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)' + 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)' + 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' + 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)' + assert geom2.ExportToWkt() == "CIRCULARSTRING (-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0)" + ############################################################################### # Test OGRCompoundCurve @@ -1925,24 +2432,24 @@ def test_gml_ArcString(): def test_gml_OGRCompoundCurve(): - wkt = 'COMPOUNDCURVE ((0 0,1 1,2 0))' + 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' + 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)' + 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))' + assert geom.ExportToWkt() == "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))" - gml2 = geom.ExportToGML(['FORMAT=GML3']) + gml2 = geom.ExportToGML(["FORMAT=GML3"]) assert gml2 == gml # CompositeCurve of 3 arcs @@ -1952,7 +2459,10 @@ def test_gml_OGRCompoundCurve(): 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))' + 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 = """ @@ -1961,7 +2471,10 @@ def test_gml_OGRCompoundCurve(): 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))' + 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 = """ @@ -1969,7 +2482,10 @@ def test_gml_OGRCompoundCurve(): 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))' + 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 = """ @@ -1982,7 +2498,11 @@ def test_gml_OGRCompoundCurve(): """ 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))' + 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 @@ -1993,34 +2513,46 @@ 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))' + 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' + 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))' + 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))' + 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() + 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']) + 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_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 @@ -2043,8 +2575,10 @@ def test_gml_OGRMultiSurface(): """ 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' + 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 = """ @@ -2065,8 +2599,10 @@ def test_gml_OGRMultiSurface(): """ 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' + 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 = """ @@ -2087,14 +2623,19 @@ def test_gml_OGRMultiSurface(): """ 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 ( + 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 @@ -2105,10 +2646,11 @@ def test_gml_OGRMultiCurve(): 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' + assert ( + geom.ExportToWkt() == "MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1))" + ), " not correctly parsed" - gml2 = geom.ExportToGML(['FORMAT=GML3']) + gml2 = geom.ExportToGML(["FORMAT=GML3"]) assert gml2 == gml # MultiCurve of LineString and Arc @@ -2124,8 +2666,10 @@ def test_gml_OGRMultiCurve(): """ geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTICURVE ((0 0,1 1,1 -1),CIRCULARSTRING (0 0,1 1,1 -1))', \ - ' not correctly parsed' + 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 = """ @@ -2140,8 +2684,10 @@ def test_gml_OGRMultiCurve(): """ geom = ogr.CreateGeometryFromGML(gml) - assert geom.ExportToWkt() == 'MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1),(0 0,1 1,1 -1))', \ - ' not correctly parsed' + assert ( + geom.ExportToWkt() + == "MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1),(0 0,1 1,1 -1))" + ), " not correctly parsed" # MultiCurve of CompositeCurve gml = """ @@ -2160,8 +2706,11 @@ def test_gml_OGRMultiCurve(): """ 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' + 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 @@ -2169,20 +2718,21 @@ def test_gml_OGRMultiCurve(): def test_gml_write_gml_ns(): - geom = ogr.CreateGeometryFromWkt('POINT(500000 4500000)') - gml = geom.ExportToGML(options=['NAMESPACE_DECL=YES']) + 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)) + 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']) + 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)) + 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']) + 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)) + assert gml == expected_gml, "got %s, instead of %s" % (gml, expected_gml) + ############################################################################### # Test reading geometry from https://github.com/OSGeo/gdal/issues/4155 @@ -2190,7 +2740,8 @@ def test_gml_write_gml_ns(): def test_gml_read_gml_ArcByCenterPoint_projected_crs_northing_easting(): - g = ogr.CreateGeometryFromGML(""" + g = ogr.CreateGeometryFromGML( + """ @@ -2217,5 +2768,6 @@ def test_gml_read_gml_ArcByCenterPoint_projected_crs_northing_easting(): - """) + """ + ) assert g is not None diff --git a/autotest/ogr/ogr_gml_read.py b/autotest/ogr/ogr_gml_read.py index 7ead5a14575f..74f64446187f 100755 --- a/autotest/ogr/ogr_gml_read.py +++ b/autotest/ogr/ogr_gml_read.py @@ -35,142 +35,143 @@ import gdaltest import ogrtest -from osgeo import gdal -from osgeo import ogr -from osgeo import osr import pytest +from osgeo import gdal, ogr, osr + + ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdaltest.have_gml_reader = ogr.Open('data/gml/ionic_wfs.gml') is not None + gdaltest.have_gml_reader = ogr.Open("data/gml/ionic_wfs.gml") is not None yield - gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) - gdal.SetConfigOption('GML_SAVE_RESOLVED_TO', None) + gdal.SetConfigOption("GML_SKIP_RESOLVE_ELEMS", None) + gdal.SetConfigOption("GML_SAVE_RESOLVED_TO", None) gdaltest.clean_tmp() - fl = gdal.ReadDir('/vsimem/') + fl = gdal.ReadDir("/vsimem/") if fl is not None: print(fl) try: - os.remove('data/gml/bom.gfs') + os.remove("data/gml/bom.gfs") except OSError: pass try: - os.remove('data/gml/utf8.gfs') + os.remove("data/gml/utf8.gfs") except OSError: pass try: - os.remove('data/gml/ticket_2349_test_1.gfs') + os.remove("data/gml/ticket_2349_test_1.gfs") except OSError: pass try: - os.remove('data/gml/citygml.gfs') + os.remove("data/gml/citygml.gfs") except OSError: pass try: - os.remove('data/gml/citygml_compound_crs.gfs') + os.remove("data/gml/citygml_compound_crs.gfs") except OSError: pass try: - os.remove('data/gml/gnis_pop_100.gfs') + os.remove("data/gml/gnis_pop_100.gfs") except OSError: pass try: - os.remove('data/gml/gnis_pop_110.gfs') + os.remove("data/gml/gnis_pop_110.gfs") except OSError: pass try: - os.remove('data/gml/paris_typical_strike_demonstration.gfs') + os.remove("data/gml/paris_typical_strike_demonstration.gfs") except OSError: pass try: - os.remove('data/gml/global_geometry.gfs') + os.remove("data/gml/global_geometry.gfs") except OSError: pass try: - os.remove('tmp/global_geometry.gfs') + os.remove("tmp/global_geometry.gfs") except OSError: pass try: - os.remove('tmp/global_geometry.xml') + os.remove("tmp/global_geometry.xml") except OSError: pass try: - os.remove('data/gml/curveProperty.gfs') + os.remove("data/gml/curveProperty.gfs") except OSError: pass try: - os.remove('tmp/ogr_gml_26.gml') - os.remove('tmp/ogr_gml_26.xsd') + 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') + 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') + os.remove("tmp/ogr_gml_28.gml") + os.remove("tmp/ogr_gml_28.gfs") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.sqlite') + os.remove("tmp/GmlTopo-sample.sqlite") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.gfs') + os.remove("tmp/GmlTopo-sample.gfs") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.resolved.gml') + os.remove("tmp/GmlTopo-sample.resolved.gml") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.xml') + os.remove("tmp/GmlTopo-sample.xml") except OSError: pass try: - os.remove('tmp/sample_gml_face_hole_negative_no.sqlite') + os.remove("tmp/sample_gml_face_hole_negative_no.sqlite") except OSError: pass try: - os.remove('tmp/sample_gml_face_hole_negative_no.gfs') + 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') + 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') + os.remove("tmp/sample_gml_face_hole_negative_no.xml") except OSError: pass try: - os.remove('data/gml/wfs_typefeature.gfs') + os.remove("data/gml/wfs_typefeature.gfs") except OSError: pass try: - os.remove('tmp/ogr_gml_51.gml') - os.remove('tmp/ogr_gml_51.xsd') + 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') + os.remove("tmp/gmlattributes.gml") + os.remove("tmp/gmlattributes.gfs") except OSError: pass - files = os.listdir('data') + files = os.listdir("data") for filename in files: - if len(filename) > 13 and filename[-13:] == '.resolved.gml': - os.unlink('data/gml/' + filename) - gdal.Unlink('data/gml/test_xsi_nil_gfs.gfs') + if len(filename) > 13 and filename[-13:] == ".resolved.gml": + os.unlink("data/gml/" + filename) + gdal.Unlink("data/gml/test_xsi_nil_gfs.gfs") + ############################################################################### # Test reading geometry and attribute from ionic wfs gml file. @@ -181,21 +182,22 @@ def test_ogr_gml_1(): if not gdaltest.have_gml_reader: pytest.skip() - gml_ds = ogr.Open('data/gml/ionic_wfs.gml') + gml_ds = ogr.Open("data/gml/ionic_wfs.gml") - assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' + assert gml_ds.GetLayerCount() == 1, "wrong number of layers" - lyr = gml_ds.GetLayerByName('GEM') + lyr = gml_ds.GetLayerByName("GEM") feat = lyr.GetNextFeature() - assert feat.GetField('Name') == 'Aartselaar', 'Wrong name field value' + 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))' + 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.' + assert feat is None, "got unexpected feature." + ############################################################################### # Do the same test somewhere without a .gfs file. @@ -206,24 +208,25 @@ def test_ogr_gml_2(): pytest.skip() # copy gml file (but not .gfs file) - open('tmp/ionic_wfs.gml', 'w').write(open('data/gml/ionic_wfs.gml').read()) + open("tmp/ionic_wfs.gml", "w").write(open("data/gml/ionic_wfs.gml").read()) - gml_ds = ogr.Open('tmp/ionic_wfs.gml') + gml_ds = ogr.Open("tmp/ionic_wfs.gml") - assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' + assert gml_ds.GetLayerCount() == 1, "wrong number of layers" - lyr = gml_ds.GetLayerByName('GEM') - assert lyr.GetGeometryColumn() == 'Geometry' + lyr = gml_ds.GetLayerByName("GEM") + assert lyr.GetGeometryColumn() == "Geometry" feat = lyr.GetNextFeature() - assert feat.GetField('Name') == 'Aartselaar', 'Wrong name field value' + 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))' + 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.' + assert feat is None, "got unexpected feature." + ############################################################################### # Similar test for RNF style line data. @@ -233,23 +236,24 @@ def test_ogr_gml_3(): if not gdaltest.have_gml_reader: pytest.skip() - gml_ds = ogr.Open('data/gml/rnf_eg.gml') + gml_ds = ogr.Open("data/gml/rnf_eg.gml") - assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' + assert gml_ds.GetLayerCount() == 1, "wrong number of layers" - lyr = gml_ds.GetLayerByName('RoadSegment') + lyr = gml_ds.GetLayerByName("RoadSegment") feat = lyr.GetNextFeature() - assert feat.GetField('ngd_id') == 817792, 'Wrong ngd_id field value' + assert feat.GetField("ngd_id") == 817792, "Wrong ngd_id field value" - assert feat.GetField('type') == 'HWY', 'Wrong type 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)' + 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.' + assert feat is None, "got unexpected feature." + ############################################################################### # Test of read GML file with UTF-8 BOM indicator. @@ -260,31 +264,31 @@ def test_ogr_gml_4(): if not gdaltest.have_gml_reader: pytest.skip() - gml_ds = ogr.Open('data/gml/bom.gml') + gml_ds = ogr.Open("data/gml/bom.gml") - assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' + assert gml_ds.GetLayerCount() == 1, "wrong number of layers" - lyr = gml_ds.GetLayerByName('CartographicText') + lyr = gml_ds.GetLayerByName("CartographicText") - assert lyr.GetFeatureCount() == 3, 'wrong number of features' + 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("featureCode") == 10198, "Wrong featureCode field value" - assert feat.GetField('anchorPosition') == 8, 'Wrong anchorPosition field value' + assert feat.GetField("anchorPosition") == 8, "Wrong anchorPosition field value" - wkt = 'POINT (347243.85 461299.5)' + 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' + assert feat.GetField("featureCode") == 10069, "Wrong featureCode field value" - wkt = 'POINT (347251.45 461250.85)' + wkt = "POINT (347251.45 461250.85)" assert not ogrtest.check_feature_geometry(feat, wkt) @@ -292,19 +296,21 @@ def test_ogr_gml_4(): ############################################################################### # 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/gml/ticket_2349_test_1.gml') + gml_ds = ogr.Open("data/gml/ticket_2349_test_1.gml") - lyr = gml_ds.GetLayerByName('MyPolyline') + lyr = gml_ds.GetLayerByName("MyPolyline") - lyr.SetAttributeFilter('height > 300') + lyr.SetAttributeFilter("height > 300") lyr.GetNextFeature() + ############################################################################### # Test of various FIDs (various prefixes and lengths) (Ticket#1017) @@ -314,23 +320,23 @@ def test_ogr_gml_6(): if not gdaltest.have_gml_reader: pytest.skip() - files = ['test_point1', 'test_point2', 'test_point3', 'test_point4'] + files = ["test_point1", "test_point2", "test_point3", "test_point4"] fids = [] for filename in files: fids[:] = [] - gml_ds = ogr.Open(os.path.join('data', 'gml', filename + '.gml')) + gml_ds = ogr.Open(os.path.join("data", "gml", 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(os.path.join('data', 'gml', filename + '.gfs')) - pytest.fail('Wrong FID value') + os.remove(os.path.join("data", "gml", filename + ".gfs")) + pytest.fail("Wrong FID value") fids.append(feat.GetFID()) feat = lyr.GetNextFeature() gml_ds = None - os.remove(os.path.join('data', 'gml', filename + '.gfs')) + os.remove(os.path.join("data", "gml", filename + ".gfs")) ############################################################################### @@ -342,23 +348,33 @@ def test_ogr_gml_7(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.SetConfigOption('GML_EXPOSE_FID', 'FALSE') - gml_ds = ogr.Open('data/gml/test_point.gml') - gdal.SetConfigOption('GML_EXPOSE_FID', None) + gdal.SetConfigOption("GML_EXPOSE_FID", "FALSE") + gml_ds = ogr.Open("data/gml/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' + 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' + 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) @@ -369,10 +385,10 @@ def test_ogr_gml_8(): if not gdaltest.have_gml_reader: pytest.skip() - gml_ds = ogr.Open('data/gml/utf8.gml') + gml_ds = ogr.Open("data/gml/utf8.gml") lyr = gml_ds.GetLayer() feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('name') == 'Āliamanu' + assert feat.GetFieldAsString("name") == "Āliamanu" ############################################################################### @@ -384,31 +400,32 @@ 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)) + 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' + dst_feat.SetFieldBinaryFromHexString("test", "80626164") # \x80bad' # Avoid the warning - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") ret = lyr.CreateFeature(dst_feat) gdal.PopErrorHandler() - assert ret == 0, 'CreateFeature failed.' + assert ret == 0, "CreateFeature failed." ds = None - ds = ogr.Open('tmp/broken_utf8.gml') - lyr = ds.GetLayerByName('test') + ds = ogr.Open("tmp/broken_utf8.gml") + lyr = ds.GetLayerByName("test") feat = lyr.GetNextFeature() - assert feat.GetField('test') == '?bad', 'Unexpected content.' + assert feat.GetField("test") == "?bad", "Unexpected content." ds = None - os.remove('tmp/broken_utf8.gml') - os.remove('tmp/broken_utf8.xsd') + os.remove("tmp/broken_utf8.gml") + os.remove("tmp/broken_utf8.xsd") + ############################################################################### # Test writing different data types in a GML file (ticket #2857) @@ -420,76 +437,109 @@ 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) + 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) - field_defn = ogr.FieldDefn('real', ogr.OFTReal) + 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) + lyr.CreateField(ogr.FieldDefn("float", ogr.OFTReal)) + field_defn = ogr.FieldDefn("integer", ogr.OFTInteger) field_defn.SetWidth(5) lyr.CreateField(field_defn) - lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) - lyr.CreateField(ogr.FieldDefn('time', ogr.OFTTime)) - lyr.CreateField(ogr.FieldDefn('datetime', ogr.OFTDateTime)) + lyr.CreateField(ogr.FieldDefn("date", ogr.OFTDate)) + lyr.CreateField(ogr.FieldDefn("time", ogr.OFTTime)) + lyr.CreateField(ogr.FieldDefn("datetime", ogr.OFTDateTime)) dst_feat = ogr.Feature(lyr.GetLayerDefn()) - dst_feat.SetField('string', 'test string of length 24') - dst_feat.SetField('real', 12.34) - dst_feat.SetField('float', 1234.5678) - dst_feat.SetField('integer', '1234') - dst_feat.SetField('date', '2019/11/06') - dst_feat.SetField('time', '12:34:56') - dst_feat.SetField('datetime', '2019/11/06 12:34:56+00') + dst_feat.SetField("string", "test string of length 24") + dst_feat.SetField("real", 12.34) + dst_feat.SetField("float", 1234.5678) + dst_feat.SetField("integer", "1234") + dst_feat.SetField("date", "2019/11/06") + dst_feat.SetField("time", "12:34:56") + dst_feat.SetField("datetime", "2019/11/06 12:34:56+00") ret = lyr.CreateFeature(dst_feat) - assert ret == 0, 'CreateFeature failed.' + assert ret == 0, "CreateFeature failed." ds = None - ds = ogr.Open('tmp/fields.gml') - lyr = ds.GetLayerByName('test') + 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('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.GetFieldDefnRef(feat.GetFieldIndex('date')).GetType() == ogr.OFTDate - assert feat.GetFieldDefnRef(feat.GetFieldIndex('time')).GetType() == ogr.OFTTime - assert feat.GetFieldDefnRef(feat.GetFieldIndex('datetime')).GetType() == ogr.OFTDateTime - - assert feat.GetField('string') == 'test string of length 24', \ - ('Unexpected string content.' + feat.GetField('string')) - 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 feat.GetField('date') == '2019/11/06' - assert feat.GetField('time') == '12:34:56' - assert feat.GetField('datetime') == '2019/11/06 12:34:56+00' - - 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') + 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("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.GetFieldDefnRef(feat.GetFieldIndex("date")).GetType() == ogr.OFTDate + assert feat.GetFieldDefnRef(feat.GetFieldIndex("time")).GetType() == ogr.OFTTime + assert ( + feat.GetFieldDefnRef(feat.GetFieldIndex("datetime")).GetType() + == ogr.OFTDateTime + ) + + assert ( + feat.GetField("string") == "test string of length 24" + ), "Unexpected string content." + feat.GetField("string") + 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 feat.GetField("date") == "2019/11/06" + assert feat.GetField("time") == "12:34:56" + assert feat.GetField("datetime") == "2019/11/06 12:34:56+00" + + 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 @@ -502,33 +552,37 @@ def test_ogr_gml_11(): # Make sure the .gfs file is more recent that the .gml one try: - gml_mtime = os.stat('data/gml/testgeometryelementpath.gml').st_mtime - gfs_mtime = os.stat('data/gml/testgeometryelementpath.gfs').st_mtime + gml_mtime = os.stat("data/gml/testgeometryelementpath.gml").st_mtime + gfs_mtime = os.stat("data/gml/testgeometryelementpath.gfs").st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: - print('Touching .gfs file') - f = open('data/gml/testgeometryelementpath.gfs', 'rb+') + print("Touching .gfs file") + f = open("data/gml/testgeometryelementpath.gfs", "rb+") data = f.read(1) f.seek(0, 0) f.write(data) f.close() - ds = ogr.Open('data/gml/testgeometryelementpath.gml') + ds = ogr.Open("data/gml/testgeometryelementpath.gml") lyr = ds.GetLayer(0) - assert lyr.GetGeometryColumn() == 'location1container|location1', \ - 'did not get expected geometry column name' + 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' + 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' + assert geom.ExportToWkt() == "POINT (3 50)", "did not get expected geometry" ds = None + ############################################################################### # Test reading a virtual GML file @@ -538,20 +592,26 @@ def test_ogr_gml_12(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('/vsizip/data/gml/testgeometryelementpath.zip/testgeometryelementpath.gml') + ds = ogr.Open( + "/vsizip/data/gml/testgeometryelementpath.zip/testgeometryelementpath.gml" + ) lyr = ds.GetLayer(0) - assert lyr.GetGeometryColumn() == 'location1container|location1', \ - 'did not get expected geometry column name' + 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' + 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' + assert geom.ExportToWkt() == "POINT (3 50)", "did not get expected geometry" ds = None + ############################################################################### # Test reading GML with StringList, IntegerList and RealList fields @@ -562,19 +622,27 @@ def test_ogr_gml_13(): pytest.skip() for _ in range(2): - ds = ogr.Open('data/gml/testlistfields.gml') + ds = ogr.Open("data/gml/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' + 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/gml/testlistfields.gfs') + gdal.Unlink("data/gml/testlistfields.gfs") + ############################################################################### # Test xlink resolution @@ -587,55 +655,61 @@ def test_ogr_gml_14(): # 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') + 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') + 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'] + 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): + 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') + 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 = 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') + 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) + gdal.SetConfigOption("GML_SKIP_RESOLVE_ELEMS", None) + gdal.SetConfigOption("GML_SAVE_RESOLVED_TO", None) try: - fp = open('tmp/cache/xlink1resolved.gml', 'r') + 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') + 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' + assert text == expectedtext, "Problem with file 1" try: - fp = open('tmp/cache/xlink2resolved.gml', 'r') + 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') + 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' + assert text == expectedtext, "Problem with file 2" + ############################################################################### # Run test_ogrsf @@ -647,12 +721,16 @@ def test_ogr_gml_15(): 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/gml/test_point.gml') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + " -ro data/gml/test_point.gml" + ) + + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Read CityGML generic attributes @@ -663,15 +741,18 @@ def test_ogr_gml_16(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/citygml.gml') + ds = ogr.Open("data/gml/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: + 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') + pytest.fail("did not get expected values") + ############################################################################### # Test reading CityGML of Project PLATEAU @@ -683,21 +764,24 @@ def test_gml_read_compound_crs_lat_long(): pytest.skip() # open CityGML file - gml = ogr.Open('data/gml/citygml_compound_crs.gml') + gml = ogr.Open("data/gml/citygml_compound_crs.gml") # check number of layers - assert gml.GetLayerCount() == 1, 'Wrong layer count' + assert gml.GetLayerCount() == 1, "Wrong layer count" lyr = gml.GetLayer(0) sr = osr.SpatialReference() sr.ImportFromEPSG(6668) # JGD2011 - assert sr.IsSame(lyr.GetSpatialRef(), options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), 'Wrong SRS' + assert sr.IsSame( + lyr.GetSpatialRef(), options=["IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES"] + ), "Wrong SRS" - wkt = 'POLYHEDRALSURFACE Z (((139.812484938717 35.7092130413279 0.15,139.812489071491 35.7091641446533 0.15,139.812444202746 35.7091610722245 0.15,139.812439721473 35.7092112956502 0.15,139.812436111402 35.7092517484017 0.15,139.812481422309 35.7092546406366 0.15,139.812484938717 35.7092130413279 0.15)),((139.812484938717 35.7092130413279 0.15,139.812481422309 35.7092546406366 0.15,139.812481422309 35.7092546406366 12.08,139.812484938717 35.7092130413279 12.08,139.812484938717 35.7092130413279 0.15)),((139.812481422309 35.7092546406366 0.15,139.812436111402 35.7092517484017 0.15,139.812436111402 35.7092517484017 12.08,139.812481422309 35.7092546406366 12.08,139.812481422309 35.7092546406366 0.15)),((139.812436111402 35.7092517484017 0.15,139.812439721473 35.7092112956502 0.15,139.812439721473 35.7092112956502 12.08,139.812436111402 35.7092517484017 12.08,139.812436111402 35.7092517484017 0.15)),((139.812439721473 35.7092112956502 0.15,139.812444202746 35.7091610722245 0.15,139.812444202746 35.7091610722245 12.08,139.812439721473 35.7092112956502 12.08,139.812439721473 35.7092112956502 0.15)),((139.812444202746 35.7091610722245 0.15,139.812489071491 35.7091641446533 0.15,139.812489071491 35.7091641446533 12.08,139.812444202746 35.7091610722245 12.08,139.812444202746 35.7091610722245 0.15)),((139.812489071491 35.7091641446533 0.15,139.812484938717 35.7092130413279 0.15,139.812484938717 35.7092130413279 12.08,139.812489071491 35.7091641446533 12.08,139.812489071491 35.7091641446533 0.15)),((139.812484938717 35.7092130413279 12.08,139.812481422309 35.7092546406366 12.08,139.812436111402 35.7092517484017 12.08,139.812439721473 35.7092112956502 12.08,139.812444202746 35.7091610722245 12.08,139.812489071491 35.7091641446533 12.08,139.812484938717 35.7092130413279 12.08)))' + wkt = "POLYHEDRALSURFACE Z (((139.812484938717 35.7092130413279 0.15,139.812489071491 35.7091641446533 0.15,139.812444202746 35.7091610722245 0.15,139.812439721473 35.7092112956502 0.15,139.812436111402 35.7092517484017 0.15,139.812481422309 35.7092546406366 0.15,139.812484938717 35.7092130413279 0.15)),((139.812484938717 35.7092130413279 0.15,139.812481422309 35.7092546406366 0.15,139.812481422309 35.7092546406366 12.08,139.812484938717 35.7092130413279 12.08,139.812484938717 35.7092130413279 0.15)),((139.812481422309 35.7092546406366 0.15,139.812436111402 35.7092517484017 0.15,139.812436111402 35.7092517484017 12.08,139.812481422309 35.7092546406366 12.08,139.812481422309 35.7092546406366 0.15)),((139.812436111402 35.7092517484017 0.15,139.812439721473 35.7092112956502 0.15,139.812439721473 35.7092112956502 12.08,139.812436111402 35.7092517484017 12.08,139.812436111402 35.7092517484017 0.15)),((139.812439721473 35.7092112956502 0.15,139.812444202746 35.7091610722245 0.15,139.812444202746 35.7091610722245 12.08,139.812439721473 35.7092112956502 12.08,139.812439721473 35.7092112956502 0.15)),((139.812444202746 35.7091610722245 0.15,139.812489071491 35.7091641446533 0.15,139.812489071491 35.7091641446533 12.08,139.812444202746 35.7091610722245 12.08,139.812444202746 35.7091610722245 0.15)),((139.812489071491 35.7091641446533 0.15,139.812484938717 35.7092130413279 0.15,139.812484938717 35.7092130413279 12.08,139.812489071491 35.7091641446533 12.08,139.812489071491 35.7091641446533 0.15)),((139.812484938717 35.7092130413279 12.08,139.812481422309 35.7092546406366 12.08,139.812436111402 35.7092517484017 12.08,139.812439721473 35.7092112956502 12.08,139.812444202746 35.7091610722245 12.08,139.812489071491 35.7091641446533 12.08,139.812484938717 35.7092130413279 12.08)))" # check the first feature feat = lyr.GetNextFeature() - assert not ogrtest.check_feature_geometry(feat, wkt), 'Wrong geometry' + assert not ogrtest.check_feature_geometry(feat, wkt), "Wrong geometry" + ############################################################################### # Read layer SRS for WFS 1.0.0 return @@ -708,19 +792,20 @@ def test_ogr_gml_17(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/gnis_pop_100.gml') + ds = ogr.Open("data/gml/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' + assert got_wkt.find('GEOGCS["WGS 84"') != -1, "did not get expected SRS" assert lyr.GetExtent() == (-80.17, 76.58, -13.32, 51.0) feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() - assert got_wkt == 'POINT (2.09 34.12)', 'did not get expected geometry' + assert got_wkt == "POINT (2.09 34.12)", "did not get expected geometry" + ############################################################################### # Read layer SRS for WFS 1.1.0 return @@ -731,17 +816,18 @@ def test_ogr_gml_18(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/gnis_pop_110.gml') + ds = ogr.Open("data/gml/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 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' + 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 @@ -754,25 +840,25 @@ def test_ogr_gml_19(): pytest.skip() try: - os.remove('data/gml/gnis_pop_110.gfs') + os.remove("data/gml/gnis_pop_110.gfs") except OSError: pass - gdal.SetConfigOption('GML_INVERT_AXIS_ORDER_IF_LAT_LONG', 'NO') - ds = ogr.Open('data/gml/gnis_pop_110.gml') - gdal.SetConfigOption('GML_INVERT_AXIS_ORDER_IF_LAT_LONG', None) + gdal.SetConfigOption("GML_INVERT_AXIS_ORDER_IF_LAT_LONG", "NO") + ds = ogr.Open("data/gml/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 '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' + 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 @@ -784,11 +870,11 @@ def test_ogr_gml_20(): pytest.skip() try: - os.remove('data/gml/archsites.gfs') + os.remove("data/gml/archsites.gfs") except OSError: pass - ds = ogr.Open('data/gml/archsites.gml') + ds = ogr.Open("data/gml/archsites.gml") lyr = ds.GetLayer(0) ldefn = lyr.GetLayerDefn() @@ -802,36 +888,43 @@ def test_ogr_gml_20(): idx = ldefn.GetFieldIndex("cat") fddefn = ldefn.GetFieldDefn(idx) - assert fddefn.GetFieldTypeName(fddefn.GetType()) == 'Integer64', \ - 'did not get expected column type for col "cat"' + 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 ( + 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 ( + lyr.GetGeometryColumn() == "the_geom" + ), "did not get expected geometry column name" - assert ldefn.GetGeomType() == ogr.wkbPoint, 'did not get expected geometry type' + assert ldefn.GetGeomType() == ogr.wkbPoint, "did not get expected geometry type" ds = None try: - os.stat('data/gml/archsites.gfs') - pytest.fail('did not expected .gfs -> XSD parsing failed') + os.stat("data/gml/archsites.gfs") + pytest.fail("did not expected .gfs -> XSD parsing failed") except OSError: return + ############################################################################### # Test writing GML3 -@pytest.mark.parametrize('frmt,base_filename', - [('GML3', 'expected_gml_gml3'), - ('GML3Deegree', 'expected_gml_gml3degree'), - ('GML3.2', 'expected_gml_gml32') - ]) -def test_ogr_gml_21(frmt,base_filename): +@pytest.mark.parametrize( + "frmt,base_filename", + [ + ("GML3", "expected_gml_gml3"), + ("GML3Deegree", "expected_gml_gml3degree"), + ("GML3.2", "expected_gml_gml32"), + ], +) +def test_ogr_gml_21(frmt, base_filename): if not gdaltest.have_gml_reader: pytest.skip() @@ -840,22 +933,24 @@ def test_ogr_gml_21(frmt,base_filename): sr = osr.SpatialReference() sr.ImportFromEPSG(4326) - for ext in ('gml', 'gfs', 'xsd'): - gdal.Unlink('tmp/' + base_filename + '.' + ext) + for ext in ("gml", "gfs", "xsd"): + gdal.Unlink("tmp/" + base_filename + "." + ext) - filename = 'tmp/' + base_filename + '.gml' - ds = ogr.GetDriverByName('GML').CreateDataSource(filename, options=['FORMAT=' + frmt]) - lyr = ds.CreateLayer('firstlayer', srs=sr) - lyr.CreateField(ogr.FieldDefn('string_field', ogr.OFTString)) + filename = "tmp/" + base_filename + ".gml" + ds = ogr.GetDriverByName("GML").CreateDataSource( + filename, 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)') + 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.SetField(0, "foo") + geom = ogr.CreateGeometryFromWkt("POINT (3 48)") feat.SetGeometry(geom) lyr.CreateFeature(feat) @@ -865,44 +960,46 @@ def test_ogr_gml_21(frmt,base_filename): ds = ogr.Open(filename) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49)', \ - 'did not get expected geometry' + 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(filename, 'rt') - f2 = open('data/gml/' + base_filename + '.gml', 'rt') + f1 = open(filename, "rt") + f2 = open("data/gml/" + base_filename + ".gml", "rt") line1 = f1.readline() line2 = f2.readline() - while line1 != '': + while line1 != "": line1 = line1.strip() line2 = line2.strip() if line1 != line2: - print(open(filename, 'rt').read()) - pytest.fail('.gml file not identical to expected') + print(open(filename, "rt").read()) + pytest.fail(".gml file not identical to expected") line1 = f1.readline() line2 = f2.readline() f1.close() f2.close() - xsd_filename = filename[0:-3] + 'xsd' - f1 = open(xsd_filename, 'rt') - f2 = open('tmp/' + base_filename + '.xsd', 'rt') + xsd_filename = filename[0:-3] + "xsd" + f1 = open(xsd_filename, "rt") + f2 = open("tmp/" + base_filename + ".xsd", "rt") line1 = f1.readline() line2 = f2.readline() - while line1 != '': + while line1 != "": line1 = line1.strip() line2 = line2.strip() if line1 != line2: - print(open(xsd_filename, 'rt').read()) - pytest.fail('.xsd file not identical to expected') + print(open(xsd_filename, "rt").read()) + pytest.fail(".xsd file not identical to expected") line1 = f1.readline() line2 = f2.readline() f1.close() f2.close() - for ext in ('gml', 'gfs', 'xsd'): - gdal.Unlink('tmp/' + base_filename + '.' + ext) + for ext in ("gml", "gfs", "xsd"): + gdal.Unlink("tmp/" + base_filename + "." + ext) + ############################################################################### # Read a OpenLS DetermineRouteResponse document @@ -913,16 +1010,17 @@ def test_ogr_gml_22(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/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' + ds = ogr.Open("data/gml/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' + 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 @@ -934,29 +1032,29 @@ def test_ogr_gml_23(): pytest.skip() try: - os.remove('tmp/global_geometry.gfs') + os.remove("tmp/global_geometry.gfs") except OSError: pass - shutil.copy('data/gml/global_geometry.xml', 'tmp/global_geometry.xml') + shutil.copy("data/gml/global_geometry.xml", "tmp/global_geometry.xml") # Here we use only the .xml file - ds = ogr.Open('tmp/global_geometry.xml') + 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 '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' + 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' + 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 @@ -969,12 +1067,12 @@ def test_ogr_gml_24(): pytest.skip() try: - os.remove('data/gml/global_geometry.gfs') + os.remove("data/gml/global_geometry.gfs") except OSError: pass # Here we use only the .xml file and the .xsd file - ds = ogr.Open('data/gml/global_geometry.xml') + ds = ogr.Open("data/gml/global_geometry.xml") lyr = ds.GetLayer(0) @@ -991,10 +1089,11 @@ def test_ogr_gml_24(): feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() - assert got_wkt == 'POINT (2 49)', 'did not get expected geometry' + 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' + assert extent == (2.0, 3.0, 49.0, 50.0), "did not get expected layer extent" + ############################################################################### # Test fixes for #3934 and #3935 @@ -1005,25 +1104,27 @@ def test_ogr_gml_25(): if not gdaltest.have_gml_reader: pytest.skip() - if int(gdal.VersionInfo('VERSION_NUM')) < 1900: - pytest.skip('would crash') + if int(gdal.VersionInfo("VERSION_NUM")) < 1900: + pytest.skip("would crash") try: - os.remove('data/gml/curveProperty.gfs') + os.remove("data/gml/curveProperty.gfs") except OSError: pass - gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', 'YES') - ds = ogr.Open('data/gml/curveProperty.xml') - gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', None) + gdal.SetConfigOption("GML_FACE_HOLE_NEGATIVE", "YES") + ds = ogr.Open("data/gml/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' + 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) @@ -1035,17 +1136,26 @@ def test_ogr_gml_26(): 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 -dsco FORMAT=GML2 tmp/ogr_gml_26.gml data/poly.shp -zfield eas_id') + gdaltest.runexternal( + test_cli_utilities.get_ogr2ogr_path() + + " -f GML -dsco FORMAT=GML2 tmp/ogr_gml_26.gml data/poly.shp -zfield eas_id" + ) - f = open('tmp/ogr_gml_26.gml', 'rt') + f = open("tmp/ogr_gml_26.gml", "rt") content = f.read() f.close() - assert content.find("478315.531254762880.5158") != -1 + assert ( + content.find( + "478315.531254762880.5158" + ) + != -1 + ) - ds = ogr.Open('tmp/ogr_gml_26.gml') + ds = ogr.Open("tmp/ogr_gml_26.gml") lyr = ds.GetLayer(0) @@ -1053,6 +1163,7 @@ def test_ogr_gml_26(): ds = None + ############################################################################### # Test writing and reading 3D geoms (GML3) @@ -1063,17 +1174,24 @@ def test_ogr_gml_27(): 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') + 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') + f = open("tmp/ogr_gml_27.gml", "rt") content = f.read() f.close() - assert content.find("478315.53125 4762880.5 158") != -1 + assert ( + content.find("478315.53125 4762880.5 158") + != -1 + ) - ds = ogr.Open('tmp/ogr_gml_27.gml') + ds = ogr.Open("tmp/ogr_gml_27.gml") lyr = ds.GetLayer(0) @@ -1081,6 +1199,7 @@ def test_ogr_gml_27(): ds = None + ############################################################################### # Test writing and reading layers of type wkbNone (#4154) @@ -1091,30 +1210,35 @@ def test_ogr_gml_28(): 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') + 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') + 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') + os.unlink("tmp/ogr_gml_28.xsd") - ds = ogr.Open('tmp/ogr_gml_28.gml') + 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') + ds = ogr.Open("tmp/ogr_gml_28.gml") lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone ds = None + ############################################################################### # Test reading FME GMLs @@ -1124,26 +1248,30 @@ def test_ogr_gml_29(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/testfmegml.gml') + ds = ogr.Open("data/gml/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))'], - ] + 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) + 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) + 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 @@ -1166,7 +1294,10 @@ def test_ogr_gml_30(): A%sZ -""" % (geom, field1) +""" % ( + geom, + field1, + ) f = gdal.VSIFOpenL("/vsimem/ogr_gml_30.gml", "wb") gdal.VSIFWriteL(data, 1, len(data), f) @@ -1182,9 +1313,10 @@ def test_ogr_gml_30(): 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(field1) == 2050, "did not get expected len(field1)" + + assert len(geom_wkt) == 2060, "did not get expected len(geom_wkt)" - assert len(geom_wkt) == 2060, 'did not get expected len(geom_wkt)' ############################################################################### # Test SEQUENTIAL_LAYERS @@ -1195,24 +1327,25 @@ def test_ogr_gml_31(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.SetConfigOption('GML_READ_MODE', 'SEQUENTIAL_LAYERS') + gdal.SetConfigOption("GML_READ_MODE", "SEQUENTIAL_LAYERS") test_ogr_gml_29() - gdal.SetConfigOption('GML_READ_MODE', None) + 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/gml/testfmegml.gml') - gdal.SetConfigOption('GML_READ_MODE', None) + gdal.SetConfigOption("GML_READ_MODE", "SEQUENTIAL_LAYERS") + ds = ogr.Open("data/gml/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' + 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' + assert feat.GetFID() == 1, "did not get feature when reading back first layer" + ############################################################################### # Test SEQUENTIAL_LAYERS without a .gfs @@ -1232,12 +1365,12 @@ def test_ogr_gml_32(): gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - ds = ogr.Open('/vsimem/ogr_gml_31.gml') + 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' + assert feat.GetFID() == 1, "did not get feature when reading directly second layer" ds = None @@ -1247,12 +1380,14 @@ def test_ogr_gml_32(): data = str(data) - assert data.find("true") != -1, \ - 'did not find true in .gfs' + 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 @@ -1263,23 +1398,25 @@ def test_ogr_gml_33(): pytest.skip() # Test reading second layer and then first layer - gdal.SetConfigOption('GML_READ_MODE', 'INTERLEAVED_LAYERS') - ds = ogr.Open('data/gml/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]] + gdal.SetConfigOption("GML_READ_MODE", "INTERLEAVED_LAYERS") + ds = ogr.Open("data/gml/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]) @@ -1289,7 +1426,7 @@ def test_ogr_gml_33(): else: fid = feat.GetFID() expected_fid = read_seq[1] - assert fid == expected_fid, ('failed at step %d' % i) + assert fid == expected_fid, "failed at step %d" % i ############################################################################### @@ -1301,24 +1438,25 @@ 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') + 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<&') + feat.SetField(0, "\xc4\x80liamanu<&") lyr.CreateFeature(feat) feat = None ds = None - ds = ogr.Open('/vsimem/ogr_gml_34.gml') + ds = ogr.Open("/vsimem/ogr_gml_34.gml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - assert feat.GetFieldAsString('name') == '\xc4\x80liamanu<&' + assert feat.GetFieldAsString("name") == "\xc4\x80liamanu<&" ds = None - gdal.Unlink('/vsimem/ogr_gml_34.gml') - gdal.Unlink('/vsimem/ogr_gml_34.xsd') + gdal.Unlink("/vsimem/ogr_gml_34.gml") + gdal.Unlink("/vsimem/ogr_gml_34.xsd") + ############################################################################### # Test GML_SKIP_RESOLVE_ELEMS=HUGE (#4380) @@ -1329,161 +1467,169 @@ def test_ogr_gml_35(): if not gdaltest.have_gml_reader: pytest.skip() - if ogr.GetDriverByName('SQLite') is None: + if ogr.GetDriverByName("SQLite") is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: - os.remove('tmp/GmlTopo-sample.sqlite') + os.remove("tmp/GmlTopo-sample.sqlite") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.gfs') + os.remove("tmp/GmlTopo-sample.gfs") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.resolved.gml') + os.remove("tmp/GmlTopo-sample.resolved.gml") except OSError: pass - shutil.copy('data/gml/GmlTopo-sample.xml', 'tmp/GmlTopo-sample.xml') + shutil.copy("data/gml/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) + 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 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()) + assert gdal.GetLastErrorMsg() == "", "did not expect error" + assert ds.GetLayerCount() == 3, "expected 3 layers, got %d" % ds.GetLayerCount() - lyr = ds.GetLayerByName('Suolo') + 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)))' + 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') + 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'): +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 GML_FACE_HOLE_NEGATIVE == "NO": if not ogrtest.have_geos(): pytest.skip() try: - os.remove('tmp/GmlTopo-sample.gfs') + os.remove("tmp/GmlTopo-sample.gfs") except OSError: pass try: - os.remove('tmp/GmlTopo-sample.resolved.gml') + os.remove("tmp/GmlTopo-sample.resolved.gml") except OSError: pass - shutil.copy('data/gml/GmlTopo-sample.xml', 'tmp/GmlTopo-sample.xml') + shutil.copy("data/gml/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' + 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') + 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)))' + 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))' + 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') + 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') + return test_ogr_gml_36("YES") + ############################################################################### # Test new GMLTopoSurface interpretation (#3934) with HUGE xlink resolver -def test_ogr_gml_38(resolver='HUGE'): +def test_ogr_gml_38(resolver="HUGE"): if not gdaltest.have_gml_reader: pytest.skip() - if resolver == 'HUGE': - if ogr.GetDriverByName('SQLite') is None: + 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') + os.remove("tmp/sample_gml_face_hole_negative_no.sqlite") except OSError: pass try: - os.remove('tmp/sample_gml_face_hole_negative_no.gfs') + 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') + os.remove("tmp/sample_gml_face_hole_negative_no.resolved.gml") except OSError: pass - shutil.copy('data/gml/sample_gml_face_hole_negative_no.xml', 'tmp/sample_gml_face_hole_negative_no.xml') + shutil.copy( + "data/gml/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) + 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') + if resolver == "HUGE": + assert not os.path.exists("tmp/sample_gml_face_hole_negative_no.sqlite") - assert gdal.GetLastErrorMsg() == '', 'did not expect error' + assert gdal.GetLastErrorMsg() == "", "did not expect error" - lyr = ds.GetLayerByName('Suolo') + 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)))' + 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') + return test_ogr_gml_38("NONE") + ############################################################################### # Test parsing XSD where simpleTypes not inlined, but defined elsewhere in the .xsd (#4328) @@ -1494,11 +1640,14 @@ def test_ogr_gml_40(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/testLookForSimpleType.xml') + ds = ogr.Open("data/gml/testLookForSimpleType.xml") lyr = ds.GetLayer(0) - fld_defn = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('CITYNAME')) + fld_defn = lyr.GetLayerDefn().GetFieldDefn( + lyr.GetLayerDefn().GetFieldIndex("CITYNAME") + ) assert fld_defn.GetWidth() == 26 + ############################################################################### # Test validating against .xsd @@ -1507,21 +1656,25 @@ def test_ogr_gml_41(): gdaltest.have_gml_validation = False - #if gdal.GetDriverByName('GMLAS'): + # if gdal.GetDriverByName('GMLAS'): # gdaltest.have_gml_validation = True # return 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'): + if not gdaltest.download_file( + "http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip", "SCHEMAS_OPENGIS_NET.zip" + ): pytest.skip() - ds = ogr.Open('data/gml/expected_gml_gml3.gml') + ds = ogr.Open("data/gml/expected_gml_gml3.gml") - gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', '/vsizip/./tmp/cache/SCHEMAS_OPENGIS_NET.zip') - lyr = ds.ExecuteSQL('SELECT ValidateSchema()') - gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) + 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) @@ -1530,37 +1683,46 @@ def test_ogr_gml_41(): ds.ReleaseResultSet(lyr) if val == 0: - assert gdal.GetLastErrorMsg().find('not implemented due to missing libxml2 support') != -1 + assert ( + gdal.GetLastErrorMsg().find( + "not implemented due to missing libxml2 support" + ) + != -1 + ) pytest.skip() gdaltest.have_gml_validation = True + ############################################################################### + def validate(filename): if not gdaltest.have_gml_validation: pytest.skip() - #if gdal.GetDriverByName('GMLAS'): + # if gdal.GetDriverByName('GMLAS'): # assert gdal.OpenEx('GMLAS:' + filename, open_options=['VALIDATE=YES', 'FAIL_IF_VALIDATION_ERROR=YES']) is not None # return try: - os.mkdir('tmp/cache/SCHEMAS_OPENGIS_NET') + os.mkdir("tmp/cache/SCHEMAS_OPENGIS_NET") except OSError: pass try: - os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/gml') + os.stat("tmp/cache/SCHEMAS_OPENGIS_NET/gml") except OSError: - gdaltest.unzip('tmp/cache/SCHEMAS_OPENGIS_NET', 'tmp/cache/SCHEMAS_OPENGIS_NET.zip') + gdaltest.unzip( + "tmp/cache/SCHEMAS_OPENGIS_NET", "tmp/cache/SCHEMAS_OPENGIS_NET.zip" + ) 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) + 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) @@ -1570,13 +1732,15 @@ def validate(filename): assert val != 0 + ############################################################################### # Test validating against .xsd def test_ogr_gml_42(): - validate('data/gml/expected_gml_gml32.gml') + validate("data/gml/expected_gml_gml32.gml") + ############################################################################### # Test automated downloading of WFS schema @@ -1591,23 +1755,28 @@ def test_ogr_gml_43(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/wfs_typefeature.gml') + ds = ogr.Open("data/gml/wfs_typefeature.gml") assert ds is not None ds = None try: - os.stat('data/gml/wfs_typefeature.gfs') + os.stat("data/gml/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: + 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 + can_download_schema = gdal.GetDriverByName("HTTP") is not None - assert not can_download_schema, '.gfs found, but schema could be downloaded' + assert not can_download_schema, ".gfs found, but schema could be downloaded" ############################################################################### @@ -1650,9 +1819,9 @@ def test_ogr_gml_44(): """ - gdal.FileFromMemBuffer('/vsimem/ogr_gml_44.xsd', xsd_content) + gdal.FileFromMemBuffer("/vsimem/ogr_gml_44.xsd", xsd_content) - ds = ogr.Open('data/gml/test_point.gml,xsd=/vsimem/ogr_gml_44.xsd') + ds = ogr.Open("data/gml/test_point.gml,xsd=/vsimem/ogr_gml_44.xsd") lyr = ds.GetLayer(0) # fid and dbl @@ -1660,7 +1829,8 @@ def test_ogr_gml_44(): ds = None - gdal.Unlink('/vsimem/ogr_gml_44.xsd') + gdal.Unlink("/vsimem/ogr_gml_44.xsd") + ############################################################################### # Test PREFIX and TARGET_NAMESPACE creation options @@ -1671,17 +1841,19 @@ 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)) + 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) + dst_feat.SetField("str", "str") + dst_feat.SetField("int", 1) + dst_feat.SetField("dbl", 2.34) lyr.CreateFeature(dst_feat) @@ -1689,44 +1861,48 @@ def test_ogr_gml_45(): ds = None try: - validate('/vsimem/ogr_gml_45.gml') + validate("/vsimem/ogr_gml_45.gml") finally: - gdal.Unlink('/vsimem/ogr_gml_45.gml') - gdal.Unlink('/vsimem/ogr_gml_45.xsd') + gdal.Unlink("/vsimem/ogr_gml_45.gml") + gdal.Unlink("/vsimem/ogr_gml_45.xsd") ############################################################################### # 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'] + 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 != '': + 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() @@ -1736,16 +1912,16 @@ def test_ogr_gml_46(): geom_type = ogr.wkbNone srs = None - lyr = ds.CreateLayer('test', geom_type=geom_type, srs=srs) + 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)) + 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.SetField("str", "str") + dst_feat.SetField("int", 1) + dst_feat.SetField("dbl", 2.34) dst_feat.SetGeometry(geom) lyr.CreateFeature(dst_feat) @@ -1755,35 +1931,39 @@ def test_ogr_gml_46(): # Validate document try: - validate('/vsimem/ogr_gml_46.gml') + validate("/vsimem/ogr_gml_46.gml") except: - print('validation failed for format=%s, wkt=%s' % (frmt, wkt)) + print("validation failed for format=%s, wkt=%s" % (frmt, wkt)) - f = gdal.VSIFOpenL('/vsimem/ogr_gml_46.gml', 'rb') + 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gml_46.xsd", "rb") content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(content) finally: - gdal.Unlink('/vsimem/ogr_gml_46.gml') - gdal.Unlink('/vsimem/ogr_gml_46.xsd') + gdal.Unlink("/vsimem/ogr_gml_46.gml") + gdal.Unlink("/vsimem/ogr_gml_46.xsd") # Only minor schema changes - if frmt == 'GML3Deegree': + if frmt == "GML3Deegree": break ############################################################################### # Test validation of WFS GML documents -@pytest.mark.parametrize('filename', ['data/gml/wfs10.xml', 'data/gml/wfs11.xml', 'data/gml/wfs20.xml']) + +@pytest.mark.parametrize( + "filename", ["data/gml/wfs10.xml", "data/gml/wfs11.xml", "data/gml/wfs20.xml"] +) def test_ogr_gml_validate_wfs(filename): validate(filename) + ############################################################################### # Test that we can parse some particular .xsd files that have the geometry # field declared as : @@ -1801,9 +1981,9 @@ def test_ogr_gml_48(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/schema_with_geom_in_complextype.gfs') + gdal.Unlink("data/gml/schema_with_geom_in_complextype.gfs") - ds = ogr.Open('data/gml/schema_with_geom_in_complextype.xml') + ds = ogr.Open("data/gml/schema_with_geom_in_complextype.xml") lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbUnknown @@ -1812,6 +1992,7 @@ def test_ogr_gml_48(): ds = None + ############################################################################### # Test a pseudo Inspire GML file @@ -1831,23 +2012,24 @@ def test_ogr_gml_49(): """ - gdal.FileFromMemBuffer('/vsimem/ogr_gml_49.gml', xsd_content) + gdal.FileFromMemBuffer("/vsimem/ogr_gml_49.gml", xsd_content) - ds = ogr.Open('/vsimem/ogr_gml_49.gml') + 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') + 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') + gdal.Unlink("/vsimem/ogr_gml_49.gml") + gdal.Unlink("/vsimem/ogr_gml_49.gfs") + ############################################################################### # Test support for StringList, IntegerList, RealList @@ -1858,38 +2040,48 @@ 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) + 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) + field_defn = ogr.FieldDefn("intlist", ogr.OFTIntegerList) lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('reallist', ogr.OFTRealList) + field_defn = ogr.FieldDefn("reallist", ogr.OFTRealList) lyr.CreateField(field_defn) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) - feat.SetFieldStringList(0, ['a', 'b']) + 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') + ds = ogr.Open("/vsimem/ogr_gml_50.gml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() - if feat.GetFieldAsStringList(lyr.GetLayerDefn().GetFieldIndex('stringlist')) != ['a', 'b']: + if feat.GetFieldAsStringList(lyr.GetLayerDefn().GetFieldIndex("stringlist")) != [ + "a", + "b", + ]: feat.DumpReadable() pytest.fail() - if feat.GetFieldAsIntegerList(lyr.GetLayerDefn().GetFieldIndex('intlist')) != [2, 3]: + if feat.GetFieldAsIntegerList(lyr.GetLayerDefn().GetFieldIndex("intlist")) != [ + 2, + 3, + ]: feat.DumpReadable() pytest.fail() - if feat.GetFieldAsDoubleList(lyr.GetLayerDefn().GetFieldIndex('reallist')) != [4.56, 5.67]: + 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') + 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 @@ -1901,25 +2093,33 @@ def test_ogr_gml_51(): pytest.skip() import test_cli_utilities + if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() - for frmt in ['GML2', 'GML3']: + 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) + 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') + 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 + assert ( + content.find("""479647""") + == -1 + ) - ds = ogr.Open('tmp/ogr_gml_51.gml') + ds = ogr.Open("tmp/ogr_gml_51.gml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None @@ -1936,52 +2136,67 @@ def test_ogr_gml_52(): pytest.skip() try: - os.remove('data/gml/fake_mtkgml.gfs') + os.remove("data/gml/fake_mtkgml.gfs") except OSError: pass for _ in range(2): - ds = ogr.Open('data/gml/fake_mtkgml.xml') + ds = ogr.Open("data/gml/fake_mtkgml.xml") - lyr = ds.GetLayerByName('A') + lyr = ds.GetLayerByName("A") assert lyr.GetGeomType() == ogr.wkbPoint25D srs = lyr.GetSpatialRef() assert srs is not None wkt = srs.ExportToWkt() - assert '3067' in wkt + assert "3067" in wkt - assert lyr.GetExtent() == (280000,280000,7000000,7000000) + assert lyr.GetExtent() == (280000, 280000, 7000000, 7000000) 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: + 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') + 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: + 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') + 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: + 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/gml/fake_mtkgml.gfs') + os.remove("data/gml/fake_mtkgml.gfs") + ############################################################################### # Test that we don't recognize .xsd files themselves @@ -1992,10 +2207,11 @@ def test_ogr_gml_53(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/archsites.xsd') + ds = ogr.Open("data/gml/archsites.xsd") assert ds is None ds = None + ############################################################################### # Test that we can open an empty GML datasource (#249, #5205) @@ -2005,18 +2221,19 @@ def test_ogr_gml_54(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/empty.gfs') + gdal.Unlink("data/gml/empty.gfs") - ds = ogr.Open('data/gml/empty.gml') + ds = ogr.Open("data/gml/empty.gml") assert ds is not None ds = None # with .gfs now - ds = ogr.Open('data/gml/empty.gml') + ds = ogr.Open("data/gml/empty.gml") assert ds is not None ds = None - gdal.Unlink('data/gml/empty.gfs') + gdal.Unlink("data/gml/empty.gfs") + ############################################################################### # Test support for in schemas @@ -2028,14 +2245,13 @@ def test_ogr_gml_55(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/ogr_gml_55.gml') + ds = ogr.Open("data/gml/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/gml/ogr_gml_55.gfs') - + os.unlink("data/gml/ogr_gml_55.gfs") ############################################################################### @@ -2048,38 +2264,44 @@ def test_ogr_gml_56(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/ogr_gml_56.gfs') + gdal.Unlink("data/gml/ogr_gml_56.gfs") - gdal.SetConfigOption('GML_REGISTRY', 'data/gml/ogr_gml_56_registry.xml') - ds = ogr.Open('data/gml/ogr_gml_56.gml') - gdal.SetConfigOption('GML_REGISTRY', None) - lyr = ds.GetLayerByName('mainFeature') + gdal.SetConfigOption("GML_REGISTRY", "data/gml/ogr_gml_56_registry.xml") + ds = ogr.Open("data/gml/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 ( + 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' + assert feat.GetFieldAsStringList( + feat.GetFieldIndex("subFeatureRepeatedProperty_href") + ) == ["#subFeatureRepeated.2"] + assert feat.GetField("foo") == "bar" - lyr = ds.GetLayerByName('subFeatureRepeated') + lyr = ds.GetLayerByName("subFeatureRepeated") feat = lyr.GetNextFeature() - assert feat.GetField('gml_id') == 'subFeatureRepeated.2' - assert feat.GetField('bar') == 'baz' + assert feat.GetField("gml_id") == "subFeatureRepeated.2" + assert feat.GetField("bar") == "baz" feat = lyr.GetNextFeature() - assert feat.GetField('gml_id') == 'subFeatureRepeated.0' + assert feat.GetField("gml_id") == "subFeatureRepeated.0" feat = lyr.GetNextFeature() - assert feat.GetField('gml_id') == 'subFeatureRepeated.1' + assert feat.GetField("gml_id") == "subFeatureRepeated.1" ds = None with pytest.raises(OSError): - os.unlink('data/gml/ogr_gml_56.gfs') - + os.unlink("data/gml/ogr_gml_56.gfs") ############################################################################### @@ -2094,18 +2316,20 @@ def test_ogr_gml_57(): 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) + 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) + lyr = ds.CreateLayer("myLayer", geom_type=ogr.wkbNone) assert lyr.TestCapability(ogr.OLCCreateGeomField) == 1 - geomfielddefn = ogr.GeomFieldDefn('first_geometry', ogr.wkbPoint) + 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) + geomfielddefn = ogr.GeomFieldDefn("second_geometry", ogr.wkbLineString) if i == 1: sr = osr.SpatialReference() sr.ImportFromEPSG(32630) @@ -2116,29 +2340,50 @@ def test_ogr_gml_57(): 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)')) + 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') + 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') + 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)' + 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') + gdal.Unlink("/vsimem/ogr_gml_57.gml") + gdal.Unlink("/vsimem/ogr_gml_57.xsd") ############################################################################### @@ -2150,204 +2395,233 @@ def test_ogr_gml_58(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/inspire_cadastralparcel.gfs') + gdal.Unlink("data/gml/inspire_cadastralparcel.gfs") - ds = ogr.Open('data/gml/inspire_cadastralparcel.xml') + ds = ogr.Open("data/gml/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).GetName() == "geometry" assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbMultiPolygon - assert lyr_defn.GetGeomFieldDefn(1).GetName() == 'referencePoint' + 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')] + 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)' + 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)] + 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(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/gml/inspire_basicpropertyunit.xml') + ds = ogr.Open("data/gml/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')] + 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)] + 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/gml/inspire_cadastralboundary.xml') + ds = ogr.Open("data/gml/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).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'])] + 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)' + 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)] + 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)' + assert feat.GetGeomFieldRef(0).ExportToWkt() == "LINESTRING (2 49,3 50)" feat = None lyr = None ds = None - ds = ogr.Open('data/gml/inspire_cadastralzoning.xml') + ds = ogr.Open("data/gml/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).GetName() == "geometry" assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbMultiPolygon - assert lyr_defn.GetGeomFieldDefn(1).GetName() == 'referencePoint' + 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')] + 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)' + 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)] + 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(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 @@ -2359,32 +2633,35 @@ def test_ogr_gml_59(): # Make sure the .gfs file is more recent that the .gml one try: - gml_mtime = os.stat('data/gml/testcondition.gml').st_mtime - gfs_mtime = os.stat('data/gml/testcondition.gfs').st_mtime + gml_mtime = os.stat("data/gml/testcondition.gml").st_mtime + gfs_mtime = os.stat("data/gml/testcondition.gfs").st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: - print('Touching .gfs file') - f = open('data/gml/testcondition.gfs', 'rb+') + print("Touching .gfs file") + f = open("data/gml/testcondition.gfs", "rb+") data = f.read(1) f.seek(0, 0) f.write(data) f.close() - ds = ogr.Open('data/gml/testcondition.gml') + ds = ogr.Open("data/gml/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'])] + 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 @@ -2396,21 +2673,22 @@ def test_ogr_gml_60(): pytest.skip() # Make sure the .gfs file is more recent that the .gml one - gdal.Unlink('data/gml/wfs_200_multiplelayers.gfs') + gdal.Unlink("data/gml/wfs_200_multiplelayers.gfs") for _ in range(2): - ds = ogr.Open('data/gml/wfs_200_multiplelayers.gml') - lyr = ds.GetLayerByName('road') + ds = ogr.Open("data/gml/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 feat.GetField("gml_id") == "road.21" + lyr = ds.GetLayerByName("popplace") assert lyr.GetFeatureCount() == 1 feat = lyr.GetNextFeature() - assert feat.GetField('gml_id') == 'popplace.BACMK' + assert feat.GetField("gml_id") == "popplace.BACMK" ds = None - gdal.Unlink('data/gml/wfs_200_multiplelayers.gfs') + gdal.Unlink("data/gml/wfs_200_multiplelayers.gfs") + ############################################################################### # Test reading a element specified with a full path in @@ -2423,43 +2701,44 @@ def test_ogr_gml_61(): # Make sure the .gfs file is more recent that the .gml one try: - gml_mtime = os.stat('data/gml/gmlsubfeature.gml').st_mtime - gfs_mtime = os.stat('data/gml/gmlsubfeature.gfs').st_mtime + gml_mtime = os.stat("data/gml/gmlsubfeature.gml").st_mtime + gfs_mtime = os.stat("data/gml/gmlsubfeature.gfs").st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: - print('Touching .gfs file') - f = open('data/gml/gmlsubfeature.gfs', 'rb+') + print("Touching .gfs file") + f = open("data/gml/gmlsubfeature.gfs", "rb+") data = f.read(1) f.seek(0, 0) f.write(data) f.close() - ds = ogr.Open('data/gml/gmlsubfeature.gml') + ds = ogr.Open("data/gml/gmlsubfeature.gml") lyr = ds.GetLayer(0) - assert lyr.GetFeatureCount() == 2, 'did not get expected geometry column name' + 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': + 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))': + 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': + 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))': + 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 @@ -2469,47 +2748,53 @@ def test_ogr_gml_62(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('tmp/gmlattributes.gfs') + gdal.Unlink("tmp/gmlattributes.gfs") - shutil.copy('data/gml/gmlattributes.gml', 'tmp/gmlattributes.gml') + shutil.copy("data/gml/gmlattributes.gml", "tmp/gmlattributes.gml") # Default behaviour - ds = ogr.Open('tmp/gmlattributes.gml') + 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') + 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') + 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) + 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'): + 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: + 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'): + 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 @@ -2526,7 +2811,7 @@ def test_ogr_gml_63(): pytest.skip() # test ST file type - ds = ogr.Open('data/gml/ruian_st_v1.xml.gz') + ds = ogr.Open("data/gml/ruian_st_v1.xml.gz") # check number of layers nlayers = ds.GetLayerCount() @@ -2534,15 +2819,15 @@ def test_ogr_gml_63(): # check name of first layer lyr = ds.GetLayer(0) - assert lyr.GetName() == 'Staty' + assert lyr.GetName() == "Staty" # check geometry column name - assert lyr.GetGeometryColumn() == 'DefinicniBod' + assert lyr.GetGeometryColumn() == "DefinicniBod" ds = None # test OB file type - ds = ogr.Open('data/gml/ruian_ob_v1.xml.gz') + ds = ogr.Open("data/gml/ruian_ob_v1.xml.gz") # check number of layers nlayers = ds.GetLayerCount() @@ -2555,6 +2840,7 @@ def test_ogr_gml_63(): nfeatures += lyr.GetFeatureCount() assert nfeatures == 7 + ############################################################################### # Test multiple instances of parsers (#5571) @@ -2564,11 +2850,11 @@ def test_ogr_gml_64(): if not gdaltest.have_gml_reader: pytest.skip() - for parser in ['XERCES', 'EXPAT']: + for parser in ["XERCES", "EXPAT"]: for _ in range(2): - gdal.SetConfigOption('GML_PARSER', parser) - ds = ogr.Open('data/gml/rnf_eg.gml') - gdal.SetConfigOption('GML_PARSER', None) + gdal.SetConfigOption("GML_PARSER", parser) + ds = ogr.Open("data/gml/rnf_eg.gml") + gdal.SetConfigOption("GML_PARSER", None) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None, parser @@ -2583,22 +2869,36 @@ 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'], - ] + 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 = "/vsimem/ogr_gml_65.gml" # filename = 'ogr_gml_65.gml' - ds = ogr.GetDriverByName('GML').CreateDataSource(filename, options=['FORMAT=GML3', option]) - lyr = ds.CreateLayer('lyr') + 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)))")) + 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') + f = gdal.VSIFOpenL(filename, "rb") + data = gdal.VSIFReadL(1, 10000, f).decode("ascii") gdal.VSIFCloseL(f) assert expected in data @@ -2606,7 +2906,10 @@ def test_ogr_gml_65(): 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)))": + if ( + feat.GetGeometryRef().ExportToWkt() + != "MULTIPOLYGON (((0 1 2,3 4 5,6 7 8,0 1 2)))" + ): feat.DumpReadable() pytest.fail() ds = None @@ -2624,130 +2927,150 @@ def test_ogr_gml_66(): if not gdaltest.have_gml_reader: pytest.skip() - filename = '/vsimem/ogr_gml_66.gml' + 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) + 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))')) + 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)')) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("LINESTRING (0 0,1 1,2 0)")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('curvepolygon', geom_type=ogr.wkbCurvePolygon) + 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))')) + 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))')) + 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) + 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)))')) + 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)))')) + 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) + 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))')) + 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))')) + 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) + 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))')) + 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) + 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)')) + 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) + 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)))')) + 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) + 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))')) + f.SetGeometry(ogr.CreateGeometryFromWkt("MULTILINESTRING ((0 0,0 1,1 1,0 0))")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('compoundcurve_untyped') + lyr = ds.CreateLayer("compoundcurve_untyped") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 0)')) + 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))')) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("LINESTRING (0 0,1 1,2 0)")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('curvepolygon_untyped') + lyr = ds.CreateLayer("curvepolygon_untyped") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) + 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))')) + 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))')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POLYGON ((0 0,0 1,1 1,0 0))")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('multisurface_untyped') + lyr = ds.CreateLayer("multisurface_untyped") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))')) + 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)))')) + 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)))')) + f.SetGeometry(ogr.CreateGeometryFromWkt("MULTIPOLYGON (((0 0,0 1,1 1,0 0)))")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('multicurve_untyped') + lyr = ds.CreateLayer("multicurve_untyped") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0 1,1 1,0 0))')) + 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))')) + 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))')) + f.SetGeometry(ogr.CreateGeometryFromWkt("MULTILINESTRING ((0 0,0 1,1 1,0 0))")) lyr.CreateFeature(f) f = None @@ -2758,147 +3081,186 @@ def test_ogr_gml_66(): ds = ogr.Open(filename) - lyr = ds.GetLayerByName('compoundcurve') + lyr = ds.GetLayerByName("compoundcurve") assert lyr.GetGeomType() == ogr.wkbCompoundCurve feat = lyr.GetNextFeature() - if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))': + 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))': + 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))': + if feat.GetGeometryRef().ExportToWkt() != "COMPOUNDCURVE ((0 0,1 1,2 0))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('curvepolygon') + 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))': + 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))': + if feat.GetGeometryRef().ExportToWkt() != "CURVEPOLYGON ((0 0,0 1,1 1,0 0))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('multisurface') + 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)))': + 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)))': + if feat.GetGeometryRef().ExportToWkt() != "MULTISURFACE (((0 0,0 1,1 1,0 0)))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('multicurve') + 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))': + 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))': + if feat.GetGeometryRef().ExportToWkt() != "MULTICURVE ((0 0,0 1,1 1,0 0))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('polygon') + 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))': + if feat.GetGeometryRef().ExportToWkt() != "POLYGON ((0 0,0 1,1 1,0 0))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('linestring') + 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)': + if feat.GetGeometryRef().ExportToWkt() != "LINESTRING (0 0,0 1,1 1,0 0)": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('multipolygon') + 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)))': + if feat.GetGeometryRef().ExportToWkt() != "MULTIPOLYGON (((0 0,0 1,1 1,0 0)))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('multilinestring') + 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))': + if feat.GetGeometryRef().ExportToWkt() != "MULTILINESTRING ((0 0,0 1,1 1,0 0))": feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('compoundcurve_untyped') + 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))': + 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)': + 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))': + if ( + feat.GetGeometryRef().ExportToWkt() + != "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))" + ): feat.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('curvepolygon_untyped') + 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))': + 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))': + 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))': + 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') + 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)))': + 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)))': + 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)))': + 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') + 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))': + 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))': + 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))': + if ( + feat.GetGeometryRef().ExportToWkt() + != "MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0))" + ): feat.DumpReadable() pytest.fail() @@ -2909,6 +3271,7 @@ def test_ogr_gml_66(): gdal.Unlink(filename) gdal.Unlink(filename[0:-3] + "gfs") + ############################################################################### # Test boolean, int16, integer64 type @@ -2918,27 +3281,27 @@ 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) + 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 = ogr.FieldDefn("b2", ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('bool_list', ogr.OFTIntegerList) + 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 = ogr.FieldDefn("short", ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('float', ogr.OFTReal) + fld_defn = ogr.FieldDefn("float", ogr.OFTReal) fld_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('int64', ogr.OFTInteger64) + fld_defn = ogr.FieldDefn("int64", ogr.OFTInteger64) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('int64list', ogr.OFTInteger64List) + fld_defn = ogr.FieldDefn("int64list", ogr.OFTInteger64List) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) @@ -2964,30 +3327,76 @@ def test_ogr_gml_67(): 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 + 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 + 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 + 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: + 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]: + if ( + f.GetFID() != 1234567890123 + or f.GetField("int64") != 1234567890123 + or f.GetField("int64list") != [1, 1234567890123] + ): f.DumpReadable() pytest.fail(i) ds = None @@ -2997,6 +3406,7 @@ def test_ogr_gml_67(): gdal.Unlink(filename) gdal.Unlink(filename[0:-3] + "gfs") + ############################################################################### # Test reading GML with xsd with a choice of geometry properties @@ -3006,22 +3416,26 @@ def test_ogr_gml_68(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/choicepolygonmultipolygon.gml') + ds = ogr.Open("data/gml/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)))'] + 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' + 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' + assert got_wkt == expected_results[i], "did not get expected geometry" ds = None + ############################################################################### # Test not nullable fields @@ -3031,27 +3445,29 @@ 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) + 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) + field_defn = ogr.FieldDefn("field_nullable", ogr.OFTString) lyr.CreateField(field_defn) - field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) + 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) + 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)')) + 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') + f.SetField("field_not_nullable", "not_null") gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -3060,7 +3476,7 @@ def test_ogr_gml_69(): # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -3069,17 +3485,40 @@ def test_ogr_gml_69(): 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 = 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) @@ -3090,10 +3529,10 @@ 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) + 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 = ogr.FieldDefn("field_string", ogr.OFTString) field_defn.SetDefault("'a'") field_defn.SetNullable(0) lyr.CreateField(field_defn) @@ -3104,10 +3543,10 @@ def test_ogr_gml_70(): ds = None - ds = ogr.Open('/vsimem/ogr_gml_70.gml') - lyr = ds.GetLayerByName('test') + ds = ogr.Open("/vsimem/ogr_gml_70.gml") + lyr = ds.GetLayerByName("test") f = lyr.GetNextFeature() - if f.GetField('field_string') != 'a': + if f.GetField("field_string") != "a": f.DumpReadable() pytest.fail() ds = None @@ -3115,6 +3554,7 @@ def test_ogr_gml_70(): 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 @@ -3123,13 +3563,15 @@ 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)] + 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): @@ -3137,75 +3579,81 @@ def ogr_gml_71_helper(ds): 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' + 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)': + 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)': + 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/gml/wfsjointlayer.gfs') - ds = ogr.Open('data/gml/wfsjointlayer.gml') + gdal.Unlink("data/gml/wfsjointlayer.gfs") + ds = ogr.Open("data/gml/wfsjointlayer.gml") ogr_gml_71_helper(ds) ds = None with pytest.raises(OSError): - os.unlink('data/gml/wfsjointlayer.gfs') - + os.unlink("data/gml/wfsjointlayer.gfs") # With .xsd but that is only partially understood - ds = gdal.OpenEx('data/gml/wfsjointlayer.gml', open_options=['XSD=data/gml/wfsjointlayer_not_understood.xsd']) + ds = gdal.OpenEx( + "data/gml/wfsjointlayer.gml", + open_options=["XSD=data/gml/wfsjointlayer_not_understood.xsd"], + ) ogr_gml_71_helper(ds) ds = None try: - os.unlink('data/gml/wfsjointlayer.gfs') + os.unlink("data/gml/wfsjointlayer.gfs") except OSError: pytest.fail() # Without .xsd nor .gfs - shutil.copy('data/gml/wfsjointlayer.gml', 'tmp/wfsjointlayer.gml') - gdal.Unlink('tmp/wfsjointlayer.gfs') - ds = ogr.Open('tmp/wfsjointlayer.gml') + shutil.copy("data/gml/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') + os.stat("tmp/wfsjointlayer.gfs") except OSError: pytest.fail() # With .gfs - ds = ogr.Open('tmp/wfsjointlayer.gml') + ds = ogr.Open("tmp/wfsjointlayer.gml") ogr_gml_71_helper(ds) ds = None + ############################################################################### # Test name and description @@ -3215,30 +3663,33 @@ 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 = 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 = 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 = 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 = 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 @@ -3249,27 +3700,28 @@ def test_ogr_gml_73(): pytest.skip() try: - os.remove('data/gml/cswresults.gfs') + os.remove("data/gml/cswresults.gfs") except OSError: pass - ds = ogr.Open('data/gml/cswresults.xml') + ds = ogr.Open("data/gml/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' + 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' + 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/gml/cswresults.gfs') + os.remove("data/gml/cswresults.gfs") except OSError: pass @@ -3284,30 +3736,33 @@ def test_ogr_gml_74(): pytest.skip() # With .xsd - ds = gdal.OpenEx('data/gml/expected_gml_gml32.gml', open_options=['FORCE_SRS_DETECTION=YES']) + ds = gdal.OpenEx( + "data/gml/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' + assert lyr.GetSpatialRef() is not None, "did not get expected SRS" + assert lyr.GetFeatureCount() == 2, "did not get expected feature count" - shutil.copy('data/gml/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') + shutil.copy("data/gml/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']) + 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' + 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']) + 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' + 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') + os.unlink("tmp/ogr_gml_74.gml") + os.unlink("tmp/ogr_gml_74.gfs") + ############################################################################### # Test we don't open a WMTS Capabilities doc @@ -3318,8 +3773,9 @@ def test_ogr_gml_75(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.FileFromMemBuffer("/vsimem/ogr_gml_75.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/ogr_gml_75.xml", + """ -""") +""", + ) - ds = ogr.Open('/vsimem/ogr_gml_75.xml') + ds = ogr.Open("/vsimem/ogr_gml_75.xml") assert ds is None - gdal.Unlink('/vsimem/ogr_gml_75.xml') + gdal.Unlink("/vsimem/ogr_gml_75.xml") + ############################################################################### # Test we are robust to content of XML elements bigger than 2 GB @@ -3362,12 +3820,12 @@ def test_ogr_gml_76(): pytest.skip() with gdaltest.error_handler(): - ds = ogr.Open('/vsisparse/data/gml/huge_attribute_gml_sparse.xml') + ds = ogr.Open("/vsisparse/data/gml/huge_attribute_gml_sparse.xml") if ds is not None: lyr = ds.GetLayer(0) lyr.GetNextFeature() - ds = ogr.Open('/vsisparse/data/gml/huge_geom_gml_sparse.xml') + ds = ogr.Open("/vsisparse/data/gml/huge_geom_gml_sparse.xml") if ds is not None: lyr = ds.GetLayer(0) lyr.GetNextFeature() @@ -3382,8 +3840,9 @@ def test_ogr_gml_77(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.FileFromMemBuffer("/vsimem/ogr_gml_77.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/ogr_gml_77.xml", + """ -""") +""", + ) - ds = ogr.Open('/vsimem/ogr_gml_77.xml') + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" ds = None - ds = gdal.OpenEx('/vsimem/ogr_gml_77.xml', open_options=['SWAP_COORDINATES=YES']) + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" ds = None - ds = gdal.OpenEx('/vsimem/ogr_gml_77.xml', open_options=['SWAP_COORDINATES=NO']) + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (49 2)" ds = None - gdal.Unlink('/vsimem/ogr_gml_77.xml') - gdal.Unlink('/vsimem/ogr_gml_77.gfs') + gdal.Unlink("/vsimem/ogr_gml_77.xml") + gdal.Unlink("/vsimem/ogr_gml_77.gfs") + ############################################################################### # Test effect of SWAP_COORDINATES (#6678) @@ -3428,8 +3889,9 @@ def test_ogr_gml_78(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.FileFromMemBuffer("/vsimem/ogr_gml_78.xml", - """ + gdal.FileFromMemBuffer( + "/vsimem/ogr_gml_78.xml", + """ -""") +""", + ) - ds = ogr.Open('/vsimem/ogr_gml_78.xml') + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" ds = None - ds = gdal.OpenEx('/vsimem/ogr_gml_78.xml', open_options=['SWAP_COORDINATES=YES']) + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (49 2)" ds = None - ds = gdal.OpenEx('/vsimem/ogr_gml_78.xml', open_options=['SWAP_COORDINATES=NO']) + 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)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (2 49)" ds = None - gdal.Unlink('/vsimem/ogr_gml_78.xml') - gdal.Unlink('/vsimem/ogr_gml_78.gfs') + gdal.Unlink("/vsimem/ogr_gml_78.xml") + gdal.Unlink("/vsimem/ogr_gml_78.gfs") + ############################################################################### # Test SRSNAME_FORMAT @@ -3474,31 +3938,34 @@ 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'] - ] + 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) + 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)') + 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') + data = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) - assert expected_srsname in data and expected_coords in data, \ - srsname_format + 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") - gdal.Unlink('/vsimem/ogr_gml_79.xml') - gdal.Unlink('/vsimem/ogr_gml_79.xsd') ############################################################################### # Test null / unset @@ -3509,16 +3976,16 @@ 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)) + 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 + f["int_field"] = 4 lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetFieldNull('int_field') + f.SetFieldNull("int_field") lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) @@ -3526,47 +3993,49 @@ def test_ogr_gml_80(): f = None ds = None - ds = ogr.Open('/vsimem/ogr_gml_80.xml') + ds = ogr.Open("/vsimem/ogr_gml_80.xml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['int_field'] != 4: + if f["int_field"] != 4: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f['int_field'] is not None: + if f["int_field"] is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.IsFieldSet('int_field'): + 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') + 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/gml/test_xsi_nil_gfs.gfs') - ds = ogr.Open('data/gml/test_xsi_nil_gfs.gml') + gdal.Unlink("data/gml/test_xsi_nil_gfs.gfs") + ds = ogr.Open("data/gml/test_xsi_nil_gfs.gml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f.GetField('intval') != 1: + if f.GetField("intval") != 1: f.DumpReadable() pytest.fail() ds = None - gdal.Unlink('data/gml/test_xsi_nil_gfs.gfs') + gdal.Unlink("data/gml/test_xsi_nil_gfs.gfs") + ############################################################################### # Test GML_FEATURE_COLLECTION=YES @@ -3577,47 +4046,55 @@ 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']) + 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') + 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') + data = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) - assert 'gml:FeatureCollection' in data + 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') + data = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) assert 'name = "FeatureCollection"' not in data - assert 'gmlsf' not in data + assert "gmlsf" not in data + + gdal.Unlink("/vsimem/ogr_gml_82.gml") + gdal.Unlink("/vsimem/ogr_gml_82.xsd") - 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', options = ['FORMAT=GML2']) - lyr = ds.CreateLayer('test') + ds = ogr.GetDriverByName("GML").CreateDataSource( + "/vsimem/ogr_gml_83.gml", options=["FORMAT=GML2"] + ) + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 0), TIN EMPTY)')) + 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') + gdal.Unlink("/vsimem/ogr_gml_83.gml") + gdal.Unlink("/vsimem/ogr_gml_83.xsd") + ############################################################################### @@ -3627,8 +4104,10 @@ 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, """ + tmpname = "/vsimem/test_ogr_gml_srsname_only_on_top_bounded_by.xml" + gdal.FileFromMemBuffer( + tmpname, + """ 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() + 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() + 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/gml/arcgis-world-wfs.gfs') + gdal.Unlink("data/gml/arcgis-world-wfs.gfs") - ds = ogr.Open('data/gml/arcgis-world-wfs.gml,xsd=data/gml/arcgis-world-wfs.xsd') + ds = ogr.Open("data/gml/arcgis-world-wfs.gml,xsd=data/gml/arcgis-world-wfs.xsd") lyr = ds.GetLayer(0) for i in range(2, 4): - assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTReal + assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTReal + + gdal.Unlink("data/gml/arcgis-world-wfs.gfs") - gdal.Unlink('data/gml/arcgis-world-wfs.gfs') ############################################################################### @@ -3689,43 +4172,56 @@ def test_ogr_gml_standalone_geom(): if not gdaltest.have_gml_reader: pytest.skip() - ds = ogr.Open('data/gml/standalone_geometry.gml') + ds = ogr.Open("data/gml/standalone_geometry.gml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f.GetGeometryRef().ExportToWkt() == 'POLYGON ((2 49,3 49,3 48,2 48,2 49))' + assert f.GetGeometryRef().ExportToWkt() == "POLYGON ((2 49,3 49,3 48,2 48,2 49))" ############################################################################### # Test unique fields -@pytest.mark.parametrize('gml_format', ['GML2','GML3','GML3.2']) -@pytest.mark.parametrize('constraint_met', [True, False]) + +@pytest.mark.parametrize("gml_format", ["GML2", "GML3", "GML3.2"]) +@pytest.mark.parametrize("constraint_met", [True, False]) def test_ogr_gml_unique(gml_format, constraint_met): if not gdaltest.have_gml_reader: pytest.skip() try: - ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/test_ogr_gml_unique.gml', options=['FORMAT='+gml_format]) - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) - field_defn = ogr.FieldDefn('field_not_unique', ogr.OFTString) + ds = ogr.GetDriverByName("GML").CreateDataSource( + "/vsimem/test_ogr_gml_unique.gml", options=["FORMAT=" + gml_format] + ) + lyr = ds.CreateLayer("test", geom_type=ogr.wkbNone) + field_defn = ogr.FieldDefn("field_not_unique", ogr.OFTString) lyr.CreateField(field_defn) - field_defn = ogr.FieldDefn('field_unique', ogr.OFTString) + field_defn = ogr.FieldDefn("field_unique", ogr.OFTString) field_defn.SetUnique(True) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) - f['field_unique'] = 'foo' + f["field_unique"] = "foo" lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f['field_unique'] = 'bar' if constraint_met else 'foo' + f["field_unique"] = "bar" if constraint_met else "foo" lyr.CreateFeature(f) f = None ds = None - ds = gdal.OpenEx('/vsimem/test_ogr_gml_unique.gml') - lyr = ds.GetLayerByName('test') - assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_unique')).IsUnique() == 0 - assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_unique')).IsUnique() == 1 + ds = gdal.OpenEx("/vsimem/test_ogr_gml_unique.gml") + lyr = ds.GetLayerByName("test") + assert ( + lyr.GetLayerDefn() + .GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex("field_not_unique")) + .IsUnique() + == 0 + ) + assert ( + lyr.GetLayerDefn() + .GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex("field_unique")) + .IsUnique() + == 1 + ) ds = None if gdaltest.have_gml_validation: @@ -3740,6 +4236,7 @@ def test_ogr_gml_unique(gml_format, constraint_met): gdal.Unlink("/vsimem/test_ogr_gml_unique.gml") gdal.Unlink("/vsimem/test_ogr_gml_unique.xsd") + ############################################################################### @@ -3748,19 +4245,20 @@ def test_ogr_gml_write_gfs_no(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('/vsimem/test.gfs') - gdal.Unlink('/vsimem/test.xsd') - gdal.FileFromMemBuffer('/vsimem/test.gml', - open('data/gml/expected_gml_gml32.gml', 'rb').read()) + gdal.Unlink("/vsimem/test.gfs") + gdal.Unlink("/vsimem/test.xsd") + gdal.FileFromMemBuffer( + "/vsimem/test.gml", open("data/gml/expected_gml_gml32.gml", "rb").read() + ) - assert gdal.OpenEx('/vsimem/test.gml') is not None - assert gdal.VSIStatL('/vsimem/test.gfs') is not None - gdal.Unlink('/vsimem/test.gfs') + assert gdal.OpenEx("/vsimem/test.gml") is not None + assert gdal.VSIStatL("/vsimem/test.gfs") is not None + gdal.Unlink("/vsimem/test.gfs") - assert gdal.OpenEx('/vsimem/test.gml', open_options = ['WRITE_GFS=NO']) is not None - assert gdal.VSIStatL('/vsimem/test.gfs') is None + assert gdal.OpenEx("/vsimem/test.gml", open_options=["WRITE_GFS=NO"]) is not None + assert gdal.VSIStatL("/vsimem/test.gfs") is None - gdal.Unlink('/vsimem/test.gml') + gdal.Unlink("/vsimem/test.gml") ############################################################################### @@ -3771,21 +4269,24 @@ def test_ogr_gml_write_gfs_yes(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('/vsimem/test.gfs') - gdal.FileFromMemBuffer('/vsimem/test.gml', - open('data/gml/expected_gml_gml32.gml', 'rb').read()) - gdal.FileFromMemBuffer('/vsimem/test.xsd', - open('data/gml/expected_gml_gml32.xsd', 'rb').read()) + gdal.Unlink("/vsimem/test.gfs") + gdal.FileFromMemBuffer( + "/vsimem/test.gml", open("data/gml/expected_gml_gml32.gml", "rb").read() + ) + gdal.FileFromMemBuffer( + "/vsimem/test.xsd", open("data/gml/expected_gml_gml32.xsd", "rb").read() + ) - assert gdal.OpenEx('/vsimem/test.gml') is not None - assert gdal.VSIStatL('/vsimem/test.gfs') is None + assert gdal.OpenEx("/vsimem/test.gml") is not None + assert gdal.VSIStatL("/vsimem/test.gfs") is None - assert gdal.OpenEx('/vsimem/test.gml', open_options = ['WRITE_GFS=YES']) is not None - assert gdal.VSIStatL('/vsimem/test.gfs') is not None + assert gdal.OpenEx("/vsimem/test.gml", open_options=["WRITE_GFS=YES"]) is not None + assert gdal.VSIStatL("/vsimem/test.gfs") is not None + + gdal.Unlink("/vsimem/test.gml") + gdal.Unlink("/vsimem/test.gfs") + gdal.Unlink("/vsimem/test.xsd") - gdal.Unlink('/vsimem/test.gml') - gdal.Unlink('/vsimem/test.gfs') - gdal.Unlink('/vsimem/test.xsd') ############################################################################### @@ -3795,31 +4296,33 @@ def test_ogr_gml_no_gfs_rewriting(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('/vsimem/test.gfs') - gdal.Unlink('/vsimem/test.xsd') - gdal.FileFromMemBuffer('/vsimem/test.gml', - open('data/gml/expected_gml_gml32.gml', 'rb').read()) + gdal.Unlink("/vsimem/test.gfs") + gdal.Unlink("/vsimem/test.xsd") + gdal.FileFromMemBuffer( + "/vsimem/test.gml", open("data/gml/expected_gml_gml32.gml", "rb").read() + ) - assert gdal.OpenEx('/vsimem/test.gml') is not None - assert gdal.VSIStatL('/vsimem/test.gfs') is not None + assert gdal.OpenEx("/vsimem/test.gml") is not None + assert gdal.VSIStatL("/vsimem/test.gfs") is not None - f = gdal.VSIFOpenL('/vsimem/test.gfs', 'rb+') + f = gdal.VSIFOpenL("/vsimem/test.gfs", "rb+") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFSeekL(f, 0, 0) - data += b'' + data += b"" gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) - assert gdal.OpenEx('/vsimem/test.gml') is not None + assert gdal.OpenEx("/vsimem/test.gml") is not None - f = gdal.VSIFOpenL('/vsimem/test.gfs', 'rb+') + f = gdal.VSIFOpenL("/vsimem/test.gfs", "rb+") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) - assert b'' in data + assert b"" in data + + gdal.Unlink("/vsimem/test.gml") + gdal.Unlink("/vsimem/test.gfs") - gdal.Unlink('/vsimem/test.gml') - gdal.Unlink('/vsimem/test.gfs') ############################################################################### # Read AIXM ElevatedSurface @@ -3830,8 +4333,8 @@ def test_ogr_gml_aixm_elevated_surface(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/aixm_ElevatedSurface.gfs') - ds = ogr.Open('data/gml/aixm_ElevatedSurface.xml') + gdal.Unlink("data/gml/aixm_ElevatedSurface.gfs") + ds = ogr.Open("data/gml/aixm_ElevatedSurface.xml") lyr = ds.GetLayer(0) assert lyr.GetExtent() == (2, 3, 49, 50) @@ -3839,40 +4342,44 @@ def test_ogr_gml_aixm_elevated_surface(): feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() - assert got_wkt == 'POLYGON ((2 49,3 49,3 50,2 49))' + assert got_wkt == "POLYGON ((2 49,3 49,3 50,2 49))" ds = None - gdal.Unlink('data/gml/aixm_ElevatedSurface.gfs') + gdal.Unlink("data/gml/aixm_ElevatedSurface.gfs") ############################################################################### # Test support for XML comment srsName="" in .xsd -@pytest.mark.parametrize('gml_format', ['GML2','GML3','GML3.2']) +@pytest.mark.parametrize("gml_format", ["GML2", "GML3", "GML3.2"]) def test_ogr_gml_srs_name_in_xsd(gml_format): if not gdaltest.have_gml_reader: pytest.skip() - filename = '/vsimem/test_ogr_gml_srs_name_in_xsd.gml' - xsdfilename = filename[0:-4] + '.xsd' + filename = "/vsimem/test_ogr_gml_srs_name_in_xsd.gml" + xsdfilename = filename[0:-4] + ".xsd" - ds = ogr.GetDriverByName('GML').CreateDataSource(filename, options=['FORMAT='+gml_format]) + ds = ogr.GetDriverByName("GML").CreateDataSource( + filename, options=["FORMAT=" + gml_format] + ) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) - lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbMultiPolygon) + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbMultiPolygon) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((2 49,2 50,3 50,2 49)))')) + f.SetGeometryDirectly( + ogr.CreateGeometryFromWkt("MULTIPOLYGON (((2 49,2 50,3 50,2 49)))") + ) lyr.CreateFeature(f) f = None ds = None - f = gdal.VSIFOpenL(xsdfilename, 'rb') + f = gdal.VSIFOpenL(xsdfilename, "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) - if gml_format == 'GML2': + if gml_format == "GML2": assert b'' in data else: assert b'' in data @@ -3880,10 +4387,10 @@ def test_ogr_gml_srs_name_in_xsd(gml_format): ds = ogr.Open(filename) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] f = lyr.GetNextFeature() - assert f.GetGeometryRef().ExportToWkt() == 'MULTIPOLYGON (((2 49,2 50,3 50,2 49)))' + assert f.GetGeometryRef().ExportToWkt() == "MULTIPOLYGON (((2 49,2 50,3 50,2 49)))" f = None ds = None @@ -3899,18 +4406,18 @@ def test_ogr_gml_too_nested(): if not gdaltest.have_gml_reader: pytest.skip() - gdal.Unlink('data/gml/too_nested.gfs') + gdal.Unlink("data/gml/too_nested.gfs") with gdaltest.error_handler(): - ds = ogr.Open('data/gml/too_nested.gml') + ds = ogr.Open("data/gml/too_nested.gml") lyr = ds.GetLayer(0) assert lyr.GetNextFeature() is None - gdal.Unlink('data/gml/too_nested.gfs') + gdal.Unlink("data/gml/too_nested.gfs") - with gdaltest.config_option('OGR_GML_NESTING_LEVEL', 'UNLIMITED'): - ds = ogr.Open('data/gml/too_nested.gml') + with gdaltest.config_option("OGR_GML_NESTING_LEVEL", "UNLIMITED"): + ds = ogr.Open("data/gml/too_nested.gml") lyr = ds.GetLayer(0) assert lyr.GetNextFeature() is not None - gdal.Unlink('data/gml/too_nested.gfs') + gdal.Unlink("data/gml/too_nested.gfs") diff --git a/autotest/ogr/ogr_gmlas.py b/autotest/ogr/ogr_gmlas.py index 721c53cf743a..76c34ab38c30 100755 --- a/autotest/ogr/ogr_gmlas.py +++ b/autotest/ogr/ogr_gmlas.py @@ -32,71 +32,79 @@ # DEALINGS IN THE SOFTWARE. ############################################################################### -from http.server import BaseHTTPRequestHandler import os import os.path - +from http.server import BaseHTTPRequestHandler import gdaltest import ogrtest -import webserver - -from osgeo import gdal -from osgeo import ogr import pytest +import webserver +from osgeo import gdal, ogr -pytestmark = pytest.mark.require_driver('GMLAS') +pytestmark = pytest.mark.require_driver("GMLAS") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): - gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', 'YES') + gdal.SetConfigOption("GMLAS_WARN_UNEXPECTED", "YES") # FileGDB embedded libxml2 cause random crashes with CPLValidateXML() use of external libxml2 - old_val_GDAL_XML_VALIDATION = gdal.GetConfigOption('GDAL_XML_VALIDATION') - if ogr.GetDriverByName('FileGDB') is not None and old_val_GDAL_XML_VALIDATION is None: - gdal.SetConfigOption('GDAL_XML_VALIDATION', 'NO') + old_val_GDAL_XML_VALIDATION = gdal.GetConfigOption("GDAL_XML_VALIDATION") + if ( + ogr.GetDriverByName("FileGDB") is not None + and old_val_GDAL_XML_VALIDATION is None + ): + gdal.SetConfigOption("GDAL_XML_VALIDATION", "NO") yield - files = gdal.ReadDir('/vsimem/') + files = gdal.ReadDir("/vsimem/") if files is not None: - print('Remaining files: ' + str(files)) + print("Remaining files: " + str(files)) + + gdal.SetConfigOption("GMLAS_WARN_UNEXPECTED", None) + gdal.SetConfigOption("GDAL_XML_VALIDATION", old_val_GDAL_XML_VALIDATION) - gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', None) - gdal.SetConfigOption('GDAL_XML_VALIDATION', old_val_GDAL_XML_VALIDATION) ############################################################################### -def compare_ogrinfo_output(gmlfile, reffile, options=''): + +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 - ret = ret.replace('data/gmlas\\', 'data/gmlas/') # Windows - expected = open(reffile, 'rb').read().decode('utf-8') - expected = expected.replace('\r\n', '\n') + 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 + 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) + 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:') + pytest.fail("Got:") + ############################################################################### # Basic test @@ -104,16 +112,18 @@ def compare_ogrinfo_output(gmlfile, reffile, options=''): def test_ogr_gmlas_basic(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_test1.xml') + 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') + 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" + ) - return compare_ogrinfo_output('data/gmlas/gmlas_test1.xml', - 'data/gmlas/gmlas_test1.txt') ############################################################################### # Run test_ogrsf @@ -122,17 +132,21 @@ def test_ogr_gmlas_basic(): def test_ogr_gmlas_test_ogrsf(): # Skip tests when -fsanitize is used - if gdaltest.is_travis_branch('sanitize'): - pytest.skip('Skipping because of -sanitize') + 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') + 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 - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test virtual file support @@ -140,24 +154,29 @@ def test_ogr_gmlas_test_ogrsf(): def test_ogr_gmlas_virtual_file(): - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_8.xml', - """""") + xsi:schemaLocation="http://myns ogr_gmlas_8.xsd"/>""", + ) - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_8.xsd', - """ -""") +""", + ) - ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_8.xml') + 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') + gdal.Unlink("/vsimem/ogr_gmlas_8.xml") + gdal.Unlink("/vsimem/ogr_gmlas_8.xsd") + ############################################################################### # Test opening with XSD option @@ -165,18 +184,23 @@ def test_ogr_gmlas_virtual_file(): def test_ogr_gmlas_datafile_with_xsd_option(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['XSD=data/gmlas/gmlas_test1.xsd']) + 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(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xsd']) + 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 @@ -184,10 +208,11 @@ def test_ogr_gmlas_no_datafile_with_xsd_option(): def test_ogr_gmlas_no_datafile_xsd_which_is_not_xsd(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xml']) + 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 @@ -195,9 +220,15 @@ def test_ogr_gmlas_no_datafile_xsd_which_is_not_xsd(): def test_ogr_gmlas_no_datafile_no_xsd(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:') + 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 + assert ( + gdal.GetLastErrorMsg().find( + "XSD open option must be provided when no XML data file is passed" + ) + >= 0 + ) + ############################################################################### # Test opening an inexisting GML file @@ -206,9 +237,10 @@ def test_ogr_gmlas_no_datafile_no_xsd(): def test_ogr_gmlas_non_existing_gml(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:/vsimem/i_do_not_exist.gml') + 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 + 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 @@ -217,9 +249,10 @@ def test_ogr_gmlas_non_existing_gml(): def test_ogr_gmlas_non_existing_xsd(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=/vsimem/i_do_not_exist.xsd']) + 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 + assert gdal.GetLastErrorMsg().find("Cannot resolve /vsimem/i_do_not_exist.xsd") >= 0 + ############################################################################### # Test opening a GML file without schemaLocation @@ -227,15 +260,23 @@ def test_ogr_gmlas_non_existing_xsd(): def test_ogr_gmlas_gml_without_schema_location(): - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_gml_without_schema_location.xml', - """""") + 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') + 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 + 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") - gdal.Unlink('/vsimem/ogr_gmlas_gml_without_schema_location.xml') ############################################################################### # Test invalid schema @@ -244,9 +285,10 @@ def test_ogr_gmlas_gml_without_schema_location(): def test_ogr_gmlas_invalid_schema(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_invalid_schema.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_invalid_schema.xml") assert ds is None - assert gdal.GetLastErrorMsg().find('invalid content') >= 0 + assert gdal.GetLastErrorMsg().find("invalid content") >= 0 + ############################################################################### # Test invalid XML @@ -254,12 +296,16 @@ def test_ogr_gmlas_invalid_schema(): def test_ogr_gmlas_invalid_xml(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_invalid_xml.xml') + 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 + assert ( + gdal.GetLastErrorMsg().find("input ended before all started tags were ended") + >= 0 + ) + ############################################################################### # Test links with gml:ReferenceType @@ -267,19 +313,22 @@ def test_ogr_gmlas_invalid_xml(): def test_ogr_gmlas_gml_Reference(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_test_targetelement.xml') + ds = ogr.Open("GMLAS:data/gmlas/gmlas_test_targetelement.xml") assert ds.GetLayerCount() == 3 - lyr = ds.GetLayerByName('main_elt') + 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: + 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() @@ -290,21 +339,28 @@ def test_ogr_gmlas_gml_Reference(): def test_ogr_gmlas_same_element_in_different_ns(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_same_element_in_different_ns.xml') + 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') + lyr = ds.GetLayerByName("elt") f = lyr.GetNextFeature() - if f.IsFieldSet('abstractElt_other_ns_realizationOfAbstractElt_pkid') == 0: + 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 + 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 @@ -312,163 +368,185 @@ def test_ogr_gmlas_same_element_in_different_ns(): def test_ogr_gmlas_corner_case_relative_path(): - ds = ogr.Open('GMLAS:../ogr/data/gmlas/gmlas_test1.xml') + 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(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_unexpected_repeated_element.xml') + 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! + 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 + 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(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_unexpected_repeated_element_variant.xml') + 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! + 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 + 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(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32.gml', open_options=[ - 'CONFIG_FILE=true']) + 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 ': + if ( + f["geometryProperty_xml"] + != ' 49 2 ' + ): f.DumpReadable() pytest.fail() - if not f.IsFieldNull('geometryPropertyEmpty_xml'): + if not f.IsFieldNull("geometryPropertyEmpty_xml"): f.DumpReadable() pytest.fail() - if f['pointProperty_xml'] != '50 3': + if ( + f["pointProperty_xml"] + != '50 3' + ): f.DumpReadable() pytest.fail() - if f['pointPropertyRepeated_xml'] != [ - '0 1', - '1 2', - '3 4']: + if f["pointPropertyRepeated_xml"] != [ + '0 1', + '1 2', + '3 4', + ]: f.DumpReadable() - pytest.fail(f['pointPropertyRepeated_xml']) - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') + 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) + assert not (sr is None or sr.ExportToWkt().find("4326") < 0) wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping - if wkt != 'POINT (2 49)': + if wkt != "POINT (2 49)": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryPropertyEmpty') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("geometryPropertyEmpty") if f.GetGeomFieldRef(geom_idx) is not None: f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('pointProperty') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("pointProperty") sr = lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetSpatialRef() - assert not (sr is None or sr.ExportToWkt().find('4326') < 0) + assert not (sr is None or sr.ExportToWkt().find("4326") < 0) wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() - if wkt != 'POINT (3 50)': + if wkt != "POINT (3 50)": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') + 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 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)': + if wkt != "LINESTRING (2 49)": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('pointPropertyRepeated') + 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))': + if wkt != "GEOMETRYCOLLECTION (POINT (0 1),POINT (1 2),POINT (3 4))": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('mycustompointproperty_point') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("mycustompointproperty_point") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() - if wkt != 'POINT (5 6)': + 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_idx = lyr.GetLayerDefn().GetGeomFieldIndex("geometryProperty") geom = f.GetGeomFieldRef(geom_idx) - if ogrtest.check_feature_geometry(geom, 'POINT (3.0 0.0)') != 0: + 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') + 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']) + 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') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("geometryProperty") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping - if wkt != 'POINT (49 2)': + if wkt != "POINT (49 2)": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("lineStringProperty") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping - if wkt != 'LINESTRING (2 49)': + 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']) + 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') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("geometryProperty") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping - if wkt != 'POINT (2 49)': + if wkt != "POINT (2 49)": f.DumpReadable() pytest.fail() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("lineStringProperty") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping - if wkt != 'LINESTRING (49 2)': + if wkt != "LINESTRING (49 2)": f.DumpReadable() pytest.fail() @@ -479,25 +557,33 @@ def test_ogr_gmlas_geometryproperty(): def test_ogr_gmlas_abstractgeometry(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_abstractgeometry_gml32.gml', open_options=[ - 'CONFIG_FILE=true']) + 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': + if ( + f["AbstractGeometry_xml"] + != '0 1' + ): f.DumpReadable() pytest.fail() - if f['repeated_AbstractGeometry_xml'] != [ - '0 1', - '1 2']: + if f["repeated_AbstractGeometry_xml"] != [ + '0 1', + '1 2', + ]: f.DumpReadable() - pytest.fail(f['repeated_AbstractGeometry_xml']) + pytest.fail(f["repeated_AbstractGeometry_xml"]) wkt = f.GetGeomFieldRef(0).ExportToWkt() - if wkt != 'POINT (0 1)': + if wkt != "POINT (0 1)": f.DumpReadable() pytest.fail() wkt = f.GetGeomFieldRef(1).ExportToWkt() - if wkt != 'GEOMETRYCOLLECTION (POINT (0 1),POINT (1 2))': + if wkt != "GEOMETRYCOLLECTION (POINT (0 1),POINT (1 2))": f.DumpReadable() pytest.fail() @@ -518,18 +604,18 @@ def error_handler(self, err_type, err_no, err_msg): def test_ogr_gmlas_validate(): # By default check we are silent about validation error - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml') + 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) + gdal.SetConfigOption("GMLAS_WARN_UNEXPECTED", None) lyr = ds.GetLayer(0) lyr.GetFeatureCount() - gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', 'YES') + gdal.SetConfigOption("GMLAS_WARN_UNEXPECTED", "YES") gdal.PopErrorHandler() assert not myhandler.error_list - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_validate.xml") assert ds is not None myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) @@ -542,27 +628,35 @@ def test_ogr_gmlas_validate(): # 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']) + 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()) + 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']) + 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') + 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']) + 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 @@ -570,7 +664,10 @@ def test_ogr_gmlas_validate(): # 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']) + 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 @@ -578,11 +675,14 @@ def test_ogr_gmlas_validate(): # 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']) + 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 @@ -590,11 +690,16 @@ def test_ogr_gmlas_validate(): def test_ogr_gmlas_test_ns_prefix(): # The schema doesn't directly import xlink, but indirectly references it - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test_targetelement.xsd']) + ds = gdal.OpenEx( + "GMLAS:", open_options=["XSD=data/gmlas/gmlas_test_targetelement.xsd"] + ) - lyr = ds.GetLayerByName('_ogr_fields_metadata') + lyr = ds.GetLayerByName("_ogr_fields_metadata") f = lyr.GetNextFeature() - if f['field_xpath'] != 'myns:main_elt/myns:reference_missing_target_elt/@xlink:href': + if ( + f["field_xpath"] + != "myns:main_elt/myns:reference_missing_target_elt/@xlink:href" + ): f.DumpReadable() pytest.fail() @@ -605,10 +710,10 @@ def test_ogr_gmlas_test_ns_prefix(): def test_ogr_gmlas_no_namespace(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_no_namespace.xml') + ds = ogr.Open("GMLAS:data/gmlas/gmlas_no_namespace.xml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['foo'] != 'bar': + if f["foo"] != "bar": f.DumpReadable() pytest.fail() @@ -621,71 +726,104 @@ def test_ogr_gmlas_conf(): # Non existing file with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['CONFIG_FILE=not_existing']) + 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', "") + 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') + 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', "") + 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') + 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']) + 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') + 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']) + ds = gdal.OpenEx( + "GMLAS:data/gmlas/gmlas_test1.xml", + open_options=[ + "CONFIG_FILE=true" + ], + ) assert ds is not None - lyr = ds.GetLayerByName('main_elt') + lyr = ds.GetLayerByName("main_elt") f = lyr.GetNextFeature() - if f['ogr_pkid'].find('main_elt_1') < 0 or \ - f['otherns_id'] != 'otherns_id': + 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']) + 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 + assert lyr.GetLayerDefn().GetFieldIndex("geometryProperty_xml") < 0 f = lyr.GetNextFeature() - geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') + geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex("geometryProperty") wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() - if wkt != 'POINT (2 49)': + 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']) + 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']) + 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 + 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 @@ -694,76 +832,102 @@ def test_ogr_gmlas_conf(): def test_ogr_gmlas_conf_ignored_xpath(): # Test unsupported and invalid XPaths - for xpath in ['', - '1', - '@', - '@/', - '.', - ':', - '/:', - 'a:', - 'a:1', - 'foo[1]', - "foo[@bar='baz']"]: + 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= + gdal.OpenEx( + "GMLAS:", + open_options=[ + "XSD=data/gmlas/gmlas_test1.xsd", + """CONFIG_FILE= true %s - """ % xpath]) - assert gdal.GetLastErrorMsg().find('XPath syntax') >= 0, xpath + """ + % 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= + gdal.OpenEx( + "GMLAS:", + open_options=[ + "XSD=data/gmlas/gmlas_test1.xsd", + """CONFIG_FILE= - """]) - assert gdal.GetLastErrorMsg().find('Prefix ns was already mapped') >= 0 + """, + ], + ) + 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= + 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 + 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 + 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= + 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 = ds.GetLayerByName("main_elt") lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" # Test various XPath syntaxes - ds = gdal.OpenEx('GMLAS:', open_options=[ - 'XSD=data/gmlas/gmlas_test1.xsd', - """CONFIG_FILE= + ds = gdal.OpenEx( + "GMLAS:", + open_options=[ + "XSD=data/gmlas/gmlas_test1.xsd", + """CONFIG_FILE= false myns:main_elt/@optionalStrAttr @@ -777,20 +941,23 @@ def test_ogr_gmlas_conf_ignored_xpath(): myns:main_elt/myns:int_arra foo/myns:long - """]) + """, + ], + ) assert ds is not None - lyr = ds.GetLayerByName('main_elt') + 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 + 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 + assert lyr.GetLayerDefn().GetFieldIndex("int_array") >= 0 + assert lyr.GetLayerDefn().GetFieldIndex("long") >= 0 + ############################################################################### @@ -799,19 +966,18 @@ def test_ogr_gmlas_conf_ignored_xpath(): class GMLASHTTPHandler(BaseHTTPRequestHandler): - - def log_request(self, code='-', size='-'): + 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 = open("/tmp/log.txt", "a") + f.write("GET %s\n" % self.path) f.close() - if self.path.startswith('/vsimem/'): + if self.path.startswith("/vsimem/"): f = gdal.VSIFOpenL(self.path, "rb") if f is None: self.send_response(404) @@ -822,7 +988,7 @@ def do_GET(self): gdal.VSIFSeekL(f, 0, 0) content = gdal.VSIFReadL(1, size, f) gdal.VSIFCloseL(f) - self.protocol_version = 'HTTP/1.0' + self.protocol_version = "HTTP/1.0" self.send_response(200) self.end_headers() self.wfile.write(content) @@ -832,15 +998,20 @@ def do_GET(self): except IOError: pass - self.send_error(404, 'File Not Found: %s' % self.path) + self.send_error(404, "File Not Found: %s" % self.path) + ############################################################################### # Test schema caching -@pytest.mark.skipif('SKIP_OGR_GMLAS_HTTP_RELATED' in os.environ, reason='test skipped on CI due to timeout on Windows Conda builds with parallel ctest') + +@pytest.mark.skipif( + "SKIP_OGR_GMLAS_HTTP_RELATED" in os.environ, + reason="test skipped on CI due to timeout on Windows Conda builds with parallel ctest", +) def test_ogr_gmlas_cache(): - drv = gdal.GetDriverByName('HTTP') + drv = gdal.GetDriverByName("HTTP") if drv is None: pytest.skip() @@ -849,21 +1020,27 @@ def test_ogr_gmlas_cache(): if webserver_port == 0: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache.xml', - """ bar -""" % webserver_port) +""" + % webserver_port, + ) - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache.xsd', - """ -""") +""", + ) - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache_2.xsd', - """ @@ -872,18 +1049,27 @@ def test_ogr_gmlas_cache(): -""") +""", + ) # 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 + 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']) + 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() @@ -892,8 +1078,12 @@ def test_ogr_gmlas_cache(): 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']) + 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() @@ -901,11 +1091,15 @@ def test_ogr_gmlas_cache(): webserver.server_stop(webserver_process, webserver_port) pytest.fail(ds.GetLayerCount()) - gdal.Unlink('/vsimem/my/gmlas_cache/' + gdal.ReadDir('/vsimem/my/gmlas_cache')[0]) + 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']) + 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() @@ -914,9 +1108,13 @@ def test_ogr_gmlas_cache(): 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']) + 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() @@ -927,49 +1125,62 @@ def test_ogr_gmlas_cache(): 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']) + 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: + 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]) + 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 + 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') + 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') + 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') + 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(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_link_nested_independant_child.xml') + 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': + if f["second_my_id"] != "second_id": f.DumpReadable() pytest.fail() @@ -980,25 +1191,31 @@ def test_ogr_gmlas_link_nested_independant_child(): def test_ogr_gmlas_composition_compositionPart(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_composition_compositionPart.xml') + ds = ogr.Open("GMLAS:data/gmlas/gmlas_composition_compositionPart.xml") - lyr = ds.GetLayerByName('first_composition') + lyr = ds.GetLayerByName("first_composition") f = lyr.GetNextFeature() - if f.IsFieldSet('parent_ogr_pkid') == 0 or f.IsFieldSet('CompositionPart_pkid') == 0: + 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: + if ( + f.IsFieldSet("parent_ogr_pkid") == 0 + or f.IsFieldSet("CompositionPart_pkid") == 0 + ): f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('CompositionPart') + lyr = ds.GetLayerByName("CompositionPart") f = lyr.GetNextFeature() - if f.IsFieldSet('my_id') == 0 or f.IsFieldSet('a') == 0: + 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: + if f.IsFieldSet("my_id") == 0 or f.IsFieldSet("a") == 0: f.DumpReadable() pytest.fail() @@ -1010,30 +1227,39 @@ def test_ogr_gmlas_composition_compositionPart(): def test_ogr_gmlas_instantiate_only_gml_feature(): - 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']) + 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(): - ds = ogr.Open('GMLAS:data/gmlas/gmlas_timestamp_ignored_for_hash_foo.xml') + ds = ogr.Open("GMLAS:data/gmlas/gmlas_timestamp_ignored_for_hash_foo.xml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - pkid = f['ogr_pkid'] + pkid = f["ogr_pkid"] - ds = ogr.Open('GMLAS:data/gmlas/gmlas_timestamp_ignored_for_hash_bar.xml') + 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: + if f["ogr_pkid"] != pkid: f.DumpReadable() pytest.fail(pkid) @@ -1044,7 +1270,7 @@ def test_ogr_gmlas_timestamp_ignored_for_hash(): def test_ogr_gmlas_dataset_getnextfeature(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_test1.xml") assert ds.TestCapability(ogr.ODsCRandomLayerRead) == 1 @@ -1061,7 +1287,7 @@ def test_ogr_gmlas_dataset_getnextfeature(): base_count = 59 assert count == base_count - assert last_l.GetName() == 'main_elt' + assert last_l.GetName() == "main_elt" f, lyr = ds.GetNextFeature() assert f is None and lyr is None @@ -1076,16 +1302,22 @@ def test_ogr_gmlas_dataset_getnextfeature(): break assert last_pct == 1.0 - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['EXPOSE_METADATA_LAYERS=YES']) + 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'): + 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']) + ds = gdal.OpenEx( + "GMLAS:data/gmlas/gmlas_test1.xml", open_options=["EXPOSE_METADATA_LAYERS=YES"] + ) count = 0 while True: f, lyr = ds.GetNextFeature() @@ -1095,10 +1327,10 @@ def test_ogr_gmlas_dataset_getnextfeature(): 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'] + 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() @@ -1116,15 +1348,16 @@ def test_ogr_gmlas_dataset_getnextfeature(): 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'], - ]: + 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') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_test1.xml") expected_count = base_count for layer in layers: ds.GetLayerByName(layer) @@ -1144,7 +1377,10 @@ def test_ogr_gmlas_dataset_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']) + ds = gdal.OpenEx( + "GMLAS:", + open_options=["XSD=data/gmlas/gmlas_test1.xsd", "EXPOSE_METADATA_LAYERS=YES"], + ) count = 0 last_l = None while True: @@ -1157,6 +1393,7 @@ def test_ogr_gmlas_dataset_getnextfeature(): assert count != 0 + ############################################################################### # Test that with schemas that have a structure like a base:identifier, we # will inline it. @@ -1164,13 +1401,16 @@ def test_ogr_gmlas_dataset_getnextfeature(): def test_ogr_gmlas_inline_identifier(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_inline_identifier.xsd']) + 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 + assert lyr.GetLayerDefn().GetFieldIndex("identifier_foo") >= 0 + ############################################################################### # Test that we can handle things like gml:name and au:name @@ -1178,24 +1418,32 @@ def test_ogr_gmlas_inline_identifier(): def test_ogr_gmlas_avoid_same_name_inlined_classes(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_avoid_same_name_inlined_classes.xsd']) + 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') + lyr = ds.GetLayerByName("myFeature_ns1_dt") assert lyr is not None - lyr = ds.GetLayerByName('myFeature_ns2_dt') + 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(): 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.OpenEx( + "GMLAS:data/gmlas/gmlas_validate_ignored_fixed_attribute.xml", + open_options=[ + "VALIDATE=YES", + "CONFIG_FILE=@bar", + ], + ) gdal.PopErrorHandler() assert not myhandler.error_list @@ -1203,32 +1451,38 @@ def test_ogr_gmlas_validate_ignored_fixed_attribute(): ############################################################################### # Test REMOVE_UNUSED_LAYERS and REMOVE_UNUSED_FIELDS options + def test_ogr_gmlas_remove_unused_layers_and_fields(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_remove_unused_layers_and_fields.xml', - open_options=['REMOVE_UNUSED_LAYERS=YES', - 'REMOVE_UNUSED_FIELDS=YES']) + 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' + assert ( + f["used1"] == "foo" + and f["used2"] == "bar" + and f["nillable_nilReason"] == "unknown" + ) - lyr = ds.GetLayerByName('_ogr_layers_metadata') + lyr = ds.GetLayerByName("_ogr_layers_metadata") if lyr.GetFeatureCount() != 1: for f in lyr: f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('_ogr_fields_metadata') + lyr = ds.GetLayerByName("_ogr_fields_metadata") if lyr.GetFeatureCount() != 7: for f in lyr: f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('_ogr_layer_relationships') + lyr = ds.GetLayerByName("_ogr_layer_relationships") if lyr.GetFeatureCount() != 0: for f in lyr: f.DumpReadable() @@ -1238,10 +1492,14 @@ def test_ogr_gmlas_remove_unused_layers_and_fields(): ############################################################################### # Test xlink resolution -@pytest.mark.skipif('SKIP_OGR_GMLAS_HTTP_RELATED' in os.environ, reason='test skipped on CI due to timeout on Windows Conda builds with parallel ctest') + +@pytest.mark.skipif( + "SKIP_OGR_GMLAS_HTTP_RELATED" in os.environ, + reason="test skipped on CI due to timeout on Windows Conda builds with parallel ctest", +) def test_ogr_gmlas_xlink_resolver(): - drv = gdal.GetDriverByName('HTTP') + drv = gdal.GetDriverByName("HTTP") if drv is None: pytest.skip() @@ -1249,8 +1507,9 @@ def test_ogr_gmlas_xlink_resolver(): if webserver_port == 0: pytest.skip() - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xsd', - """ @@ -1288,13 +1547,17 @@ def test_ogr_gmlas_xlink_resolver(): -""") +""", + ) - 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_fake_xlink.xsd", + open("data/gmlas/gmlas_fake_xlink.xsd", "rb").read(), + ) - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/ogr_gmlas_xlink_resolver.xml", + """ @@ -1304,61 +1567,73 @@ def test_ogr_gmlas_xlink_resolver(): -""" % (webserver_port, webserver_port)) +""" + % (webserver_port, webserver_port), + ) # By default, no resolution - ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml') + ds = gdal.OpenEx("GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml") lyr = ds.GetLayer(0) - if lyr.GetLayerDefn().GetFieldIndex('my_link_rawcontent') >= 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= + 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: + 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'): + 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') + 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': + 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= + 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) + """ + ], + ) + gdal.SetConfigOption("GMLAS_XLINK_RAM_CACHE_SIZE", None) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['my_link_rawcontent'] != 'bar': + if f["my_link_rawcontent"] != "bar": webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is not cached @@ -1367,48 +1642,52 @@ def test_ogr_gmlas_xlink_resolver(): pytest.fail() # Delete the remote file and check that we can retrieve it from RAM cache - gdal.Unlink('/vsimem/resource.xml') + gdal.Unlink("/vsimem/resource.xml") lyr.ResetReading() f = lyr.GetNextFeature() - if f['my_link_rawcontent'] != 'bar': + if f["my_link_rawcontent"] != "bar": webserver.server_stop(webserver_process, webserver_port) pytest.fail() f = lyr.GetNextFeature() - if f['my_link_rawcontent'] != 'baz': + if f["my_link_rawcontent"] != "baz": webserver.server_stop(webserver_process, webserver_port) pytest.fail() - gdal.Unlink('/vsimem/resource2.xml') + 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: + 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': + 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= + 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': + if f["my_link_rawcontent"] != "bar": webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is cached @@ -1418,19 +1697,24 @@ def test_ogr_gmlas_xlink_resolver(): 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= + 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': + if f["my_link_rawcontent"] != "baz": webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is cached @@ -1440,25 +1724,32 @@ def test_ogr_gmlas_xlink_resolver(): ds = None # Test absent remote resource - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver_absent_resource.xml', - """ + 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= +""" + % 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'): + if f.IsFieldSet("my_link_rawcontent"): f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() @@ -1466,8 +1757,10 @@ def test_ogr_gmlas_xlink_resolver(): # Test file size limit gdal.Unlink(cached_file) - ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', - open_options=["""CONFIG_FILE= + ds = gdal.OpenEx( + "GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml", + open_options=[ + """CONFIG_FILE= 1 /vsimem/gmlas_xlink_cache @@ -1475,11 +1768,13 @@ def test_ogr_gmlas_xlink_resolver(): true true - """]) + """ + ], + ) lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() - if gdal.GetLastErrorMsg() == '': + if gdal.GetLastErrorMsg() == "": webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is not cached @@ -1489,9 +1784,11 @@ def test_ogr_gmlas_xlink_resolver(): 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= + gdal.FileFromMemBuffer("/vsimem/resource.xml", "bar") + ds = gdal.OpenEx( + "GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml", + open_options=[ + """CONFIG_FILE= /vsimem/gmlas_xlink_cache @@ -1500,13 +1797,19 @@ def test_ogr_gmlas_xlink_resolver(): RawContent true - """ % webserver_port]) + """ + % 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': + 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() @@ -1517,13 +1820,18 @@ def test_ogr_gmlas_xlink_resolver(): ds = None # Test with URL specific rule with FieldsFromXPath resolution - gdal.FileFromMemBuffer('/vsimem/subdir1/resource.xml', """ + 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', """ +""", + ) + 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 @@ -1533,11 +1841,13 @@ def test_ogr_gmlas_xlink_resolver(): 1234567890123 1.25 2016-10-07T12:34:56Z -""") - gdal.FileFromMemBuffer('/vsimem/non_matching_resource.xml', 'foo') +""", + ) + gdal.FileFromMemBuffer("/vsimem/non_matching_resource.xml", "foo") - gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xml', - """ + gdal.FileFromMemBuffer( + "/vsimem/ogr_gmlas_xlink_resolver.xml", + """ @@ -1549,7 +1859,9 @@ def test_ogr_gmlas_xlink_resolver(): -""" % (webserver_port, webserver_port, webserver_port, webserver_port)) +""" + % (webserver_port, webserver_port, webserver_port, webserver_port), + ) config_file = """ @@ -1614,57 +1926,77 @@ def test_ogr_gmlas_xlink_resolver(): //datetime - """ % (webserver_port, webserver_port) - - ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', - open_options=['CONFIG_FILE=' + config_file]) + """ % ( + 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': + 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: + 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') + 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]) + 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': + 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() @@ -1673,20 +2005,23 @@ def test_ogr_gmlas_xlink_resolver(): 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') + 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') + 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 @@ -1694,10 +2029,10 @@ def test_ogr_gmlas_xlink_resolver(): def test_ogr_gmlas_recoding(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_recoding.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_recoding.xml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if f['attr'] != '\u00e9': + if f["attr"] != "\u00e9": f.DumpReadable() pytest.fail() @@ -1709,32 +2044,47 @@ def test_ogr_gmlas_recoding(): def test_ogr_gmlas_schema_without_namespace_prefix(): # 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') + 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': + if f["layer_xpath"] != "my_ns:main_elt": f.DumpReadable() pytest.fail() - gdal.Unlink('/vsimem/ogr_gmlas_schema_without_namespace_prefix.xsd') + 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') + 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': + if f["layer_xpath"] != "fake_3_0:main_elt": f.DumpReadable() pytest.fail() - gdal.Unlink('/vsimem/ogr_gmlas_schema_without_namespace_prefix.xsd') + 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') + 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': + if f["layer_xpath"] != "my_namespace:main_elt": f.DumpReadable() pytest.fail() @@ -1745,7 +2095,7 @@ def test_ogr_gmlas_schema_without_namespace_prefix(): def test_ogr_gmlas_truncated_xml(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_truncated_xml.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_truncated_xml.xml") lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() @@ -1760,118 +2110,140 @@ def test_ogr_gmlas_truncated_xml(): def test_ogr_gmlas_identifier_truncation(): - ds = gdal.OpenEx('GMLAS:', open_options=[ - 'XSD=data/gmlas/gmlas_identifier_truncation.xsd', - 'CONFIG_FILE=10false']) - lyr = ds.GetLayerByName('v_l_i_clas') + 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' + assert s == "v_l_idTifi" s = lyr.GetLayerDefn().GetFieldDefn(2).GetName() - assert s == 'an_lo_ide1' + assert s == "an_lo_ide1" s = lyr.GetLayerDefn().GetFieldDefn(3).GetName() - assert s == 'an_lo_ide2' + assert s == "an_lo_ide2" s = lyr.GetLayerDefn().GetFieldDefn(4).GetName() - assert s == 'x' + assert s == "x" s = lyr.GetLayerDefn().GetFieldDefn(5).GetName() - assert s == 'noTCAMELCa' + assert s == "noTCAMELCa" s = lyr.GetLayerDefn().GetFieldDefn(6).GetName() - assert s == 'suuuuuuuuu' + assert s == "suuuuuuuuu" s = lyr.GetLayerDefn().GetFieldDefn(7).GetName() - assert s == '_r_l_o_n_g' - lyr = ds.GetLayerByName('a_l_i_cla1') + 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') + lyr = ds.GetLayerByName("a_l_i_cla2") assert lyr is not None, ds.GetLayer(2).GetName() - lyr = ds.GetLayerByName('y') + 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(): - ds = gdal.OpenEx('GMLAS:', open_options=[ - 'XSD=data/gmlas/gmlas_identifier_case_ambiguity.xsd', - 'CONFIG_FILE=false']) - lyr = ds.GetLayerByName('differentcase1') + 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' + assert s == "differentcase1" s = lyr.GetLayerDefn().GetFieldDefn(2).GetName() - assert s == 'DifferentCASE2' - lyr = ds.GetLayerByName('DifferentCASE2') + 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('SQLite') is None: + 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 = 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']) + 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') + 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('SQLite') is None: + 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 ') + 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') + 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') + expected = open("data/gmlas/gmlas_test1_generated.xml", "rt").read() + expected = expected.replace("\r\n", "\n") if got != expected: print(got) - print('') + print("") - print('Diff:') - os.system('diff -u data/gmlas/gmlas_test1_generated.xml tmp/gmlas_test1_generated.xml') - pytest.fail('Got:') + 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') + 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') + 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') + expected = open("data/gmlas/gmlas_test1_generated.xsd", "rt").read() + expected = expected.replace("\r\n", "\n") if got != expected: print(got) - print('') + print("") - print('Diff:') - os.system('diff -u data/gmlas/gmlas_test1_generated.xsd tmp/gmlas_test1_generated.xsd') - pytest.fail('Got:') + print("Diff:") + os.system( + "diff -u data/gmlas/gmlas_test1_generated.xsd tmp/gmlas_test1_generated.xsd" + ) + pytest.fail("Got:") ############################################################################### @@ -1881,59 +2253,71 @@ def test_ogr_gmlas_writer_check_xml_xsd(): def test_ogr_gmlas_writer_check_xml_read_back(): - if ogr.GetDriverByName('SQLite') is None: + 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') + 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') + 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') + 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(open("tmp/gmlas_test1_generated.xml", "rt").read()) + print("") - print('XSD:') - print(open('tmp/gmlas_test1_generated.xsd', 'rt').read()) - print('') + print("XSD:") + print(open("tmp/gmlas_test1_generated.xsd", "rt").read()) + print("") - print('ogrinfo dump:') + print("ogrinfo dump:") print(ret) - print('') + 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') + 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:') + 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") - gdal.Unlink('tmp/gmlas_test1_generated.xml') - gdal.Unlink('tmp/gmlas_test1_generated.xsd') ############################################################################### # Test writing support with geometries @@ -1941,37 +2325,57 @@ def test_ogr_gmlas_writer_check_xml_read_back(): def test_ogr_gmlas_writer_gml(): - 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 = 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}']) + 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_gml.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + 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') + 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 ( + '49 2' + in content + ) + + assert ( + '50 3' + in content + ) - assert '50 3' in content + assert ( + ' 0 1' + in content + ) - assert ' 0 1' in content + assert ( + ' 1 2' + in content + ) - assert ' 1 2' in content ############################################################################### # Test writing support with geometries and -a_srs @@ -1979,53 +2383,72 @@ def test_ogr_gmlas_writer_gml(): def test_ogr_gmlas_writer_gml_assign_srs(): - 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 = 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) + 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_gml.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + 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') + 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 + 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 = 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']) + 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') + 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 + 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") - 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 @@ -2033,35 +2456,55 @@ def test_ogr_gmlas_writer_gml_assign_srs(): def test_ogr_gmlas_writer_gml_original_xml(): - 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 = 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']) + 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 = 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_gml.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + 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') + gdal.Unlink("/vsimem/ogr_gmlas_writer_gml.xml") + gdal.Unlink("/vsimem/ogr_gmlas_writer_gml.xsd") + + assert ( + ' 49 2 ' + in content + ) - assert ' 49 2 ' in content + assert ( + ' 0 1' + in content + ) - assert ' 0 1' in content + assert ( + ' 1 2' + in content + ) - assert ' 1 2' in content ############################################################################### # Test writing support with XSD, INDENT_SIZE, COMMENT, OUTPUT_XSD_FILENAME, TIMESTAMP options @@ -2069,80 +2512,111 @@ def test_ogr_gmlas_writer_gml_original_xml(): def test_ogr_gmlas_writer_options(): - 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 = 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']) + 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_options.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + content = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') + gdal.Unlink("/vsimem/ogr_gmlas_writer_options.xml") - assert gdal.VSIStatL('/vsimem/my_schema.xsd') is not None + assert gdal.VSIStatL("/vsimem/my_schema.xsd") is not None - gdal.Unlink('/vsimem/my_schema.xsd') + gdal.Unlink("/vsimem/my_schema.xsd") # Test indentation size assert '\n ' in content # Test comment - assert '\n' in content + assert "\n" in content # Test OUTPUT_XSD_FILENAME - assert '/vsimem/my_schema.xsd' in content + assert "/vsimem/my_schema.xsd" in content # Test SRSNAME_FORMAT=OGC_URN - assert '49 2' in content + 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 = 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']) + 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_options.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + content = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') + gdal.Unlink("/vsimem/ogr_gmlas_writer_options.xml") - assert gdal.VSIStatL('/vsimem/my_schema.xsd') is None + 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) + 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 = 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']) + 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', - """ + 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 = 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') + f = gdal.VSIFOpenL("/vsimem/ogr_gmlas_writer_options.xml", "rb") assert f is not None - content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') + content = gdal.VSIFReadL(1, 10000, f).decode("utf-8") gdal.VSIFCloseL(f) - gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') + gdal.Unlink("/vsimem/ogr_gmlas_writer_options.xml") + + assert gdal.VSIStatL("/vsimem/my_schema.xsd") is None - 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 + ) - assert 'xsi:schemaLocation="http://www.opengis.net/wfs/2.0 /vsimem/fake_wfs.xsd ' in content ############################################################################### # Test writing support error handle @@ -2184,95 +2665,173 @@ def test_ogr_gmlas_writer_errors(): # 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 + 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 = 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 + 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 + 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 = 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 + 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 + 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') + 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 + 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') + 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') + 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 + 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') + 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 + 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') + 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 + 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') + 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') + 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 @@ -2281,7 +2840,7 @@ def test_ogr_gmlas_writer_errors(): def test_ogr_gmlas_read_fake_gmljp2(): - ds = gdal.OpenEx('GMLAS:data/gmlas/fake_gmljp2.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/fake_gmljp2.xml") count = 0 while True: @@ -2293,6 +2852,7 @@ def test_ogr_gmlas_read_fake_gmljp2(): assert count == 5 + ############################################################################### # Test TypingConstraints @@ -2300,8 +2860,10 @@ def test_ogr_gmlas_read_fake_gmljp2(): def test_ogr_gmlas_typing_constraints(): # One substitution, no repetition - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_typing_constraints_one_subst_no_repetition.xml', - open_options=["""CONFIG_FILE= + ds = gdal.OpenEx( + "GMLAS:data/gmlas/gmlas_typing_constraints_one_subst_no_repetition.xml", + open_options=[ + """CONFIG_FILE= @@ -2313,23 +2875,27 @@ def test_ogr_gmlas_typing_constraints(): -"""]) +""" + ], + ) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if not f.IsFieldSetAndNotNull('foo_bar_pkid'): + if not f.IsFieldSetAndNotNull("foo_bar_pkid"): f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() - if f.GetField('value') != 'baz': + 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= + ds = gdal.OpenEx( + "GMLAS:data/gmlas/gmlas_typing_constraints_one_subst_with_repetition.xml", + open_options=[ + """CONFIG_FILE= @@ -2341,23 +2907,27 @@ def test_ogr_gmlas_typing_constraints(): -"""]) - lyr = ds.GetLayer('main_elt_foo_bar') +""" + ], + ) + lyr = ds.GetLayer("main_elt_foo_bar") assert lyr.GetFeatureCount() == 2 - lyr = ds.GetLayer('bar') + lyr = ds.GetLayer("bar") f = lyr.GetNextFeature() - if f.GetField('value') != 'baz': + if f.GetField("value") != "baz": f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() - if f.GetField('value') != 'baz2': + 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= + ds = gdal.OpenEx( + "GMLAS:data/gmlas/gmlas_typing_constraints_two_subst.xml", + open_options=[ + """CONFIG_FILE= @@ -2370,45 +2940,52 @@ def test_ogr_gmlas_typing_constraints(): -"""]) +""" + ], + ) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - if not f.IsFieldSetAndNotNull('foo_bar_pkid'): + if not f.IsFieldSetAndNotNull("foo_bar_pkid"): f.DumpReadable() pytest.fail() - if f.IsFieldSetAndNotNull('foo_baz_pkid'): + if f.IsFieldSetAndNotNull("foo_baz_pkid"): f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() - if f.GetField('value') != 'baz': + if f.GetField("value") != "baz": f.DumpReadable() pytest.fail() ds = None + ############################################################################### # Test swe:DataArray def test_ogr_gmlas_swe_dataarray(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_swe_dataarray.xml') + ds = gdal.OpenEx("GMLAS:data/gmlas/gmlas_swe_dataarray.xml") - lyr = ds.GetLayerByName('dataarray_1_components') + 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: + 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: + 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() @@ -2416,17 +2993,21 @@ def test_ogr_gmlas_swe_dataarray(): f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('dataarray_2') + 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: + 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: + 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() @@ -2434,17 +3015,21 @@ def test_ogr_gmlas_swe_dataarray(): f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('dataarray_3') + 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: + 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: + 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() @@ -2458,29 +3043,35 @@ def test_ogr_gmlas_swe_dataarray(): ############################################################################### # Test swe:DataRecord + def test_ogr_gmlas_swe_datarecord(): gdal.ErrorReset() - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_swe_datarecord.xml', open_options=['VALIDATE=YES']) - assert gdal.GetLastErrorMsg() == '' + 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') + 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: + 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 @@ -2491,19 +3082,19 @@ def test_ogr_gmlas_any_field_at_end_of_declaration(): # 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') + 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': + assert gdal.GetLastErrorMsg() != "" + if f.GetField("foo") != "bar": f.DumpReadable() pytest.fail() - if f.GetField('value') != 'baz': - print('Expected fail: value != baz') + if f.GetField("value") != "baz": + print("Expected fail: value != baz") ############################################################################### @@ -2512,10 +3103,10 @@ def test_ogr_gmlas_any_field_at_end_of_declaration(): def test_ogr_gmlas_aux_schema_without_namespace_prefix(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_aux_schema_without_namespace_prefix.xml') - lyr = ds.GetLayerByName('main_elt') + 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'): + if not f.IsFieldSetAndNotNull("generic_pkid"): f.DumpReadable() pytest.fail() @@ -2527,35 +3118,43 @@ def test_ogr_gmlas_aux_schema_without_namespace_prefix(): def test_ogr_gmlas_geometry_as_substitutiongroup(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometry_as_substitutiongroup.xml') - lyr = ds.GetLayerByName('foo') + 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 + ############################################################################### # Test importing a GML geometry whose coordinates elements has leading spaces def test_ogr_gmlas_coordinates_with_leading_space(): - ds = gdal.OpenEx('GMLAS:data/gmlas/coordinates_with_leading_space.gml') + ds = gdal.OpenEx("GMLAS:data/gmlas/coordinates_with_leading_space.gml") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f.GetGeometryRef().ExportToIsoWkt() == "POLYGON Z ((1372074.89354568 6205942.4974615 40.4258117361937,1372074.55352024 6205942.4356387 40.4258117361937,1372074.50715313 6205942.69065778 40.4258117361937,1372074.84717857 6205942.75248059 40.4258117361937,1372074.89354568 6205942.4974615 40.4258117361937))" + assert ( + f.GetGeometryRef().ExportToIsoWkt() + == "POLYGON Z ((1372074.89354568 6205942.4974615 40.4258117361937,1372074.55352024 6205942.4356387 40.4258117361937,1372074.50715313 6205942.69065778 40.4258117361937,1372074.84717857 6205942.75248059 40.4258117361937,1372074.89354568 6205942.4974615 40.4258117361937))" + ) ds = None + ############################################################################### @pytest.mark.require_run_on_demand def test_ogr_gmlas_extra_piezometre(): - 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') + 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", + ) + ############################################################################### @@ -2563,159 +3162,205 @@ def test_ogr_gmlas_extra_piezometre(): @pytest.mark.require_run_on_demand def test_ogr_gmlas_extra_eureg(): - 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') + 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(): - ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_no_element_in_first_choice_schema.xsd']) - lyr = ds.GetLayerByName('_ogr_layers_metadata') + 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': + 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(): with gdaltest.error_handler(): - ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_internal_xlink_href.xml') - lyr = ds.GetLayerByName('main_elt') + 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'): + 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'): + 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'): + 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'): + 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': + 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') + 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': + 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': + 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': + 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': + 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': + 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': + 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': + 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') + 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': + 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': + 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': + 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() + ############################################################################### # Test opening a file whose .xsd has a bad version attribute in the = 0 + 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 @@ -531,42 +576,45 @@ def test_ogr_gpkg_12(): gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = 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' + "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).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).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).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).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).GetName() == "FLD_INTEGER64" assert sql_lyr.GetLayerDefn().GetFieldDefn(4).GetType() == ogr.OFTInteger64 gpkg_ds.ReleaseResultSet(sql_lyr) - sql_lyr = gpkg_ds.ExecuteSQL('SELECT * FROM tbl_linestring_renamed WHERE 0=1') + sql_lyr = gpkg_ds.ExecuteSQL("SELECT * FROM tbl_linestring_renamed WHERE 0=1") feat = sql_lyr.GetNextFeature() assert feat is None 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']: + 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 = gpkg_ds.ExecuteSQL(sql) feat = sql_lyr.GetNextFeature() assert feat is not None @@ -575,56 +623,58 @@ def test_ogr_gpkg_12(): assert sql_lyr.GetFeatureCount() == 1 gpkg_ds.ReleaseResultSet(sql_lyr) - sql_lyr = gpkg_ds.ExecuteSQL('SELECT sqlite_version()') + sql_lyr = 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 gpkg_ds.ReleaseResultSet(sql_lyr) + ############################################################################### # Test non-spatial tables def test_ogr_gpkg_13(): - gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) - lyr = gpkg_ds.CreateLayer('non_spatial', geom_type=ogr.wkbNone) + gpkg_ds = ogr.Open("tmp/gpkg_test.gpkg", update=1) + lyr = gpkg_ds.CreateLayer("non_spatial", geom_type=ogr.wkbNone) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None - lyr.CreateField(ogr.FieldDefn('fld_integer', ogr.OFTInteger)) + lyr.CreateField(ogr.FieldDefn("fld_integer", ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetField('fld_integer', 1) + feat.SetField("fld_integer", 1) lyr.CreateFeature(feat) feat = None lyr.ResetReading() feat = lyr.GetNextFeature() - if not feat.IsFieldNull('fld_integer'): + if not feat.IsFieldNull("fld_integer"): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() - if feat.GetField('fld_integer') != 1: + if feat.GetField("fld_integer") != 1: feat.DumpReadable() pytest.fail() # Test second aspatial layer - lyr = gpkg_ds.CreateLayer('non_spatial2', geom_type=ogr.wkbNone) + lyr = gpkg_ds.CreateLayer("non_spatial2", geom_type=ogr.wkbNone) gpkg_ds = None gdal.ErrorReset() - gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) - assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' + gpkg_ds = ogr.Open("tmp/gpkg_test.gpkg", update=1) + assert gdal.GetLastErrorMsg() == "", "fail : warning NOT expected" assert gpkg_ds.GetLayerCount() == 5 - lyr = gpkg_ds.GetLayer('non_spatial') + lyr = gpkg_ds.GetLayer("non_spatial") assert lyr.GetGeomType() == ogr.wkbNone feat = lyr.GetNextFeature() - assert feat.IsFieldNull('fld_integer') + assert feat.IsFieldNull("fld_integer") feat = lyr.GetNextFeature() - if feat.GetField('fld_integer') != 1: + if feat.GetField("fld_integer") != 1: feat.DumpReadable() pytest.fail() + ############################################################################### # Add various geometries to test spatial filtering @@ -634,27 +684,32 @@ def test_ogr_gpkg_14(): sr = osr.SpatialReference() sr.ImportFromEPSG(32631) - gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) - lyr = gpkg_ds.CreateLayer('point_no_spi-but-with-dashes', geom_type=ogr.wkbPoint, options=['SPATIAL_INDEX=NO'], srs=sr) + gpkg_ds = ogr.Open("tmp/gpkg_test.gpkg", update=1) + lyr = 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)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1000 30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 30000000)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(-1000 30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 -30000000)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1000 -30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 -30000000)')) + 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')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT EMPTY")) lyr.CreateFeature(feat) f = lyr.GetFeature(5) @@ -662,7 +717,7 @@ def test_ogr_gpkg_14(): f.DumpReadable() pytest.fail() f = lyr.GetFeature(6) - if f.GetGeometryRef().ExportToWkt() != 'POINT EMPTY': + if f.GetGeometryRef().ExportToWkt() != "POINT EMPTY": f.DumpReadable() pytest.fail() f = None @@ -672,26 +727,26 @@ def test_ogr_gpkg_14(): gpkg_ds.ReleaseResultSet(sql_lyr) assert res == 0 - lyr = gpkg_ds.CreateLayer('point-with-spi-and-dashes', geom_type=ogr.wkbPoint) + lyr = 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)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1000 30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 30000000)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(-1000 30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 -30000000)')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1000 -30000000)")) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 -30000000)')) + 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')) + feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT EMPTY")) lyr.CreateFeature(feat) sql_lyr = gpkg_ds.ExecuteSQL('SELECT * FROM "point-with-spi-and-dashes"') @@ -716,7 +771,7 @@ def _has_spatialite_4_3_or_later(ds): if sql_lyr: f = sql_lyr.GetNextFeature() version = f.GetField(0) - version = '.'.join(version.split('.')[0:2]) + version = ".".join(version.split(".")[0:2]) version = float(version) if version >= 4.3: has_spatialite_4_3_or_later = True @@ -724,76 +779,100 @@ def _has_spatialite_4_3_or_later(ds): ds.ReleaseResultSet(sql_lyr) return has_spatialite_4_3_or_later + ############################################################################### # Test SQL functions def test_ogr_gpkg_15(): - gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) + gpkg_ds = ogr.Open("tmp/gpkg_test.gpkg", update=1) sql_lyr = 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') + "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: + 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() gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = 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') + "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): + 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() 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 = gpkg_ds.ExecuteSQL("SELECT GPKG_IsAssignable('%s', '%s')" % (expected_type, actual_type)) + ("POINT", "POINT", 1), + ("LINESTRING", "POINT", 0), + ("GEOMETRY", "POINT", 1), + ("POINT", "GEOMETRY", 0), + ("GEOMETRYCOLLECTION", "MULTIPOINT", 1), + ("GEOMETRYCOLLECTION", "POINT", 0), + ]: + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT GPKG_IsAssignable('%s', '%s')" % (expected_type, actual_type) + ) feat = sql_lyr.GetNextFeature() got_result = feat.GetField(0) 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)) + 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), + ("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') + gdal.PushErrorHandler("CPLQuietErrorHandler") sql_lyr = gpkg_ds.ExecuteSQL(sql) if expected_result == 0: gdal.PopErrorHandler() @@ -885,7 +964,9 @@ def test_ogr_gpkg_15(): gpkg_ds.ReleaseResultSet(sql_lyr) # NULL argument - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, NULL) FROM tbl_linestring_renamed") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_Transform(geom, NULL) FROM tbl_linestring_renamed" + ) feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() @@ -895,8 +976,10 @@ def test_ogr_gpkg_15(): # Invalid target SRID=0 # GeoPackage: The record with an srs_id of 0 SHALL be used for undefined geographic coordinate reference systems. with gdaltest.error_handler(): - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, 0), ST_SRID(ST_Transform(geom, 0)) FROM tbl_linestring_renamed") - assert sql_lyr.GetSpatialRef().ExportToWkt().find('Undefined geographic SRS') >= 0 + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_Transform(geom, 0), ST_SRID(ST_Transform(geom, 0)) FROM tbl_linestring_renamed" + ) + assert sql_lyr.GetSpatialRef().ExportToWkt().find("Undefined geographic SRS") >= 0 feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is None or feat.GetField(0) != 0: feat.DumpReadable() @@ -908,10 +991,12 @@ def test_ogr_gpkg_15(): # The source is undefined geographic coordinate reference systems (based on WGS84) and the target is WGS84, # and the result is an identity transformation that leaves geometry unchanged. src_lyr = gpkg_ds.GetLayerByName("point-with-spi-and-dashes") - assert src_lyr.GetSpatialRef().ExportToWkt().find('Undefined geographic SRS') >= 0 + assert src_lyr.GetSpatialRef().ExportToWkt().find("Undefined geographic SRS") >= 0 with gdaltest.error_handler(): - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, 4326), ST_SRID(ST_Transform(geom, 4326)) FROM \"point-with-spi-and-dashes\"") - assert sql_lyr.GetSpatialRef().ExportToWkt().find('WGS_1984') >= 0 + sql_lyr = gpkg_ds.ExecuteSQL( + 'SELECT ST_Transform(geom, 4326), ST_SRID(ST_Transform(geom, 4326)) FROM "point-with-spi-and-dashes"' + ) + assert sql_lyr.GetSpatialRef().ExportToWkt().find("WGS_1984") >= 0 feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is None or feat.GetField(0) != 4326: feat.DumpReadable() @@ -920,21 +1005,27 @@ def test_ogr_gpkg_15(): # Invalid spatialite geometry: SRID=4326,MULTIPOINT EMPTY truncated with gdaltest.error_handler(): - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_Transform(x'0001E610000000000000000000000000000000000000000000000000000000000000000000007C04000000000000FE', 4326) FROM tbl_linestring_renamed") + sql_lyr = 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() gpkg_ds.ReleaseResultSet(sql_lyr) - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, ST_SRID(geom)) FROM tbl_linestring_renamed") + sql_lyr = 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)': + if feat.GetGeometryRef().ExportToWkt() != "LINESTRING (5 5,10 5,10 10,5 10)": feat.DumpReadable() pytest.fail() gpkg_ds.ReleaseResultSet(sql_lyr) - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_SRID(ST_Transform(geom, 4326)) FROM tbl_linestring_renamed") + sql_lyr = 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() @@ -942,7 +1033,9 @@ def test_ogr_gpkg_15(): gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry: SRID=4326,MULTIPOINT EMPTY - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_SRID(ST_Transform(x'0001E610000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE', 4326)) FROM tbl_linestring_renamed") + sql_lyr = 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() @@ -986,25 +1079,31 @@ def test_ogr_gpkg_15(): gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid geometry, but long enough for our purpose... - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'47500011000000000104000000')") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_GeometryType(x'47500011000000000104000000')" + ) feat = sql_lyr.GetNextFeature() - if feat.GetField(0) != 'MULTIPOINT': + if feat.GetField(0) != "MULTIPOINT": feat.DumpReadable() pytest.fail() feat = None gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry (MULTIPOINT EMPTY) - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_GeometryType(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')" + ) feat = sql_lyr.GetNextFeature() - if feat.GetField(0) != 'MULTIPOINT': + if feat.GetField(0) != "MULTIPOINT": feat.DumpReadable() pytest.fail() feat = None gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry (MULTIPOINT EMPTY) - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_IsEmpty(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_IsEmpty(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')" + ) feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() @@ -1014,7 +1113,9 @@ def test_ogr_gpkg_15(): # Error case: invalid geometry with gdaltest.error_handler(): - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'475000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_GeometryType(x'475000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')" + ) feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() @@ -1037,7 +1138,7 @@ def test_ogr_gpkg_15(): # Test hstore_get_value sql_lyr = gpkg_ds.ExecuteSQL("SELECT hstore_get_value('a=>b', 'a')") feat = sql_lyr.GetNextFeature() - if feat.GetField(0) != 'b': + if feat.GetField(0) != "b": feat.DumpReadable() pytest.fail() feat = None @@ -1070,7 +1171,12 @@ def test_ogr_gpkg_15(): feat = None gpkg_ds.ReleaseResultSet(sql_lyr) - if ogr.GetGEOSVersionMajor() * 10000 + ogr.GetGEOSVersionMinor() * 100 + ogr.GetGEOSVersionMicro() >= 30800: + if ( + ogr.GetGEOSVersionMajor() * 10000 + + ogr.GetGEOSVersionMinor() * 100 + + ogr.GetGEOSVersionMicro() + >= 30800 + ): sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_MakeValid(NULL)") feat = sql_lyr.GetNextFeature() assert feat.GetGeometryRef() is None @@ -1081,130 +1187,145 @@ def test_ogr_gpkg_15(): assert feat.GetGeometryRef() is None gpkg_ds.ReleaseResultSet(sql_lyr) - sql_lyr = gpkg_ds.ExecuteSQL("SELECT ST_MakeValid(geom) FROM tbl_linestring_renamed") + sql_lyr = gpkg_ds.ExecuteSQL( + "SELECT ST_MakeValid(geom) FROM tbl_linestring_renamed" + ) feat = sql_lyr.GetNextFeature() - if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (5 5,10 5,10 10,5 10)': + if feat.GetGeometryRef().ExportToWkt() != "LINESTRING (5 5,10 5,10 10,5 10)": feat.DumpReadable() pytest.fail() gpkg_ds.ReleaseResultSet(sql_lyr) if _has_spatialite_4_3_or_later(gpkg_ds): sql_lyr = gpkg_ds.ExecuteSQL( - "SELECT ST_Buffer(geom, 1e-10) FROM tbl_linestring_renamed") + "SELECT ST_Buffer(geom, 1e-10) FROM tbl_linestring_renamed" + ) assert sql_lyr.GetGeomType() == ogr.wkbPolygon - assert sql_lyr.GetSpatialRef().ExportToWkt().find('32631') >= 0 + assert sql_lyr.GetSpatialRef().ExportToWkt().find("32631") >= 0 gpkg_ds.ReleaseResultSet(sql_lyr) + ############################################################################### # Test unknown extensions def test_ogr_gpkg_16(): - 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 = 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') + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg") lyr = ds.GetLayer(0) lyr.GetLayerDefn() gdal.ErrorReset() ds = None - assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' + assert gdal.GetLastErrorMsg() == "", "fail : warning NOT expected" # Warning since we open as read-write - ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg", update=1) lyr = ds.GetLayer(0) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr.GetLayerDefn() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" - ds.ExecuteSQL("UPDATE gpkg_extensions SET scope = 'read-write' WHERE extension_name = 'myext'") + 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') + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg") lyr = ds.GetLayer(0) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr.GetLayerDefn() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" # and also as read-write - ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg", update=1) lyr = ds.GetLayer(0) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr.GetLayerDefn() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" ds = None - gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') + 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 = 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') + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg") lyr = ds.GetLayer(0) gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') + gdal.PushErrorHandler("CPLQuietErrorHandler") lyr.GetLayerDefn() gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" - gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') + 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 = 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') + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg") lyr = ds.GetLayer(0) gdal.ErrorReset() lyr.GetLayerDefn() - assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' + assert gdal.GetLastErrorMsg() == "", "fail : warning NOT expected" # Warning since we open as read-write gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg", update=1) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" - ds.ExecuteSQL("UPDATE gpkg_extensions SET scope = 'read-write' WHERE extension_name = 'myext'") + ds.ExecuteSQL( + "UPDATE gpkg_extensions SET scope = 'read-write' WHERE extension_name = 'myext'" + ) ds = None # Warning since we open as read-only gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg") gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" # and also as read-write gdal.ErrorReset() - gdal.PushErrorHandler('CPLQuietErrorHandler') - ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) + gdal.PushErrorHandler("CPLQuietErrorHandler") + ds = ogr.Open("/vsimem/ogr_gpk_16.gpkg", update=1) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' + assert gdal.GetLastErrorMsg() != "", "fail : warning expected" ds = None - gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') + gdal.Unlink("/vsimem/ogr_gpk_16.gpkg") + ############################################################################### # Run INDIRECT_SQLITE dialect @@ -1212,14 +1333,15 @@ def test_ogr_gpkg_16(): def test_ogr_gpkg_17(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_17.gpkg') - sql_lyr = ds.ExecuteSQL("SELECT ogr_version()", dialect='INDIRECT_SQLITE') + 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') + gdal.Unlink("/vsimem/ogr_gpkg_17.gpkg") + ############################################################################### # Test geometry type extension @@ -1227,19 +1349,19 @@ def test_ogr_gpkg_17(): def test_ogr_gpkg_18(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_18.gpkg') - lyr = ds.CreateLayer('wkbCircularString', geom_type=ogr.wkbCircularString) + 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)')) + 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' + assert validate("/vsimem/ogr_gpkg_18.gpkg"), "validation failed" gdal.ErrorReset() - ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg') - assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' + ds = ogr.Open("/vsimem/ogr_gpkg_18.gpkg") + assert gdal.GetLastErrorMsg() == "", "fail : warning NOT expected" lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbCircularString @@ -1247,30 +1369,34 @@ def test_ogr_gpkg_18(): 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'") + 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') + 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') + 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)')) + 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'") + 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 gdal.ErrorReset() - ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg') - assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' + ds = ogr.Open("/vsimem/ogr_gpkg_18.gpkg") + assert gdal.GetLastErrorMsg() == "", "fail : warning NOT expected" lyr = ds.GetLayer(0) f = lyr.GetNextFeature() @@ -1279,43 +1405,50 @@ def test_ogr_gpkg_18(): ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg', update=1) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("CIRCULARSTRING(0 0,1 0,0 0)")) gdal.ErrorReset() ret = lyr.CreateFeature(f) - assert ret == 0 and gdal.GetLastErrorMsg() == '' + 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) + 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'") + 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 if has_validate(): - ret = validate('/vsimem/ogr_gpkg_18.gpkg', quiet=True) - assert not ret, 'validation unexpectedly succeeded' + 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') + 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))')) + 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_%'") + 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') + gdal.Unlink("/vsimem/ogr_gpkg_18.gpkg") + ############################################################################### # Test metadata @@ -1323,90 +1456,109 @@ def test_ogr_gpkg_18(): def test_ogr_gpkg_19(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_19.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_19.gpkg") assert not ds.GetMetadata() - lyr = ds.CreateLayer('test_without_md') + lyr = ds.CreateLayer("test_without_md") assert not lyr.GetMetadata() - ds.SetMetadataItem('foo', 'bar') + 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') + 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 ds.GetMetadataDomainList() == [""] - ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg') + 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 = 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 = 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') + ds = ogr.Open("/vsimem/ogr_gpkg_19.gpkg") # Check that we don't create triggers sql_lyr = ds.ExecuteSQL( - "SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name IN ('gpkg_metadata', 'gpkg_metadata_reference')") + "SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name IN ('gpkg_metadata', 'gpkg_metadata_reference')" + ) assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) - lyr = ds.GetLayer('test_with_md') - assert lyr.GetMetadataItem('IDENTIFIER') == 'ident' - assert lyr.GetMetadataItem('DESCRIPTION') == 'desc' + 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 = 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'} + 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') + 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 = 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' + 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") - gdal.Unlink('/vsimem/ogr_gpkg_19.gpkg') - gdal.Unlink('/vsimem/ogr_gpkg_19.gpkg.aux.xml') ############################################################################### # Test spatial reference system @@ -1414,122 +1566,141 @@ def test_ogr_gpkg_19(): def test_ogr_gpkg_20(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_20.gpkg") # "Conflict" with EPSG:4326 srs = osr.SpatialReference() - srs.SetFromUserInput("""GEOGCS["my geogcs", + 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) + AUTHORITY["my_org","4326"]]""" + ) + lyr = ds.CreateLayer("my_org_4326", srs=srs) # No authority node srs = osr.SpatialReference() - srs.SetFromUserInput("""GEOGCS["another geogcs", + 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) + 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') + 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") + 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") + 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 + 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' + assert validate("/vsimem/ogr_gpkg_20.gpkg"), "validation failed" - gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_20.gpkg") - ds = gdaltest.gpkg_dr.CreateDataSource('/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") + 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 = ogr.Open("/vsimem/ogr_gpkg_20.gpkg", update=1) - ds.ExecuteSQL('DELETE FROM gpkg_spatial_ref_sys WHERE srs_id = 4326') + ds.ExecuteSQL("DELETE FROM gpkg_spatial_ref_sys WHERE srs_id = 4326") ds = None - gdal.SetConfigOption('OGR_GPKG_FOREIGN_KEY_CHECK', 'NO') + 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 = 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') + gdal.Unlink("/vsimem/ogr_gpkg_20.gpkg") - ds = gdaltest.gpkg_dr.CreateDataSource('/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) + 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.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') + 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 = ogr.Open("/vsimem/ogr_gpkg_20.gpkg", update=1) ds = None - gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_20.gpkg") def test_ogr_gpkg_srs_non_duplication_custom_crs(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_20.gpkg") srs = osr.SpatialReference() - srs.SetFromUserInput("""GEOGCS["my custom geogcs", + srs.SetFromUserInput( + """GEOGCS["my custom geogcs", DATUM["my datum", - SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]""") - lyr = ds.CreateLayer('test', srs=srs) + SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]""" + ) + lyr = ds.CreateLayer("test", srs=srs) assert lyr - lyr = ds.CreateLayer('test2', srs=srs) + lyr = ds.CreateLayer("test2", srs=srs) assert lyr sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) - assert fc == 4 # srs_id 0, 1, 4326 + custom one + assert fc == 4 # srs_id 0, 1, 4326 + custom one - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my custom geogcs'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my custom geogcs'" + ) assert sql_lyr.GetFeatureCount() == 1 f = sql_lyr.GetNextFeature() - assert f['srs_id'] == 100000 - assert f['organization'] == 'NONE' - assert f['organization_coordsys_id'] == 100000 + assert f["srs_id"] == 100000 + assert f["organization"] == "NONE" + assert f["organization_coordsys_id"] == 100000 ds.ReleaseResultSet(sql_lyr) # Test now transitionning to definition_12_063 / WKT2 database structure... srs_3d = osr.SpatialReference() - srs_3d.SetFromUserInput("""GEOGCRS["srs 3d", + srs_3d.SetFromUserInput( + """GEOGCRS["srs 3d", DATUM["some datum", ELLIPSOID["some ellipsoid",6378137,298.257223563, LENGTHUNIT["metre",1]]], @@ -1544,77 +1715,102 @@ def test_ogr_gpkg_srs_non_duplication_custom_crs(): ANGLEUNIT["degree",0.0174532925199433]], AXIS["ellipsoidal height (h)",up, ORDER[3], - LENGTHUNIT["metre",1]]]""") - lyr = ds.CreateLayer('test_3d', srs=srs_3d) + LENGTHUNIT["metre",1]]]""" + ) + lyr = ds.CreateLayer("test_3d", srs=srs_3d) assert lyr - lyr = ds.CreateLayer('test_3d_bis', srs=srs_3d) + lyr = ds.CreateLayer("test_3d_bis", srs=srs_3d) assert lyr - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='srs 3d'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='srs 3d'" + ) assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) # Test again with SRS that can be represented in WKT1 - lyr = ds.CreateLayer('test3', srs=srs) + lyr = ds.CreateLayer("test3", srs=srs) assert lyr - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my custom geogcs'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my custom geogcs'" + ) assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_20.gpkg") def test_ogr_gpkg_srs_non_consistent_with_official_definition(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_20.gpkg") test_fake_4267 = osr.SpatialReference() - test_fake_4267.SetFromUserInput("""GEOGCS["my geogcs 4267", + test_fake_4267.SetFromUserInput( + """GEOGCS["my geogcs 4267", DATUM["WGS_1984", SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433], - AUTHORITY["EPSG","4267"]]""") + AUTHORITY["EPSG","4267"]]""" + ) gdal.ErrorReset() with gdaltest.error_handler(): - lyr = ds.CreateLayer('test_fake_4267', srs=test_fake_4267) - assert gdal.GetLastErrorMsg() == 'Passed SRS uses EPSG:4267 identification, but its definition is not compatible with the official definition of the object. Registering it as a non-EPSG entry into the database.' + lyr = ds.CreateLayer("test_fake_4267", srs=test_fake_4267) + assert ( + gdal.GetLastErrorMsg() + == "Passed SRS uses EPSG:4267 identification, but its definition is not compatible with the official definition of the object. Registering it as a non-EPSG entry into the database." + ) assert lyr # EPSG:4326 already in the database test_fake_4326 = osr.SpatialReference() - test_fake_4326.SetFromUserInput("""GEOGCS["my geogcs 4326", + test_fake_4326.SetFromUserInput( + """GEOGCS["my geogcs 4326", DATUM["WGS_1984", SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433], - AUTHORITY["EPSG","4326"]]""") + AUTHORITY["EPSG","4326"]]""" + ) gdal.ErrorReset() with gdaltest.error_handler(): - lyr = ds.CreateLayer('test_fake_4326', srs=test_fake_4326) - assert gdal.GetLastErrorMsg() == 'Passed SRS uses EPSG:4326 identification, but its definition is not compatible with the definition of that object already in the database. Registering it as a new entry into the database.' + lyr = ds.CreateLayer("test_fake_4326", srs=test_fake_4326) + assert ( + gdal.GetLastErrorMsg() + == "Passed SRS uses EPSG:4326 identification, but its definition is not compatible with the definition of that object already in the database. Registering it as a new entry into the database." + ) assert lyr ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_20.gpkg', update = 1) - lyr = ds.GetLayer('test_fake_4267') - assert lyr.GetSpatialRef().ExportToWkt().replace(',AUTHORITY["EPSG","9122"]', '') == 'GEOGCS["my geogcs 4267",DATUM["WGS_1984",SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4267"]]' + ds = ogr.Open("/vsimem/ogr_gpkg_20.gpkg", update=1) + lyr = ds.GetLayer("test_fake_4267") + assert ( + lyr.GetSpatialRef().ExportToWkt().replace(',AUTHORITY["EPSG","9122"]', "") + == 'GEOGCS["my geogcs 4267",DATUM["WGS_1984",SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4267"]]' + ) - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my geogcs 4267'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my geogcs 4267'" + ) assert sql_lyr.GetFeatureCount() == 1 f = sql_lyr.GetNextFeature() - assert f['srs_id'] == 100000 - assert f['organization'] == 'NONE' - assert f['organization_coordsys_id'] == 100000 + assert f["srs_id"] == 100000 + assert f["organization"] == "NONE" + assert f["organization_coordsys_id"] == 100000 ds.ReleaseResultSet(sql_lyr) - lyr = ds.GetLayer('test_fake_4326') - assert lyr.GetSpatialRef().ExportToWkt().replace(',AUTHORITY["EPSG","9122"]', '') == 'GEOGCS["my geogcs 4326",DATUM["WGS_1984",SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + lyr = ds.GetLayer("test_fake_4326") + assert ( + lyr.GetSpatialRef().ExportToWkt().replace(',AUTHORITY["EPSG","9122"]', "") + == 'GEOGCS["my geogcs 4326",DATUM["WGS_1984",SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' + ) - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my geogcs 4326'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my geogcs 4326'" + ) assert sql_lyr.GetFeatureCount() == 1 f = sql_lyr.GetNextFeature() - assert f['srs_id'] == 100001 - assert f['organization'] == 'NONE' - assert f['organization_coordsys_id'] == 100001 + assert f["srs_id"] == 100001 + assert f["organization"] == "NONE" + assert f["organization_coordsys_id"] == 100001 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys") @@ -1623,8 +1819,8 @@ def test_ogr_gpkg_srs_non_consistent_with_official_definition(): gdal.ErrorReset() gdal.ErrorReset() - lyr = ds.CreateLayer('test_fake_4267_bis', srs=test_fake_4267) - assert gdal.GetLastErrorMsg() == '' + lyr = ds.CreateLayer("test_fake_4267_bis", srs=test_fake_4267) + assert gdal.GetLastErrorMsg() == "" sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys") fc_after = sql_lyr.GetFeatureCount() @@ -1633,31 +1829,37 @@ def test_ogr_gpkg_srs_non_consistent_with_official_definition(): assert fc_before == fc_after ds = None - gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_20.gpkg") def test_ogr_gpkg_write_srs_undefined_geographic(): - gdal.Unlink('tmp/ogr_gpkg_srs_undefined_geographic.gpkg') + gdal.Unlink("tmp/ogr_gpkg_srs_undefined_geographic.gpkg") - gpkg_ds = gdaltest.gpkg_dr.CreateDataSource('tmp/ogr_gpkg_srs_undefined_geographic.gpkg') + gpkg_ds = gdaltest.gpkg_dr.CreateDataSource( + "tmp/ogr_gpkg_srs_undefined_geographic.gpkg" + ) assert gpkg_ds is not None # Check initial default SRS entries in gpkg_spatial_ref_sys sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys") gpkg_spatial_ref_sys_total = sql_lyr.GetNextFeature().GetField(0) - assert gpkg_spatial_ref_sys_total == 3 # entries with SRS IDs: -1, 0, 4326 + assert gpkg_spatial_ref_sys_total == 3 # entries with SRS IDs: -1, 0, 4326 gpkg_ds.ReleaseResultSet(sql_lyr) - srs= osr.SpatialReference() - srs.SetFromUserInput('GEOGCS["Undefined geographic SRS",DATUM["unknown",SPHEROID["unknown",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]') - lyr = gpkg_ds.CreateLayer('srs_test_geographic_layer', geom_type=ogr.wkbPoint, srs=srs) + srs = osr.SpatialReference() + srs.SetFromUserInput( + 'GEOGCS["Undefined geographic SRS",DATUM["unknown",SPHEROID["unknown",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' + ) + lyr = gpkg_ds.CreateLayer( + "srs_test_geographic_layer", geom_type=ogr.wkbPoint, srs=srs + ) srs_wkt = lyr.GetSpatialRef().ExportToWkt() - assert srs_wkt.find('Undefined geographic SRS') >= 0, srs_wkt + assert srs_wkt.find("Undefined geographic SRS") >= 0, srs_wkt assert lyr.GetSpatialRef().IsGeographic() gpkg_ds = None - gpkg_ds = ogr.Open('tmp/ogr_gpkg_srs_undefined_geographic.gpkg') + gpkg_ds = ogr.Open("tmp/ogr_gpkg_srs_undefined_geographic.gpkg") # Check no new SRS entries have been inserted into gpkg_spatial_ref_sys sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys") @@ -1666,35 +1868,37 @@ def test_ogr_gpkg_write_srs_undefined_geographic(): lyr = gpkg_ds.GetLayer(0) srs_wkt = lyr.GetSpatialRef().ExportToWkt() - assert srs_wkt.find('Undefined geographic SRS') >= 0, srs_wkt + assert srs_wkt.find("Undefined geographic SRS") >= 0, srs_wkt assert lyr.GetSpatialRef().IsGeographic() gpkg_ds = None - gdal.Unlink('tmp/ogr_gpkg_srs_undefined_geographic.gpkg') + gdal.Unlink("tmp/ogr_gpkg_srs_undefined_geographic.gpkg") def test_ogr_gpkg_write_srs_undefined_Cartesian(): - gdal.Unlink('tmp/ogr_gpkg_srs_Cartesian.gpkg') + gdal.Unlink("tmp/ogr_gpkg_srs_Cartesian.gpkg") - gpkg_ds = gdaltest.gpkg_dr.CreateDataSource('tmp/ogr_gpkg_srs_Cartesian.gpkg') + gpkg_ds = gdaltest.gpkg_dr.CreateDataSource("tmp/ogr_gpkg_srs_Cartesian.gpkg") assert gpkg_ds is not None # Check initial default SRS entries in gpkg_spatial_ref_sys sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys") gpkg_spatial_ref_sys_total = sql_lyr.GetNextFeature().GetField(0) - assert gpkg_spatial_ref_sys_total == 3 # SRS with IDs: -1, 0, 4326 + assert gpkg_spatial_ref_sys_total == 3 # SRS with IDs: -1, 0, 4326 gpkg_ds.ReleaseResultSet(sql_lyr) - srs= osr.SpatialReference() + srs = osr.SpatialReference() srs.SetFromUserInput('LOCAL_CS["Undefined Cartesian SRS"]') - lyr = gpkg_ds.CreateLayer('srs_test_Cartesian_layer', geom_type=ogr.wkbPoint, srs=srs) + lyr = gpkg_ds.CreateLayer( + "srs_test_Cartesian_layer", geom_type=ogr.wkbPoint, srs=srs + ) srs_wkt = lyr.GetSpatialRef().ExportToWkt() - assert srs_wkt.find('Undefined Cartesian SRS') >= 0 + assert srs_wkt.find("Undefined Cartesian SRS") >= 0 assert lyr.GetSpatialRef().IsLocal() gpkg_ds = None - gpkg_ds = ogr.Open('tmp/ogr_gpkg_srs_Cartesian.gpkg') + gpkg_ds = ogr.Open("tmp/ogr_gpkg_srs_Cartesian.gpkg") # Check no new SRS entries have been inserted into gpkg_spatial_ref_sys sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys") @@ -1703,11 +1907,12 @@ def test_ogr_gpkg_write_srs_undefined_Cartesian(): lyr = gpkg_ds.GetLayer(0) srs_wkt = lyr.GetSpatialRef().ExportToWkt() - assert srs_wkt.find('Undefined Cartesian SRS') >= 0, srs_wkt + assert srs_wkt.find("Undefined Cartesian SRS") >= 0, srs_wkt assert lyr.GetSpatialRef().IsLocal() gpkg_ds = None - gdal.Unlink('tmp/ogr_gpkg_srs_Cartesian.gpkg') + gdal.Unlink("tmp/ogr_gpkg_srs_Cartesian.gpkg") + ############################################################################### # Test maximum width of text fields @@ -1715,118 +1920,123 @@ def test_ogr_gpkg_write_srs_undefined_Cartesian(): def test_ogr_gpkg_21(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_21.gpkg') - lyr = ds.CreateLayer('test') - field_defn = ogr.FieldDefn('str', ogr.OFTString) + 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) + 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') + f.SetField(0, "ab") gdal.ErrorReset() lyr.CreateFeature(f) - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" f = ogr.Feature(lyr.GetLayerDefn()) - f.SetFieldBinaryFromHexString(0, '41E9') + f.SetFieldBinaryFromHexString(0, "41E9") gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField(0, 'abc') + f.SetField(0, "abc") gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" f = lyr.GetFeature(f.GetFID()) - assert f.GetField(0) == 'abc' + assert f.GetField(0) == "abc" - gdal.Unlink('/vsimem/ogr_gpkg_21.gpkg') + 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) + 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') + f.SetFieldBinaryFromHexString(0, "41E9") gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" f = lyr.GetFeature(f.GetFID()) - assert f.GetField(0) == 'A_' + assert f.GetField(0) == "A_" f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField(0, 'abc') + f.SetField(0, "abc") gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" f = lyr.GetFeature(f.GetFID()) - assert f.GetField(0) == 'ab' + assert f.GetField(0) == "ab" + + gdal.Unlink("/vsimem/ogr_gpkg_21.gpkg") - gdal.Unlink('/vsimem/ogr_gpkg_21.gpkg') ############################################################################### def test_ogr_gpkg_table_in_gpkg_content_but_missing(): - filename = '/vsimem/test_ogr_gpkg_table_in_gpkg_content_but_missing.gpkg' + filename = "/vsimem/test_ogr_gpkg_table_in_gpkg_content_but_missing.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - ds.CreateLayer('valid') - ds.ExecuteSQL("INSERT INTO gpkg_contents VALUES('non_existent','attributes','non_existent','','2022-05-18T17:24:49.837Z',NULL,NULL,NULL,NULL,-1);") + ds.CreateLayer("valid") + ds.ExecuteSQL( + "INSERT INTO gpkg_contents VALUES('non_existent','attributes','non_existent','','2022-05-18T17:24:49.837Z',NULL,NULL,NULL,NULL,-1);" + ) ds = None gdal.ErrorReset() with gdaltest.error_handler(): ds = ogr.Open(filename) - assert 'non_existent' in gdal.GetLastErrorMsg() + assert "non_existent" in gdal.GetLastErrorMsg() assert ds.GetLayerCount() == 1 gdal.Unlink(filename) ds = None + ############################################################################### # Test FID64 support def test_ogr_gpkg_22(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_22.gpkg') - lyr = ds.CreateLayer('test') - field_defn = ogr.FieldDefn('foo', ogr.OFTString) + 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.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') + 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') + gdal.Unlink("/vsimem/ogr_gpkg_22.gpkg") + ############################################################################### # Test not nullable fields @@ -1834,26 +2044,28 @@ def test_ogr_gpkg_22(): def test_ogr_gpkg_23(): - 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) + 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) + field_defn = ogr.FieldDefn("field_nullable", ogr.OFTString) lyr.CreateField(field_defn) - field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) + 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)')) + 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') + f.SetField("field_not_nullable", "not_null") gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -1862,7 +2074,7 @@ def test_ogr_gpkg_23(): # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() @@ -1870,11 +2082,11 @@ def test_ogr_gpkg_23(): f = None # Nullable geometry field - lyr = ds.CreateLayer('test2', geom_type=ogr.wkbPoint, options=['SPATIAL_INDEX=NO']) + lyr = ds.CreateLayer("test2", geom_type=ogr.wkbPoint, options=["SPATIAL_INDEX=NO"]) # Cannot add more than one geometry field gdal.PushErrorHandler() - ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foo', ogr.wkbPoint)) + ret = lyr.CreateGeomField(ogr.GeomFieldDefn("foo", ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 @@ -1883,17 +2095,17 @@ def test_ogr_gpkg_23(): f = None # Not-nullable fields and geometry fields created after table creation - lyr = ds.CreateLayer('test3', geom_type=ogr.wkbNone) + lyr = ds.CreateLayer("test3", geom_type=ogr.wkbNone) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None - field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) + 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) + field_defn = ogr.FieldDefn("field_nullable", ogr.OFTString) lyr.CreateField(field_defn) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE data_type = 'features'") @@ -1911,7 +2123,7 @@ def test_ogr_gpkg_23(): ds.ReleaseResultSet(sql_lyr) assert fc == 2 - field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) + field_defn = ogr.GeomFieldDefn("geomfield_not_nullable", ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) @@ -1931,49 +2143,88 @@ def test_ogr_gpkg_23(): 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)')) + 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']) + 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)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) f = None - ds.CreateLayer('test5', geom_type=ogr.wkbNone) + ds.CreateLayer("test5", geom_type=ogr.wkbNone) ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_23.gpkg') + ds = ogr.Open("/vsimem/ogr_gpkg_23.gpkg") - lyr = ds.GetLayerByName('test5') - field_defn = ogr.GeomFieldDefn('', ogr.wkbPoint) + 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("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') + 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("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') + lyr = ds.GetLayerByName("test4") assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 ds = None - gdal.Unlink('/vsimem/ogr_gpkg_23.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_23.gpkg") + ############################################################################### # Test unique constraints on fields @@ -1981,20 +2232,20 @@ def test_ogr_gpkg_23(): def test_ogr_gpkg_unique(): - ds = ogr.GetDriverByName('GPKG').CreateDataSource('/vsimem/ogr_gpkg_unique.gpkg') - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) + ds = ogr.GetDriverByName("GPKG").CreateDataSource("/vsimem/ogr_gpkg_unique.gpkg") + lyr = ds.CreateLayer("test", geom_type=ogr.wkbNone) # Default: no unique constraints - field_defn = ogr.FieldDefn('field_default', ogr.OFTString) + field_defn = ogr.FieldDefn("field_default", ogr.OFTString) lyr.CreateField(field_defn) # Explicit: no unique constraints - field_defn = ogr.FieldDefn('field_no_unique', ogr.OFTString) + field_defn = ogr.FieldDefn("field_no_unique", ogr.OFTString) field_defn.SetUnique(0) lyr.CreateField(field_defn) # Explicit: unique constraints - field_defn = ogr.FieldDefn('field_unique', ogr.OFTString) + field_defn = ogr.FieldDefn("field_unique", ogr.OFTString) field_defn.SetUnique(1) lyr.CreateField(field_defn) @@ -2012,7 +2263,7 @@ def test_ogr_gpkg_unique(): f = None # Test adding columns after "crystallization" - field_defn = ogr.FieldDefn('field_unique_failure', ogr.OFTString) + field_defn = ogr.FieldDefn("field_unique_failure", ogr.OFTString) field_defn.SetUnique(1) # Not allowed by sqlite3. Could potentially be improved with gdaltest.error_handler(): @@ -2023,11 +2274,11 @@ def test_ogr_gpkg_unique(): # Note: leave create table in a single line because of regex spaces testing sql = ( 'CREATE TABLE IF NOT EXISTS "test2" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "field_default" TEXT, "field_no_unique" TEXT, "field_unique" TEXT UNIQUE,`field unique2` TEXT UNIQUE,field_unique3 TEXT UNIQUE, FIELD_UNIQUE_INDEX TEXT, `field unique index2` TEXT, "field_unique_index3" TEXT, NOT_UNIQUE TEXT);', - 'CREATE UNIQUE INDEX test2_unique_idx ON test2(field_unique_index);', # field_unique_index in lowercase whereas in uppercase in CREATE TABLE statement - 'CREATE UNIQUE INDEX test2_unique_idx2 ON test2(`field unique index2`);', + "CREATE UNIQUE INDEX test2_unique_idx ON test2(field_unique_index);", # field_unique_index in lowercase whereas in uppercase in CREATE TABLE statement + "CREATE UNIQUE INDEX test2_unique_idx2 ON test2(`field unique index2`);", 'CREATE UNIQUE INDEX test2_unique_idx3 ON test2("field_unique_index3");', "INSERT INTO gpkg_contents VALUES('test2','attributes','test2','','2020-05-27T12:27:30.136Z',NULL,NULL,NULL,NULL,0);", - "INSERT INTO gpkg_ogr_contents VALUES('test2',NULL);" + "INSERT INTO gpkg_ogr_contents VALUES('test2',NULL);", ) for s in sql: @@ -2036,9 +2287,9 @@ def test_ogr_gpkg_unique(): ds = None # Reload - ds = ogr.Open('/vsimem/ogr_gpkg_unique.gpkg') + ds = ogr.Open("/vsimem/ogr_gpkg_unique.gpkg") - lyr = ds.GetLayerByName('test') + lyr = ds.GetLayerByName("test") layerDefinition = lyr.GetLayerDefn() fldDef = layerDefinition.GetFieldDefn(0) @@ -2048,7 +2299,7 @@ def test_ogr_gpkg_unique(): fldDef = layerDefinition.GetFieldDefn(2) assert fldDef.IsUnique() - lyr = ds.GetLayerByName('test2') + lyr = ds.GetLayerByName("test2") layerDefinition = lyr.GetLayerDefn() fldDef = layerDefinition.GetFieldDefn(0) @@ -2075,7 +2326,8 @@ def test_ogr_gpkg_unique(): assert not fldDef.IsUnique() ds = None - gdal.Unlink('/vsimem/ogr_gpkg_unique.gpkg') + gdal.Unlink("/vsimem/ogr_gpkg_unique.gpkg") + ############################################################################### # Test default values @@ -2083,42 +2335,42 @@ def test_ogr_gpkg_unique(): def test_ogr_gpkg_24(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_24.gpkg') - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) + 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 = 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') + 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') + 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) + 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 = 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 = 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 = 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 = 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 = ogr.FieldDefn("field_date", ogr.OFTDate) field_defn.SetDefault("CURRENT_DATE") lyr.CreateField(field_defn) @@ -2131,15 +2383,15 @@ def test_ogr_gpkg_24(): f = None # Test adding columns after "crystallization" - field_defn = ogr.FieldDefn('field_datetime5', ogr.OFTDateTime) + 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 = 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 = ogr.FieldDefn("field_string2", ogr.OFTString) field_defn.SetDefault("'X'") lyr.CreateField(field_defn) @@ -2150,38 +2402,88 @@ def test_ogr_gpkg_24(): 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 + 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" + 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': + 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') + gdal.Unlink("/vsimem/ogr_gpkg_24.gpkg") + ############################################################################### # Test creating a field with the fid name @@ -2189,45 +2491,45 @@ def test_ogr_gpkg_24(): def test_ogr_gpkg_25(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_25.gpkg') - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['FID=myfid']) + 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)) + lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) gdal.PushErrorHandler() - ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) + ret = lyr.CreateField(ogr.FieldDefn("myfid", ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 - ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) + ret = lyr.CreateField(ogr.FieldDefn("myfid", ogr.OFTInteger)) assert ret == 0 - lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) + 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') + 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') + 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(): + if feat.GetField("myfid") != feat.GetFID(): feat.DumpReadable() pytest.fail() - feat.SetField('str', 'foo') + feat.SetField("str", "foo") ret = lyr.SetFeature(feat) assert ret == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) - feat.SetField('myfid', 10) + feat.SetField("myfid", 10) gdal.PushErrorHandler() ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() @@ -2238,7 +2540,7 @@ def test_ogr_gpkg_25(): gdal.PopErrorHandler() assert ret != 0 - feat.UnsetField('myfid') + feat.UnsetField("myfid") gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() @@ -2246,18 +2548,29 @@ def test_ogr_gpkg_25(): 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: + 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: + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_25.gpkg") + ############################################################################### # Test dataset transactions @@ -2265,7 +2578,7 @@ def test_ogr_gpkg_25(): def test_ogr_gpkg_26(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_26.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_26.gpkg") assert ds.TestCapability(ogr.ODsCTransactions) == 1 @@ -2276,8 +2589,8 @@ def test_ogr_gpkg_26(): gdal.PopErrorHandler() assert ret != 0 - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + lyr = ds.CreateLayer("test") + lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) ret = ds.RollbackTransaction() assert ret == 0 gdal.PushErrorHandler() @@ -2286,7 +2599,7 @@ def test_ogr_gpkg_26(): assert ret != 0 ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_26.gpkg", update=1) assert ds.GetLayerCount() == 0 ret = ds.StartTransaction() assert ret == 0 @@ -2295,8 +2608,8 @@ def test_ogr_gpkg_26(): gdal.PopErrorHandler() assert ret != 0 - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + lyr = ds.CreateLayer("test") + lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) ret = ds.CommitTransaction() assert ret == 0 gdal.PushErrorHandler() @@ -2305,9 +2618,9 @@ def test_ogr_gpkg_26(): assert ret != 0 ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_26.gpkg", update=1) assert ds.GetLayerCount() == 1 - lyr = ds.GetLayerByName('test') + lyr = ds.GetLayerByName("test") ds.StartTransaction() lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) @@ -2331,40 +2644,40 @@ def test_ogr_gpkg_26(): assert lyr.GetFeatureCount() == 2 ds.StartTransaction() - lyr = ds.CreateLayer('test2', geom_type=ogr.wkbPoint) - lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) + 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)')) + 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)')) + 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)) + 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)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(0 0)")) ret = lyr.CreateFeature(f) # ds.CommitTransaction() - ds.ReleaseResultSet(ds.ExecuteSQL('SELECT 1')) + 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)')) + 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' @@ -2373,7 +2686,8 @@ def test_ogr_gpkg_26(): ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_26.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_26.gpkg") + ############################################################################### # Test interface with Spatialite @@ -2381,29 +2695,30 @@ def test_ogr_gpkg_26(): def test_ogr_gpkg_27(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_27.gpkg') + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_27.gpkg") pytest.skip() ds.ReleaseResultSet(sql_lyr) - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (2 49)")) lyr.CreateFeature(f) - sql_lyr = ds.ExecuteSQL('SELECT GeomFromGPB(geom) FROM test') + sql_lyr = ds.ExecuteSQL("SELECT GeomFromGPB(geom) FROM test") f = sql_lyr.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_27.gpkg") + ############################################################################### # Test ogr2ogr -a_srs (as the geopackage driver doesn't clone the passed SRS @@ -2412,12 +2727,15 @@ def test_ogr_gpkg_27(): def test_ogr_gpkg_28(): - 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 + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_28.gpkg") + ############################################################################### # Test XYM / XYZM support @@ -2425,62 +2743,67 @@ def test_ogr_gpkg_28(): def test_ogr_gpkg_29(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_29.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_29.gpkg") assert ds.TestCapability(ogr.ODsCMeasuredGeometries) == 1 - lyr = ds.CreateLayer('pointm', geom_type=ogr.wkbPointM) + 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)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT M (1 2 3)")) lyr.CreateFeature(f) - lyr = ds.CreateLayer('pointzm', geom_type=ogr.wkbPointZM) + 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)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT ZM (1 2 3 4)")) lyr.CreateFeature(f) ds = None - assert validate('/vsimem/ogr_gpkg_29.gpkg'), 'validation failed' + assert validate("/vsimem/ogr_gpkg_29.gpkg"), "validation failed" - ds = ogr.Open('/vsimem/ogr_gpkg_29.gpkg', update=1) - lyr = ds.GetLayerByName('pointm') + 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)': + 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'") + ds.ExecuteSQL( + "UPDATE pointm SET geom = x'4750000700000000000000000000F03F000000000000F03F000000000000004000000000000000400000000000000840000000000000084001D1070000000000000000F03F00000000000000400000000000000840'" + ) - lyr = ds.GetLayerByName('pointzm') + lyr = ds.GetLayerByName("pointzm") assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': + 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.ExecuteSQL( + "UPDATE pointzm SET geom = x'4750000900000000000000000000F03F000000000000F03F00000000000000400000000000000040000000000000084000000000000008400000000000001040000000000000104001B90B0000000000000000F03F000000000000004000000000000008400000000000001040'" + ) ds = None # Check again - ds = ogr.Open('/vsimem/ogr_gpkg_29.gpkg') - lyr = ds.GetLayerByName('pointm') + 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)': + if f.GetGeometryRef().ExportToIsoWkt() != "POINT M (1 2 3)": f.DumpReadable() pytest.fail() - lyr = ds.GetLayerByName('pointzm') + lyr = ds.GetLayerByName("pointzm") assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() - if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_29.gpkg") + ############################################################################### # Test non standard file extension (#6396) @@ -2490,20 +2813,20 @@ def test_ogr_gpkg_30(): gdal.ErrorReset() with gdaltest.error_handler(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_30.geopkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_30.geopkg") assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ds = None gdal.ErrorReset() with gdaltest.error_handler(): - ds = ogr.Open('/vsimem/ogr_gpkg_30.geopkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_30.geopkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ds = None with gdaltest.error_handler(): - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_30.geopkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_30.geopkg") ############################################################################### @@ -2512,33 +2835,34 @@ def test_ogr_gpkg_30(): def test_ogr_gpkg_31(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_31.gpkg') - lyr = ds.CreateLayer('curve', geom_type=ogr.wkbCurve) + 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)')) + 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))')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("COMPOUNDCURVE ((1 2,3 4))")) lyr.CreateFeature(f) - lyr = ds.CreateLayer('surface', geom_type=ogr.wkbSurface) + 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))')) + 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))')) + 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') + ds = ogr.Open("/vsimem/ogr_gpkg_31.gpkg") + lyr = ds.GetLayerByName("curve") assert lyr.GetGeomType() == ogr.wkbCurve - lyr = ds.GetLayerByName('surface') + lyr = ds.GetLayerByName("surface") assert lyr.GetGeomType() == ogr.wkbSurface ds = None - assert validate('/vsimem/ogr_gpkg_31.gpkg'), 'validation failed' + assert validate("/vsimem/ogr_gpkg_31.gpkg"), "validation failed" + + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_31.gpkg") - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_31.gpkg') ############################################################################### # Run creating a non-spatial layer that isn't registered as 'aspatial' and @@ -2547,11 +2871,13 @@ def test_ogr_gpkg_31(): def test_ogr_gpkg_32(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_32.gpkg') - ds.CreateLayer('aspatial', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=NOT_REGISTERED']) + 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') + ds = ogr.Open("/vsimem/ogr_gpkg_32.gpkg") assert ds.GetLayerCount() == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents") assert sql_lyr.GetFeatureCount() == 0 @@ -2559,14 +2885,17 @@ def test_ogr_gpkg_32(): sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_extensions'") + 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' + assert validate("/vsimem/ogr_gpkg_32.gpkg"), "validation failed" + + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_32.gpkg") - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_32.gpkg') ############################################################################### # Test OGR_CURRENT_DATE @@ -2574,37 +2903,41 @@ def test_ogr_gpkg_32(): def test_ogr_gpkg_33(): - 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) + 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) + 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'") + 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'" + ) assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_33.gpkg') + 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(): layer_name = """weird'layer"name""" - dbname = '/vsimem/ogr_gpkg_34.gpkg' + 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)) + 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))')) + 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 ( + lyr.SetMetadataItem("FOO", "BAR") + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, @@ -2614,13 +2947,16 @@ def test_ogr_gpkg_34(): 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.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') + f = gdal.VSIFOpenL(dbname, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) assert layer_name in content @@ -2630,7 +2966,7 @@ def test_ogr_gpkg_34(): gdal.ErrorReset() with gdaltest.error_handler(): ds.ExecuteSQL('ALTER TABLE "weird\'layer""name" RENAME TO gpkg_contents') - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() ds.ExecuteSQL('ALTER TABLE "weird\'layer""name" RENAME TO "weird2\'layer""name"') ds = None @@ -2638,21 +2974,21 @@ def test_ogr_gpkg_34(): ds = ogr.Open(dbname, update=1) gdal.ErrorReset() ds.ExecuteSQL('ALTER TABLE "weird2\'layer""name" RENAME COLUMN "foo" TO "bar"') - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" lyr = ds.GetLayerByName(new_layer_name) - assert lyr.GetLayerDefn().GetFieldIndex('bar') >= 0 + assert lyr.GetLayerDefn().GetFieldIndex("bar") >= 0 gdal.ErrorReset() ds.ExecuteSQL('ALTER TABLE "weird2\'layer""name" DROP COLUMN "bar"') - assert gdal.GetLastErrorMsg() == '' - assert lyr.GetLayerDefn().GetFieldIndex('bar') < 0 + assert gdal.GetLastErrorMsg() == "" + assert lyr.GetLayerDefn().GetFieldIndex("bar") < 0 - ds.ExecuteSQL('VACUUM') + 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') + f = gdal.VSIFOpenL(dbname, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) assert layer_name not in content @@ -2661,17 +2997,17 @@ def test_ogr_gpkg_34(): ds = ogr.Open(dbname, update=1) gdal.ErrorReset() with gdaltest.error_handler(): - ds.ExecuteSQL('DELLAYER:does_not_exist') - assert gdal.GetLastErrorMsg() != '' + ds.ExecuteSQL("DELLAYER:does_not_exist") + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() - ds.ExecuteSQL('DELLAYER:' + layer_name) - assert gdal.GetLastErrorMsg() == '' - ds.ExecuteSQL('VACUUM') + 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') + f = gdal.VSIFOpenL(dbname, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) assert layer_name not in content @@ -2682,75 +3018,83 @@ def test_ogr_gpkg_34(): 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))')) + 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') + lyr.SetMetadataItem("FOO", "BAR") + lyr = ds.CreateLayer("another_layer_name") ds = None ds = ogr.Open(dbname, update=1) gdal.ErrorReset() ds.ExecuteSQL('DROP TABLE "weird2\'layer""name"') - assert gdal.GetLastErrorMsg() == '' - ds.ExecuteSQL('DROP TABLE another_layer_name') - assert gdal.GetLastErrorMsg() == '' + 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() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() - ds.ExecuteSQL('VACUUM') + 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') + 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 + assert "another_layer_name" not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) + ############################################################################### # Test DeleteField() def test_ogr_gpkg_35(): - dbname = '/vsimem/ogr_gpkg_35.gpkg' + 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)) + 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))')) + 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)) + 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)) # Metadata - lyr_nonspatial.SetMetadataItem('FOO', 'BAR') - ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('column', 'test_nonspatial', 'bar_i_will_disappear', NULL, '2021-01-01T00:00:00.000Z', 1, NULL)") - ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (2, 'dataset','http://gdal.org','text/plain','bla')") - ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('column', 'test_nonspatial', 'bar_i_will_disappear', NULL, '2021-01-01T00:00:00.000Z', 2, NULL)") + lyr_nonspatial.SetMetadataItem("FOO", "BAR") + ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('column', 'test_nonspatial', 'bar_i_will_disappear', NULL, '2021-01-01T00:00:00.000Z', 1, NULL)" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_metadata VALUES (2, 'dataset','http://gdal.org','text/plain','bla')" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('column', 'test_nonspatial', 'bar_i_will_disappear', NULL, '2021-01-01T00:00:00.000Z', 2, NULL)" + ) f = ogr.Feature(lyr_nonspatial.GetLayerDefn()) f.SetFID(10) - f.SetField('foo', 'fooval') - f.SetField('bar_i_will_disappear', 'barval') - f.SetField('baz', 'bazval') + 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 ( + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, @@ -2760,8 +3104,10 @@ def test_ogr_gpkg_35(): 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("""CREATE TABLE gpkg_data_column_constraints ( +)""" + ) + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_column_constraints ( constraint_name TEXT NOT NULL, constraint_type TEXT NOT NULL, value TEXT, @@ -2771,9 +3117,14 @@ def test_ogr_gpkg_35(): max_is_inclusive BOOLEAN, description TEXT, CONSTRAINT gdcc_ntv UNIQUE (constraint_name, - constraint_type, value))""") - 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')") + constraint_type, value))""" + ) + 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 @@ -2790,8 +3141,12 @@ def test_ogr_gpkg_35(): 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))': + 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() @@ -2801,11 +3156,11 @@ def test_ogr_gpkg_35(): assert ret == 0 lyr_nonspatial.ResetReading() f = lyr_nonspatial.GetNextFeature() - if f.GetFID() != 10 or f['foo'] != 'fooval' or f['baz'] != 'bazval': + if f.GetFID() != 10 or f["foo"] != "fooval" or f["baz"] != "bazval": f.DumpReadable() pytest.fail() - ds.ExecuteSQL('VACUUM') + ds.ExecuteSQL("VACUUM") ds = None @@ -2814,16 +3169,16 @@ def test_ogr_gpkg_35(): # Try on read-only dataset ds = ogr.Open(dbname) - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_metadata WHERE id = 1') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_metadata WHERE id = 1") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_metadata WHERE id = 2') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_metadata WHERE id = 2") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) - lyr = ds.GetLayerByName('test_nonspatial') - assert lyr.GetMetadataItem('FOO') == 'BAR' + lyr = ds.GetLayerByName("test_nonspatial") + assert lyr.GetMetadataItem("FOO") == "BAR" lyr = ds.GetLayer(0) with gdaltest.error_handler(): @@ -2832,33 +3187,35 @@ def test_ogr_gpkg_35(): 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') + f = gdal.VSIFOpenL(dbname, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) - assert 'bar_i_will_disappear' not in content + assert "bar_i_will_disappear" not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) + ############################################################################### # Test AlterFieldDefn() def test_ogr_gpkg_36(): - dbname = '/vsimem/ogr_gpkg_36.gpkg' + 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)) + 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))')) + 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 ( + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, @@ -2868,8 +3225,10 @@ def test_ogr_gpkg_36(): 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("""CREATE TABLE gpkg_data_column_constraints ( +)""" + ) + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_column_constraints ( constraint_name TEXT NOT NULL, constraint_type TEXT NOT NULL, value TEXT, @@ -2879,41 +3238,52 @@ def test_ogr_gpkg_36(): max_is_inclusive BOOLEAN, description TEXT, CONSTRAINT gdcc_ntv UNIQUE (constraint_name, - constraint_type, value))""") - 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', 'read-write')") + constraint_type, value))""" + ) + 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', 'read-write')" + ) ds.ExecuteSQL("CREATE INDEX my_idx ON test(foo)") # Metadata - lyr.SetMetadataItem('FOO', 'BAR') - ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('column', 'test', 'foo', NULL, '2021-01-01T00:00:00.000Z', 1, NULL)") + lyr.SetMetadataItem("FOO", "BAR") + ds.ExecuteSQL( + "INSERT INTO gpkg_metadata_reference VALUES ('column', 'test', 'foo', NULL, '2021-01-01T00:00:00.000Z', 1, NULL)" + ) assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 with gdaltest.error_handler(): - ret = lyr.AlterFieldDefn(-1, ogr.FieldDefn('foo'), ogr.ALTER_ALL_FLAG) + 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) + 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) + 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) + 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) + 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 = ogr.FieldDefn("bar", ogr.OFTReal) new_field_defn.SetSubType(ogr.OFSTFloat32) new_field_defn.SetWidth(10) - new_field_defn.SetDefault('5') + new_field_defn.SetDefault("5") # Schema only change assert lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) == 0 @@ -2927,35 +3297,41 @@ def test_ogr_gpkg_36(): assert lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) == 0 # Violation of not-null constraint - new_field_defn = ogr.FieldDefn('baz', ogr.OFTString) + new_field_defn = ogr.FieldDefn("baz", ogr.OFTString) new_field_defn.SetNullable(False) with gdaltest.error_handler(): - assert lyr.AlterFieldDefn(1 , new_field_defn, ogr.ALTER_ALL_FLAG) != 0 + assert lyr.AlterFieldDefn(1, 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))': + 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 # Just change the name, and run it outside an existing transaction lyr.StartTransaction() - new_field_defn = ogr.FieldDefn('baw2', ogr.OFTString) + new_field_defn = ogr.FieldDefn("baw2", ogr.OFTString) assert lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) == 0 lyr.CommitTransaction() # Just change the name, and run it under an existing transaction lyr.StartTransaction() - new_field_defn = ogr.FieldDefn('baw', ogr.OFTString) + 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))': + 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 @@ -2967,7 +3343,7 @@ def test_ogr_gpkg_36(): f = None ds.ReleaseResultSet(sql_lyr) - ds.ExecuteSQL('VACUUM') + ds.ExecuteSQL("VACUUM") ds = None @@ -2976,38 +3352,42 @@ def test_ogr_gpkg_36(): # Try on read-only dataset ds = ogr.Open(dbname) - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_data_columns WHERE table_name = 'test' AND column_name = 'baw'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_data_columns WHERE table_name = 'test' AND column_name = 'baw'" + ) assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_metadata_reference WHERE table_name = 'test' AND column_name = 'baw'") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_metadata_reference WHERE table_name = 'test' AND column_name = 'baw'" + ) assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) lyr = ds.GetLayer(0) with gdaltest.error_handler(): - ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('foo'), ogr.ALTER_ALL_FLAG) + 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') + f = gdal.VSIFOpenL(dbname, "rb") + content = gdal.VSIFReadL(1, 1000000, f).decode("latin1") gdal.VSIFCloseL(f) - assert 'foo' not in content + 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 = 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(): - new_field_defn = ogr.FieldDefn('bar') + new_field_defn = ogr.FieldDefn("bar") new_field_defn.SetNullable(False) ret = lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) assert ret != 0 @@ -3016,25 +3396,27 @@ def test_ogr_gpkg_36(): gdaltest.gpkg_dr.DeleteDataSource(dbname) + ############################################################################### # Test ReorderFields() def test_ogr_gpkg_37(): - dbname = '/vsimem/ogr_gpkg_37.gpkg' + 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)) + 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))')) + 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 ( + ds.ExecuteSQL( + """CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, @@ -3044,9 +3426,14 @@ def test_ogr_gpkg_37(): 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( + "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)") @@ -3059,15 +3446,24 @@ def test_ogr_gpkg_37(): assert lyr.ReorderFields([1, 0]) == 0 lyr.ResetReading() - assert lyr.GetLayerDefn().GetFieldIndex('foo') == 1 and lyr.GetLayerDefn().GetFieldIndex('bar') == 0 + 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))': + 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'") + 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) @@ -3083,23 +3479,26 @@ def test_ogr_gpkg_37(): gdaltest.gpkg_dr.DeleteDataSource(dbname) + ############################################################################### # Test GetExtent() and RECOMPUTE EXTENT ON -def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): +def test_ogr_gpkg_38(options=["SPATIAL_INDEX=YES"]): - dbname = '/vsimem/ogr_gpkg_38.gpkg' + dbname = "/vsimem/ogr_gpkg_38.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(dbname) - lyr = ds.CreateLayer('test', geom_type=ogr.wkbLineString, options=options) + lyr = ds.CreateLayer("test", geom_type=ogr.wkbLineString, options=options) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)')) + 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.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) @@ -3109,9 +3508,9 @@ def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): # 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') + 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: + 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) @@ -3120,14 +3519,14 @@ def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): # Modify feature f = lyr.GetFeature(1) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (-1 -2,-3 -4)')) + 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') + ds.ExecuteSQL("RECOMPUTE EXTENT ON test") extent = lyr.GetExtent(force=0) assert extent == (-3.0, -1.0, -4.0, -2.0) ds = None @@ -3144,7 +3543,7 @@ def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): lyr.DeleteFeature(1) # This should cancel NULLify the extent in gpkg_contents - ds.ExecuteSQL('RECOMPUTE EXTENT ON test') + ds.ExecuteSQL("RECOMPUTE EXTENT ON test") extent = lyr.GetExtent(force=0, can_return_null=True) assert extent is None ds = None @@ -3159,7 +3558,7 @@ def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): def test_ogr_gpkg_38_nospi(): - return test_ogr_gpkg_38(options=['SPATIAL_INDEX=NO']) + return test_ogr_gpkg_38(options=["SPATIAL_INDEX=NO"]) ############################################################################### @@ -3168,34 +3567,42 @@ def test_ogr_gpkg_38_nospi(): def test_ogr_gpkg_39(): - dbname = '/vsimem/ogr_gpkg_39.gpkg' + dbname = "/vsimem/ogr_gpkg_39.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(dbname) - ds.CreateLayer('test') + ds.CreateLayer("test") - lyr = ds.CreateLayer('test_with_explicit_identifier', options=['IDENTIFIER=explicit_identifier']) + 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']) + 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']) + lyr = ds.CreateLayer("test2", options=["IDENTIFIER=test"]) assert lyr is None with gdaltest.error_handler(): - lyr = ds.CreateLayer('test2', options=['IDENTIFIER=explicit_identifier']) + 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' )") + 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']) + 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 @@ -3203,11 +3610,11 @@ def test_ogr_gpkg_39(): def test_ogr_gpkg_40(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_40.gpkg') - ds.CreateLayer('aspatial', geom_type=ogr.wkbNone) + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_40.gpkg") + ds.CreateLayer("aspatial", geom_type=ogr.wkbNone) ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_40.gpkg') + ds = ogr.Open("/vsimem/ogr_gpkg_40.gpkg") assert ds.GetLayerCount() == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents") assert sql_lyr.GetFeatureCount() == 1 @@ -3215,14 +3622,17 @@ def test_ogr_gpkg_40(): sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_extensions'") + 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' + assert validate("/vsimem/ogr_gpkg_40.gpkg"), "validation failed" + + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_40.gpkg") - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_40.gpkg') ############################################################################### # Test tables without integer primary key (#6799), and unrecognized column type @@ -3230,31 +3640,34 @@ def test_ogr_gpkg_40(): def test_ogr_gpkg_41(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_41.gpkg') - ds.ExecuteSQL('CREATE TABLE foo (mycol VARCHAR_ILLEGAL)') + 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.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') + 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: + if f["mycol"] != "myval" or f.GetFID() != 1: f.DumpReadable() pytest.fail() ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_41.gpkg') + 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: + if f["mycol"] != "myval" or f.GetFID() != 1: f.DumpReadable() pytest.fail() ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_41.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_41.gpkg") + ############################################################################### # Test feature_count @@ -3262,7 +3675,9 @@ def test_ogr_gpkg_41(): def foo_has_trigger(ds): sql_lyr = ds.ExecuteSQL( - "SELECT COUNT(*) FROM sqlite_master WHERE name = 'trigger_insert_feature_count_foo'", dialect='DEBUG') + "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 @@ -3271,7 +3686,9 @@ def foo_has_trigger(ds): def get_feature_count_from_gpkg_contents(ds): - sql_lyr = ds.ExecuteSQL('SELECT feature_count FROM gpkg_ogr_contents', dialect='DEBUG') + sql_lyr = ds.ExecuteSQL( + "SELECT feature_count FROM gpkg_ogr_contents", dialect="DEBUG" + ) f = sql_lyr.GetNextFeature() val = f.GetField(0) f = None @@ -3281,23 +3698,23 @@ def get_feature_count_from_gpkg_contents(ds): def test_ogr_gpkg_42(): - 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)) + 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') + 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) + ds = ogr.Open("/vsimem/ogr_gpkg_42.gpkg", update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 10) @@ -3311,7 +3728,7 @@ def test_ogr_gpkg_42(): fc = lyr.GetFeatureCount() assert fc == 6 - ds.ExecuteSQL('DELETE FROM foo WHERE i = 1') + ds.ExecuteSQL("DELETE FROM foo WHERE i = 1") assert foo_has_trigger(ds) @@ -3324,46 +3741,49 @@ def test_ogr_gpkg_42(): ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) + 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.ExecuteSQL("UPDATE gpkg_ogr_contents SET feature_count = NULL") ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) + 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) + 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.ExecuteSQL("UPDATE gpkg_ogr_contents SET feature_count = 5000") - ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_42.gpkg", update=1) lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 5000 # Test renaming assert lyr.TestCapability(ogr.OLCRename) == 1 - assert lyr.Rename('bar') == ogr.OGRERR_NONE - assert lyr.GetDescription() == 'bar' - assert lyr.GetLayerDefn().GetName() == 'bar' + assert lyr.Rename("bar") == ogr.OGRERR_NONE + assert lyr.GetDescription() == "bar" + assert lyr.GetLayerDefn().GetName() == "bar" with gdaltest.error_handler(): assert lyr.Rename("bar") != ogr.OGRERR_NONE with gdaltest.error_handler(): assert lyr.Rename("gpkg_ogr_contents") != ogr.OGRERR_NONE - assert lyr.GetDescription() == 'bar' - assert lyr.GetLayerDefn().GetName() == 'bar' + assert lyr.GetDescription() == "bar" + assert lyr.GetLayerDefn().GetName() == "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') + 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 @@ -3372,27 +3792,30 @@ def test_ogr_gpkg_42(): # Test layer deletion ds.DeleteLayer(0) - sql_lyr = ds.ExecuteSQL("SELECT feature_count FROM gpkg_ogr_contents", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL( + "SELECT feature_count FROM gpkg_ogr_contents", 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)) + 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) + 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)') + sql_lyr = ds.ExecuteSQL("PRAGMA table_info(gpkg_contents)") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 10 @@ -3409,61 +3832,71 @@ def test_ogr_gpkg_42(): lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 6 - ds.ExecuteSQL('DELETE FROM foo WHERE i = 1') + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_42.gpkg") ############################################################################### # Test limitations on number of tables + def test_ogr_gpkg_43(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_43.gpkg') + 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)) + 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.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 - ds = gdal.OpenEx('/vsimem/ogr_gpkg_43.gpkg') - assert len(ds.GetMetadata_List('SUBDATASETS')) == 2 * 1001 + ds = gdal.OpenEx("/vsimem/ogr_gpkg_43.gpkg") + assert len(ds.GetMetadata_List("SUBDATASETS")) == 2 * 1001 assert ds.GetLayerCount() == 1001 - with gdaltest.config_option('OGR_TABLE_LIMIT', '1000'): + with gdaltest.config_option("OGR_TABLE_LIMIT", "1000"): with gdaltest.error_handler(): - ds = gdal.OpenEx('/vsimem/ogr_gpkg_43.gpkg') - assert len(ds.GetMetadata_List('SUBDATASETS')) == 2 * 1000 + ds = gdal.OpenEx("/vsimem/ogr_gpkg_43.gpkg") + assert len(ds.GetMetadata_List("SUBDATASETS")) == 2 * 1000 assert ds.GetLayerCount() == 1000 ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_43.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_43.gpkg") ############################################################################### # Test GeoPackage without metadata table + def test_ogr_gpkg_44(): - gdal.SetConfigOption('CREATE_METADATA_TABLES', 'NO') - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_44.gpkg') - ds.CreateLayer('foo') + 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) + gdal.SetConfigOption("CREATE_METADATA_TABLES", None) - assert validate('/vsimem/ogr_gpkg_44.gpkg'), 'validation failed' + assert validate("/vsimem/ogr_gpkg_44.gpkg"), "validation failed" - ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg') + ds = ogr.Open("/vsimem/ogr_gpkg_44.gpkg") md = ds.GetMetadata() assert md == {} md = ds.GetLayer(0).GetMetadata() @@ -3474,34 +3907,40 @@ def test_ogr_gpkg_44(): assert fc == 0 ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg', update=1) - ds.SetMetadataItem('FOO', 'BAR') + ds = ogr.Open("/vsimem/ogr_gpkg_44.gpkg", update=1) + ds.SetMetadataItem("FOO", "BAR") ds = None - ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg') + ds = ogr.Open("/vsimem/ogr_gpkg_44.gpkg") md = ds.GetMetadata() - assert md == {'FOO': 'BAR'} + assert md == {"FOO": "BAR"} ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_44.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_44.gpkg") ############################################################################### # Test non conformant GeoPackage: table with non INTEGER PRIMARY KEY + def test_ogr_gpkg_45(): - 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 = 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') + ds = ogr.Open("/vsimem/ogr_gpkg_45.gpkg") lyr = ds.GetLayer(0) - assert lyr.GetFIDColumn() == '' + assert lyr.GetFIDColumn() == "" assert lyr.GetLayerDefn().GetFieldCount() == 2 ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_45.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_45.gpkg") + ############################################################################### # Test spatial view and spatial index @@ -3509,43 +3948,65 @@ def test_ogr_gpkg_45(): def test_ogr_gpkg_46(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_46.gpkg') - lyr = ds.CreateLayer('foo') + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 1)")) lyr.CreateFeature(f) # Note: this definition of a view is non conformant with GPKG 1.3 clarifications on views - 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_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)" + ) # Note: this definition of a view is non conformant with GPKG 1.3 clarifications on views - 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_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 * 10000 + b.fid as my_fid, a.fid as fid1, 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.ExecuteSQL( + "CREATE VIEW my_view3 AS SELECT a.fid * 10000 + b.fid as my_fid, a.fid as fid1, 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') + 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' + 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')")) + 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')) + lyr.CreateField(ogr.FieldDefn("bar")) # Check if spatial index is recognized sql_lyr = ds.ExecuteSQL("SELECT HasSpatialIndex('my_view', 'my_geom')") @@ -3554,8 +4015,8 @@ def test_ogr_gpkg_46(): 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') + 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) @@ -3566,16 +4027,16 @@ def test_ogr_gpkg_46(): assert f is None # View with FID in non-first position - lyr = ds.GetLayerByName('my_view2') + lyr = ds.GetLayerByName("my_view2") assert lyr.GetLayerDefn().GetFieldCount() == 1 - assert lyr.GetFIDColumn() == 'OGC_FID' + assert lyr.GetFIDColumn() == "OGC_FID" f = lyr.GetNextFeature() - if f.GetFID() != 1 or f.GetField(0) != 'bla': + if f.GetFID() != 1 or f.GetField(0) != "bla": f.DumpReadable() pytest.fail() # View with FID in first position - lyr = ds.GetLayerByName('my_view3') + lyr = ds.GetLayerByName("my_view3") assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() assert f.GetFID() == 10001 @@ -3585,7 +4046,8 @@ def test_ogr_gpkg_46(): assert f.Equal(f2) ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_46.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_46.gpkg") + ############################################################################### # Test corner case of Identify() @@ -3593,146 +4055,155 @@ def test_ogr_gpkg_46(): def test_ogr_gpkg_47(): - gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg') + gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_47.gpkg") # Set wrong application_id - fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb+') + 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.VSIFWriteL(struct.pack("B" * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) gdal.ErrorReset() with gdaltest.error_handler(): - ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_47.gpkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() - 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() == '' + 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']) + 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+') + 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.VSIFWriteL(struct.pack("B" * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) gdal.ErrorReset() with gdaltest.error_handler(): - ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_47.gpkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" ds = None gdal.ErrorReset() - 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() == '' + 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']) + 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+') + fp = gdal.VSIFOpenL("/vsimem/ogr_gpkg_47.gpkg", "rb+") gdal.VSIFSeekL(fp, 60, 0) - assert struct.unpack('>I', gdal.VSIFReadL(4, 1, fp))[0] == 10200 + assert struct.unpack(">I", gdal.VSIFReadL(4, 1, fp))[0] == 10200 gdal.VSIFSeekL(fp, 60, 0) - gdal.VSIFWriteL(struct.pack('>I', 10201), 4, 1, fp) + gdal.VSIFWriteL(struct.pack(">I", 10201), 4, 1, fp) gdal.VSIFCloseL(fp) gdal.ErrorReset() - ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_47.gpkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None gdal.ErrorReset() - 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() == '' + 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.3']) + gdaltest.gpkg_dr.CreateDataSource( + "/vsimem/ogr_gpkg_47.gpkg", options=["VERSION=1.3"] + ) # Check user_version - fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb') + fp = gdal.VSIFOpenL("/vsimem/ogr_gpkg_47.gpkg", "rb") gdal.VSIFSeekL(fp, 60, 0) - assert struct.unpack('>I', gdal.VSIFReadL(4, 1, fp))[0] == 10300 + assert struct.unpack(">I", gdal.VSIFReadL(4, 1, fp))[0] == 10300 gdal.VSIFCloseL(fp) gdal.ErrorReset() - ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_47.gpkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() == '' + assert gdal.GetLastErrorMsg() == "" ds = None gdal.ErrorReset() - 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() == '' + 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.99.0 - gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg', options=['VERSION=1.2']) + 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+') + fp = gdal.VSIFOpenL("/vsimem/ogr_gpkg_47.gpkg", "rb+") gdal.VSIFSeekL(fp, 60, 0) - gdal.VSIFWriteL(struct.pack('>I', 19900), 4, 1, fp) + gdal.VSIFWriteL(struct.pack(">I", 19900), 4, 1, fp) gdal.VSIFCloseL(fp) gdal.ErrorReset() with gdaltest.error_handler(): - ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) + ds = ogr.Open("/vsimem/ogr_gpkg_47.gpkg", update=1) assert ds is not None - assert gdal.GetLastErrorMsg() != '' + assert gdal.GetLastErrorMsg() != "" gdal.ErrorReset() - 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() == '' + 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') + gdaltest.gpkg_dr.CreateDataSource("/vsimem/.cur_input") # Set wrong application_id - fp = gdal.VSIFOpenL('/vsimem/.cur_input', 'rb+') + 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.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') + 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']) + gdaltest.gpkg_dr.CreateDataSource("/vsimem/.cur_input", options=["VERSION=1.2"]) # Set wrong user_version - fp = gdal.VSIFOpenL('/vsimem/.cur_input', 'rb+') + 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.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') + 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 = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_47.gpkg") + ds.CreateLayer("foo") ds = None - fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb') + 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') + 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 = 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') + gdal.Unlink("/vsimem/ogr_gpkg_47.zip") + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_47.gpkg") + ############################################################################### # Test insertion of features with unset fields @@ -3740,38 +4211,38 @@ def test_ogr_gpkg_47(): def test_ogr_gpkg_48(): - 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')) + 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') + f.SetField("a", "a") lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('b', 'b') - f.SetField('c', 'c') + 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: + 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: + 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') + 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': + if f.GetField("foo") != "x": f.DumpReadable() pytest.fail() f = ogr.Feature(lyr.GetLayerDefn()) @@ -3779,12 +4250,13 @@ def test_ogr_gpkg_48(): assert lyr.SetFeature(f) == 0 lyr.ResetReading() f = lyr.GetNextFeature() - if f.GetField('foo') != 'x': + if f.GetField("foo") != "x": f.DumpReadable() pytest.fail() ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_48.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_48.gpkg") + ############################################################################### # Test CreateGeomField() on a attributes layer @@ -3792,20 +4264,22 @@ def test_ogr_gpkg_48(): def test_ogr_gpkg_49(): - ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_49.gpkg') + ds = gdaltest.gpkg_dr.CreateDataSource("/vsimem/ogr_gpkg_49.gpkg") - lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, - options=['ASPATIAL_VARIANT=GPKG_ATTRIBUTES']) + 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) + field_defn = ogr.GeomFieldDefn("", ogr.wkbPoint) assert lyr.CreateGeomField(field_defn) == 0 ds = None - gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_49.gpkg') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_49.gpkg") + ############################################################################### # Test minimalistic support of definition_12_063 @@ -3813,38 +4287,43 @@ def test_ogr_gpkg_49(): def test_ogr_gpkg_50(): - 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) + 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) + ds = ogr.Open("/vsimem/ogr_gpkg_50.gpkg", update=1) srs32631 = osr.SpatialReference() srs32631.ImportFromEPSG(32631) - ds.CreateLayer('test', srs=srs32631) + ds.CreateLayer("test", srs=srs32631) # No authority node srs_without_org = osr.SpatialReference() - srs_without_org.SetFromUserInput("""GEOGCS["another geogcs", + 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) + 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' + assert validate("/vsimem/ogr_gpkg_50.gpkg"), "validation failed" - ds = ogr.Open('/vsimem/ogr_gpkg_50.gpkg') - lyr = ds.GetLayer('test') + ds = ogr.Open("/vsimem/ogr_gpkg_50.gpkg") + lyr = ds.GetLayer("test") assert lyr.GetSpatialRef().IsSame(srs32631) - lyr = ds.GetLayer('without_org') + 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') + 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') + gdaltest.gpkg_dr.DeleteDataSource("/vsimem/ogr_gpkg_50.gpkg") + ############################################################################### # Test opening a .gpkg.sql file @@ -3852,46 +4331,52 @@ def test_ogr_gpkg_50(): def test_ogr_gpkg_51(): - if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': + if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != "YES": pytest.skip() - ds = ogr.Open('data/gpkg/poly.gpkg.sql') + ds = ogr.Open("data/gpkg/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(): - ds = ogr.Open('data/gpkg/poly_non_conformant.gpkg') + ds = ogr.Open("data/gpkg/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.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': + if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != "YES": pytest.skip() - ds = ogr.Open('data/gpkg/poly_inconsistent_case.gpkg.sql') + ds = ogr.Open("data/gpkg/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/gpkg/poly_inconsistent_case.gpkg.sql') + ret = gdaltest.runexternal( + test_cli_utilities.get_test_ogrsf_path() + + " data/gpkg/poly_inconsistent_case.gpkg.sql" + ) - assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 ############################################################################### @@ -3902,16 +4387,16 @@ def test_ogr_gpkg_54(): # 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) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) f = None - lyr = ds.CreateLayer('layer2', geom_type=ogr.wkbPoint) + lyr = ds.CreateLayer("layer2", geom_type=ogr.wkbPoint) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 1)")) lyr.CreateFeature(f) f = None ds = None @@ -3923,19 +4408,19 @@ def test_ogr_gpkg_54(): lyr2 = ds2.GetLayer(1) f1 = lyr1.GetFeature(1) - f1.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) + f1.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 2)")) lyr1.SetFeature(f1) f2 = lyr2.GetFeature(1) - f2.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) + f2.SetGeometry(ogr.CreateGeometryFromWkt("POINT (3 4)")) lyr2.SetFeature(f2) f1 = lyr1.GetFeature(1) - f1.SetGeometry(ogr.CreateGeometryFromWkt('POINT (5 6)')) + f1.SetGeometry(ogr.CreateGeometryFromWkt("POINT (5 6)")) lyr1.SetFeature(f1) f2 = lyr2.GetFeature(1) - f2.SetGeometry(ogr.CreateGeometryFromWkt('POINT (7 8)')) + f2.SetGeometry(ogr.CreateGeometryFromWkt("POINT (7 8)")) lyr2.SetFeature(f2) ds1 = None @@ -3944,60 +4429,67 @@ def test_ogr_gpkg_54(): ds = ogr.Open(tmpfile) lyr1 = ds.GetLayer(0) f = lyr1.GetNextFeature() - if f.GetGeometryRef().ExportToWkt() != 'POINT (5 6)': + 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)': + 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(): - tmpfile = '/vsimem/ogr_gpkg_55.gpkg' - ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile) - lyr = ds.CreateLayer('layer1', geom_type=ogr.wkbLineString) + 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)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 0)")) gdal.ErrorReset() with gdaltest.error_handler(): lyr.CreateFeature(f) - assert gdal.GetLastErrorMsg() != '', 'should have warned' + assert gdal.GetLastErrorMsg() != "", "should have warned" f = None f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 1)")) gdal.ErrorReset() lyr.CreateFeature(f) - assert gdal.GetLastErrorMsg() == '', 'should NOT have warned' + 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(): - 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') + 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: + 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') + gdal.Unlink("/vsimem/ogr_gpkg_56.gpkg") + ############################################################################### # Test creation of a field which is the same as the FID column @@ -4005,14 +4497,14 @@ def test_ogr_gpkg_56(): def test_ogr_gpkg_creation_fid(): - filename = '/vsimem/test_ogr_gpkg_creation_fid.gpkg' - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) + filename = "/vsimem/test_ogr_gpkg_creation_fid.gpkg" + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) - lyr = ds.CreateLayer('fid_integer') - assert lyr.CreateField(ogr.FieldDefn('fid', ogr.OFTInteger)) == ogr.OGRERR_NONE + lyr = ds.CreateLayer("fid_integer") + assert lyr.CreateField(ogr.FieldDefn("fid", ogr.OFTInteger)) == ogr.OGRERR_NONE f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 12 + f["fid"] = 12 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 12 f = lyr.GetFeature(f.GetFID()) @@ -4021,7 +4513,7 @@ def test_ogr_gpkg_creation_fid(): f = None f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 13 + f["fid"] = 13 f.SetFID(13) assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 13 @@ -4030,11 +4522,11 @@ def test_ogr_gpkg_creation_fid(): assert lyr.SetFeature(f) == ogr.OGRERR_NONE f = None - lyr = ds.CreateLayer('fid_integer64') - assert lyr.CreateField(ogr.FieldDefn('fid', ogr.OFTInteger64)) == ogr.OGRERR_NONE + lyr = ds.CreateLayer("fid_integer64") + assert lyr.CreateField(ogr.FieldDefn("fid", ogr.OFTInteger64)) == ogr.OGRERR_NONE f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890123 + f["fid"] = 1234567890123 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 1234567890123 f = lyr.GetFeature(f.GetFID()) @@ -4043,7 +4535,7 @@ def test_ogr_gpkg_creation_fid(): f = None f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890124 + f["fid"] = 1234567890124 f.SetFID(1234567890124) assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 1234567890124 @@ -4053,21 +4545,21 @@ def test_ogr_gpkg_creation_fid(): f = None f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890125 + f["fid"] = 1234567890125 f.SetFID(1) with gdaltest.error_handler(): assert lyr.CreateFeature(f) == ogr.OGRERR_FAILURE # Simulates the situation of GeoPackage ---QGIS---> Shapefile --> GeoPackage # See https://github.com/qgis/QGIS/pull/43118 - lyr = ds.CreateLayer('fid_real') - fld_defn = ogr.FieldDefn('fid', ogr.OFTReal) + lyr = ds.CreateLayer("fid_real") + fld_defn = ogr.FieldDefn("fid", ogr.OFTReal) fld_defn.SetWidth(20) fld_defn.SetPrecision(0) assert lyr.CreateField(fld_defn) == ogr.OGRERR_NONE f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890123 + f["fid"] = 1234567890123 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 1234567890123 f = lyr.GetFeature(f.GetFID()) @@ -4076,7 +4568,7 @@ def test_ogr_gpkg_creation_fid(): f = None f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890124 + f["fid"] = 1234567890124 f.SetFID(1234567890124) assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert f.GetFID() == 1234567890124 @@ -4086,12 +4578,12 @@ def test_ogr_gpkg_creation_fid(): f = None f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890123.5 + f["fid"] = 1234567890123.5 with gdaltest.error_handler(): assert lyr.CreateFeature(f) == ogr.OGRERR_FAILURE f = ogr.Feature(lyr.GetLayerDefn()) - f['fid'] = 1234567890125 + f["fid"] = 1234567890125 f.SetFID(1) with gdaltest.error_handler(): assert lyr.CreateFeature(f) == ogr.OGRERR_FAILURE @@ -4099,18 +4591,20 @@ def test_ogr_gpkg_creation_fid(): ds = None gdal.Unlink(filename) + ############################################################################### # Test opening a corrupted gpkg with duplicated layer names def test_ogr_gpkg_57(): - if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': + if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != "YES": pytest.skip() - tmpfile = '/vsimem/tmp.gpkg.txt' - gdal.FileFromMemBuffer(tmpfile, - """-- SQL GPKG + 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); @@ -4119,28 +4613,32 @@ def test_ogr_gpkg_57(): 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); -""") +""", + ) gdal.ErrorReset() 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' + 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(): - 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') + 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')") @@ -4151,15 +4649,20 @@ def test_ogr_gpkg_58(): gdal.Unlink(out_filename) + ############################################################################### # Test CreateSpatialIndex() def test_ogr_gpkg_59(): - out_filename = '/vsimem/ogr_gpkg_59.gpkg' - gdal.VectorTranslate(out_filename, 'data/poly.shp', format='GPKG', - layerCreationOptions=['SPATIAL_INDEX=NO']) + 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')") @@ -4170,29 +4673,30 @@ def test_ogr_gpkg_59(): gdal.Unlink(out_filename) + ############################################################################### # Test savepoints def test_ogr_gpkg_savepoint(): - filename = '/vsimem/ogr_gpkg_savepoint.gpkg' + filename = "/vsimem/ogr_gpkg_savepoint.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('foo') - lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) + lyr = ds.CreateLayer("foo") + lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) - f['str'] = 'foo' + f["str"] = "foo" lyr.CreateFeature(f) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) ds.StartTransaction() - ds.ExecuteSQL('SAVEPOINT pt') + ds.ExecuteSQL("SAVEPOINT pt") lyr.DeleteFeature(1) - ds.ExecuteSQL('ROLLBACK TO SAVEPOINT pt') + ds.ExecuteSQL("ROLLBACK TO SAVEPOINT pt") f = ogr.Feature(lyr.GetLayerDefn()) - f['str'] = 'bar' + f["str"] = "bar" lyr.CreateFeature(f) ds.CommitTransaction() ds = None @@ -4204,6 +4708,7 @@ def test_ogr_gpkg_savepoint(): gdal.Unlink(filename) + ############################################################################### # Test that we don't open file handles behind the back of sqlite3 @@ -4211,74 +4716,75 @@ def test_ogr_gpkg_savepoint(): def test_ogr_gpkg_wal(): 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' + filename = "tmp/ogr_gpkg_wal.gpkg" - with gdaltest.config_option('OGR_SQLITE_JOURNAL', 'WAL'): + with gdaltest.config_option("OGR_SQLITE_JOURNAL", "WAL"): ds = gdaltest.gpkg_dr.CreateDataSource(filename) - ds.CreateLayer('foo') + ds.CreateLayer("foo") ds = None ds = ogr.Open(filename, update=1) - os.stat(filename + '-wal') + os.stat(filename + "-wal") # Re-open in read-only mode ds_ro = ogr.Open(filename) ds_ro.GetName() - os.stat(filename + '-wal') + os.stat(filename + "-wal") # Test external process to read the file - gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ' + filename) + gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + " " + filename) # The file must still exist - os.stat(filename + '-wal') + os.stat(filename + "-wal") ds = None ds_ro = None gdal.Unlink(filename) - gdal.Unlink(filename + '-wal') - gdal.Unlink(filename + '-shm') + gdal.Unlink(filename + "-wal") + gdal.Unlink(filename + "-shm") + ############################################################################### # Test NOLOCK open option def test_ogr_gpkg_nolock(): - def get_nolock(ds): - sql_lyr = ds.ExecuteSQL('SELECT nolock', dialect='DEBUG') + sql_lyr = ds.ExecuteSQL("SELECT nolock", dialect="DEBUG") f = sql_lyr.GetNextFeature() res = True if f[0] == 1 else False ds.ReleaseResultSet(sql_lyr) return res # needs to be a real file - filename = 'tmp/test_ogr_gpkg_#_nolock.gpkg' + filename = "tmp/test_ogr_gpkg_#_nolock.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('foo') + lyr = ds.CreateLayer("foo") f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None # Special case on Windows for files that start with drive letters - full_filename = os.path.join(os.getcwd(), 'tmp', 'test_ogr_gpkg_#_nolock.gpkg') - ds = gdal.OpenEx(full_filename, gdal.OF_VECTOR, open_options=['NOLOCK=YES']) + full_filename = os.path.join(os.getcwd(), "tmp", "test_ogr_gpkg_#_nolock.gpkg") + ds = gdal.OpenEx(full_filename, gdal.OF_VECTOR, open_options=["NOLOCK=YES"]) assert ds ds = None - ds = gdal.OpenEx(filename, gdal.OF_VECTOR, open_options=['NOLOCK=YES']) + ds = gdal.OpenEx(filename, gdal.OF_VECTOR, open_options=["NOLOCK=YES"]) assert ds assert get_nolock(ds) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - ds2 = ogr.Open(filename, update = 1) + ds2 = ogr.Open(filename, update=1) lyr2 = ds2.GetLayer(0) f = ogr.Feature(lyr2.GetLayerDefn()) # Without lockless mode on ds, this would timeout and fail @@ -4288,25 +4794,28 @@ def get_nolock(ds): ds = None # Lockless mode should NOT be honored by GDAL in update mode - ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['NOLOCK=YES']) + ds = gdal.OpenEx( + filename, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=["NOLOCK=YES"] + ) assert ds assert not get_nolock(ds) ds = None # Now turn on WAL - ds = ogr.Open(filename, update = 1) - ds.ReleaseResultSet(ds.ExecuteSQL('PRAGMA journal_mode = WAL')) + ds = ogr.Open(filename, update=1) + ds.ReleaseResultSet(ds.ExecuteSQL("PRAGMA journal_mode = WAL")) ds = None # Lockless mode should NOT be honored by GDAL on a WAL enabled file - ds = gdal.OpenEx(filename, gdal.OF_VECTOR, open_options=['NOLOCK=YES']) + ds = gdal.OpenEx(filename, gdal.OF_VECTOR, open_options=["NOLOCK=YES"]) assert ds assert not get_nolock(ds) ds = None gdal.Unlink(filename) - gdal.Unlink(filename + '-wal') - gdal.Unlink(filename + '-shm') + gdal.Unlink(filename + "-wal") + gdal.Unlink(filename + "-shm") + ############################################################################### # Run test_ogrsf @@ -4315,25 +4824,32 @@ def get_nolock(ds): def test_ogr_gpkg_test_ogrsf(): # Do integrity check first - gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg') + gpkg_ds = ogr.Open("tmp/gpkg_test.gpkg") sql_lyr = gpkg_ds.ExecuteSQL("PRAGMA integrity_check") feat = sql_lyr.GetNextFeature() - assert feat.GetField(0) == 'ok', 'integrity check failed' + assert feat.GetField(0) == "ok", "integrity check failed" gpkg_ds.ReleaseResultSet(sql_lyr) import test_cli_utilities + if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() 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') + 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 + 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') + 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 + assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 ############################################################################### @@ -4342,54 +4858,74 @@ def test_ogr_gpkg_test_ogrsf(): def test_ogr_gpkg_json(): - filename = '/vsimem/ogr_gpkg_json.gpkg' + filename = "/vsimem/ogr_gpkg_json.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") - fld_defn = ogr.FieldDefn('test_json', ogr.OFTString) + 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 + ds.ReleaseResultSet(ds.ExecuteSQL("SELECT 1 FROM test")) # will crystalize - fld_defn = ogr.FieldDefn('test2_json', ogr.OFTString) + 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) + fld_defn = ogr.FieldDefn("test_string", ogr.OFTString) lyr.CreateField(fld_defn) ds = None - ds = ogr.Open(filename, update = 1) + 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 + 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 = 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 + 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 + assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex("test_json")) == 0 ds = None - assert validate(filename), 'validation failed' + 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) + 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() @@ -4400,19 +4936,20 @@ def test_ogr_gpkg_json(): gdal.Unlink(filename) + ############################################################################### # Test invalid/non-standard content in records def test_ogr_gpkg_invalid_values_in_records(): - filename = '/vsimem/test_ogr_gpkg_invalid_date_content.gpkg' + filename = "/vsimem/test_ogr_gpkg_invalid_date_content.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") - fld_defn = ogr.FieldDefn('dt', ogr.OFTDateTime) + fld_defn = ogr.FieldDefn("dt", ogr.OFTDateTime) lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('d', ogr.OFTDate) + fld_defn = ogr.FieldDefn("d", ogr.OFTDate) lyr.CreateField(fld_defn) for i in range(6): @@ -4430,45 +4967,52 @@ def test_ogr_gpkg_invalid_values_in_records(): gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Invalid content for record 1 in column dt: foo' - assert not f.IsFieldSet('dt') + assert gdal.GetLastErrorMsg() == "Invalid content for record 1 in column dt: foo" + assert not f.IsFieldSet("dt") gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Invalid content for record 2 in column d: bar' - assert not f.IsFieldSet('d') + assert gdal.GetLastErrorMsg() == "Invalid content for record 2 in column d: bar" + assert not f.IsFieldSet("d") gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Unexpected data type for record 3 in column dt' - assert not f.IsFieldSet('dt') + assert gdal.GetLastErrorMsg() == "Unexpected data type for record 3 in column dt" + assert not f.IsFieldSet("dt") gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Unexpected data type for record 4 in column d' - assert not f.IsFieldSet('d') + assert gdal.GetLastErrorMsg() == "Unexpected data type for record 4 in column d" + assert not f.IsFieldSet("d") gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Non-conformant content for record 5 in column dt, 2020/01/21 12:34:56+01, successfully parsed' - assert f.IsFieldSet('dt') - assert f['dt'] == '2020/01/21 12:34:56+01' + assert ( + gdal.GetLastErrorMsg() + == "Non-conformant content for record 5 in column dt, 2020/01/21 12:34:56+01, successfully parsed" + ) + assert f.IsFieldSet("dt") + assert f["dt"] == "2020/01/21 12:34:56+01" gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() - assert gdal.GetLastErrorMsg() == 'Non-conformant content for record 6 in column d, 2020/01/21, successfully parsed' - assert f.IsFieldSet('d') - assert f['d'] == '2020/01/21' + assert ( + gdal.GetLastErrorMsg() + == "Non-conformant content for record 6 in column d, 2020/01/21, successfully parsed" + ) + assert f.IsFieldSet("d") + assert f["d"] == "2020/01/21" ds = None gdal.Unlink(filename) + ############################################################################### # Test creating a table with layer geometry type unknown/GEOMETRY and # geometries of mixed dimensionality @@ -4476,27 +5020,29 @@ def test_ogr_gpkg_invalid_values_in_records(): def test_ogr_gpkg_mixed_dimensionality_unknown_layer_geometry_type(): - filename = '/vsimem/test_ogr_gpkg_mixed_dimensionality_unknown_layer_geometry_type.gpkg' + filename = ( + "/vsimem/test_ogr_gpkg_mixed_dimensionality_unknown_layer_geometry_type.gpkg" + ) ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 2)")) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2 3)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 2 3)")) lyr.CreateFeature(f) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbUnknown - sql_lyr = ds.ExecuteSQL('SELECT z FROM gpkg_geometry_columns') + sql_lyr = ds.ExecuteSQL("SELECT z FROM gpkg_geometry_columns") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 2 ds.ReleaseResultSet(sql_lyr) @@ -4508,21 +5054,22 @@ def test_ogr_gpkg_mixed_dimensionality_unknown_layer_geometry_type(): ############################################################################### # Test fixing up wrong RTree update3 trigger from GeoPackage < 1.2.1 + def test_ogr_gpkg_fixup_wrong_rtree_trigger(): - filename = '/vsimem/test_ogr_gpkg_fixup_wrong_rtree_trigger.gpkg' - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) - ds.CreateLayer('test') - ds.CreateLayer('test2') + filename = "/vsimem/test_ogr_gpkg_fixup_wrong_rtree_trigger.gpkg" + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) + ds.CreateLayer("test") + ds.CreateLayer("test2") ds = None with gdaltest.error_handler(): - ds = ogr.Open(filename, update = 1) + ds = ogr.Open(filename, update=1) # inject wrong trigger on purpose with the wrong 'OF "geometry" ' part - ds.ExecuteSQL('DROP TRIGGER rtree_test_geometry_update3') + ds.ExecuteSQL("DROP TRIGGER rtree_test_geometry_update3") wrong_trigger = 'CREATE TRIGGER "rtree_test_geometry_update3" AFTER UPDATE OF "geometry" ON "test" WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' ds.ExecuteSQL(wrong_trigger) - ds.ExecuteSQL('DROP TRIGGER rtree_test2_geometry_update3') + ds.ExecuteSQL("DROP TRIGGER rtree_test2_geometry_update3") # Test another potential variant (although not generated by OGR) wrong_trigger2 = 'CREATE TRIGGER "rtree_test2_geometry_update3" AFTER UPDATE OF geometry ON test2 WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' ds.ExecuteSQL(wrong_trigger2) @@ -4531,28 +5078,40 @@ def test_ogr_gpkg_fixup_wrong_rtree_trigger(): # Open in read-only mode ds = ogr.Open(filename) - sql_lyr = ds.ExecuteSQL("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test_geometry_update3'") + sql_lyr = ds.ExecuteSQL( + "SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test_geometry_update3'" + ) f = sql_lyr.GetNextFeature() - sql = f['sql'] + sql = f["sql"] ds.ReleaseResultSet(sql_lyr) ds = None assert sql == wrong_trigger # Open in update mode - ds = ogr.Open(filename, update = 1) - sql_lyr = ds.ExecuteSQL("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test_geometry_update3'") + ds = ogr.Open(filename, update=1) + sql_lyr = ds.ExecuteSQL( + "SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test_geometry_update3'" + ) f = sql_lyr.GetNextFeature() - sql = f['sql'] + sql = f["sql"] ds.ReleaseResultSet(sql_lyr) - sql_lyr = ds.ExecuteSQL("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test2_geometry_update3'") + sql_lyr = ds.ExecuteSQL( + "SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = 'rtree_test2_geometry_update3'" + ) f = sql_lyr.GetNextFeature() - sql2 = f['sql'] + sql2 = f["sql"] ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink(filename) - assert sql == 'CREATE TRIGGER "rtree_test_geometry_update3" AFTER UPDATE ON "test" WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' - assert sql2 == 'CREATE TRIGGER "rtree_test2_geometry_update3" AFTER UPDATE ON test2 WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' + assert ( + sql + == 'CREATE TRIGGER "rtree_test_geometry_update3" AFTER UPDATE ON "test" WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' + ) + assert ( + sql2 + == 'CREATE TRIGGER "rtree_test2_geometry_update3" AFTER UPDATE ON test2 WHEN OLD."fid" != NEW."fid" AND (NEW."geometry" NOTNULL AND NOT ST_IsEmpty(NEW."geometry")) BEGIN DELETE FROM "rtree_test_geometry" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_test_geometry" VALUES (NEW."fid",ST_MinX(NEW."geometry"), ST_MaxX(NEW."geometry"),ST_MinY(NEW."geometry"), ST_MaxY(NEW."geometry")); END' + ) ############################################################################### @@ -4561,13 +5120,18 @@ def test_ogr_gpkg_fixup_wrong_rtree_trigger(): def test_ogr_gpkg_prelude_statements(): - gdal.VectorTranslate('/vsimem/test.gpkg', 'data/poly.shp', format='GPKG') - ds = gdal.OpenEx('/vsimem/test.gpkg', - open_options=["PRELUDE_STATEMENTS=ATTACH DATABASE '/vsimem/test.gpkg' AS other"]) - sql_lyr = ds.ExecuteSQL('SELECT * FROM poly JOIN other.poly USING (eas_id)') + gdal.VectorTranslate("/vsimem/test.gpkg", "data/poly.shp", format="GPKG") + ds = gdal.OpenEx( + "/vsimem/test.gpkg", + open_options=[ + "PRELUDE_STATEMENTS=ATTACH DATABASE '/vsimem/test.gpkg' AS other" + ], + ) + sql_lyr = ds.ExecuteSQL("SELECT * FROM poly JOIN other.poly USING (eas_id)") assert sql_lyr.GetFeatureCount() == 10 ds.ReleaseResultSet(sql_lyr) - gdal.Unlink('/vsimem/test.gpkg') + gdal.Unlink("/vsimem/test.gpkg") + ############################################################################### # Test DATETIME_FORMAT @@ -4575,29 +5139,33 @@ def test_ogr_gpkg_prelude_statements(): def test_ogr_gpkg_datetime_timezones(): - filename = '/vsimem/test_ogr_gpkg_datetime_timezones.gpkg' - ds = gdaltest.gpkg_dr.CreateDataSource(filename, options = ['DATETIME_FORMAT=UTC']) - lyr = ds.CreateLayer('test') - lyr.CreateField(ogr.FieldDefn('dt', ogr.OFTDateTime)) - for val in ['2020/01/01 01:34:56', '2020/01/01 01:34:56+00', '2020/01/01 01:34:56.789+02']: + filename = "/vsimem/test_ogr_gpkg_datetime_timezones.gpkg" + ds = gdaltest.gpkg_dr.CreateDataSource(filename, options=["DATETIME_FORMAT=UTC"]) + lyr = ds.CreateLayer("test") + lyr.CreateField(ogr.FieldDefn("dt", ogr.OFTDateTime)) + for val in [ + "2020/01/01 01:34:56", + "2020/01/01 01:34:56+00", + "2020/01/01 01:34:56.789+02", + ]: f = ogr.Feature(lyr.GetLayerDefn()) - f.SetField('dt', val) + f.SetField("dt", val) lyr.CreateFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() - assert f.GetField('dt') == '2020/01/01 01:34:56+00' + assert f.GetField("dt") == "2020/01/01 01:34:56+00" f = lyr.GetNextFeature() - assert f.GetField('dt') == '2020/01/01 01:34:56+00' + assert f.GetField("dt") == "2020/01/01 01:34:56+00" f = lyr.GetNextFeature() - assert f.GetField('dt') == '2019/12/31 23:34:56.789+00' + assert f.GetField("dt") == "2019/12/31 23:34:56.789+00" sql_lyr = ds.ExecuteSQL("SELECT dt || '' FROM test") f = sql_lyr.GetNextFeature() # check that milliseconds are written to be strictly compliant with the GPKG spec - assert f.GetField(0) == '2020-01-01T01:34:56.000Z' + assert f.GetField(0) == "2020-01-01T01:34:56.000Z" ds.ReleaseResultSet(sql_lyr) ds = None @@ -4607,13 +5175,14 @@ def test_ogr_gpkg_datetime_timezones(): ############################################################################### # Test AbortSQL + def test_abort_sql(): - filename = 'data/gpkg/poly_non_conformant.gpkg' + filename = "data/gpkg/poly_non_conformant.gpkg" ds = ogr.Open(filename) def abortAfterDelay(): - #print("Aborting SQL...") + # print("Aborting SQL...") assert ds.AbortSQL() == ogr.OGRERR_NONE t = threading.Timer(0.5, abortAfterDelay) @@ -4641,7 +5210,7 @@ def abortAfterDelay(): ds2 = gdal.OpenEx(filename, gdal.OF_VECTOR) def abortAfterDelay2(): - #print("Aborting SQL...") + # print("Aborting SQL...") assert ds2.AbortSQL() == ogr.OGRERR_NONE t = threading.Timer(0.5, abortAfterDelay2) @@ -4661,32 +5230,37 @@ def abortAfterDelay2(): # Test ST_Transform() with no record in gpkg_spatial_ref_sys and thus we # fallback to EPSG -@pytest.mark.skipif(sys.platform == 'win32', - reason='f.GetGeometryRef() returns None on the current Windows CI') + +@pytest.mark.skipif( + sys.platform == "win32", + reason="f.GetGeometryRef() returns None on the current Windows CI", +) def test_ogr_gpkg_st_transform_no_record_spatial_ref_sys(): - ds = ogr.GetDriverByName('GPKG').CreateDataSource('/vsimem/test.gpkg') - lyr = ds.CreateLayer('test') + ds = ogr.GetDriverByName("GPKG").CreateDataSource("/vsimem/test.gpkg") + lyr = ds.CreateLayer("test") f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (500000 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (500000 0)")) lyr.CreateFeature(f) f = None if not _has_spatialite_4_3_or_later(ds): ds = None - gdal.Unlink('/vsimem/test.gpkg') - pytest.skip('Spatialite missing or too old') + gdal.Unlink("/vsimem/test.gpkg") + pytest.skip("Spatialite missing or too old") - sql_lyr = ds.ExecuteSQL('SELECT ST_Transform(SetSRID(geom, 32631), 32731) FROM test') + sql_lyr = ds.ExecuteSQL( + "SELECT ST_Transform(SetSRID(geom, 32631), 32731) FROM test" + ) # Fails on a number of configs # assert sql_lyr.GetSpatialRef().GetAuthorityCode(None) == '32731' f = sql_lyr.GetNextFeature() - assert f.GetGeometryRef().ExportToWkt() == 'POINT (500000 10000000)' + assert f.GetGeometryRef().ExportToWkt() == "POINT (500000 10000000)" f = None ds.ReleaseResultSet(sql_lyr) ds = None - gdal.Unlink('/vsimem/test.gpkg') + gdal.Unlink("/vsimem/test.gpkg") ############################################################################### @@ -4694,20 +5268,22 @@ def test_ogr_gpkg_st_transform_no_record_spatial_ref_sys(): def test_ogr_gpkg_deferred_spi_creation(): - def has_spi(ds): - sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'rtree_test_geom'", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL( + "SELECT 1 FROM sqlite_master WHERE name = 'rtree_test_geom'", + dialect="DEBUG", + ) res = sql_lyr.GetNextFeature() is not None ds.ReleaseResultSet(sql_lyr) return res - ds = ogr.GetDriverByName('GPKG').CreateDataSource('/vsimem/test.gpkg') + ds = ogr.GetDriverByName("GPKG").CreateDataSource("/vsimem/test.gpkg") - lyr = ds.CreateLayer('test') + lyr = ds.CreateLayer("test") assert not has_spi(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) fid = f.GetFID() f = None @@ -4720,35 +5296,35 @@ def has_spi(ds): assert lyr.GetFeature(fid) is not None assert not has_spi(ds) - assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) == ogr.OGRERR_NONE + assert lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) == ogr.OGRERR_NONE assert not has_spi(ds) assert lyr.DeleteField(0) == ogr.OGRERR_NONE assert not has_spi(ds) - ds.ReleaseResultSet(ds.ExecuteSQL('SELECT 1')) + ds.ReleaseResultSet(ds.ExecuteSQL("SELECT 1")) assert has_spi(ds) # GetNextFeature() with spatial filter should cause SPI creation - ds.ExecuteSQL('DELLAYER:test') - lyr = ds.CreateLayer('test') + ds.ExecuteSQL("DELLAYER:test") + lyr = ds.CreateLayer("test") assert not has_spi(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) fid = f.GetFID() f = None assert not has_spi(ds) - lyr.SetSpatialFilterRect(-1,-1,1,1) + lyr.SetSpatialFilterRect(-1, -1, 1, 1) lyr.ResetReading() assert lyr.GetNextFeature() is not None assert has_spi(ds) ds = None - gdal.Unlink('/vsimem/test.gpkg') + gdal.Unlink("/vsimem/test.gpkg") ############################################################################### @@ -4756,41 +5332,43 @@ def has_spi(ds): def test_ogr_gpkg_deferred_spi_update(): - def has_spi_triggers(ds): - sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'trigger' AND name LIKE 'rtree_test_geom%'", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM sqlite_master WHERE type = 'trigger' AND name LIKE 'rtree_test_geom%'", + dialect="DEBUG", + ) res = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) return res == 6 - filename = '/vsimem/test.gpkg' + filename = "/vsimem/test.gpkg" # Basic test - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) - ds.CreateLayer('test') + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) + ds.CreateLayer("test") ds = None - with gdaltest.config_option('OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD', '2'): - ds = ogr.Open(filename, update = 1) + with gdaltest.config_option("OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD", "2"): + ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) assert has_spi_triggers(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 1)")) lyr.CreateFeature(f) assert not has_spi_triggers(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (2 2)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (2 2)")) lyr.CreateFeature(f) assert not has_spi_triggers(ds) - sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect="DEBUG") res = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert res == 2 @@ -4798,7 +5376,7 @@ def has_spi_triggers(ds): ds.CommitTransaction() assert has_spi_triggers(ds) - sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect="DEBUG") res = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert res == 3 @@ -4806,26 +5384,26 @@ def has_spi_triggers(ds): ds = None # Check effect of RollbackTransaction() - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) - ds.CreateLayer('test') + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) + ds.CreateLayer("test") ds = None - with gdaltest.config_option('OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD', '1'): - ds = ogr.Open(filename, update = 1) + with gdaltest.config_option("OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD", "1"): + ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) assert not has_spi_triggers(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 1)")) lyr.CreateFeature(f) assert not has_spi_triggers(ds) - sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect="DEBUG") res = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert res == 1 @@ -4833,7 +5411,7 @@ def has_spi_triggers(ds): ds.RollbackTransaction() assert has_spi_triggers(ds) - sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect='DEBUG') + sql_lyr = ds.ExecuteSQL("SELECT * FROM rtree_test_geom", dialect="DEBUG") res = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert res == 0 @@ -4842,25 +5420,25 @@ def has_spi_triggers(ds): # Check that GetNextFeature() with a spatial filter causes flushing of # deferred SPI values - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) - ds.CreateLayer('test') + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) + ds.CreateLayer("test") ds = None - with gdaltest.config_option('OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD', '1'): - ds = ogr.Open(filename, update = 1) + with gdaltest.config_option("OGR_GPKG_DEFERRED_SPI_UPDATE_THRESHOLD", "1"): + ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(f) assert not has_spi_triggers(ds) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 1)")) lyr.CreateFeature(f) - lyr.SetSpatialFilterRect(0,0,1,1) + lyr.SetSpatialFilterRect(0, 0, 1, 1) lyr.ResetReading() assert lyr.GetNextFeature() is not None assert has_spi_triggers(ds) @@ -4868,7 +5446,7 @@ def has_spi_triggers(ds): assert lyr.GetNextFeature() is None ds = None - gdal.Unlink('/vsimem/test.gpkg') + gdal.Unlink("/vsimem/test.gpkg") ############################################################################### @@ -4877,122 +5455,254 @@ def has_spi_triggers(ds): def test_ogr_gpkg_field_domains(): - filename = '/vsimem/test.gpkg' + filename = "/vsimem/test.gpkg" # Test write support - ds = gdal.GetDriverByName('GPKG').Create(filename, 0, 0, 0, gdal.GDT_Unknown) + ds = gdal.GetDriverByName("GPKG").Create(filename, 0, 0, 0, gdal.GDT_Unknown) assert ds.TestCapability(ogr.ODsCAddFieldDomain) assert ds.GetFieldDomainNames() is None - assert ds.GetFieldDomain('does_not_exist') is None - - assert ds.AddFieldDomain(ogr.CreateRangeFieldDomain('range_domain_int', 'my desc', ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, False)) - assert ds.GetFieldDomain('range_domain_int') is not None - - assert set(ds.GetFieldDomainNames()) == {'range_domain_int'} - - assert not ds.AddFieldDomain(ogr.CreateRangeFieldDomain('range_domain_int', 'my desc', ogr.OFTInteger, ogr.OFSTNone, 1, True, 2, True)) - - assert ds.AddFieldDomain(ogr.CreateRangeFieldDomain('range_domain_int64', '', ogr.OFTInteger64, ogr.OFSTNone, -1234567890123, False, 1234567890123, True)) - assert ds.GetFieldDomain('range_domain_int64') is not None - - assert ds.AddFieldDomain(ogr.CreateRangeFieldDomain('range_domain_real', '', ogr.OFTReal, ogr.OFSTNone, 1.5, True, 2.5, True)) - assert ds.GetFieldDomain('range_domain_real') is not None + assert ds.GetFieldDomain("does_not_exist") is None + + assert ds.AddFieldDomain( + ogr.CreateRangeFieldDomain( + "range_domain_int", + "my desc", + ogr.OFTInteger, + ogr.OFSTNone, + 1, + True, + 2, + False, + ) + ) + assert ds.GetFieldDomain("range_domain_int") is not None + + assert set(ds.GetFieldDomainNames()) == {"range_domain_int"} + + assert not ds.AddFieldDomain( + ogr.CreateRangeFieldDomain( + "range_domain_int", + "my desc", + ogr.OFTInteger, + ogr.OFSTNone, + 1, + True, + 2, + True, + ) + ) - assert ds.AddFieldDomain(ogr.CreateRangeFieldDomain('range_domain_real_inf', '', ogr.OFTReal, ogr.OFSTNone, -math.inf, True, math.inf, True)) - assert ds.GetFieldDomain('range_domain_real_inf') is not None + assert ds.AddFieldDomain( + ogr.CreateRangeFieldDomain( + "range_domain_int64", + "", + ogr.OFTInteger64, + ogr.OFSTNone, + -1234567890123, + False, + 1234567890123, + True, + ) + ) + assert ds.GetFieldDomain("range_domain_int64") is not None - assert ds.AddFieldDomain(ogr.CreateGlobFieldDomain('glob_domain', 'my desc', ogr.OFTString, ogr.OFSTNone, '*')) - assert ds.GetFieldDomain('glob_domain') is not None + assert ds.AddFieldDomain( + ogr.CreateRangeFieldDomain( + "range_domain_real", "", ogr.OFTReal, ogr.OFSTNone, 1.5, True, 2.5, True + ) + ) + assert ds.GetFieldDomain("range_domain_real") is not None + + assert ds.AddFieldDomain( + ogr.CreateRangeFieldDomain( + "range_domain_real_inf", + "", + ogr.OFTReal, + ogr.OFSTNone, + -math.inf, + True, + math.inf, + True, + ) + ) + assert ds.GetFieldDomain("range_domain_real_inf") is not None - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain', '', ogr.OFTInteger64, ogr.OFSTNone, {1: "one", "2": None})) - assert ds.GetFieldDomain('enum_domain') is not None + assert ds.AddFieldDomain( + ogr.CreateGlobFieldDomain( + "glob_domain", "my desc", ogr.OFTString, ogr.OFSTNone, "*" + ) + ) + assert ds.GetFieldDomain("glob_domain") is not None - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_int_single', 'my desc', ogr.OFTInteger, ogr.OFSTNone, {1: "one"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_int', '', ogr.OFTInteger, ogr.OFSTNone, {1: "one", 2: "two"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_int64_single_1', '', ogr.OFTInteger64, ogr.OFSTNone, { 1234567890123: "1234567890123"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_int64_single_2', '', ogr.OFTInteger64, ogr.OFSTNone, { -1234567890123: "-1234567890123"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_int64', '', ogr.OFTInteger64, ogr.OFSTNone, {1: "one", 1234567890123: "1234567890123", 3: "three"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_real_single', '', ogr.OFTReal, ogr.OFSTNone, {1.5: "one dot five"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_real', '', ogr.OFTReal, ogr.OFSTNone, {1: "one", 1.5: "one dot five", 1234567890123: "1234567890123", 3: "three"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_string_single', '', ogr.OFTString, ogr.OFSTNone, {"three": "three"})) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain_guess_string', '', ogr.OFTString, ogr.OFSTNone, {1: "one", 1.5: "one dot five", "three": "three", 4: "four"})) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain", "", ogr.OFTInteger64, ogr.OFSTNone, {1: "one", "2": None} + ) + ) + assert ds.GetFieldDomain("enum_domain") is not None + + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_int_single", + "my desc", + ogr.OFTInteger, + ogr.OFSTNone, + {1: "one"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_int", + "", + ogr.OFTInteger, + ogr.OFSTNone, + {1: "one", 2: "two"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_int64_single_1", + "", + ogr.OFTInteger64, + ogr.OFSTNone, + {1234567890123: "1234567890123"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_int64_single_2", + "", + ogr.OFTInteger64, + ogr.OFSTNone, + {-1234567890123: "-1234567890123"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_int64", + "", + ogr.OFTInteger64, + ogr.OFSTNone, + {1: "one", 1234567890123: "1234567890123", 3: "three"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_real_single", + "", + ogr.OFTReal, + ogr.OFSTNone, + {1.5: "one dot five"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_real", + "", + ogr.OFTReal, + ogr.OFSTNone, + {1: "one", 1.5: "one dot five", 1234567890123: "1234567890123", 3: "three"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_string_single", + "", + ogr.OFTString, + ogr.OFSTNone, + {"three": "three"}, + ) + ) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain_guess_string", + "", + ogr.OFTString, + ogr.OFSTNone, + {1: "one", 1.5: "one dot five", "three": "three", 4: "four"}, + ) + ) assert len(ds.GetFieldDomainNames()) == len(set(ds.GetFieldDomainNames())) - assert set(ds.GetFieldDomainNames()) == {'enum_domain', - 'enum_domain_guess_int', - 'enum_domain_guess_int64', - 'enum_domain_guess_int64_single_1', - 'enum_domain_guess_int64_single_2', - 'enum_domain_guess_int_single', - 'enum_domain_guess_real', - 'enum_domain_guess_real_single', - 'enum_domain_guess_string', - 'enum_domain_guess_string_single', - 'glob_domain', - 'range_domain_int', - 'range_domain_int64', - 'range_domain_real', - 'range_domain_real_inf'} - - lyr = ds.CreateLayer('test') - - fld_defn = ogr.FieldDefn('with_range_domain_int', ogr.OFTInteger) - fld_defn.SetDomainName('range_domain_int') + assert set(ds.GetFieldDomainNames()) == { + "enum_domain", + "enum_domain_guess_int", + "enum_domain_guess_int64", + "enum_domain_guess_int64_single_1", + "enum_domain_guess_int64_single_2", + "enum_domain_guess_int_single", + "enum_domain_guess_real", + "enum_domain_guess_real_single", + "enum_domain_guess_string", + "enum_domain_guess_string_single", + "glob_domain", + "range_domain_int", + "range_domain_int64", + "range_domain_real", + "range_domain_real_inf", + } + + lyr = ds.CreateLayer("test") + + fld_defn = ogr.FieldDefn("with_range_domain_int", ogr.OFTInteger) + fld_defn.SetDomainName("range_domain_int") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('with_range_domain_int64', ogr.OFTInteger64) - fld_defn.SetDomainName('range_domain_int64') + fld_defn = ogr.FieldDefn("with_range_domain_int64", ogr.OFTInteger64) + fld_defn.SetDomainName("range_domain_int64") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('with_range_domain_real', ogr.OFTReal) - fld_defn.SetDomainName('range_domain_real') + fld_defn = ogr.FieldDefn("with_range_domain_real", ogr.OFTReal) + fld_defn.SetDomainName("range_domain_real") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('with_glob_domain', ogr.OFTString) - fld_defn.SetDomainName('glob_domain') + fld_defn = ogr.FieldDefn("with_glob_domain", ogr.OFTString) + fld_defn.SetDomainName("glob_domain") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('with_enum_domain', ogr.OFTInteger64) - fld_defn.SetDomainName('enum_domain') + fld_defn = ogr.FieldDefn("with_enum_domain", ogr.OFTInteger64) + fld_defn.SetDomainName("enum_domain") lyr.CreateField(fld_defn) - fld_defn = ogr.FieldDefn('without_domain_initially', ogr.OFTInteger) + fld_defn = ogr.FieldDefn("without_domain_initially", ogr.OFTInteger) lyr.CreateField(fld_defn) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" # Test read support ds = gdal.OpenEx(filename, gdal.OF_VECTOR) - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_data_column_constraints') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_data_column_constraints") assert sql_lyr is not None ds.ReleaseResultSet(sql_lyr) - assert set(ds.GetFieldDomainNames()) == {'enum_domain', - 'enum_domain_guess_int', - 'enum_domain_guess_int64', - 'enum_domain_guess_int64_single_1', - 'enum_domain_guess_int64_single_2', - 'enum_domain_guess_int_single', - 'enum_domain_guess_real', - 'enum_domain_guess_real_single', - 'enum_domain_guess_string', - 'enum_domain_guess_string_single', - 'glob_domain', - 'range_domain_int', - 'range_domain_int64', - 'range_domain_real', - 'range_domain_real_inf'} - - domain = ds.GetFieldDomain('range_domain_int') + assert set(ds.GetFieldDomainNames()) == { + "enum_domain", + "enum_domain_guess_int", + "enum_domain_guess_int64", + "enum_domain_guess_int64_single_1", + "enum_domain_guess_int64_single_2", + "enum_domain_guess_int_single", + "enum_domain_guess_real", + "enum_domain_guess_real_single", + "enum_domain_guess_string", + "enum_domain_guess_string_single", + "glob_domain", + "range_domain_int", + "range_domain_int64", + "range_domain_real", + "range_domain_real_inf", + } + + domain = ds.GetFieldDomain("range_domain_int") assert domain is not None - assert domain.GetName() == 'range_domain_int' - assert domain.GetDescription() == 'my desc' + assert domain.GetName() == "range_domain_int" + assert domain.GetDescription() == "my desc" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTInteger assert domain.GetMinAsDouble() == 1.0 @@ -5000,10 +5710,10 @@ def test_ogr_gpkg_field_domains(): assert domain.GetMaxAsDouble() == 2.0 assert not domain.IsMaxInclusive() - domain = ds.GetFieldDomain('range_domain_int64') + domain = ds.GetFieldDomain("range_domain_int64") assert domain is not None - assert domain.GetName() == 'range_domain_int64' - assert domain.GetDescription() == '' + assert domain.GetName() == "range_domain_int64" + assert domain.GetDescription() == "" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTInteger64 assert domain.GetMinAsDouble() == -1234567890123 @@ -5011,10 +5721,10 @@ def test_ogr_gpkg_field_domains(): assert domain.GetMaxAsDouble() == 1234567890123 assert domain.IsMaxInclusive() - domain = ds.GetFieldDomain('range_domain_real') + domain = ds.GetFieldDomain("range_domain_real") assert domain is not None - assert domain.GetName() == 'range_domain_real' - assert domain.GetDescription() == '' + assert domain.GetName() == "range_domain_real" + assert domain.GetDescription() == "" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTReal assert domain.GetMinAsDouble() == 1.5 @@ -5022,10 +5732,10 @@ def test_ogr_gpkg_field_domains(): assert domain.GetMaxAsDouble() == 2.5 assert domain.IsMaxInclusive() - domain = ds.GetFieldDomain('range_domain_real_inf') + domain = ds.GetFieldDomain("range_domain_real_inf") assert domain is not None - assert domain.GetName() == 'range_domain_real_inf' - assert domain.GetDescription() == '' + assert domain.GetName() == "range_domain_real_inf" + assert domain.GetDescription() == "" assert domain.GetDomainType() == ogr.OFDT_RANGE assert domain.GetFieldType() == ogr.OFTReal assert domain.GetMinAsDouble() == -math.inf @@ -5033,54 +5743,54 @@ def test_ogr_gpkg_field_domains(): assert domain.GetMaxAsDouble() == math.inf assert domain.IsMaxInclusive() - domain = ds.GetFieldDomain('glob_domain') + domain = ds.GetFieldDomain("glob_domain") assert domain is not None - assert domain.GetName() == 'glob_domain' - assert domain.GetDescription() == 'my desc' + assert domain.GetName() == "glob_domain" + assert domain.GetDescription() == "my desc" assert domain.GetDomainType() == ogr.OFDT_GLOB assert domain.GetFieldType() == ogr.OFTString - assert domain.GetGlob() == '*' + assert domain.GetGlob() == "*" - domain = ds.GetFieldDomain('enum_domain') + domain = ds.GetFieldDomain("enum_domain") assert domain is not None - assert domain.GetName() == 'enum_domain' - assert domain.GetDescription() == '' + assert domain.GetName() == "enum_domain" + assert domain.GetDescription() == "" assert domain.GetDomainType() == ogr.OFDT_CODED assert domain.GetFieldType() == ogr.OFTInteger64 - assert domain.GetEnumeration() == { "1": "one", "2": None } + assert domain.GetEnumeration() == {"1": "one", "2": None} - domain = ds.GetFieldDomain('enum_domain_guess_int_single') - assert domain.GetDescription() == 'my desc' + domain = ds.GetFieldDomain("enum_domain_guess_int_single") + assert domain.GetDescription() == "my desc" assert domain.GetFieldType() == ogr.OFTInteger - domain = ds.GetFieldDomain('enum_domain_guess_int') + domain = ds.GetFieldDomain("enum_domain_guess_int") assert domain.GetFieldType() == ogr.OFTInteger - domain = ds.GetFieldDomain('enum_domain_guess_int64_single_1') + domain = ds.GetFieldDomain("enum_domain_guess_int64_single_1") assert domain.GetFieldType() == ogr.OFTInteger64 - domain = ds.GetFieldDomain('enum_domain_guess_int64_single_2') + domain = ds.GetFieldDomain("enum_domain_guess_int64_single_2") assert domain.GetFieldType() == ogr.OFTInteger64 - domain = ds.GetFieldDomain('enum_domain_guess_int64') + domain = ds.GetFieldDomain("enum_domain_guess_int64") assert domain.GetFieldType() == ogr.OFTInteger64 - domain = ds.GetFieldDomain('enum_domain_guess_real_single') + domain = ds.GetFieldDomain("enum_domain_guess_real_single") assert domain.GetFieldType() == ogr.OFTReal - domain = ds.GetFieldDomain('enum_domain_guess_real') + domain = ds.GetFieldDomain("enum_domain_guess_real") assert domain.GetFieldType() == ogr.OFTReal - domain = ds.GetFieldDomain('enum_domain_guess_string_single') + domain = ds.GetFieldDomain("enum_domain_guess_string_single") assert domain.GetFieldType() == ogr.OFTString - domain = ds.GetFieldDomain('enum_domain_guess_string') + domain = ds.GetFieldDomain("enum_domain_guess_string") assert domain.GetFieldType() == ogr.OFTString - lyr = ds.GetLayerByName('test') + lyr = ds.GetLayerByName("test") lyr_defn = lyr.GetLayerDefn() - fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('with_range_domain_int')) - assert fld_defn.GetDomainName() == 'range_domain_int' + fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("with_range_domain_int")) + assert fld_defn.GetDomainName() == "range_domain_int" ds = None @@ -5090,71 +5800,73 @@ def test_ogr_gpkg_field_domains(): lyr_defn = lyr.GetLayerDefn() # Unset domain name - idx = lyr_defn.GetFieldIndex('with_range_domain_int') + idx = lyr_defn.GetFieldIndex("with_range_domain_int") fld_defn = lyr_defn.GetFieldDefn(idx) fld_defn = ogr.FieldDefn(fld_defn.GetName(), fld_defn.GetType()) - fld_defn.SetDomainName('') + fld_defn.SetDomainName("") assert lyr.AlterFieldDefn(idx, fld_defn, ogr.ALTER_ALL_FLAG) == 0 # Change domain name - idx = lyr_defn.GetFieldIndex('with_range_domain_int64') + idx = lyr_defn.GetFieldIndex("with_range_domain_int64") fld_defn = lyr_defn.GetFieldDefn(idx) fld_defn = ogr.FieldDefn(fld_defn.GetName(), fld_defn.GetType()) - fld_defn.SetDomainName('with_enum_domain') + fld_defn.SetDomainName("with_enum_domain") assert lyr.AlterFieldDefn(idx, fld_defn, ogr.ALTER_ALL_FLAG) == 0 # Set domain name - idx = lyr_defn.GetFieldIndex('without_domain_initially') + idx = lyr_defn.GetFieldIndex("without_domain_initially") fld_defn = lyr_defn.GetFieldDefn(idx) fld_defn = ogr.FieldDefn(fld_defn.GetName(), fld_defn.GetType()) - fld_defn.SetDomainName('range_domain_int') + fld_defn.SetDomainName("range_domain_int") assert lyr.AlterFieldDefn(idx, fld_defn, ogr.ALTER_ALL_FLAG) == 0 # Don't change anything - idx = lyr_defn.GetFieldIndex('with_glob_domain') + idx = lyr_defn.GetFieldIndex("with_glob_domain") fld_defn = lyr_defn.GetFieldDefn(idx) assert lyr.AlterFieldDefn(idx, fld_defn, ogr.ALTER_ALL_FLAG) == 0 ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" # Test read support ds = gdal.OpenEx(filename, gdal.OF_VECTOR) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() - idx = lyr_defn.GetFieldIndex('with_range_domain_int') + idx = lyr_defn.GetFieldIndex("with_range_domain_int") fld_defn = lyr_defn.GetFieldDefn(idx) - assert fld_defn.GetDomainName() == '' + assert fld_defn.GetDomainName() == "" - idx = lyr_defn.GetFieldIndex('with_range_domain_int64') + idx = lyr_defn.GetFieldIndex("with_range_domain_int64") fld_defn = lyr_defn.GetFieldDefn(idx) - assert fld_defn.GetDomainName() == 'with_enum_domain' + assert fld_defn.GetDomainName() == "with_enum_domain" - idx = lyr_defn.GetFieldIndex('without_domain_initially') + idx = lyr_defn.GetFieldIndex("without_domain_initially") fld_defn = lyr_defn.GetFieldDefn(idx) - assert fld_defn.GetDomainName() == 'range_domain_int' + assert fld_defn.GetDomainName() == "range_domain_int" - idx = lyr_defn.GetFieldIndex('with_glob_domain') + idx = lyr_defn.GetFieldIndex("with_glob_domain") fld_defn = lyr_defn.GetFieldDefn(idx) - assert fld_defn.GetDomainName() == 'glob_domain' - - assert set(ds.GetFieldDomainNames()) == {'enum_domain', - 'enum_domain_guess_int', - 'enum_domain_guess_int64', - 'enum_domain_guess_int64_single_1', - 'enum_domain_guess_int64_single_2', - 'enum_domain_guess_int_single', - 'enum_domain_guess_real', - 'enum_domain_guess_real_single', - 'enum_domain_guess_string', - 'enum_domain_guess_string_single', - 'glob_domain', - 'range_domain_int', - 'range_domain_int64', - 'range_domain_real', - 'range_domain_real_inf'} + assert fld_defn.GetDomainName() == "glob_domain" + + assert set(ds.GetFieldDomainNames()) == { + "enum_domain", + "enum_domain_guess_int", + "enum_domain_guess_int64", + "enum_domain_guess_int64_single_1", + "enum_domain_guess_int64_single_2", + "enum_domain_guess_int_single", + "enum_domain_guess_real", + "enum_domain_guess_real_single", + "enum_domain_guess_string", + "enum_domain_guess_string_single", + "glob_domain", + "range_domain_int", + "range_domain_int64", + "range_domain_real", + "range_domain_real_inf", + } ds = None @@ -5167,63 +5879,79 @@ def test_ogr_gpkg_field_domains(): def test_ogr_gpkg_field_domains_errors(): - filename = '/vsimem/test.gpkg' + filename = "/vsimem/test.gpkg" - ds = gdal.GetDriverByName('GPKG').Create(filename, 0, 0, 0, gdal.GDT_Unknown) - ds.CreateLayer('test') + ds = gdal.GetDriverByName("GPKG").Create(filename, 0, 0, 0, gdal.GDT_Unknown) + ds.CreateLayer("test") # The DDL lacks on purpose the NOT NULL constraints on constraint_name and constraint_type - ds.ExecuteSQL("CREATE TABLE gpkg_data_column_constraints (" + - "constraint_name TEXT,constraint_type TEXT,value TEXT," + - "min NUMERIC,min_is_inclusive BOOLEAN," + - "max NUMERIC,max_is_inclusive BOOLEAN,description TEXT)") + ds.ExecuteSQL( + "CREATE TABLE gpkg_data_column_constraints (" + + "constraint_name TEXT,constraint_type TEXT,value TEXT," + + "min NUMERIC,min_is_inclusive BOOLEAN," + + "max NUMERIC,max_is_inclusive BOOLEAN,description TEXT)" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('null_constraint_type', NULL, NULL, NULL, NULL, NULL, NULL, NULL)") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('null_constraint_type', NULL, NULL, NULL, NULL, NULL, NULL, NULL)" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('invalid_constraint_type', 'invalid', NULL, NULL, NULL, NULL, NULL, NULL)") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('invalid_constraint_type', 'invalid', NULL, NULL, NULL, NULL, NULL, NULL)" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('mix_glob_enum', 'glob', '*', NULL, NULL, NULL, NULL, NULL)") - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('mix_glob_enum', 'enum', 'foo', NULL, NULL, NULL, NULL, 'bar')") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('mix_glob_enum', 'glob', '*', NULL, NULL, NULL, NULL, NULL)" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('mix_glob_enum', 'enum', 'foo', NULL, NULL, NULL, NULL, 'bar')" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('null_in_enum_code', 'enum', NULL, NULL, NULL, NULL, NULL, 'bar')") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('null_in_enum_code', 'enum', NULL, NULL, NULL, NULL, NULL, 'bar')" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('null_in_glob_value', 'glob', NULL, NULL, NULL, NULL, NULL, NULL)") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('null_in_glob_value', 'glob', NULL, NULL, NULL, NULL, NULL, NULL)" + ) - ds.ExecuteSQL("INSERT INTO gpkg_data_column_constraints VALUES "+ - "('null_in_range', 'range', NULL, NULL, NULL, NULL, NULL, NULL)") + ds.ExecuteSQL( + "INSERT INTO gpkg_data_column_constraints VALUES " + + "('null_in_range', 'range', NULL, NULL, NULL, NULL, NULL, NULL)" + ) ds = None ds = gdal.OpenEx(filename, gdal.OF_VECTOR) - assert ds.GetFieldDomain('null_constraint_type') is None + assert ds.GetFieldDomain("null_constraint_type") is None with gdaltest.error_handler(): gdal.ErrorReset() - assert ds.GetFieldDomain('invalid_constraint_type') is None - assert gdal.GetLastErrorMsg() != '' + assert ds.GetFieldDomain("invalid_constraint_type") is None + assert gdal.GetLastErrorMsg() != "" with gdaltest.error_handler(): gdal.ErrorReset() - assert ds.GetFieldDomain('mix_glob_enum') is None - assert gdal.GetLastErrorMsg() != '' + assert ds.GetFieldDomain("mix_glob_enum") is None + assert gdal.GetLastErrorMsg() != "" with gdaltest.error_handler(): gdal.ErrorReset() - assert ds.GetFieldDomain('null_in_enum_code') is None - assert gdal.GetLastErrorMsg() != '' + assert ds.GetFieldDomain("null_in_enum_code") is None + assert gdal.GetLastErrorMsg() != "" with gdaltest.error_handler(): gdal.ErrorReset() - assert ds.GetFieldDomain('null_in_glob_value') is None - assert gdal.GetLastErrorMsg() != '' + assert ds.GetFieldDomain("null_in_glob_value") is None + assert gdal.GetLastErrorMsg() != "" # This is non conformant, but we accept it - domain = ds.GetFieldDomain('null_in_range') + domain = ds.GetFieldDomain("null_in_range") assert domain is not None assert domain.GetMinAsDouble() == -math.inf assert domain.GetMaxAsDouble() == math.inf @@ -5239,34 +5967,42 @@ def test_ogr_gpkg_field_domains_errors(): def test_ogr_gpkg_views(): - filename = '/vsimem/test_ogr_gpkg_views.gpkg' + filename = "/vsimem/test_ogr_gpkg_views.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('foo', geom_type = ogr.wkbPoint) + lyr = ds.CreateLayer("foo", geom_type=ogr.wkbPoint) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 0)")) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT(1 1)")) lyr.CreateFeature(f) - ds.ExecuteSQL('CREATE VIEW geom_view AS SELECT fid AS my_fid, geom AS my_geom FROM foo') - ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'geom_view', 'geom_view', 'features', 0 )") - ds.ExecuteSQL("INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('geom_view', 'my_geom', 'POINT', 0, 0, 0)") + ds.ExecuteSQL( + "CREATE VIEW geom_view AS SELECT fid AS my_fid, geom AS my_geom FROM foo" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'geom_view', 'geom_view', 'features', 0 )" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('geom_view', 'my_geom', 'POINT', 0, 0, 0)" + ) - ds.ExecuteSQL('CREATE VIEW attr_view AS SELECT fid AS my_fid FROM foo') - ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, identifier, data_type) VALUES ( 'attr_view', 'attr_view', 'attributes' )") + ds.ExecuteSQL("CREATE VIEW attr_view AS SELECT fid AS my_fid FROM foo") + ds.ExecuteSQL( + "INSERT INTO gpkg_contents (table_name, identifier, data_type) VALUES ( 'attr_view', 'attr_view', 'attributes' )" + ) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename) assert ds.GetLayerCount() == 3 - lyr = ds.GetLayerByName('geom_view') + lyr = ds.GetLayerByName("geom_view") assert lyr.GetGeomType() == ogr.wkbPoint - lyr = ds.GetLayerByName('attr_view') + lyr = ds.GetLayerByName("attr_view") assert lyr.GetGeomType() == ogr.wkbNone ds = None @@ -5280,7 +6016,7 @@ def test_ogr_gpkg_views(): def test_ogr_gpkg_read_deprecated_gdal_aspatial(): - filename = '/vsimem/test_ogr_gpkg_aspatial.gpkg' + filename = "/vsimem/test_ogr_gpkg_aspatial.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) ds.ExecuteSQL( "CREATE TABLE gpkg_extensions (" @@ -5290,16 +6026,19 @@ def test_ogr_gpkg_read_deprecated_gdal_aspatial(): "definition TEXT NOT NULL," "scope TEXT NOT NULL," "CONSTRAINT ge_tce UNIQUE (table_name, column_name, extension_name)" - ")") + ")" + ) ds.ExecuteSQL( "INSERT INTO gpkg_extensions " "(table_name, column_name, extension_name, definition, scope) " "VALUES " - "(NULL, NULL, 'gdal_aspatial', 'http://gdal.org/geopackage_aspatial.html', 'read-write')") - ds.ExecuteSQL('CREATE TABLE aspatial_layer(fid INTEGER PRIMARY KEY,bar TEXT)') + "(NULL, NULL, 'gdal_aspatial', 'http://gdal.org/geopackage_aspatial.html', 'read-write')" + ) + ds.ExecuteSQL("CREATE TABLE aspatial_layer(fid INTEGER PRIMARY KEY,bar TEXT)") ds.ExecuteSQL( - "INSERT INTO gpkg_contents (table_name, data_type) VALUES ('aspatial_layer', 'aspatial')") - ds.CreateLayer('spatial_layer', options=['SPATIAL_INDEX=NO']) + "INSERT INTO gpkg_contents (table_name, data_type) VALUES ('aspatial_layer', 'aspatial')" + ) + ds.CreateLayer("spatial_layer", options=["SPATIAL_INDEX=NO"]) ds = None ds = ogr.Open(filename) @@ -5312,38 +6051,43 @@ def test_ogr_gpkg_read_deprecated_gdal_aspatial(): ############################################################################### # Test fixing up wrong gpkg_metadata_reference_column_name_update trigger (GDAL < 2.4.0) + def test_ogr_gpkg_fixup_wrong_mr_column_name_update_trigger(): - filename = '/vsimem/test_ogr_gpkg_fixup_wrong_mr_column_name_update_trigger.gpkg' - ds = ogr.GetDriverByName('GPKG').CreateDataSource(filename) - ds.SetMetadata('FOO','BAR') + filename = "/vsimem/test_ogr_gpkg_fixup_wrong_mr_column_name_update_trigger.gpkg" + ds = ogr.GetDriverByName("GPKG").CreateDataSource(filename) + ds.SetMetadata("FOO", "BAR") ds = None - ds = ogr.Open(filename, update = 1) + ds = ogr.Open(filename, update=1) # inject wrong trigger on purpose - wrong_trigger = "CREATE TRIGGER 'gpkg_metadata_reference_column_name_update' " + \ - "BEFORE UPDATE OF column_name ON 'gpkg_metadata_reference' " + \ - "FOR EACH ROW BEGIN " + \ - "SELECT RAISE(ABORT, 'update on table gpkg_metadata_reference " + \ - "violates constraint: column name must be NULL when reference_scope " + \ - "is \"geopackage\", \"table\" or \"row\"') " + \ - "WHERE (NEW.reference_scope IN ('geopackage','table','row') " + \ - "AND NEW.column_nameIS NOT NULL); END;" + wrong_trigger = ( + "CREATE TRIGGER 'gpkg_metadata_reference_column_name_update' " + + "BEFORE UPDATE OF column_name ON 'gpkg_metadata_reference' " + + "FOR EACH ROW BEGIN " + + "SELECT RAISE(ABORT, 'update on table gpkg_metadata_reference " + + "violates constraint: column name must be NULL when reference_scope " + + 'is "geopackage", "table" or "row"\') ' + + "WHERE (NEW.reference_scope IN ('geopackage','table','row') " + + "AND NEW.column_nameIS NOT NULL); END;" + ) ds.ExecuteSQL(wrong_trigger) ds = None # Open in update mode - ds = ogr.Open(filename, update = 1) + ds = ogr.Open(filename, update=1) sql_lyr = ds.ExecuteSQL( - "SELECT sql FROM sqlite_master WHERE type = 'trigger' " + \ - "AND name = 'gpkg_metadata_reference_column_name_update'") + "SELECT sql FROM sqlite_master WHERE type = 'trigger' " + + "AND name = 'gpkg_metadata_reference_column_name_update'" + ) f = sql_lyr.GetNextFeature() - sql = f['sql'] + sql = f["sql"] ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink(filename) - assert 'column_nameIS' not in sql + assert "column_nameIS" not in sql + ############################################################################### # Test support for CRS coordinate_epoch @@ -5351,30 +6095,30 @@ def test_ogr_gpkg_fixup_wrong_mr_column_name_update_trigger(): def test_ogr_gpkg_crs_coordinate_epoch(): - filename = '/vsimem/test_ogr_gpkg_crs_coordinate_epoch.gpkg' + filename = "/vsimem/test_ogr_gpkg_crs_coordinate_epoch.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) srs = osr.SpatialReference() - srs.ImportFromEPSG(7665) # WGS 84 (G1762) (3D) + srs.ImportFromEPSG(7665) # WGS 84 (G1762) (3D) srs.SetCoordinateEpoch(2021.3) - ds.CreateLayer('lyr_with_coordinate_epoch', srs=srs) + ds.CreateLayer("lyr_with_coordinate_epoch", srs=srs) srs.SetCoordinateEpoch(2021.3) - ds.CreateLayer('lyr_with_same_coordinate_epoch', srs=srs) + ds.CreateLayer("lyr_with_same_coordinate_epoch", srs=srs) srs.SetCoordinateEpoch(2021.2) - ds.CreateLayer('lyr_with_different_coordinate_epoch', srs=srs) + ds.CreateLayer("lyr_with_different_coordinate_epoch", srs=srs) srs = osr.SpatialReference() - srs.ImportFromEPSG(4258) # ETRS89 - ds.CreateLayer('lyr_without_coordinate_epoch', srs=srs) + srs.ImportFromEPSG(4258) # ETRS89 + ds.CreateLayer("lyr_without_coordinate_epoch", srs=srs) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename) - sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys ORDER BY srs_id') + sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys ORDER BY srs_id") assert sql_lyr.GetFeatureCount() == 6 sql_lyr.GetNextFeature() @@ -5382,46 +6126,46 @@ def test_ogr_gpkg_crs_coordinate_epoch(): f = sql_lyr.GetNextFeature() assert f - assert f['srs_id'] == 4258 - assert f['organization'] == 'EPSG' - assert f['organization_coordsys_id'] == 4258 - assert f['epoch'] is None + assert f["srs_id"] == 4258 + assert f["organization"] == "EPSG" + assert f["organization_coordsys_id"] == 4258 + assert f["epoch"] is None f = sql_lyr.GetNextFeature() assert f - assert f['srs_id'] == 4326 - assert f['organization'] == 'EPSG' - assert f['organization_coordsys_id'] == 4326 - assert f['epoch'] is None + assert f["srs_id"] == 4326 + assert f["organization"] == "EPSG" + assert f["organization_coordsys_id"] == 4326 + assert f["epoch"] is None f = sql_lyr.GetNextFeature() assert f - assert f['srs_id'] == 100000 - assert f['organization'] == 'EPSG' - assert f['organization_coordsys_id'] == 7665 - assert f['epoch'] == 2021.3 + assert f["srs_id"] == 100000 + assert f["organization"] == "EPSG" + assert f["organization_coordsys_id"] == 7665 + assert f["epoch"] == 2021.3 f = sql_lyr.GetNextFeature() assert f - assert f['srs_id'] == 100001 - assert f['organization'] == 'EPSG' - assert f['organization_coordsys_id'] == 7665 - assert f['epoch'] == 2021.2 + assert f["srs_id"] == 100001 + assert f["organization"] == "EPSG" + assert f["organization_coordsys_id"] == 7665 + assert f["epoch"] == 2021.2 ds.ReleaseResultSet(sql_lyr) - lyr = ds.GetLayerByName('lyr_with_coordinate_epoch') + lyr = ds.GetLayerByName("lyr_with_coordinate_epoch") srs = lyr.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.3 - lyr = ds.GetLayerByName('lyr_with_same_coordinate_epoch') + lyr = ds.GetLayerByName("lyr_with_same_coordinate_epoch") srs = lyr.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.3 - lyr = ds.GetLayerByName('lyr_with_different_coordinate_epoch') + lyr = ds.GetLayerByName("lyr_with_different_coordinate_epoch") srs = lyr.GetSpatialRef() assert srs.GetCoordinateEpoch() == 2021.2 - lyr = ds.GetLayerByName('lyr_without_coordinate_epoch') + lyr = ds.GetLayerByName("lyr_without_coordinate_epoch") srs = lyr.GetSpatialRef() assert srs.GetCoordinateEpoch() == 0 @@ -5437,43 +6181,49 @@ def test_ogr_gpkg_crs_coordinate_epoch(): def test_ogr_gpkg_CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE(): # First check that CPL_TMPDIR is ignored for regular files - filename = '/vsimem/test_ogr_gpkg_CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE.gpkg' - with gdaltest.config_option('CPL_TMPDIR', '/i_do/not/exist'): + filename = "/vsimem/test_ogr_gpkg_CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE.gpkg" + with gdaltest.config_option("CPL_TMPDIR", "/i_do/not/exist"): ds = gdaltest.gpkg_dr.CreateDataSource(filename) assert ds is not None ds = None gdal.Unlink(filename) # Now check that CPL_TMPDIR is honored for CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE=FORCED - with gdaltest.config_options({'CPL_TMPDIR': '/vsimem/temporary_location', - 'CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE': 'FORCED'}): + with gdaltest.config_options( + { + "CPL_TMPDIR": "/vsimem/temporary_location", + "CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE": "FORCED", + } + ): ds = gdaltest.gpkg_dr.CreateDataSource(filename) assert ds is not None assert gdal.VSIStatL(filename) is None - assert len(gdal.ReadDir('/vsimem/temporary_location')) != 0 + assert len(gdal.ReadDir("/vsimem/temporary_location")) != 0 ds = None assert gdal.VSIStatL(filename) is not None - assert gdal.ReadDir('/vsimem/temporary_location') is None + assert gdal.ReadDir("/vsimem/temporary_location") is None gdal.Unlink(filename) + ############################################################################### # Test support for related tables extension def test_ogr_gpkg_relations(): - filename = '/vsimem/test_ogr_gpkg_relations.gpkg' + filename = "/vsimem/test_ogr_gpkg_relations.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) - lyr = ds.CreateLayer('a') - lyr.CreateField(ogr.FieldDefn('some_id', ogr.OFTInteger)) - lyr = ds.CreateLayer('b') - lyr.CreateField(ogr.FieldDefn('other_id', ogr.OFTInteger)) + lyr = ds.CreateLayer("a") + lyr.CreateField(ogr.FieldDefn("some_id", ogr.OFTInteger)) + lyr = ds.CreateLayer("b") + lyr.CreateField(ogr.FieldDefn("other_id", ogr.OFTInteger)) ds = None ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE) assert ds.GetRelationshipNames() is None - ds.ExecuteSQL("""CREATE TABLE 'gpkgext_relations' ( + ds.ExecuteSQL( + """CREATE TABLE 'gpkgext_relations' ( id INTEGER PRIMARY KEY AUTOINCREMENT, base_table_name TEXT NOT NULL, base_primary_column TEXT NOT NULL DEFAULT 'id', @@ -5481,145 +6231,171 @@ def test_ogr_gpkg_relations(): related_primary_column TEXT NOT NULL DEFAULT 'id', relation_name TEXT NOT NULL, mapping_table_name TEXT NOT NULL UNIQUE - );""") + );""" + ) # not yet valid... ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE) assert ds.GetRelationshipNames() is None - ds.ExecuteSQL("INSERT INTO gpkgext_relations VALUES(1, 'a', 'some_id', 'b', 'other_id', 'attributes', 'my_mapping_table')") - ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('gpkgext_relations',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');") - ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('my_mapping_table',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');") + ds.ExecuteSQL( + "INSERT INTO gpkgext_relations VALUES(1, 'a', 'some_id', 'b', 'other_id', 'attributes', 'my_mapping_table')" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_extensions VALUES('gpkgext_relations',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_extensions VALUES('my_mapping_table',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');" + ) ds = None ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE) assert ds.GetRelationshipNames() is None - ds.ExecuteSQL("""CREATE TABLE my_mapping_table(base_id INTEGER NOT NULL, related_id INTEGER NOT NULL);""") + ds.ExecuteSQL( + """CREATE TABLE my_mapping_table(base_id INTEGER NOT NULL, related_id INTEGER NOT NULL);""" + ) - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE) - assert ds.GetRelationshipNames() == ['a_b_attributes'] - assert ds.GetRelationship('xxx') is None - rel = ds.GetRelationship('a_b_attributes') + assert ds.GetRelationshipNames() == ["a_b_attributes"] + assert ds.GetRelationship("xxx") is None + rel = ds.GetRelationship("a_b_attributes") assert rel is not None - assert rel.GetName() == 'a_b_attributes' - assert rel.GetLeftTableName() == 'a' - assert rel.GetRightTableName() == 'b' - assert rel.GetMappingTableName() == 'my_mapping_table' + assert rel.GetName() == "a_b_attributes" + assert rel.GetLeftTableName() == "a" + assert rel.GetRightTableName() == "b" + assert rel.GetMappingTableName() == "my_mapping_table" assert rel.GetCardinality() == gdal.GRC_MANY_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['some_id'] - assert rel.GetRightTableFields() == ['other_id'] - assert rel.GetLeftMappingTableFields() == ['base_id'] - assert rel.GetRightMappingTableFields() == ['related_id'] - assert rel.GetRelatedTableType() == 'attributes' - - lyr = ds.GetLayer('a') - lyr.Rename('a_renamed') - lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('some_id'), - ogr.FieldDefn('some_id_renamed', ogr.OFTInteger), - ogr.ALTER_ALL_FLAG) - lyr = ds.GetLayer('b') - lyr.Rename('b_renamed') - lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('other_id'), - ogr.FieldDefn('other_id_renamed', ogr.OFTInteger), - ogr.ALTER_ALL_FLAG) - - assert ds.GetRelationshipNames() == ['a_renamed_b_renamed_attributes'] - assert ds.GetRelationship('xxx') is None - rel = ds.GetRelationship('a_renamed_b_renamed_attributes') + assert rel.GetLeftTableFields() == ["some_id"] + assert rel.GetRightTableFields() == ["other_id"] + assert rel.GetLeftMappingTableFields() == ["base_id"] + assert rel.GetRightMappingTableFields() == ["related_id"] + assert rel.GetRelatedTableType() == "attributes" + + lyr = ds.GetLayer("a") + lyr.Rename("a_renamed") + lyr.AlterFieldDefn( + lyr.GetLayerDefn().GetFieldIndex("some_id"), + ogr.FieldDefn("some_id_renamed", ogr.OFTInteger), + ogr.ALTER_ALL_FLAG, + ) + lyr = ds.GetLayer("b") + lyr.Rename("b_renamed") + lyr.AlterFieldDefn( + lyr.GetLayerDefn().GetFieldIndex("other_id"), + ogr.FieldDefn("other_id_renamed", ogr.OFTInteger), + ogr.ALTER_ALL_FLAG, + ) + + assert ds.GetRelationshipNames() == ["a_renamed_b_renamed_attributes"] + assert ds.GetRelationship("xxx") is None + rel = ds.GetRelationship("a_renamed_b_renamed_attributes") assert rel is not None - assert rel.GetName() == 'a_renamed_b_renamed_attributes' - assert rel.GetLeftTableName() == 'a_renamed' - assert rel.GetRightTableName() == 'b_renamed' - assert rel.GetMappingTableName() == 'my_mapping_table' + assert rel.GetName() == "a_renamed_b_renamed_attributes" + assert rel.GetLeftTableName() == "a_renamed" + assert rel.GetRightTableName() == "b_renamed" + assert rel.GetMappingTableName() == "my_mapping_table" assert rel.GetCardinality() == gdal.GRC_MANY_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['some_id_renamed'] - assert rel.GetRightTableFields() == ['other_id_renamed'] - assert rel.GetLeftMappingTableFields() == ['base_id'] - assert rel.GetRightMappingTableFields() == ['related_id'] - assert rel.GetRelatedTableType() == 'attributes' + assert rel.GetLeftTableFields() == ["some_id_renamed"] + assert rel.GetRightTableFields() == ["other_id_renamed"] + assert rel.GetLeftMappingTableFields() == ["base_id"] + assert rel.GetRightMappingTableFields() == ["related_id"] + assert rel.GetRelatedTableType() == "attributes" ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = gdal.OpenEx(filename, gdal.OF_VECTOR | gdal.OF_UPDATE) - ds.ExecuteSQL('DELLAYER:a_renamed') - sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE extension_name IN ('related_tables', 'gpkg_related_tables')") + ds.ExecuteSQL("DELLAYER:a_renamed") + sql_lyr = ds.ExecuteSQL( + "SELECT * FROM gpkg_extensions WHERE extension_name IN ('related_tables', 'gpkg_related_tables')" + ) f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) assert ds.GetRelationshipNames() is None ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" # user defined relation ds = ogr.Open(filename, update=1) - lyr = ds.CreateLayer('a') - lyr.CreateField(ogr.FieldDefn('some_id', ogr.OFTInteger)) - ds.ExecuteSQL("INSERT INTO gpkgext_relations VALUES(1, 'a', 'some_id', 'b', 'other_id', 'custom_type', 'my_mapping_table')") - ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('gpkgext_relations',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');") - ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('my_mapping_table',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');") + lyr = ds.CreateLayer("a") + lyr.CreateField(ogr.FieldDefn("some_id", ogr.OFTInteger)) + ds.ExecuteSQL( + "INSERT INTO gpkgext_relations VALUES(1, 'a', 'some_id', 'b', 'other_id', 'custom_type', 'my_mapping_table')" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_extensions VALUES('gpkgext_relations',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');" + ) + ds.ExecuteSQL( + "INSERT INTO gpkg_extensions VALUES('my_mapping_table',NULL,'gpkg_related_tables','http://www.geopackage.org/18-000.html','read-write');" + ) ds = gdal.OpenEx(filename, gdal.OF_VECTOR) - assert ds.GetRelationshipNames() == ['custom_type'] - assert ds.GetRelationship('xxx') is None - rel = ds.GetRelationship('custom_type') + assert ds.GetRelationshipNames() == ["custom_type"] + assert ds.GetRelationship("xxx") is None + rel = ds.GetRelationship("custom_type") assert rel is not None - assert rel.GetName() == 'custom_type' - assert rel.GetLeftTableName() == 'a' - assert rel.GetRightTableName() == 'b' - assert rel.GetMappingTableName() == 'my_mapping_table' + assert rel.GetName() == "custom_type" + assert rel.GetLeftTableName() == "a" + assert rel.GetRightTableName() == "b" + assert rel.GetMappingTableName() == "my_mapping_table" assert rel.GetCardinality() == gdal.GRC_MANY_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['some_id'] - assert rel.GetRightTableFields() == ['other_id'] - assert rel.GetLeftMappingTableFields() == ['base_id'] - assert rel.GetRightMappingTableFields() == ['related_id'] - assert rel.GetRelatedTableType() == 'features' + assert rel.GetLeftTableFields() == ["some_id"] + assert rel.GetRightTableFields() == ["other_id"] + assert rel.GetLeftMappingTableFields() == ["base_id"] + assert rel.GetRightMappingTableFields() == ["related_id"] + assert rel.GetRelatedTableType() == "features" ds = None gdal.Unlink(filename) + ############################################################################### # Test support for relations taken from sqlite foreign keys when related tables # extension is not used + def test_ogr_gpkg_relations_sqlite_foreign_keys(): try: - tmpfilename = '/vsimem/test_ogr_gpkg_relations_sqlite.gpkg' + tmpfilename = "/vsimem/test_ogr_gpkg_relations_sqlite.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(tmpfilename) - lyr = ds.CreateLayer('a') - lyr.CreateField(ogr.FieldDefn('some_id', ogr.OFTInteger)) - lyr = ds.CreateLayer('b') - lyr.CreateField(ogr.FieldDefn('other_id', ogr.OFTInteger)) + lyr = ds.CreateLayer("a") + lyr.CreateField(ogr.FieldDefn("some_id", ogr.OFTInteger)) + lyr = ds.CreateLayer("b") + lyr.CreateField(ogr.FieldDefn("other_id", ogr.OFTInteger)) ds = None ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR | gdal.OF_UPDATE) assert ds.GetRelationshipNames() is None - ds.ExecuteSQL('CREATE TABLE test_relation_a(artistid INTEGER PRIMARY KEY, artistname TEXT)') ds.ExecuteSQL( - 'CREATE TABLE test_relation_b(trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES test_relation_a(artistid))') + "CREATE TABLE test_relation_a(artistid INTEGER PRIMARY KEY, artistname TEXT)" + ) + ds.ExecuteSQL( + "CREATE TABLE test_relation_b(trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES test_relation_a(artistid))" + ) ds = None ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR | gdal.OF_UPDATE) - assert ds.GetRelationshipNames() == ['test_relation_b_test_relation_a'] - assert ds.GetRelationship('xxx') is None - rel = ds.GetRelationship('test_relation_b_test_relation_a') + assert ds.GetRelationshipNames() == ["test_relation_b_test_relation_a"] + assert ds.GetRelationship("xxx") is None + rel = ds.GetRelationship("test_relation_b_test_relation_a") assert rel is not None - assert rel.GetName() == 'test_relation_b_test_relation_a' - assert rel.GetLeftTableName() == 'test_relation_b' - assert rel.GetRightTableName() == 'test_relation_a' + assert rel.GetName() == "test_relation_b_test_relation_a" + assert rel.GetLeftTableName() == "test_relation_b" + assert rel.GetRightTableName() == "test_relation_a" assert rel.GetCardinality() == gdal.GRC_ONE_TO_MANY assert rel.GetType() == gdal.GRT_ASSOCIATION - assert rel.GetLeftTableFields() == ['trackartist'] - assert rel.GetRightTableFields() == ['artistid'] - assert rel.GetRelatedTableType() == 'feature' + assert rel.GetLeftTableFields() == ["trackartist"] + assert rel.GetRightTableFields() == ["artistid"] + assert rel.GetRelatedTableType() == "feature" finally: gdal.Unlink(tmpfilename) @@ -5631,18 +6407,18 @@ def test_ogr_gpkg_relations_sqlite_foreign_keys(): def test_ogr_gpkg_alter_geom_field_defn(): - filename = '/vsimem/test_ogr_gpkg_alter_geom_field_defn.gpkg' + filename = "/vsimem/test_ogr_gpkg_alter_geom_field_defn.gpkg" ds = gdaltest.gpkg_dr.CreateDataSource(filename) srs_4326 = osr.SpatialReference() srs_4326.ImportFromEPSG(4326) - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint, srs = srs_4326) + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint, srs=srs_4326) f = ogr.Feature(lyr.GetLayerDefn()) - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (1 2)")) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) - sql_lyr = ds.ExecuteSQL('SELECT sqlite_version()') + sql_lyr = ds.ExecuteSQL("SELECT sqlite_version()") f = sql_lyr.GetNextFeature() version = f.GetField(0) ds.ReleaseResultSet(sql_lyr) @@ -5650,80 +6426,105 @@ def test_ogr_gpkg_alter_geom_field_defn(): ds = None # Test renaming column (only supported for SQLite >= 3.26) - if tuple([int(x) for x in version.split('.')[0:2]]) >= (3,26): + if tuple([int(x) for x in version.split(".")[0:2]]) >= (3, 26): ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCAlterGeomFieldDefn) - new_geom_field_defn = ogr.GeomFieldDefn('new_geom_name', ogr.wkbNone) - assert lyr.AlterGeomFieldDefn(0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_NAME_FLAG) == ogr.OGRERR_NONE - assert lyr.GetGeometryColumn() == 'new_geom_name' + new_geom_field_defn = ogr.GeomFieldDefn("new_geom_name", ogr.wkbNone) + assert ( + lyr.AlterGeomFieldDefn( + 0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_NAME_FLAG + ) + == ogr.OGRERR_NONE + ) + assert lyr.GetGeometryColumn() == "new_geom_name" ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename) lyr = ds.GetLayer(0) - assert lyr.GetGeometryColumn() == 'new_geom_name' + assert lyr.GetGeometryColumn() == "new_geom_name" srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) - new_geom_field_defn = ogr.GeomFieldDefn('', ogr.wkbNone) - assert lyr.AlterGeomFieldDefn(0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG) == ogr.OGRERR_NONE + new_geom_field_defn = ogr.GeomFieldDefn("", ogr.wkbNone) + assert ( + lyr.AlterGeomFieldDefn( + 0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG + ) + == ogr.OGRERR_NONE + ) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetName() == 'Undefined geographic SRS' + assert srs.GetName() == "Undefined geographic SRS" - new_geom_field_defn = ogr.GeomFieldDefn('', ogr.wkbNone) + new_geom_field_defn = ogr.GeomFieldDefn("", ogr.wkbNone) new_geom_field_defn.SetSpatialRef(srs_4326) - assert lyr.AlterGeomFieldDefn(0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG) == ogr.OGRERR_NONE + assert ( + lyr.AlterGeomFieldDefn( + 0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG + ) + == ogr.OGRERR_NONE + ) ds = None - assert validate(filename), 'validation failed' + assert validate(filename), "validation failed" ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetAuthorityCode(None) == '4326' + assert srs.GetAuthorityCode(None) == "4326" - new_geom_field_defn = ogr.GeomFieldDefn('', ogr.wkbNone) + new_geom_field_defn = ogr.GeomFieldDefn("", ogr.wkbNone) other_srs = osr.SpatialReference() other_srs.ImportFromEPSG(4269) new_geom_field_defn.SetSpatialRef(other_srs) - assert lyr.AlterGeomFieldDefn(0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG) == ogr.OGRERR_NONE + assert ( + lyr.AlterGeomFieldDefn( + 0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_FLAG + ) + == ogr.OGRERR_NONE + ) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetAuthorityCode(None) == '4269' + assert srs.GetAuthorityCode(None) == "4269" - new_geom_field_defn = ogr.GeomFieldDefn('', ogr.wkbNone) + new_geom_field_defn = ogr.GeomFieldDefn("", ogr.wkbNone) srs = osr.SpatialReference() srs.ImportFromEPSG(4269) srs.SetCoordinateEpoch(2022) new_geom_field_defn.SetSpatialRef(srs) - assert lyr.AlterGeomFieldDefn(0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_COORD_EPOCH_FLAG) == ogr.OGRERR_NONE + assert ( + lyr.AlterGeomFieldDefn( + 0, new_geom_field_defn, ogr.ALTER_GEOM_FIELD_DEFN_SRS_COORD_EPOCH_FLAG + ) + == ogr.OGRERR_NONE + ) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs is not None - assert srs.GetAuthorityCode(None) == '4269' + assert srs.GetAuthorityCode(None) == "4269" assert srs.GetCoordinateEpoch() == 2022 ds = None @@ -5735,11 +6536,13 @@ def test_ogr_gpkg_alter_geom_field_defn(): def test_ogr_gpkg_arrow_stream_numpy(): - pytest.importorskip('osgeo.gdal_array') - numpy = pytest.importorskip('numpy') + pytest.importorskip("osgeo.gdal_array") + numpy = pytest.importorskip("numpy") - ds = gdal.GetDriverByName('GPKG').Create('/vsimem/test.gpkg', 0, 0, 0, gdal.GDT_Unknown) - lyr = ds.CreateLayer('test', geom_type = ogr.wkbPoint) + ds = gdal.GetDriverByName("GPKG").Create( + "/vsimem/test.gpkg", 0, 0, 0, gdal.GDT_Unknown + ) + lyr = ds.CreateLayer("test", geom_type=ogr.wkbPoint) assert lyr.TestCapability(ogr.OLCFastGetArrowStream) == 1 field = ogr.FieldDefn("str", ogr.OFTString) @@ -5753,9 +6556,13 @@ def test_ogr_gpkg_arrow_stream_numpy(): field.SetSubType(ogr.OFSTInt16) lyr.CreateField(field) - assert ds.AddFieldDomain(ogr.CreateCodedFieldDomain('enum_domain', '', ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None})) + assert ds.AddFieldDomain( + ogr.CreateCodedFieldDomain( + "enum_domain", "", ogr.OFTInteger, ogr.OFSTNone, {1: "one", "2": None} + ) + ) field = ogr.FieldDefn("int32", ogr.OFTInteger) - field.SetDomainName('enum_domain') + field.SetDomainName("enum_domain") lyr.CreateField(field) field = ogr.FieldDefn("int64", ogr.OFTInteger64) @@ -5787,8 +6594,8 @@ def test_ogr_gpkg_arrow_stream_numpy(): f.SetField("str", "abc") f.SetField("date", "2022-05-31") f.SetField("datetime", "2022-05-31T12:34:56.789Z") - f.SetFieldBinaryFromHexString("binary", 'DEAD') - f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1 2)')) + f.SetFieldBinaryFromHexString("binary", "DEAD") + f.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(1 2)")) lyr.CreateFeature(f) f2 = ogr.Feature(lyr.GetLayerDefn()) @@ -5797,53 +6604,76 @@ def test_ogr_gpkg_arrow_stream_numpy(): f3 = ogr.Feature(lyr.GetLayerDefn()) f3.SetField("int16", 123) - f3.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(-1 2)')) + f3.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT(-1 2)")) lyr.CreateFeature(f3) ds = None - ds = ogr.Open('/vsimem/test.gpkg') + ds = ogr.Open("/vsimem/test.gpkg") lyr = ds.GetLayer(0) try: import pyarrow + pyarrow.__version__ has_pyarrow = True except ImportError: has_pyarrow = False if has_pyarrow: stream = lyr.GetArrowStreamAsPyArrow() - batches = [ batch for batch in stream ] - #print(batches) + batches = [batch for batch in stream] + # print(batches) - stream = lyr.GetArrowStreamAsNumPy(options = ['USE_MASKED_ARRAYS=NO', - 'MAX_FEATURES_IN_BATCH=2']) - batches = [ batch for batch in stream ] + stream = lyr.GetArrowStreamAsNumPy( + options=["USE_MASKED_ARRAYS=NO", "MAX_FEATURES_IN_BATCH=2"] + ) + batches = [batch for batch in stream] assert len(batches) == 2 batch = batches[0] assert batch.keys() == { - 'fid', 'str', 'bool', 'int16', 'int32', 'int64', - 'float32', 'float64', 'date', 'datetime', 'binary', 'geom' } + "fid", + "str", + "bool", + "int16", + "int32", + "int64", + "float32", + "float64", + "date", + "datetime", + "binary", + "geom", + } assert batch["fid"][0] == 1 assert len(batch["fid"]) == 2 - for fieldname in ('bool', 'int16', 'int32', 'int64', - 'float32', 'float64'): + for fieldname in ("bool", "int16", "int32", "int64", "float32", "float64"): assert batch[fieldname][0] == f.GetField(fieldname) - assert batch['str'][0] == f.GetField('str').encode('utf-8') - assert batch['date'][0] == numpy.datetime64('2022-05-31') - assert batch['datetime'][0] == numpy.datetime64('2022-05-31T12:34:56.789') - assert bytes(batch['binary'][0]) == b'\xDE\xAD' + assert batch["str"][0] == f.GetField("str").encode("utf-8") + assert batch["date"][0] == numpy.datetime64("2022-05-31") + assert batch["datetime"][0] == numpy.datetime64("2022-05-31T12:34:56.789") + assert bytes(batch["binary"][0]) == b"\xDE\xAD" assert len(bytes(batch["geom"][0])) == 21 assert batch["fid"][1] == 2 - assert batch['bool'][1] == False + assert batch["bool"][1] == False assert batch["geom"][1] is None batch = batches[1] assert batch.keys() == { - 'fid', 'str', 'bool', 'int16', 'int32', 'int64', - 'float32', 'float64', 'date', 'datetime', 'binary', 'geom' } + "fid", + "str", + "bool", + "int16", + "int32", + "int64", + "float32", + "float64", + "date", + "datetime", + "binary", + "geom", + } assert batch["fid"][0] == 3 assert batch["int16"][0] == 123 @@ -5852,7 +6682,7 @@ def test_ogr_gpkg_arrow_stream_numpy(): # Test attribute filter lyr.SetAttributeFilter("int16 = 123") stream = lyr.GetArrowStreamAsNumPy() - batches = [ batch for batch in stream ] + batches = [batch for batch in stream] lyr.SetAttributeFilter(None) assert len(batches) == 1 assert len(batches[0]["fid"]) == 1 @@ -5861,7 +6691,7 @@ def test_ogr_gpkg_arrow_stream_numpy(): # Test spatial filter lyr.SetSpatialFilterRect(0, 0, 10, 10) stream = lyr.GetArrowStreamAsNumPy() - batches = [ batch for batch in stream ] + batches = [batch for batch in stream] lyr.SetSpatialFilter(None) assert len(batches) == 1 assert len(batches[0]["fid"]) == 1 @@ -5869,15 +6699,22 @@ def test_ogr_gpkg_arrow_stream_numpy(): # Test ignored fields assert lyr.SetIgnoredFields(["geom", "int16"]) == ogr.OGRERR_NONE - stream = lyr.GetArrowStreamAsNumPy(options = ['INCLUDE_FID=NO']) - batches = [ batch for batch in stream ] + stream = lyr.GetArrowStreamAsNumPy(options=["INCLUDE_FID=NO"]) + batches = [batch for batch in stream] lyr.SetIgnoredFields([]) batch = batches[0] assert batch.keys() == { - 'str', 'bool', 'int32', 'int64', - 'float32', 'float64', 'date', 'datetime', 'binary' } - + "str", + "bool", + "int32", + "int64", + "float32", + "float64", + "date", + "datetime", + "binary", + } ds = None - ogr.GetDriverByName('GPKG').DeleteDataSource('/vsimem/test.gpkg') + ogr.GetDriverByName("GPKG").DeleteDataSource("/vsimem/test.gpkg") diff --git a/autotest/ogr/ogr_gpsbabel.py b/autotest/ogr/ogr_gpsbabel.py index 68786bb4c956..cbec0e096789 100755 --- a/autotest/ogr/ogr_gpsbabel.py +++ b/autotest/ogr/ogr_gpsbabel.py @@ -29,33 +29,38 @@ ############################################################################### - import gdaltest -from osgeo import ogr -from osgeo import gdal import pytest +from osgeo import gdal, ogr + + def gpsbabel_binary_found(): try: - ret = gdaltest.runexternal('gpsbabel -V') - return 'GPSBabel' in ret + ret = gdaltest.runexternal("gpsbabel -V") + return "GPSBabel" in ret except OSError: return False -pytestmark = [ pytest.mark.require_driver('GPSBabel'), - pytest.mark.require_driver('GPX'), - pytest.mark.skipif(not gpsbabel_binary_found(), reason='GPSBabel utility not found') ] +pytestmark = [ + pytest.mark.require_driver("GPSBabel"), + pytest.mark.require_driver("GPX"), + pytest.mark.skipif( + not gpsbabel_binary_found(), reason="GPSBabel utility not found" + ), +] ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): # Check that the GPX driver has read support with gdaltest.error_handler(): - if ogr.Open('data/gpx/test.gpx') is None: - assert 'Expat' in gdal.GetLastErrorMsg() - pytest.skip('GDAL build without Expat support') + if ogr.Open("data/gpx/test.gpx") is None: + assert "Expat" in gdal.GetLastErrorMsg() + pytest.skip("GDAL build without Expat support") + ############################################################################### # Test reading with explicit subdriver @@ -63,43 +68,45 @@ def startup_and_cleanup(): def test_ogr_gpsbabel_1(): - ds = ogr.Open('GPSBabel:nmea:data/gpsbabel/nmea.txt') + ds = ogr.Open("GPSBabel:nmea:data/gpsbabel/nmea.txt") assert ds is not None assert ds.GetLayerCount() == 2 + ############################################################################### # Test reading with implicit subdriver def test_ogr_gpsbabel_2(): - ds = ogr.Open('data/gpsbabel/nmea.txt') + ds = ogr.Open("data/gpsbabel/nmea.txt") assert ds is not None assert ds.GetLayerCount() == 2 + ############################################################################### # Test writing def test_ogr_gpsbabel_3(): - ds = ogr.GetDriverByName('GPSBabel').CreateDataSource('GPSBabel:nmea:tmp/nmea.txt') - lyr = ds.CreateLayer('track_points', geom_type=ogr.wkbPoint) + 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.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) @@ -107,12 +114,12 @@ def test_ogr_gpsbabel_3(): lyr = None ds = None - f = open('tmp/nmea.txt', 'rt') + f = open("tmp/nmea.txt", "rt") res = f.read() f.close() - gdal.Unlink('tmp/nmea.txt') + 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' + assert not ( + res.find("$GPRMC") == -1 or res.find("$GPGGA") == -1 or res.find("$GPGSA") == -1 + ), "did not get expected result" diff --git a/autotest/ogr/ogr_gpx.py b/autotest/ogr/ogr_gpx.py index 45dd65f4a3d2..526237debd77 100755 --- a/autotest/ogr/ogr_gpx.py +++ b/autotest/ogr/ogr_gpx.py @@ -30,195 +30,213 @@ import os - import gdaltest import ogrtest -from osgeo import ogr -from osgeo import gdal import pytest -pytestmark = pytest.mark.require_driver('GPX') +from osgeo import gdal, ogr + +pytestmark = pytest.mark.require_driver("GPX") ############################################################################### -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope="module") def startup_and_cleanup(): # Check that the GPX driver has read support with gdaltest.error_handler(): - if ogr.Open('data/gpx/test.gpx') is None: - assert 'Expat' in gdal.GetLastErrorMsg() - pytest.skip('GDAL build without Expat support') + if ogr.Open("data/gpx/test.gpx") is None: + assert "Expat" in gdal.GetLastErrorMsg() + pytest.skip("GDAL build without Expat support") yield try: - os.remove('tmp/gpx.gpx') + os.remove("tmp/gpx.gpx") except OSError: pass + ############################################################################### # Test waypoints gpx layer. def test_ogr_gpx_1(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") - assert gpx_ds.GetLayerCount() == 5, 'wrong number of layers' + assert gpx_ds.GetLayerCount() == 5, "wrong number of layers" - lyr = gpx_ds.GetLayerByName('waypoints') + lyr = gpx_ds.GetLayerByName("waypoints") expect = [2, None] with gdaltest.error_handler(): - tr = ogrtest.check_features_against_list(lyr, 'ele', expect) + tr = ogrtest.check_features_against_list(lyr, "ele", expect) assert tr lyr.ResetReading() - expect = ['waypoint name', None] + expect = ["waypoint name", None] - tr = ogrtest.check_features_against_list(lyr, 'name', expect) + tr = ogrtest.check_features_against_list(lyr, "name", expect) assert tr lyr.ResetReading() - expect = ['href', None] + expect = ["href", None] - tr = ogrtest.check_features_against_list(lyr, 'link1_href', expect) + tr = ogrtest.check_features_against_list(lyr, "link1_href", expect) assert tr lyr.ResetReading() - expect = ['text', None] + expect = ["text", None] - tr = ogrtest.check_features_against_list(lyr, 'link1_text', expect) + tr = ogrtest.check_features_against_list(lyr, "link1_text", expect) assert tr lyr.ResetReading() - expect = ['type', None] + expect = ["type", None] - tr = ogrtest.check_features_against_list(lyr, 'link1_type', expect) + tr = ogrtest.check_features_against_list(lyr, "link1_type", expect) assert tr lyr.ResetReading() - expect = ['href2', None] + expect = ["href2", None] - tr = ogrtest.check_features_against_list(lyr, 'link2_href', expect) + tr = ogrtest.check_features_against_list(lyr, "link2_href", expect) assert tr lyr.ResetReading() - expect = ['text2', None] + expect = ["text2", None] - tr = ogrtest.check_features_against_list(lyr, 'link2_text', expect) + tr = ogrtest.check_features_against_list(lyr, "link2_text", expect) assert tr lyr.ResetReading() - expect = ['type2', None] + expect = ["type2", None] - tr = ogrtest.check_features_against_list(lyr, 'link2_type', expect) + tr = ogrtest.check_features_against_list(lyr, "link2_type", expect) assert tr lyr.ResetReading() - expect = ['2007/11/25 17:58:00+01', None] + expect = ["2007/11/25 17:58:00+01", None] - tr = ogrtest.check_features_against_list(lyr, 'time', expect) + tr = ogrtest.check_features_against_list(lyr, "time", expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() - assert (ogrtest.check_feature_geometry(feat, 'POINT (1 0)', - max_error=0.0001) == 0) + assert ogrtest.check_feature_geometry(feat, "POINT (1 0)", max_error=0.0001) == 0 feat = lyr.GetNextFeature() - assert (ogrtest.check_feature_geometry(feat, 'POINT (4 3)', - max_error=0.0001) == 0) + assert ogrtest.check_feature_geometry(feat, "POINT (4 3)", max_error=0.0001) == 0 + ############################################################################### # Test routes gpx layer. def test_ogr_gpx_2(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") - lyr = gpx_ds.GetLayerByName('routes') + lyr = gpx_ds.GetLayerByName("routes") lyr.ResetReading() feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'LINESTRING (6 5,9 8,12 11)', max_error=0.0001) == 0 + assert ( + ogrtest.check_feature_geometry( + feat, "LINESTRING (6 5,9 8,12 11)", max_error=0.0001 + ) + == 0 + ) feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'LINESTRING EMPTY', max_error=0.0001) == 0 + assert ( + ogrtest.check_feature_geometry(feat, "LINESTRING EMPTY", max_error=0.0001) == 0 + ) ############################################################################### # Test route_points gpx layer. + def test_ogr_gpx_3(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") - lyr = gpx_ds.GetLayerByName('route_points') + lyr = gpx_ds.GetLayerByName("route_points") - expect = ['route point name', None, None] + expect = ["route point name", None, None] - tr = ogrtest.check_features_against_list(lyr, 'name', expect) + tr = ogrtest.check_features_against_list(lyr, "name", expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'POINT (6 5)', max_error=0.0001) == 0 + assert ogrtest.check_feature_geometry(feat, "POINT (6 5)", max_error=0.0001) == 0 + ############################################################################### # Test tracks gpx layer. def test_ogr_gpx_4(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") - lyr = gpx_ds.GetLayerByName('tracks') + lyr = gpx_ds.GetLayerByName("tracks") lyr.ResetReading() feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((15 14,18 17),(21 20,24 23))', max_error=0.0001) == 0 + assert ( + ogrtest.check_feature_geometry( + feat, "MULTILINESTRING ((15 14,18 17),(21 20,24 23))", max_error=0.0001 + ) + == 0 + ) feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'MULTILINESTRING EMPTY', max_error=0.0001) == 0 + assert ( + ogrtest.check_feature_geometry(feat, "MULTILINESTRING EMPTY", max_error=0.0001) + == 0 + ) feat = lyr.GetNextFeature() f_geom = feat.GetGeometryRef() - assert f_geom.ExportToWkt() == 'MULTILINESTRING EMPTY' + assert f_geom.ExportToWkt() == "MULTILINESTRING EMPTY" + ############################################################################### # Test route_points gpx layer. def test_ogr_gpx_5(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") - lyr = gpx_ds.GetLayerByName('track_points') + lyr = gpx_ds.GetLayerByName("track_points") - expect = ['track point name', None, None, None] + expect = ["track point name", None, None, None] - tr = ogrtest.check_features_against_list(lyr, 'name', expect) + tr = ogrtest.check_features_against_list(lyr, "name", expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() - assert ogrtest.check_feature_geometry(feat, 'POINT (15 14)', max_error=0.0001) == 0 + assert ogrtest.check_feature_geometry(feat, "POINT (15 14)", max_error=0.0001) == 0 + ############################################################################### # Copy our small gpx file to a new gpx file. def test_ogr_gpx_6(): - gpx_ds = ogr.Open('data/gpx/test.gpx') + gpx_ds = ogr.Open("data/gpx/test.gpx") try: - gdal.PushErrorHandler('CPLQuietErrorHandler') - ogr.GetDriverByName('CSV').DeleteDataSource('tmp/gpx.gpx') + gdal.PushErrorHandler("CPLQuietErrorHandler") + ogr.GetDriverByName("CSV").DeleteDataSource("tmp/gpx.gpx") gdal.PopErrorHandler() except: pass @@ -226,12 +244,13 @@ def test_ogr_gpx_6(): co_opts = [] # Duplicate waypoints - gpx_lyr = gpx_ds.GetLayerByName('waypoints') + gpx_lyr = gpx_ds.GetLayerByName("waypoints") - gpx2_ds = ogr.GetDriverByName('GPX').CreateDataSource('tmp/gpx.gpx', - options=co_opts) + gpx2_ds = ogr.GetDriverByName("GPX").CreateDataSource( + "tmp/gpx.gpx", options=co_opts + ) - gpx2_lyr = gpx2_ds.CreateLayer('waypoints', geom_type=ogr.wkbPoint) + gpx2_lyr = gpx2_ds.CreateLayer("waypoints", geom_type=ogr.wkbPoint) gpx_lyr.ResetReading() @@ -240,14 +259,14 @@ def test_ogr_gpx_6(): feat = gpx_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert gpx2_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert gpx2_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = gpx_lyr.GetNextFeature() # Duplicate routes - gpx_lyr = gpx_ds.GetLayerByName('routes') + gpx_lyr = gpx_ds.GetLayerByName("routes") - gpx2_lyr = gpx2_ds.CreateLayer('routes', geom_type=ogr.wkbLineString) + gpx2_lyr = gpx2_ds.CreateLayer("routes", geom_type=ogr.wkbLineString) gpx_lyr.ResetReading() @@ -256,14 +275,14 @@ def test_ogr_gpx_6(): feat = gpx_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert gpx2_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert gpx2_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = gpx_lyr.GetNextFeature() # Duplicate tracks - gpx_lyr = gpx_ds.GetLayerByName('tracks') + gpx_lyr = gpx_ds.GetLayerByName("tracks") - gpx2_lyr = gpx2_ds.CreateLayer('tracks', geom_type=ogr.wkbMultiLineString) + gpx2_lyr = gpx2_ds.CreateLayer("tracks", geom_type=ogr.wkbMultiLineString) gpx_lyr.ResetReading() @@ -272,32 +291,32 @@ def test_ogr_gpx_6(): feat = gpx_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert gpx2_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert gpx2_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = gpx_lyr.GetNextFeature() + ############################################################################### # Output extra fields as . def test_ogr_gpx_7(): - bna_ds = ogr.Open('data/gpx/csv_for_gpx.csv') + bna_ds = ogr.Open("data/gpx/csv_for_gpx.csv") try: - os.remove('tmp/gpx.gpx') + os.remove("tmp/gpx.gpx") except OSError: pass - co_opts = ['GPX_USE_EXTENSIONS=yes'] + co_opts = ["GPX_USE_EXTENSIONS=yes"] # Duplicate waypoints - bna_lyr = bna_ds.GetLayerByName('csv_for_gpx') + bna_lyr = bna_ds.GetLayerByName("csv_for_gpx") - gpx_ds = ogr.GetDriverByName('GPX').CreateDataSource('tmp/gpx.gpx', - options=co_opts) + gpx_ds = ogr.GetDriverByName("GPX").CreateDataSource("tmp/gpx.gpx", options=co_opts) - gpx_lyr = gpx_ds.CreateLayer('waypoints', geom_type=ogr.wkbPoint) + gpx_lyr = gpx_ds.CreateLayer("waypoints", geom_type=ogr.wkbPoint) bna_lyr.ResetReading() @@ -310,35 +329,36 @@ def test_ogr_gpx_7(): feat = bna_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) - assert gpx_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' + assert gpx_lyr.CreateFeature(dst_feat) == 0, "CreateFeature failed." feat = bna_lyr.GetNextFeature() gpx_ds = None -# Now check that the extensions fields have been well written - gpx_ds = ogr.Open('tmp/gpx.gpx') - gpx_lyr = gpx_ds.GetLayerByName('waypoints') + # Now check that the extensions fields have been well written + gpx_ds = ogr.Open("tmp/gpx.gpx") + gpx_lyr = gpx_ds.GetLayerByName("waypoints") - expect = ['PID1', 'PID2'] + expect = ["PID1", "PID2"] - tr = ogrtest.check_features_against_list(gpx_lyr, 'ogr_Primary_ID', expect) + tr = ogrtest.check_features_against_list(gpx_lyr, "ogr_Primary_ID", expect) assert tr gpx_lyr.ResetReading() - expect = ['SID1', 'SID2'] + expect = ["SID1", "SID2"] - tr = ogrtest.check_features_against_list(gpx_lyr, 'ogr_Secondary_ID', expect) + tr = ogrtest.check_features_against_list(gpx_lyr, "ogr_Secondary_ID", expect) assert tr gpx_lyr.ResetReading() - expect = ['TID1', None] + expect = ["TID1", None] - tr = ogrtest.check_features_against_list(gpx_lyr, 'ogr_Third_ID', expect) + tr = ogrtest.check_features_against_list(gpx_lyr, "ogr_Third_ID", expect) assert tr + ############################################################################### # Output extra fields as . @@ -346,84 +366,87 @@ def test_ogr_gpx_7(): def test_ogr_gpx_8(): try: - os.remove('tmp/gpx.gpx') + os.remove("tmp/gpx.gpx") except OSError: pass - gpx_ds = ogr.GetDriverByName('GPX').CreateDataSource('tmp/gpx.gpx', options=['LINEFORMAT=LF']) + gpx_ds = ogr.GetDriverByName("GPX").CreateDataSource( + "tmp/gpx.gpx", options=["LINEFORMAT=LF"] + ) - lyr = gpx_ds.CreateLayer('route_points', geom_type=ogr.wkbPoint) + lyr = gpx_ds.CreateLayer("route_points", geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(2 49)') - feat.SetField('route_name', 'ROUTE_NAME') - feat.SetField('route_fid', 0) + geom = ogr.CreateGeometryFromWkt("POINT(2 49)") + feat.SetField("route_name", "ROUTE_NAME") + feat.SetField("route_fid", 0) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 50)') - feat.SetField('route_name', '--ignored--') - feat.SetField('route_fid', 0) + geom = ogr.CreateGeometryFromWkt("POINT(3 50)") + feat.SetField("route_name", "--ignored--") + feat.SetField("route_fid", 0) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 51)') - feat.SetField('route_name', 'ROUTE_NAME2') - feat.SetField('route_fid', 1) + geom = ogr.CreateGeometryFromWkt("POINT(3 51)") + feat.SetField("route_name", "ROUTE_NAME2") + feat.SetField("route_fid", 1) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 49)') - feat.SetField('route_fid', 1) + geom = ogr.CreateGeometryFromWkt("POINT(3 49)") + feat.SetField("route_fid", 1) feat.SetGeometry(geom) lyr.CreateFeature(feat) - lyr = gpx_ds.CreateLayer('track_points', geom_type=ogr.wkbPoint) + lyr = gpx_ds.CreateLayer("track_points", geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(2 49)') - feat.SetField('track_name', 'TRACK_NAME') - feat.SetField('track_fid', 0) - feat.SetField('track_seg_id', 0) + geom = ogr.CreateGeometryFromWkt("POINT(2 49)") + feat.SetField("track_name", "TRACK_NAME") + feat.SetField("track_fid", 0) + feat.SetField("track_seg_id", 0) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 50)') - feat.SetField('track_name', '--ignored--') - feat.SetField('track_fid', 0) - feat.SetField('track_seg_id', 0) + geom = ogr.CreateGeometryFromWkt("POINT(3 50)") + feat.SetField("track_name", "--ignored--") + feat.SetField("track_fid", 0) + feat.SetField("track_seg_id", 0) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 51)') - feat.SetField('track_fid', 0) - feat.SetField('track_seg_id', 1) + geom = ogr.CreateGeometryFromWkt("POINT(3 51)") + feat.SetField("track_fid", 0) + feat.SetField("track_seg_id", 1) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) - geom = ogr.CreateGeometryFromWkt('POINT(3 49)') - feat.SetField('track_name', 'TRACK_NAME2') - feat.SetField('track_fid', 1) - feat.SetField('track_seg_id', 0) + geom = ogr.CreateGeometryFromWkt("POINT(3 49)") + feat.SetField("track_name", "TRACK_NAME2") + feat.SetField("track_fid", 1) + feat.SetField("track_seg_id", 0) feat.SetGeometry(geom) lyr.CreateFeature(feat) gpx_ds = None - f = open('tmp/gpx.gpx', 'rb') - f_ref = open('data/gpx/ogr_gpx_8_ref.txt', 'rb') + f = open("tmp/gpx.gpx", "rb") + f_ref = open("data/gpx/ogr_gpx_8_ref.txt", "rb") f_content = f.read() f_ref_content = f_ref.read() f.close() f_ref.close() - assert f_content.find(f_ref_content) != -1, 'did not get expected result' + assert f_content.find(f_ref_content) != -1, "did not get expected result" + ############################################################################### # Parse file with a